Android官方文档—APP资源(Localizing with Resources)

资源本地化

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中的文本字符串应使用默认语言,这是您希望应用程序的大多数用户说出的语言。

默认资源集还必须包括任何默认的drawable和布局,并且可以包括其他类型的资源,例如动画。

res / drawable /(所需目录至少包含一个图形文件,适用于Google Play上的应用程序图标)
    res / layout /(包含定义默认布局的XML文件的必需目录)
    res / anim /(如果你有任何res / anim- <qualifiers>文件夹,则需要)
    res / xml /(如果你有任何res / xml- <qualifiers>文件夹,则需要)
    res / raw /(如果你有任何res / raw- <qualifiers>文件夹,则需要)

提示:在您的代码中,检查对Android资源的每个引用。确保为每个资源定义了默认资源。还要确保默认字符串文件已完成:本地化字符串文件可以包含字符串的子集,但默认字符串文件必须包含所有字符串。

如何创建替代资源

本地化应用程序的很大一部分是为不同语言提供替代文本。在某些情况下,您还将提供替代图形,声音,布局和其他特定于语言环境的资源。

应用程序可以指定许多res / <qualifiers> /目录,每个目录都有不同的限定符。要为其他语言环境创建备用资源,请使用指定语言或语言区域组合的限定符。 (资源目录的名称必须符合提供备用资源中描述的命名方案,否则它将无法编译。)

例:

假设您的应用程序的默认语言是英语。假设您还希望将应用程序中的所有文本本地化为法语,并将应用程序中的大部分文本(除应用程序标题之外的所有内容)本地化为日语。在这种情况下,您可以创建三个备用strings.xml文件,每个文件都存储在特定于语言环境的资源目录中:

1.res/values/strings.xml

包含应用程序使用的所有字符串的英文文本,包括名为title的字符串的文本。

2.res/values-fr/strings.xml

包含所有字符串的法语文本,包括标题。

3.res/values-ja/strings.xml

包含除标题以外的所有字符串的日语文本。

如果你的Java代码引用了R.string.title,那么运行时会发生什么:

  • 如果设备设置为法语以外的任何语言,Android将从res / values / strings.xml文件加载标题。
  • 如果设备设置为法语,Android将从res / values-fr / strings.xml文件加载标题。

请注意,如果设备设置为日语,Android将在res / values-ja / strings.xml文件中查找标题。但是因为该文件中不包含这样的字符串,Android将回退到默认值,并将从res / values / strings.xml文件加载英文标题。

哪些资源优先?

如果多个资源文件与设备的配置匹配,则Android会在决定使用哪个文件时遵循一组规则。在可以在资源目录名称中指定的限定符中,locale几乎总是优先。

例:

假设一个应用程序包括一组默认图形和另外两组图形,每个图形都针对不同的设备设置进行了优化:

  • 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)。

语言设置为印地语(hi)。

即使设备配置为印地语,Android也会从res / values-mcc404 / strings.xml(英文)加载text_a。这是因为在资源选择过程中,Android会优先选择MCC匹配语言匹配。

选择过程并不总是像这些例子所说的那样简单。请阅读Android如何找到最佳匹配资源,以获得更细致的流程描述。所有限定符均按提供替代资源表2中的优先顺序进行描述和列出。

参考Java中的资源

在应用程序的Java代码中,使用语法R.resource_type.resource_name或android.R.resource_type.resource_name来引用资源。有关此内容的更多信息,请参阅访问资源。

本地化核对表

有关本地化和分发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对象进行手动区域设置查找

您可以使用Android提供的Context对象查找语言环境:

String locale = context.getResources().getConfiguration().locale.getDisplayName();

使用App Translation Service

App Translation Service已集成到Developer Console中,也可从Android Studio访问。这是一种快速简单的方法,可以获得即时报价并向翻译公司下订单。您可以为应用UI字符串,Play商品详情文本,IAP名称和广告系列文字订购一种或多种语言的翻译。

测试本地化应用程序


在设备上测试

请记住,您正在测试的设备可能与其他地区的消费者可用的设备有很大不同。您设备上可用的区域设置可能与其他设备上提供的区域设置不同。此外,设备屏幕的分辨率和密度可能会有所不同,这可能会影响UI中字符串和绘图的显示。

要更改设备上的区域设置或语言,请使用“设置”应用程序。

在仿真器上进行测试

有关使用模拟器的详细信息,请参阅请参阅Android模拟器。

创建和使用自定义区域设置

“自定义”区域设置是Android系统映像未明确支持的语言/区域组合。您可以通过在模拟器中创建自定义区域设置来测试应用程序在自定义区域设置中的运行方式。有两种方法可以做到这一点:

  • 使用“自定义区域设置”应用程序,该应用程序可从“应用程(创建自定义区域设置后,按住区域设置名称切换到该区域设置。)
  • 从adb shell更改为自定义区域设置,如下所述。

将模拟器设置为Android系统映像中不可用的语言环境时,系统本身将以其默认语言显示。但是,您的应用程序应正确本地化。

从adb shell更改模拟器区域设置

使用adb shell更改模拟器中的区域设置。

1.选择要测试的区域设置并确定其BCP-47语言标记,例如,Canadian French将是fr-CA。

2.启动模拟器。

3.从主机上的命令行shell,运行以下命令:
adb shell
或者如果您连接了设备,请通过添加-e选项指定您想要模拟器:
adb -e shell

4.在adb shell提示符(#)下,运行以下命令:

setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start

使用步骤1中的相应代码替换括号内的部分。

例如,用加拿大法语进行测试:

setprop persist.sys.locale fr-CA;stop;sleep 5;start

这将导致模拟器重新启动。 (它看起来像完全重启,但事实并非如此。)一旦主屏幕再次出现,重新启动应用程序,应用程序将使用新的语言环境启动。

测试默认资源

以下是测试应用程序是否包含所需的每个字符串资源的方法:

  1. 将模拟器或设备设置为您的应用程序不支持的语言。例如,如果应用程序在res / values-fr /中有法语字符串但在res / values-es /中没有任何西班牙语字符串,则将模拟器的语言环境设置为西班牙语。 (您可以使用“自定义区域设置”应用程序将模拟器设置为不受支持的区域设置。)
  2. 运行该应用程序。
  3. 如果应用程序显示错误消息和强制关闭按钮,则可能正在查找不可用的字符串。确保res / values / strings.xml文件包含应用程序使用的每个字符串的定义。

如果测试成功,请将其重复用于其他类型的配置。例如,如果应用程序有一个名为res / layout-land / main.xml的布局文件,但不包含名为res / layout-port / main.xml的文件,则将模拟器或设备设置为纵向,并查看是否应用程序将运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值