确定 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 的设置中按优先顺序设置首选语言以用于测试目的
意大利语
法语(法国)
英语(英国)
因此我的操作系统目前是意大利语。
应用显示TextBlock
和x: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
)成为ListView
的SelectedItem
,因为这是系统决定在启动时显示的内容。
谢谢
【问题讨论】:
【参考方案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;fr-FR,因此会跳过意大利语。我会调查你的回答并报告,谢谢 我复制了您的案例,感谢您的提示。我在上面提供了不同的解决方案。 您的解决方案正在崩溃“找不到资源的东西”,我应该能够弄清楚,但到目前为止它不起作用。我的文件夹结构是“Strings/en/resources.resw”,fr 也是如此。我将您的虚拟资源放置为“Strings/resources.resw”,“Strings”文件夹位于顶部。我尝试了 MainResourceMap["Resources/Strings/resources"] 和 MainResourceMap["Strings/resources"] 以及 resw 扩展。到目前为止它崩溃了。以上是关于确定 UWP 中的 Windows 10 选择了哪种资源文化回退的主要内容,如果未能解决你的问题,请参考以下文章