概述:Android 中的资源切换
资源是指文本字符串、布局、声音、图形和 Android 应用需要的任何其他静态数据。应用可以包含多组资源,每组资源针对不同的设备配置进行定制。当用户运行应用时,Android 会自动选择并加载与设备最匹配的资源。
为什么默认资源很重要
当应用在没有提供特定于该语言区域的文本的语言区域中运行时,Android 就会从res/values/strings.xml
加载默认字符串。如果缺少此默认文件,或者此文件缺少应用需要的字符串,那么应用就不会运行,而是显示错误。
使用资源进行本地化
如何创建默认资源
将应用的默认文本放在res/values/strings.xml
中。
提示:在代码中,检查对 Android 资源的每个引用。确保为每个资源定义了默认资源。此外,还需要确保默认字符串文件是完整的:本地化的字符串文件可包含部分字符串,但默认字符串文件必须包含所有字符串。
如何创建备用资源
示例:假设应用的默认语言是英语。再假设希望将应用中的大部分文本(应用标题除外)本地化为日语。
-
res/values/strings.xml
包含应用使用的所有字符串的英语文本,包括名为title
的字符串的文本。 -
res/values-ja/strings.xml
包含除title
之外的所有字符串的日语文本。
如果基于 Java 的代码引用了R.string.title
,且设备设置为日语,Android 会在res/values-ja/strings.xml
文件中查找title
。但由于该文件中不包含此类字符串,因此 Android 会退回到默认状态,从res/values/strings.xml
文件中加载英语title
。
哪些资源优先?
如果多个资源文件与设备的配置匹配,则 Android 会遵循一组规则来确定使用哪个文件。在可通过资源目录名称指定的限定符中,语言区域几乎总是处于优先地位。
在代码中引用资源
在应用的基于 Java 的代码中,使用R.resource_type.resource_name
或android.R.resource_type.resource_name
语法来引用资源。
管理要进行本地化的字符串
- 将所有字符串放入 strings.xml 中
在构建应用时,请不要硬编码任何字符串,而应将所有字符串声明为默认的strings.xml
文件中的资源,以便于更新和本地化。 - 遵循针对界面字符串的 Android 指南
应使用友好而简练的风格,还应尽可能地使用 Android 标准术语。 - 为声明的字符串提供充分的上下文
在strings.xml
文件中声明字符串时,请确保清楚说明使用该字符串的上下文。示例如下:
<!-- The action for submitting a form. This text is on a button that can fit 30 chars -->
<string name="login_submit_button">Sign in</string>
- 标记消息中不应该翻译的部分
字符串中常常包含不应翻译成其他语言的文本。常见的示例包括一段代码、某个值的占位符、特殊符号或名称。准备字符串进行翻译时,查找并标记应保持原样不进行翻译的文本,以避免翻译人员对其进行更改。
要标记不应翻译的文本,可以使用<xliff:g>
占位符标记。在声明占位符标记时,务必添加一个 ID 属性来说明此占位符的用途。如果应用稍后会替换占位符的值,务必提供属性示例来说明预期的用途。
<string name="countdown">
<xliff:g id="time" example="5 days">%1$s</xliff:g> until holiday
</string>
关于本地化的建议
- 将应用设计为可在任何语言区域中使用
不能对用户用来运行应用的设备做任何假设。确保应用包含一套完整的默认资源。 - 设计灵活的布局
如果需要重新排列布局以适应某种语言,可以针对该语言创建备用布局。不过,这样做会增加应用的维护难度。最好是创建一个更灵活的布局。 - 避免创建超出需要的资源文件和文本字符串
可能不需要为应用中的每个资源创建特定于语言区域的备用资源。可能也不需要为每一个字符串创建替代文本。例如,假设应用的默认语言是美式英语,对于一些重要的短语,需要提供英式英语拼写。为此,可以创建一个名为res/values-en-rGB/strings.xml
的小文件,该文件仅包含应用在英国的设备上运行时应该有所不同的字符串。 - 使用 Android Context 对象手动查找语言区域
Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0);
String locale = primaryLocale.getDisplayName();
测试本地化应用
在设备上测试
要更改设备上的语言区域或语言,使用“设置”应用。
测试默认资源
测试应用是否包含所需的全部字符串资源:将模拟器或设备设置为应用不支持的语言,运行应用,如果应用显示错误消息和“强制应用关闭”按钮,则表示它可能正在查找一个未提供的字符串。
如果测试成功,针对其他类型的配置重复此测试。
参考资料:应用资源 > 本地化 > 本地化您的应用
本地化您的应用 | Android 开发者 | Android Developers