概述:Android 中的资源切换

资源是指文本字符串、布局、声音、图形和 Android 应用需要的任何其他静态数据。应用可以包含多组资源,每组资源针对不同的设备配置进行定制。当用户运行应用时,Android 会自动选择并加载与设备最匹配的资源。

为什么默认资源很重要

当应用在没有提供特定于该语言区域的文本的语言区域中运行时,Android 就会从res/values/strings.xml加载默认字符串。如果缺少此默认文件,或者此文件缺少应用需要的字符串,那么应用就不会运行,而是显示错误。

使用资源进行本地化

如何创建默认资源

将应用的默认文本放在res/values/strings.xml中。

提示:在代码中,检查对 Android 资源的每个引用。确保为每个资源定义了默认资源。此外,还需要确保默认字符串文件是完整的:本地化的字符串文件可包含部分字符串,但默认字符串文件必须包含所有字符串。

如何创建备用资源

示例:假设应用的默认语言是英语。再假设希望将应用中的大部分文本(应用标题除外)本地化为日语。

  1. res/values/strings.xml 包含应用使用的所有字符串的英语文本,包括名为title的字符串的文本。
  2. 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_nameandroid.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