确定 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 目前是意大利语。
该应用显示 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
,因为这是系统决定在启动时显示的内容。
谢谢
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
视图,您可以很容易地在调试器中看到哪些有效的资源字符串。
我有一个 UWP 应用程序,其中包含以下用于本地化的资源文件
zh
es-ES
fr-CA
fr-LU
我已在 Windows 10 的设置中按优先顺序设置了首选语言以用于测试目的
意大利语
法语(法国)
英语(英国)
因此我的 OS 目前是意大利语。
该应用显示 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
,因为这是系统决定在启动时显示的内容。
谢谢
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
视图,您可以很容易地在调试器中看到哪些有效的资源字符串。