了解用户配置文件语言和应用清单语言
Windows 用户可以使用“设置”>“时间和语言”>“区域和语言”来配置首选显示语言的排序列表或一种首选显示语言。 语言可以具有区域变体。 例如,可以选择西班牙语作为在西班牙的口语、选择西班牙语作为在墨西哥的口语,或者选择西班牙语作为在美国的口语等。
在“设置”>“时间和语言”>“区域和语言”中,用户除了可以指定语言之外,还可以指定他们在世界上所处的位置(称为区域)。 请注意,显示语言(和区域变体)设置并不能确定区域设置,反之亦然。 例如,用户当前可能居住在法国,但选择的首选 Windows 显示语言 是 Español (México)。
对于 Windows 应用,语言以 BCP-47 语言标记表示。 例如,BCP-47 语言标记“en-US”对应于“设置”中的 English (United States)。 相应的 Windows 运行时 API 将接受并返回 BCP-47 语言标记的字符串表示形式。
另请参阅 IANA 语言子标记注册表。
以下三个部分定义了术语“用户配置文件语言列表”、“应用清单语言列表”和“应用运行时语言列表”。 我们将在此主题和此功能区域中的其他主题中使用以上术语,因此了解它们的含义非常重要。
用户配置文件语言列表
用户配置文件语言列表是用户在“设置”>“时间和语言”>“区域和语言”>“语言”中配置的列表的名称。 在代码中,可以使用 GlobalizationPreferences.Languages 属性以只读字符串列表的形式访问用户配置文件语言列表,其中每个字符串都是单个 BCP-47 语言标记,例如“en-US”或“ja-JP”。
IReadOnlyList<string> userLanguages = Windows.System.UserProfile.GlobalizationPreferences.Languages;
应用清单语言列表
应用清单语言列表是应用声明(或将声明)支持的语言列表。 随着你的应用经过整个开发生命周期直到本地化完成,此列表也会不断增长。
列表在编译时确定,但有两个选项用于控制具体发生的方式。 一个选项是让 Visual Studio 从项目中的文件确定列表。 要实现这一目的,首先在应用包清单源文件 (Package.appxmanifest
) 中的“应用程序”选项卡上,设置应用的默认语言。 然后,确认同一个文件包含此配置(默认情况会包含该配置)。
<Resources>
<Resource Language="x-generate" />
</Resources>
每次 Visual Studio 生成已构建应用包的清单文件 (AppxManifest.xml
) 时,它都会将源文件中的单个 Resource
元素扩展到项目中找到的所有语言限定符的联合(请参阅针对语言、缩放、高对比度和其他限定符定制资源)。 例如,如果已开始本地化,并且具有其文件夹或文件名包括“en-US”、“ja-JP”和“fr-FR”的字符串、图像和/或文件资源,则生成的 AppxManifest.xml
文件将包含以下项(列表中的第一个条目是设置的默认语言)。
<Resources>
<Resource Language="EN-US" />
<Resource Language="JA-JP" />
<Resource Language="FR-FR" />
</Resources>
另一个选项是将应用包清单源文件 (Package.appxmanifest
) 中的单个“x-generate”<Resource>
元素替换为 <Resource>
元素的扩展列表(将默认语言列在列表中的第一项时请小心)。 此选项涉及更多的维护工作,但如果使用自定义生成系统,它可能是一个合适的选项。
首先,应用清单语言列表将仅包含一种语言。 可能是 en-US。 但最后,由于你已手动配置清单或向项目添加已翻译的资源,因此,此列表将扩展。
当你的应用位于 Microsoft Store 中时,应用清单语言列表中的语言就是向客户显示的语言。 若要查看 Microsoft Store 专门支持的 BCP-47 语言标记列表,请参阅支持的语言。
在代码中,可以使用 ApplicationLanguages.ManifestLanguages 属性以只读字符串列表的形式访问应用清单语言列表,其中每个字符串都是单个 BCP-47 语言标记。
IReadOnlyList<string> userLanguages = Windows.Globalization.ApplicationLanguages.ManifestLanguages;
应用运行时语言列表
第三个感兴趣的语言列表是我们刚刚描述的两个列表之间的交集。 在运行时,应用声明支持的语言列表(应用清单语言列表)与用户声明为首选语言的语言列表(用户配置文件语言列表)进行比较。 应用运行时语言列表设置为此交集(如果交集不为空),或仅设置为应用的默认语言(如果交集为空)。
更具体地说,应用运行时语言列表由以下项组成。
- (可选)主要语言替代。 PrimaryLanguageOverride 是一种简单的替代设置,可用于为用户提供自己的独立语言选择的应用,或者是因某些强烈原因要替代默认语言选择的应用。 若要了解详细信息,请参阅应用程序资源和本地化示例。
- 应用支持的用户语言。 这是通过应用清单语言列表筛选的用户配置文件语言列表。 按应用支持的语言筛选用户的语言在软件开发工具包(SDK)、类库、依赖框架包和应用之间保持一致性。
- 如果 1 和 2 为空,则为应用支持的默认或第一种语言。 如果用户配置文件语言列表不包含应用支持的任何语言,则应用运行时语言是应用支持的第一种语言。
在代码中,可以使用 ResourceContext.QualifierValues 属性以字符串(包含 BCP-47 语言标记的分号分隔列表)的形式访问应用运行时语言列表。
string runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues["Language"];
还可以只读字符串列表的形式进行访问,每个字符串都包含单个 BCP-47 语言标记。 可以使用 ResourceContext.Languages 属性或 ApplicationLanguages.Languages 属性来执行此操作。
IReadOnlyList<string> runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Languages;
runtimeLanguages = Windows.Globalization.ApplicationLanguages.Languages;
应用运行时语言列表确定 Windows 为应用加载的资源,以及用于设置日期、时间、数字和其他组件的格式的语言。 请参阅全球化日期/时间/数字格式。
请注意,如果用户配置文件语言和应用清单语言是彼此的区域变体,则用户的区域变体将用作应用运行时语言。 例如,如果用户更喜欢 en-GB 且应用支持 en-US,则应用运行时语言为 en-GB。 这可确保日期、时间和数字的格式更接近用户的期望 (en-GB),但本地化资源仍会以应用支持的语言 (en-US) 进行加载(由于语言匹配)。
使用资源文件的语言对其进行限定
使用语言资源限定符命名资源文件或其文件夹。 若要了解关于资源限定符的详细信息,请参阅针对语言、缩放、高对比度和其他限定符定制资源。 资源文件可以是图像(或其他资产),也可以是资源容器文件,例如包含文本字符串的 .resw。
注意:即使是使用应用默认语言的资源,也必须指定语言限定符。 例如,应用的默认语言是“英语(美国)”,则将资产限定为 \Assets\Images\en-US\logo.png
。
- Windows 执行复杂的匹配,包括跨区域变体(如 en-US 和 en-GB)。 因此,请适当地添加区域子标记。 请参阅资源管理系统如何匹配语言标记。
- 如果没有为语言定义 Suppress-Script 值,则在限定符中指定语言脚本子标记。 例如,使用 zh-Hant、zh-Hant-TW 或 zh-Hans,而不是 zh-CN 或 zh-TW(有关更多详细信息,请参阅 IANA 语言子标记注册表)。
- 对于只有一种标准方言的语言,无需包含区域限定符。 例如,使用 ja,而不是 ja-JP。
- 某些工具和其他组件(如机器翻译器)可能会查找特定语言标记,例如区域方言信息,这有助于理解数据。
并非所有资源都需要本地化
并非所有资源都需要本地化。
- 至少确保所有资源都以默认语言存在。
- 对于密切相关的语言,可能只需要本地化某些资源的子集(部分本地化)。 例如,如果你的应用具有一组完整的西班牙语资源,则可能不会将所有应用的 UI 本地化为加泰罗尼亚语。 对于将泰罗尼亚语排在西班牙语前面的用户来说,无法用加泰罗尼亚语提供的资源将以西班牙语显示。
- 某些资源可能需要针对特定语言的例外情况,而大多数其他资源映射到公共资源。 在这种情况下,可以使用不确定的语言标记“und”标记要用于所有语言的资源。 Windows 将“und”语言标记解释为通配符(类似于“*”),因为它可以匹配其他任何特定匹配之后排在最顶端的应用语言。 例如,如果某些资源对于芬兰语不同,但其余资源对于所有语言都是相同的,则芬兰语资源应使用芬兰语标记进行标记,其余资源应标记为“und”。
- 对于基于语言脚本的资源(如文本的字体或高度),请将不确定的语言标记与某个指定的脚本一起使用:“und-<script>”。 例如,对于拉丁文,字体使用
und-Latn\\fonts.css
,而对于西里尔文,字体使用und-Cryl\\fonts.css
。
设置 HTTP 接受语言请求标头
请考虑调用的 Web 服务是否具有与应用相同的本地化程度。 Windows 应用以典型的 Web 请求形式发出的 HTTP 请求以及 XMLHttpRequest (XHR) 使用标准 HTTP Accept-Language 请求头。 默认情况下,HTTP 标头设置为用户配置文件语言列表。 列表中的每种语言进一步展开,以包括语言的中性语言和权重(q)。 例如,用户语言列表为 fr-FR 和 en-US 将生成 HTTP 接受语言请求标头 fr-FR, fr, en-US, en ("fr-FR,fr;q=0.8,en-US;q=0.5,en;q=0.3")。 但是,如果你的天气应用(此处举例)显示法语(法国)UI,但用户的首选列表中的顶级语言是德语,则需要从服务中显式请求法语(法国),以便在应用中保持一致。
Windows.Globalization 命名空间中的 API
通常,Windows.Globalization 名称空间中的 API 使用应用运行时语言列表来确定语言。 如果任何语言都没有匹配的格式,则使用用户区域设置。 这是用于系统时钟的相同区域设置。 “设置”>“时间和语言”>“区域和语言”>“其他日期、时间和区域设置”>“区域: 更改日期、时间或数字格式”中提供了用户区域设置。 Windows.Globalization API 还具有替代来指定要使用的语言列表,而不是应用运行时语言列表。
通过使用 Language 类,可以检查有关特定语言的详细信息,例如语言的脚本、显示名称和本机名称。
在适当的场景下使用地理区域
在“设置”>“时间和语言”>“区域和语言”>“国家或地区”中,用户可以指定其在世界上的所在位置。 可以使用此设置(而不是语言)选择要向用户显示的内容。 例如,新闻应用可能默认显示来自该区域的内容。
在代码中,可以使用 GlobalizationPreferences.HomeGeographicRegion 属性访问此设置。
通过使用 GeographicRegion 类,可以检查有关特定区域的详细信息,例如其显示名称、本机名称和正在使用的货币。
示例
下表包含用户根据各种语言和区域设置在应用的 UI 中看到的内容的示例。
应用清单语言列表 | 用户配置文件语言列表 | 应用的主要语言替代(可选) | 应用运行时语言列表 | 用户在应用中看到的内容 |
---|---|---|---|---|
英语(大不列颠)(默认值);德语(德国) | 英语(大不列颠) | 无 | 英语(大不列颠) | 英语 (en-GB) 日期/时间/数字:英语 (GB) |
德语(德国)(默认值);法语(法国);意大利语(意大利) | 法语(奥地利) | 无 | 法语(奥地利) | UI:法语(法国)(法语(奥地利)的回退) 日期/时间/数字:法语(奥地利) |
英语(美国)(默认值);法语(法国);英语(大不列颠) | 英语(加拿大);法语(加拿大) | 无 | 英语(加拿大);法语(加拿大) | UI:英语(美国)(英语(加拿大)的回退) 日期/时间/数字;英语(加拿大) |
西班牙语(西班牙)(默认值);西班牙语(墨西哥);西班牙语(拉丁美洲);葡萄牙语(巴西) | 英语(美国) | 无 | 西班牙语(西班牙) | UI:西班牙语(西班牙)(使用默认值,因为没有英语的回退) 日期/时间/数字西班牙语(西班牙) |
加泰罗尼亚语(默认值);西班牙语(西班牙);法语(法国) | 加泰罗尼亚语;法语(法国) | 无 | 加泰罗尼亚语;法语(法国) | UI:主要是加泰罗尼亚语和一些法语(法国),因为并非所有字符串都是加泰罗尼亚语 日期/时间/数字:加泰罗尼亚语 |
英语(大不列颠)(默认值);法语(法国);德语(德国) | 德语(德国);英语(大不列颠) | 英语(大不列颠)(由应用 UI 中的用户选择) | 英语(大不列颠);德语(德国) | UI:英语(大不列颠)(语言替代) 日期/时间/数字英语(大不列颠) |
注意
有关 Microsoft 使用的标准国家/地区代码的列表,请参阅官方国家/地区列表。
重要的 API
- GlobalizationPreferences.Languages
- ApplicationLanguages.ManifestLanguages
- PrimaryLanguageOverride
- ResourceContext.QualifierValues
- ResourceContext.Languages
- ApplicationLanguages.Languages
- Windows.Globalization
- 语言
- GlobalizationPreferences.HomeGeographicRegion
- GeographicRegion