第三部分:Android 应用程序接口指南---第三节:应用程序资源---第四章 本地化

第4章 本地化

Android系统会在很多地区的不同设备上运行。为了能够将应用提供给更多的用户,你的应用应该以不同的方式处理文本、音频文件、数字、货币和图形,以适合于你应用使用的地点。

本文档描述了本地化Android应用最好的实例。原则上允许你用Eclipse、Ant-based tools、或者其他任何搭载ADT的IED来开发Android应用。你应该已经有了一些Java的工作经验并熟悉Android资源的加载,熟悉在XML中声明用户界面元素,了解一些开发的知识(如Activity的生命周期),了解国际化和本地化的基本原则。

4.1 概览:Android的资源切换

资源包括文本的字符串、布局文件、声音、图片,以及其他任何你的Android应用所需的静态数据。一个应用可以包含多套资源,每套为不同的设备设置定义。当用户运行应用的时候,Android自动选择并加载最适合设备的资源。
你在写应用时:创建一组默认资源,加上在其他不同区域设置下使用的可替换资源。

用户运行你的应用时: Android系统基于设备区域设置选择加载哪些资源。

当你在写应用时,你应创建应用使用到的,默认和替换用的资源。为了创建这些资源,你需要将文件放在项目的res/目录下特定的子文件夹中。

4.1.1默认资源为什么很重要

当应用运行在你没有定义本地文本的某个区域设置时,Android会从res/values/strings.xml中加载默认字符串。如果默认文件不存在,或者没有你应用所需的某个字符串时,你的应用将不会运行,并显示一个error。下述的例子将说明当默认文本文件不完全时会发生什么。

例:一个应用的Java代码只引用了两个字符串,text_a和 text_b。这个应用包含了一个以英文定义text_a和text_b的本地化资源文件(res/values-en/strings.xml)。另外还包含了一个定义了text_a但未定义text_b的默认资源文件(res/values/strings.xml)。

这个应用可能编译通过。如果资源不存在,Eclipse等IDE不会提醒此错误。当这个应用在区域设置为英文的设备上运行时,或许也不会出现任何问题,因为 res/values-en/strings.xml 包含所有所需的字符串。但是,当这个应用在语言设置为英文以外的设备上运行是,会看见一个错误信息并出现一个Force Close按钮。这个应用不会加载。为了预防这种情况,请确保res/values/strings.xml文件存在,并定义了你所需的所以字符串。这种情况适用于所有类型的资源,而不仅限于字符串:你需要创建一组包含所有你应用调用到的默认资源文件,如布局,图片,动画等。

4.2 用资源文件来进行本地化

4.2.1如何创建默认资源

将用于应用的默认文本放在这个文件中并置于如下路径:

res/values/strings.xml(必须拥有此目录)

res/values/strings.xml中的文本字符串必须使用默认语言,即为你预期你的用户最经常说的语言。

默认资源必须同样包括所有默认的图片、布局,并能包含其他类型的资源,例如动画。

res/drawable/(必须拥有此目录,必须包含至少一个用于Google Play上应用图标的图形文件。)

res/layout/(必须拥有此目录,定义默认布局的XML文件。)

res/anim/(动画文件)

res/xml/(xml)

res/raw/(外部资源,一般这个文件夹里放入声音)

提示:检查你代码中对每个Android资源的引用。确信每一个引用都有默认资源定义它。同样保证默认字符串是完整的:一个本地化的字符串文件可以是所有字符串的子集,但是默认字符串文件必须包含所有的字符串。

4.2.2如何创建可替换的资源

应用本地化的很大一部分工作是为不同的语言提供替换用的文本。在某些情况下,你同样需要提供替换用的图形、声音、布局、以及其他本地化的资源。应用可以为不同的修饰符指定很多res/<qualifiers>/文件夹。为了向不同语言提供替换用的资源,你需要使用一个指定为一种语言或者语言-区域组合的修饰符。

例: 假定你应用的默认语言是英语。同样假定你想将你应用中所有的文本翻译成法语,并将应用中的大部分文本(除开应用标题之外的作用东西)翻译为日语。这样的话,你应该建立3个可选strings.xml文件,每个都存储在本地化资源文件夹中:

res/values/strings.xml 包含应用用到的所有字符串的英语文本,包括一个命名为title的字符串。

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

res/values-ja/strings.xm 包含除开标题之外,所有字符串的日语文本。

