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

Determine which resource culture fallback has been chosen by Windows 10 in UWP

我有一个 UWP 应用程序,其中包含以下用于本地化的资源文件

zh

es-ES

fr-CA

fr-LU

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

意大利语

法语(法国)

英语(英国)

因此我的 OS 目前是意大利语。

该应用显示 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,因为这是系统决定在启动时显示的内容。 谢谢

Running the app shows that fr-LU has been chosen.

据此document, the system will perform resource matching in the order of 1. Exact match; 2. & 3. Region match; 4. Parent match; 5. Sibling match. In this case, sibling matching is performed. About sibling match,文档提到在多个兄弟匹配的情况下,在没有更高匹配的情况下,最后枚举的兄弟将成为赢家。由于fr-LU的顺序在最后,所以系统选择它作为显示语言。 fr-ZZ 也一样。

How can I determine in code which resource or culture tag has been eventually chosen (fr-LU)?

您不能直接获取已选择的资源,因为这是系统选择。如果你还想得到它,建议使用资源加载器

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

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

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

通过评估 Results 视图,您可以很容易地在调试器中看到哪些有效的资源字符串。