本地化您的应用
Android可在许多地区的许多设备上运行。为了覆盖大多数用户,您的应用应以适合使用您的应用的区域设置的方式处理文本,音频文件,数字,货币和图形。
本文档介绍了本地化Android应用的最佳做法。
您应具备Java编程语言的工作知识,熟悉Android资源加载,XML中用户界面元素的 声明,活动生命周期等开发注意事项以及国际化和本地化的一般原则。
尽量使用Android资源框架将应用程序的本地化方面与核心的基于Java的功能分开,这是一个很好的做法:
- 您可以将应用程序用户界面的大部分或全部内容放入资源文件中,如本文档和 提供资源中所述。
- 另一方面,用户界面的行为是由基于Java的代码驱动的。例如,如果用户根据语言环境输入需要格式化或排序不同的数据,则可以使用Java编程语言以编程方式处理数据。本文档不包括如何本地化您的基于Java的代码。
有关在您的应用中本地化字符串的简短指南,请参阅培训课程, 支持不同的语言。
概述:Android中的资源切换
资源是文本字符串,布局,声音,图形以及您的Android应用所需的任何其他静态数据。应用程序可以包含多组资源,每组资源都针对不同的设备配置进行了自定义。当用户运行应用程序时,Android会自动选择并加载与设备最匹配的资源。
(本文档重点介绍本地化和区域设置,有关资源切换和您可以指定的所有配置类型(屏幕方向,触摸屏类型等)的完整说明,请参阅 提供替代资源。
当您编写应用程序时,可以为您的应用程序创建默认和替代资源以供使用。当用户运行您的应用时,Android系统会根据设备的区域设置选择要加载的资源。要创建资源,请将文件放置在项目res/
目录的特定子目录中。
为什么默认资源很重要
每当应用程序在您未提供区域设置特定文本的语言环境中运行时,Android会从中加载默认字符串res/values/strings.xml
。如果此缺省文件不存在,或者缺少应用程序需要的字符串,那么您的应用程序不会运行并显示错误。下面的例子说明了默认文本文件不完整时会发生什么。
例:
应用程序的基于Java的代码仅涉及两个字符串,text_a
而且text_b
。这个程序包括一个本地化的资源文件(res/values-en/strings.xml
定义)text_a
和 text_b
英语。此应用程序还包含一个默认资源文件(res/values/strings.xml
),其中包含一个定义text_a
,但不包括text_b
:
- 当此应用在设置为英语的语言环境设备上启动时,该应用可能无问题地运行,因为它
res/values-en/strings.xml
包含两个所需的文本字符串。 - 但是,如果在设置为英语以外的语言的设备上启动此应用程序,用户将看到错误消息和强制关闭按钮。该应用程序无法加载。
为防止出现这种情况,请确保res/values/strings.xml
文件存在,并确定每个需要的字符串。这种情况适用于所有类型的资源,而不仅仅是字符串:您需要创建一组默认资源文件,其中包含应用程序调用的所有资源 - 布局,可绘制,动画等。有关测试的信息,请参阅 测试默认值资源。
使用资源进行本地化
如何创建默认资源
将应用程序的默认文本放入 res/values/strings.xml
。
文本字符串res/values/strings.xml
应使用默认语言,这是您希望大多数应用用户说话的语言。
默认资源集还必须包含任何默认的可绘制和布局,并且可以包含其他类型的资源,如动画:
res/drawable/
(必需的目录至少保存一个图形文件,用于Google Play上应用的图标)res/layout/
(需要保存定义默认布局的XML文件的目录)res/anim/
(如果您有任何 文件夹,则需要)res/anim-<qualifiers>
res/xml/
(如果您有任何 文件夹,则需要)res/xml-<qualifiers>
res/raw/
(如果您有任何 文件夹,则需要)res/raw-<qualifiers>
提示:在您的代码中,检查每个对Android资源的引用。确保为每个资源定义了一个默认资源。还要确保默认的字符串文件是完整的:本地化的 字符串文件可以包含字符串的一个子集,但是默认的字符串文件必须包含它们全部。
如何创建替代资源
本地化应用程序的很大一部分是为不同语言提供替代文本。在某些情况下,您还可以提供其他图形,声音,布局和其他特定于语言环境的资源。
应用程序可以指定许多 目录,每个目录都有不同的限定符。要为不同的区域设置创建替代资源,请使用指定语言或语言区域组合的限定符。(资源目录的名称必须符合Provide Alternative Resources中所述的命名方案 ,否则您的应用程序无法编译。)res/<qualifiers>/
例:
假设你的应用的默认语言是英文。假设您还想将应用中的所有文本本地化为法文,并将您应用中的大部分文本(除应用标题外的所有文本)本地化为日文。在这种情况下,您可以创建三个备选strings.xml
文件,每个文件都存储在特定于语言环境的资源目录中:
res/values/strings.xml
包含应用程序使用的所有字符串的英文文本,包括名为字符串的文本title
。res/values-fr/strings.xml
包含所有字符串的法文文本,包括title
。res/values-ja/strings.xml
包含所有字符串除外的 日文文本title
。
如果您的基于Java的代码引用R.string.title
,那么在运行时会发生以下情况:
- 如果设备设置为法语以外的任何语言,则Android会
title
从该res/values/strings.xml
文件加载 。 - 如果设备设置为法语,则Android会
title
从该res/values-fr/strings.xml
文件加载。
请注意,如果设备设置为日语,Android会title
在res/values-ja/strings.xml
文件中查找 。但是由于该文件中不包含此类字符串,Android会回退到默认值,并title
从res/values/strings.xml
文件加载英文 。
哪些资源优先?
如果多个资源文件与设备的配置相匹配,则Android会根据一组规则来决定要使用哪个文件。在可以在资源目录名称中指定的限定符中,语言环境几乎总是优先。
例:
假设一个应用程序包含一组默认图形和另外两组图形,每个图形均针对不同的设备设置进行了优化:
res/drawable/
包含默认图形。res/drawable-small-land-stylus/
包含经过优化的图形,用于预期来自手写笔输入的设备,并且具有横向方向的QVGA低密度屏幕。res/drawable-ja/
包含针对日语使用而优化的图形。
如果应用程序在配置为使用日语的设备上运行,则Android会加载图形res/drawable-ja/
,即使该设备恰好是需要从触控笔输入的设备,并且横向上具有QVGA低密度屏幕。
例外:在选择过程中唯一的优先于区域设置的限定符是MCC和MNC(移动国家代码和移动网络代码)。
例:
假设您有以下情况:
- 应用程序代码要求
R.string.text_a
- 有两个相关的资源文件可用:
res/values-mcc404/strings.xml
,其中包含text_a
应用程序的默认语言,在这种情况下为英语。res/values-hi/strings.xml
,其中包括text_a
印地文。
- 该应用程序在具有以下配置的设备上运行:
- SIM卡连接到印度的移动网络(MCC 404)。
- 语言设置为Hindi(
hi
)。
即使设备配置为印地语,Android 也会text_a
从 res/values-mcc404/strings.xml
(英语)加载。这是因为在资源选择过程中,Android更喜欢MCC匹配的语言匹配。
选择过程并不总是像这些例子所表明的那样简单。请阅读Android如何找到最佳匹配资源,以获取更详细的流程描述。所有的限定符都按照提供替代资源表2中的优先顺序进行了描述和列出。
参考代码中的资源
在您的应用程序的基于Java的代码中,您可以使用语法 或 。 有关更多信息,请参阅访问资源。R.resource_type.resource_name
android.R.resource_type.resource_name
管理本地化字符串
将所有字符串移动到strings.xml中
在构建应用程序时,不要硬编码任何字符串。相反,将所有字符串声明为默认strings.xml
文件中的资源,这使得更新和本地化变得容易。strings.xml
然后可以轻松提取,翻译文件中的字符串并将其集成到应用程序中(具有适当的限定符),而不会对编译代码进行任何更改。
如果您使用文本生成图像,请将这些字符串放入strings.xml
,并在翻译后重新生成图像。
遵循Android用户界面字符串指南
当你设计和开发的用户界面,请确保您密切关注如何你跟你的用户。一般来说,使用简洁且简洁的简洁压缩样式,并在整个UI中使用一致的样式。
确保您阅读并遵循材料设计建议书写风格和文字选择。这样做可以让您的应用看起来更加精美,并帮助用户更快地理解您的用户界面。
此外,尽可能使用Android标准术语,例如操作栏,选项菜单,系统栏,通知等UI元素。正确和一致地使用Android术语可以使翻译更轻松,并为用户带来更好的最终产品。
为声明字符串提供足够的上下文
在您的strings.xml
文件中声明字符串时,请确保描述使用字符串的上下文。这些信息对翻译非常重要,并可以提高翻译质量。它还可以帮助您更有效地管理您的字符串。
这里是一个例子:
<! - 提交表单的动作。此文本位于可放置30个字符的按钮上 - > <string name = “login_submit_button” > 登录</ string>考虑提供上下文信息,其中可能包括:
- 这是什么字符串?何时何地呈现给用户?
- 这是在布局?例如,按钮中的翻译比文本框中的翻译更不灵活。
标记不应该翻译的消息部分
字符串常常包含不应该翻译成其他语言的文本。常见示例可能是一段代码,一个值的占位符,一个特殊符号或名称。在准备翻译字符串时,请查找并标记应保持原样的文本,而无需翻译,以便翻译人员不会更改它。
要标记不应翻译的文本,请使用<xliff:g>
占位符标记。下面是一个示例标签,可确保在翻译过程中文本“%1 $ s”不会更改(否则可能会中断该消息):
当您声明占位符标记时,请始终添加一个id属性,以说明占位符的用途。如果您的应用程序稍后替换了占位符值,请确保提供示例属性以阐明预期用途。
以下是一些占位符标签的例子:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Example placeholder for a special unicode symbol -->
<string name="star_rating">Check out our 5
<xliff:g id="star">\u2605</xliff:g>
</string>
<!-- Example placeholder for a for a URL -->
<string name="app_homeurl">
Visit us at <xliff:g
id="application_homepage">http://my/app/home.html</xliff:g>
</string>
<!-- Example placeholder for a name -->
<string name="prod_name">
Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
</string>
<!-- Example placeholder for a literal -->
<string name="promo_message">
Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>" to get a discount.
</string>
...
</resources>
本地化清单
有关本地化和分发Android应用程序的完整概述,请参阅本地化核对表文档。
本地化提示
设计您的应用程序以在任何语言环境中工作
您不能假设用户运行您的应用的设备。该设备可能具有您未预期的硬件,或者可能设置为您不打算或者无法测试的语言环境。设计您的应用程序,使其正常运行或无论其运行在哪个设备上都会优雅地失败。
重要提示:确保您的应用包含一整套默认资源。
确保包含 res/drawable/
和res/values/
文件夹(文件夹名称中没有任何其他修饰符),其中包含您的应用程序需要的所有图像和文本。
如果某个应用程序即使缺少一个默认资源,也不会在设置为不受支持的区域设置的设备上运行。例如,res/values/strings.xml
默认文件可能缺少应用程序需要的一个字符串:当应用程序在不支持的语言环境中运行并尝试加载时res/values/strings.xml
,用户会看到一条错误消息和一个强制关闭按钮。
有关更多信息,请参阅测试默认资源。
设计灵活的布局
如果您需要重新排列布局以适合特定语言(例如,德语的长词),则可以为该语言创建替代布局(例如res/layout-de/main.xml
)。但是,这样做可能会让您的应用难以维护。最好创建一个更灵活的单一布局。
另一种典型情况是需要不同布局的语言。例如,您可能有一个联系表单,当应用程序以日语运行时应该包含两个名称字段,而当应用程序以其他语言运行时,应该包含三个名称字段。您可以通过以下两种方式之一处理:
- 根据语言或者可以编程启用或禁用的字段创建一个布局
- 主布局包含另一个包含可更改字段的布局。第二个布局可以针对不同的语言有不同的配置。
避免创建比您需要更多的资源文件和文本字符串
您可能不需要为应用中的每个资源创建特定于语言环境的替代方案。例如,res/layout/main.xml
文件中定义的布局 可能在任何语言环境中工作,在这种情况下,不需要创建任何替代布局文件。
另外,您可能不需要为每个字符串创建替代文本。例如,假设如下:
- 您应用的默认语言是美式英语。应用程序使用的每个字符串都是使用美国英语拼写定义的
res/values/strings.xml
。 - 对于一些重要的短语,你想提供英式英语拼写。当您的应用在英国的设备上运行时,您希望使用这些替代字符串。
为此,您可以创建一个名为的小文件 res/values-en-rGB/strings.xml
,其中仅包含应用程序在英国运行时应该不同的字符串。对于所有其他字符串,应用程序将回退到默认值并使用其中定义的内容res/values/strings.xml
。
使用Android Context对象进行手动区域设置查找
您可以使用Context
Android提供的对象查找语言环境:
使用应用翻译服务
该应用翻译服务被整合到游戏控制台,它也是从访问Android的工作室。这是一种快速简便的方式,可以即时报价并向翻译公司下订单。您可以为应用UI字符串,Play商品详情文本,IAP名称和广告活动文本订购翻译为一种或多种语言。
测试本地化应用
在设备上测试
请记住,您正在测试的设备可能与其他地区的消费者可用的设备有很大不同。您设备上可用的区域设置可能与其他设备上可用的区域设置不同。此外,设备屏幕的分辨率和密度可能会有所不同,这可能会影响UI中字符串和绘图的显示。
要更改设备上的区域设置或语言,请使用设置应用程序。
在模拟器上测试
有关使用模拟器的详细信息,请参阅Android模拟器。
创建和使用自定义区域设置
“自定义”区域设置是Android系统图像未明确支持的语言/区域组合。您可以通过在模拟器中创建自定义语言环境来测试应用程序在自定义语言环境中的运行方式。有两种方法可以做到这一点:
- 使用可从应用程序选项卡访问的自定义区域设置应用程序。(创建自定义区域设置后,通过按住区域名称来切换到该区域。)
- 如下所述,从adb shell更改为自定义区域设置。
当您将模拟器设置为Android系统映像中不可用的语言环境时,系统本身将以其默认语言显示。但是,您的应用应该正确定位。
从adb shell更改模拟器语言环境
通过使用adb shell来更改模拟器中的区域设置。
- 选择您想要测试的地区并确定其BCP-47语言标签,例如,加拿大法语将是
fr-CA
。 - 启动一个模拟器。
- 从主机上的命令行shell中运行以下命令:
adb shell
或者如果您连接了设备,请通过添加以下-e
选项来指定您希望仿真器:adb -e shell
- 在adb shell提示符(
#
)下,运行以下命令:用步骤1中的相应代码替换括号内的部分。setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
例如,要用加拿大法语进行测试:
setprop persist.sys.locale fr-CA;stop;sleep 5;start
这会导致模拟器重新启动。(它看起来像是完全重新启动,但不是。)主屏幕再次出现后,重新启动您的应用程序,并使用新的区域设置启动应用程序。
测试默认资源
以下是如何测试应用程序是否包含所需的每个字符串资源:
- 将模拟器或设备设置为您的应用不支持的语言。例如,如果应用程序中有法文字符串
res/values-fr/
但没有任何西班牙字符串res/values-es/
,则将模拟器的区域设置为西班牙语。(您可以使用自定义语言环境应用程序将模拟器设置为不支持的语言环境。) - 运行应用程序。
- 如果应用程序显示错误消息和强制关闭按钮,则可能正在查找不可用的字符串。确保您的
res/values/strings.xml
文件包含应用程序使用的每个字符串的定义。
如果测试成功,请将其重复用于其他类型的配置。例如,如果应用程序具有调用的布局文件, res/layout-land/main.xml
但不包含调用的文件 res/layout-port/main.xml
,则将模拟器或设备设置为纵向方向并查看应用程序是否运行。