确定 UWP 中的 Windows 10 选择了哪种资源文化回退

Posted

技术标签:

【中文标题】确定 UWP 中的 Windows 10 选择了哪种资源文化回退【英文标题】:Determine which resource culture fallback has been chosen by Windows 10 in UWP 【发布时间】:2019-12-18 22:10:07 【问题描述】:

我有一个带有以下本地化资源文件的 UWP 应用

zh

es-ES

法国-加拿大

fr-LU

我已在 Windows 10 的设置中按优先顺序设置首选语言以用于测试目的

意大利语

法语(法国)

英语(英国)

因此我的操作系统目前是意大利语。

应用显示TextBlockx:Uid="Test",其中Test.Text 在每个资源文件中设置为键,值的形式为 "This is a test coming from es-ES"为资源文件es-ES

运行应用表明已选择 fr-LU。

通过阅读文档,我了解到 CurrentUICulture 为此设置为 fr-FR app,可能是因为找不到意大利资源文件,所以选择了第二个,fr-FR, 但随后fr-FR 未找到,因此选择了一个兄弟姐妹,以 fr-LU。系统似乎选择了这个而不是fr-CA,因为它是ManifestLanguages 列表中的最后一个。我什至添加了一个不存在的文化资源文件fr-ZZ,它被选中了!这很奇怪,但这不是我的问题,因为我只打算放有效的文化。

问题:如何在代码中确定最终选择了哪个资源或文化标签 (fr-LU)?

我可以通过将Test.Text 设置为完全等于文化来以愚蠢的方式回答这个问题, 使用资源加载器并读取值,然后将其转换为文化或覆盖主要语言。但这是逆向工程,仅出于该目的将强烈依赖于我的资源文件中的字符串。

我正在尝试解决这个问题,因为我提出了一个Listview ManifestLanguages 允许用户更改语言,并希望该语言 (这里是fr-LU)成为ListViewSelectedItem,因为这是系统决定在启动时显示的内容。 谢谢

【问题讨论】:

【参考方案1】:

运行应用程序显示已选择 fr-LU。

从这个document开始,系统会按照1的顺序进行资源匹配。完全符合; 2. & 3. 区域匹配; 4.家长匹配; 5. 兄弟匹配。在这种情况下,执行兄弟匹配。关于sibling match,文档中提到在多个兄弟匹配的情况下,在没有更高匹配的情况下,最后枚举的兄弟将是获胜者。由于fr-LU的顺序在最后,所以系统选择它作为显示语言。 fr-ZZ 也是如此。

如何在代码中确定最终选择了哪个资源或文化标签 (fr-LU)?

你不能直接得到被选择的资源,因为这是系统的选择。如果您仍想获取它,建议使用 resource loader

【讨论】:

谢谢@Faywang,所以结论是走傻路,但很高兴知道别无选择。【参考方案2】:

以下代码应该告诉您 Windows 为任何给定资源选择了哪种语言(将 DUMMY_RESOURCE 替换为资源名称):

ResourceManager.Current.MainResourceMap["Resources/DUMMY_RESOURCE"]
  .Candidates[0].GetQualifierValue("language")

这样您实际上不必本地化资源DUMMY_RESOURCE;它可以对所有语言具有相同的值。

通过评估Results 视图,您可以在调试器中轻松查看哪些有效资源字符串。

【讨论】:

不,这不起作用,它从机器上的语言返回一个逗号分隔的列表,而不是上面示例中清单语言中的 fr-LU。 我正在使用 Strings/xx/Resources.resx 形式的文件夹结构中的资源文件,其中 xx=en 和 fr(以及您想要的任何内容)。编辑这些资源以放入一个键值对并重新启动您的应用程序,您应该会看到一个分号分隔的列表。复制它很容易,只需在页面的 ctor 中调用 QualifierValues,例如在这个项目中 github.com/microsoft/Windows-universal-samples/tree/master/… ,但不要忘记将非空资源 kvp 放入 Strings 文件夹。告诉我。 您只有一个结果,可能是因为您安装了一种语言,和/或操作系统中声明的语言与资源文件中声明的语言之间没有交集。例如。对于 en 和 fr 资源,以及使用 en-GB、fr-FR 和 it-It 语言的操作系统,您的方法将返回字符串 en-GB;f​​r-FR,因此会跳过意大利语。我会调查你的回答并报告,谢谢 我复制了您的案例,感谢您的提示。我在上面提供了不同的解决方案。 您的解决方案正在崩溃“找不到资源的东西”,我应该能够弄清楚,但到目前为止它不起作用。我的文件夹结构是“Strings/en/resources.resw”,fr 也是如此。我将您的虚拟资源放置为“Strings/resources.resw”,“Strings”文件夹位于顶部。我尝试了 MainResourceMap["Resources/Strings/resources"] 和 MainResourceMap["Strings/resources"] 以及 resw 扩展。到目前为止它崩溃了。

以上是关于确定 UWP 中的 Windows 10 选择了哪种资源文化回退的主要内容,如果未能解决你的问题,请参考以下文章

VBA 如何确定在列表框中选择了哪一行?

确定在richtextbox中点击了哪一行

在Windows 10 UWP WinJS应用程序中,如何确定构建中包含哪些文件?

在 Windows 10 uwp 中获取通知来源?

Windows 10自带UWP应用打不开怎么办

UWP 应用程序在 Windows 10 中的查找结果的图标/磁贴的来源是啥?