了解用户配置文件语言和应用清单语言

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;

应用运行时语言列表

第三个感兴趣的语言列表是我们刚刚描述的两个列表之间的交集。 在运行时,应用声明支持的语言列表(应用清单语言列表)与用户声明为首选语言的语言列表(用户配置文件语言列表)进行比较。 应用运行时语言列表设置为此交集(如果交集不为空),或仅设置为应用的默认语言(如果交集为空)。

更具体地说,应用运行时语言列表由以下项组成。

  1. (可选)主要语言替代PrimaryLanguageOverride 是一种简单的替代设置,可用于为用户提供自己的独立语言选择的应用,或者是因某些强烈原因要替代默认语言选择的应用。 若要了解详细信息,请参阅应用程序资源和本地化示例
  2. 应用支持的用户语言。 这是通过应用清单语言列表筛选的用户配置文件语言列表。 按应用支持的语言筛选用户的语言在软件开发工具包(SDK)、类库、依赖框架包和应用之间保持一致性。
  3. 如果 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

示例