如果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文件中加载英文标题。

4.2.3哪组资源将获得优先权?

如果多个资源文件都匹配设备的配置,Android会遵循一组规则来决定使用哪个文件。通过资源目录名中定义的修饰符,区域设置通常总是会获得优先权。例:假设一个应用包含了一套默认的图像和另外两套图像,每一套都为不同的设备设置优化:

res/drawable/

包含默认图像

res/drawable-small-land/

包含一个横向的低密度QVGA屏幕设备优化的图像。

res/drawable-ja/

包含为日语优化的图像。

如果应用在配置为使用日语的设备上运行时,即使这个设备使用的是stylus输入并且有一个横向的低密度QVGA屏幕, Android也会从res/drawable-ja/中加载图像。

例外:优先级高于区域设置的唯二修饰符是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会从from res/values-mcc404/strings.xml(英文)中加载text_a。 这是因为资源选择过程中,Android会将MCC匹配的优先级提升超过语言匹配。选择进程并不是始终和本例中显示的那么直接。

4.3 本地化策略

4.3.1设计你的应用能够在任何语言设置下工作

你不能假设任何用户只会用某种特定的设备。某些设备可能拥有你无法预测的硬件,或有可能将区域设置为一个你没有预想过或者你无法测试的地区。所以请设计你的应用能够正常实现功能并且与运行在什么设备无关。请保证你的应用包含了一套完整的默认资源。

请保证你的应用包含res/drawable/和res/values/文件夹(文件夹名不要加任何额外的修饰符),这些文件夹包括了你的应用所需的所有图片和文本。 如果一个应用丢失了哪怕是一个默认资源,它都不会在设置为不支持区域的设备上运行。例如,res/values/strings.xml默认文件可能缺少一个应用需要的字符串:当应用在不支持区域上运行并试图加载res/values/strings.xml时,用户将会看见一个错误信息和一个Force Close按钮。像Eclipse那样的IDE不会提醒这种错误,并且当你在设置为受支持区域设置的设备或者仿真机上测试你的应用时不会发现这个问题。

4.3.2设计一个灵活的布局

如果你需要为一个已存在的语言(例如带有长单词的德语)重新设计你的布局文件,你可以为此种语言创建一个可替换的布局文件(例如res/layout-de/main.xml)。但是这会使你的应用难于维护。更好的方法是只建立一个更加灵活布局文件。

另一个典型的情况是有的语言需要在布局文件中请求其他不同的资源。例如,你可能有一个 表单,当应用在日语环境下运行时应该包括两个字段的名字空间,但是在其他语言环境下运行需要三个字段的名字空间。这样你可以让主要布局文件包含其他的具有可变性的布局文件。被包含的布局文件根据不同的语言有不同的配置。

4.3.3避免创建过多的资源文件

你或许并不需要在你的应用中为每一个资源都创建一个本地化的替换资源。例如,在res/layout/main.xml文件中定义的布局应该能够用在任何区域设置下,这样你就不必再创建一个替换用的布局文件。同样的,你可能不必为所有的字符串都创建替换文本。例如,如下假设:

你的应用的默认语言是美国英语。应用用到的每一个字符串都用美国英语的拼写,定义在in res/values/strings.xml文件中你想为几个重要的短语提供英国英语的拼写。你想让你的应用在英国的设备上运行时使用这些字符串。为了达到你的目的,你可以创建一个叫做res/values-en-rGB/strings.xml的小文件,仅包括应用在英国运行时需要的不同的字符串。而其他没有定义的字符串,应用将会回到默认语言,并使用定义在res/values/strings.xm中的字符串。

4.3.4使用Android Context对象手动获取区域设置

你可以使用Android提供的Context对象获取区域设置:

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

 

4.4 本地化应用测试

4.4.1在设备上测试

注意你用来测试的设备的可能与其他地区顾客使用的设备完全不同。你设备的可用区域设置可能与其他的设备不同。同样,设备屏幕的分辨率和密度也可能不同,这可能会影响你的UI上字符串和图片的显示。请使用Settings应用来改变设备的区域设置(Home > Menu > Settings > Locale & text > Select locale)。

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

一个自定义区域设置是一个android系统镜像并没有明确支持的“语言/区域”组合。(在SDK 标签中的Version Notes获取Android平台支持的区域设置列表)。你可以通过在模拟器上创建一个自定义区域设置,来测试你的应用是如何在自定义区域设置下工作的。有两种方法来做到:

