2024年3月30日发(作者:)

Android会运行在许多地区的许多设备上。为满足大多数用户的需要,应用程序应该使用与

应用所在地区相适应的文本、音频文件、数字、货币符号、以及图形等。

本文档介绍Android应用程序本地化的最佳实践。这个原则适用于你正在使用的任何IDE

开发工具,如带有ADT的Eclipse、基于Ant的工具等。

首先要掌握Java的编程知识,并且熟悉Android的资源加载过程,以及XML中用户界面元

素的声明方法。在开发方面要掌握Activity的生存周期以及国际化和本地化的一般原则。

使用Android资源框架把应用程序本地化的外观尽可能的与核心Java功能分离,是一个良

好的实践。

1. 可以把大多数或所有的应用程序的用户界面的内容放到资源文件中;

2. 用户界面的行为,以及其他处理,是通过Java代码来驱动的。如,如果用户输入的数据

需要依赖不同的地区来格式化或排序,那么就要使用Java代码来编程处理这些数据。

概要:Android中的资源切换

资源是文本字符串、布局、声音、图形以及Android应用程序中需要的其他静态数据。一个

应用程序能够包含多个资源集,每个都是针对不同的设备配置来定制的。当用户运行应用程

序时,Android会自动的选择并加载跟设备最匹配的资源。

当编写应用程序时,需要创建一组默认的资源,外加用于不同地区的可选资源。

当用户运行应用程序时,Android系统会基于地区来选择加载合适的资源。

在编写应用程序时,要给应用程序创建默认和可选资源。对于这些创建的资源,要把它们放

到res/目录下,特定命名的子目录中的文件中。

为什么默认资源是重要的?

当应用程序运行在一个没有提供特定语言文本的语言环境中时,Android会从

res/values/中加载默认的字符串。如果默认的文件不存在,或者是缺少应用程序需

要的字符串,那么应用程序就不会运行,并且会显示一个错误。下面的示例演示了当默认文

本文件不完整时所发生的问题:

应用程序的Java代码只引用了两个字符串,text_a和text_b。这个应用程序包含了用英语定

义的text_a和text_b的本地资源文件(res/values-en/)。应用程序还包含了一个默

认的资源文件(res/values/),文件中包含了text_a的定义,但没有定义text_b。

1. 应用程序编译时可能不会有问题。像Eclipse这样的IDE,如果资源有错误,它是不会

报告任何错误的。

2. 当应用程序在设置了英语语言环境的设备上启动时,应用程序能够正确运行,因为

res/values-en/中包含了它所需要的文本字符串。

3. 但是,当应用程序在设置了英语以外的其他语言环境的设备上启动这个应用程序时,用

户会看到一个错误信息和强制关闭按钮。

要防止这种情况发生,必须确保res/values/文件存在,并且定义了每个需要字符

串。这适用于所有类型的资源,不只是字符串。你要给应用程序需要的所有类型的资源创建

默认资源文件,包括布局资源、可描画资源、动画资源等。

使用本地化的资源

如何创建默认资源

把应用程序的默认文本放到下面位置和名称的一个文件中:

res/values/

在res/values/中的文本字符串应该使用默认的语言,这种语言是期望大多数应用

程序用户会说的语言。

必须设置的默认资源还包括其他的任何可描画资源和布局资源,以及动画资源。

res/drawable/(这个目录中至少要包含一个图形文件,用于Android启动应用的图标)

res/layout/(这个目录存放定义默认布局的XML文件)

res/anim/(如果需要,可以有任意个res/anim-文件夹)

res/xml/(如果需要,可以有任意个res/xml-文件夹)

res/raw/(如果需要,可以有任意个res/raw-文件夹)

提示:在代码中,检查每个引用的Android资源。确保每个资源都有默认的资源定义,还要

确保默认字符串文件的完整性,本地化字符串文件可以是全部字符串的一个子集,但默认字

符串文件必须要包含全部字符串。

如何创建可选资源

本地化应用程序的大部分工作是给不同的语言提供可选的文本。在某些情况下,还需要提供

可选的图形、声音、布局以及其他特定环境的资源。

应用程序能够用不同的限定符指定许多res//目录。使用特定语言或语言加地区的

组合限定符,能够给不同的语言环境创建可选资源。(资源目录的名称必须是在“提供可选

资源”文档中介绍的命名方案,否则不会被编译。)

例如:

假设应用程序的默认语言是英语。还假设要把应用程序中的文本本地化为法语,并且还想要

应用程序适用于日语环境(除了应用程序的标题以外)。这时需要创建三个可替代的

文件,每个文件被保存在指定的资源目录中:

1. res/values/:包含应用程序使用的所有的英语文本,包括标题的命名文本。

2. res/values-fr/:包含字符串的所有法语文本,包含标题。

3. res/values-ja/:包含除了标题以为的所有字符串的日语文本。

如果Java代码中应用了资源,在运行是会发生下面的情况:

1. 如果设备被设置成法语以外的其他任意语言,那么Android会从res/values/文

件中加载标题。

2. 如果设备被设置成法语语言环境,那么Android就会从res/values-fr/文件中加

载标题。

要注意的是,如果设备是日语环境,那么Android会首先从res/vaues-ja/文件中查

找标题,但是因为这个文件中没有包含标题字符串,所以Android会返回时用默认的标题,

即从res/values/文件中加载标题资源。

Android会优先选择哪个资源?

如果有多个资源文件跟设备配置匹配,Android会使用下列规则来决定使用哪个资源文件。

其中有的在资源目录名中指定了限定符,语言环境几乎始终是要优先选择的。

例如:

假设应用程序包含了一个默认的图形集和两组其他图形,每组都被优化用于不同的设备:

1. res/drawable/:包含默认图形。

2. res/drawable-small-land-stylus/:包含了用于手写笔输入和OVGA低密度横向屏幕设备的

图形。