从 Android 7.0(API 级别 24)开始,Android 为多语言用户提供了增强的支持,允许他们在设置中选择多个区域设置。Android 通过大幅扩展支持的区域设置数量并更改系统解析资源的方式来提供此功能。
本文档首先解释了低于 7.0(API 级别 24)版本的 Android 中的资源解析策略。接下来,它描述了 Android 7.0 中改进的资源解析策略。最后,它说明了如何利用扩展的区域设置数量来支持更多多语言用户。
解析语言资源的挑战
在 Android 7.0 之前,Android 并非始终能够成功匹配应用和系统区域设置。
例如,假设您有以下情况
- 您的应用的默认语言为
en_US
(美国英语),并且它还具有在es_ES
资源文件中本地化的西班牙语字符串。 - 设备设置为
es_MX
当您的 Java 代码引用字符串时,系统将加载来自默认 (en_US
) 资源文件的字符串,即使应用具有在 es_ES
下本地化的西班牙语资源。这是因为当系统找不到完全匹配项时,它会继续通过从区域设置中剥离国家/地区代码来查找资源。最后,如果找不到匹配项,系统将回退到默认值,即 en_US
。
如果用户选择了应用根本不支持的语言(如法语),系统也将默认为 en_US
。例如
用户设置 | 应用资源 | 资源解析 |
---|---|---|
fr_CH | 默认值(en) de_DE es_ES fr_FR it_IT |
尝试 fr_CH => 失败 尝试 fr => 失败 使用默认值(en) |
在此示例中,系统显示英语字符串,而不确定用户是否能够理解英语。这种行为在今天非常普遍。
对资源解析策略的改进
Android 7.0(API 级别 24)带来了更强大的资源解析功能,并自动查找更好的回退。但是,为了加快解析速度并提高可维护性,您应将资源存储在最常见的父方言中。例如,如果您之前将西班牙语资源存储在 values-es-rUS
目录中,请将其移至 values-b+es+419
目录,其中包含拉丁美洲西班牙语。同样,如果您在名为 values-en-rGB
的目录中具有资源字符串,请将目录重命名为 values-b+en+001
(国际英语),因为 en-GB
字符串的最常见父级为 en-001
。以下示例说明了这些做法如何提高资源解析的性能和可靠性。
资源解析示例
对于大于 7.0 版本的 Android,表 1 中描述的情况的解决方式有所不同
用户设置 | 应用资源 | 资源解析 |
---|---|---|
|
默认值(en) de_DE es_ES fr_FR it_IT |
尝试 fr_CH => 失败 尝试 fr => 失败 尝试 fr 的子级 => fr_FR 使用 fr_FR |
现在用户获得法语资源而不是英语资源。此示例还说明了为什么应将法语字符串存储在 fr
而不是 fr_FR
中,以用于 Android 7.0 或更高版本。这里的操作方法是匹配最接近的父方言,从而使解析更快且更可预测。
除了这种改进的解析逻辑之外,Android 现在还提供了更多用户语言可供选择。让我们再次尝试上述示例,其中意大利语指定为附加用户语言,但应用不支持法语。
用户设置 | 应用资源 | 资源解析 |
---|---|---|
|
默认值(en) de_DE es_ES it_IT |
尝试 fr_CH => 失败 尝试 fr => 失败 尝试 fr 的子级 => 失败 尝试 it_CH => 失败 尝试 it => 失败 尝试 it 的子级 => it_IT 使用 it_IT |
即使应用不支持法语,用户仍然可以获得他们理解的语言。
设计您的应用以支持其他区域设置
Android 提供了使本地化应用内容并以用户首选语言吸引用户的工具变得更容易的工具。我们建议使用以下技术配置您的应用,以便它能够以可扩展的方式适应不同的语言和格式约定。
指定您的应用支持的语言
为了确保正确解析语言,请使用模块级 build.gradle
文件中的 resConfigs
属性指定您的应用支持的语言。
以下代码示例显示了如何使用 resConfigs
来表示支持的语言。在此示例中,应用同时支持英语和西班牙语。
Groovy
android { defaultConfig { ... resConfigs "en", "es" } }
Kotlin
android { defaultConfig { ... resConfigs("en", "es") } }
LocaleList API
从 Android 7.0(API 级别 24)开始,Android 公开了 LocaleList.getDefault()
API,允许应用直接查询用户指定的语言列表。此 API 允许您创建更复杂的应用程序行为和更优化的内容显示。例如,搜索可以根据用户的设置显示多种语言的结果。浏览器应用可以避免在用户已知的语言中提供翻译页面,键盘应用可以自动启用所有合适的布局。
格式化程序
在 Android 6.0(API 级别 23)及更早版本中,Android 仅支持许多常用语言(en、es、ar、fr、ru)的一种或两种语言环境。由于每种语言只有少数变体,因此应用程序可以通过在资源文件中将一些数字和日期存储为硬编码字符串来解决问题。但是,随着 Android 支持的语言环境范围扩大,即使在单个语言环境中,日期、时间、货币和类似信息的格式也可能存在很大差异。硬编码格式可能会给最终用户带来困惑。因此,在开发面向 Android 7.0 或更高版本的应用程序时,请确保使用格式化程序,而不是硬编码数字和日期字符串。
例如,Android 7.0 及更高版本支持 27 种阿拉伯语语言环境。这些语言环境可以共享大多数资源,但有些更喜欢 ASCII 数字,而另一些则更喜欢本地数字。例如,当您想创建一个包含数字变量的句子(例如“选择一个 4 位数的 PIN 码”)时,请使用如下所示的格式化程序
format(locale, "Choose a %d-digit PIN", 4)