◆使用应用列表中提供的Custom Locale应用。(当你创建一个自定义区域设置后,长按名字以切换到此区域设置项。)

◆在adb shell中切换到一个自定义区域设置

当你将模拟器设置为一个Android系统镜像中不存在的区域设置时,系统自身会显示为他自己的默认语言。但是,你的应用应该完全本地化了。

4.4.3在ADB shell中改变模拟器的区域设置

1.通过使用ADB shell来改变模拟器的区域设置。

选择你想测试的区域设置,并确定它的语言和地区码,例如fr是法语而CA是加拿大。

2.启动模拟器。

3.在主机命令行中运行如下命令:

adb shell

或者你有一个附属设备,请通过添加一个-e参数来指定:

adb -e shell

4.当adb shell显示#的时候,运行如下命令:

setprop persist.sys.language [language code];setprop persist.sys.country [country code];stop;sleep 5;start

用第一步中决定的代码替换方括号。

 

例如,在加拿大法语环境下测试:

setprop persist.sys.language fr;setprop persist.sys.country CA;stop;sleep 5;start

这会导致模拟器重启(这可能看起来像完全的冷重启动,但它不是。)当桌面重新出现时,重新运行你的应用(例如,在Eclipse中点击Run图标),这样你的应用会在新的区域设置下运行。

4.4.4默认资源的测试

这是测试应用是否包含了所有所需字符串资源的方法。

1.设置模拟器或者设备为你的应用所不支持的语言。例如,如果应用在res/values-fr/文件夹中有法语字符串,但res/values-es/中没有任何西班牙语字符串,那就将模拟器的语言设置为西班牙语。(你可以使用Custom Locale应用来将模拟器设置为不支持的区域。)

2.运行应用

3.如果应用显示了一个错误信息和一个Force Close按钮,这可能表示不能加载某个字符串。请保证res/values/strings.xml文件拥有应用用到的所有字符串。

如果这个测试通过,在其他类型的设置下重复此测试。例如,如果应用拥有一个叫做res/layout-land/main.xml的布局文件,但不包含叫做res/layout-port/main.xml的文件,然后设置模拟器或者设备为portrait,试试这个应用是否能够运行。

 

4.5 本地化清单

此清单总结了本地化Android应用的进程。并非此列表中的所有项都适用于任何应用。

4.5.1计划和设计清单

选择一个本地化策略。你的应用将支持那些国家以及什么语言?你应用的默认国家和语言是什么?当你的应用在给出的区域设置下没有特定的资源时,应该有什么表现?

分辨你应用中的哪些东西是需要本地化的:

◆请考虑你应用中特定的细节-文本、图片、声音、音乐、数字、货币、日期和时间。你或许不需要◆本地化所有的东西。例如,你不必本地化用户不会看见的文本,或者不带倾向的图片,或者在每个区域设置下都能传达相同意义的图标。

设计你的Java代码使之无论在哪都能可以实例化资源:

◆使用R.string和strings.xml文件来取代代码中定义的字符串或者字符串常量。

◆使用R.drawable和R.layout来取代代码中定义的图片或布局。

4.5.2内容清单

◆在res/values/和其他res/文件夹中创建一组完整的默认资源

◆获得这些静态文本的可靠翻译,包括菜单文本、按键名、错误信息、以及帮助文本。将这些已翻译的文本放在res/values-<qualifiers>/strings.xml文件中。

◆确信你的应用为每一个支持的区域设置正确的格式化了动态字符(例如数字和日期)。确信你的应用为每一个支持的语言拥有了正确的换行、标点、以及排列顺序。

◆创建你的应用请求的其他本地化的内容;例如,为每一个语言创建所需要的声音文件。

4.5.3测试发布清单

◆在所有支持的区域和语言设置下测试你的应用。如果有可能的话找该区域的本地人来测试你的应用并给你回复。

◆通过加载设备或模拟器不支持的区域设置来测试默认资源。

◆在横向和竖向(landscape and portrait)模式下测试本地化的字符串。

◆标记你的应用并创建最终版本。

◆上传你的.apk文件到Google Play,在你上传时选择适当的语言。

 本文来自jy02432443,是本人辛辛苦苦一个个字码出来的,转载请保留出处,并保留追究法律责任的权利 QQ78117253 

posted @ 2013-12-23 11:54  jy02432443  阅读(742)  评论(0编辑  收藏  举报