《Android应用资源本地化(Localization.pdf》由会员分享,可在线阅读,更多相关《Android应用资源本地化(Localization.pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Android 会运行在许多地区的许多设备上。为满足大多数用户的需要,应用程序应该使用与应用所在地区相适应的文本、音频文件、数字、货币符号、以及图形等。本文档介绍 Android 应用程序本地化的最佳实践。这个原则适用于你正在使用的任何 IDE开发工具,如带有 ADT 的 Eclipse、基于 Ant 的工具等。首先要掌握 Java 的编程知识,并且熟悉 Android 的资源加载过程,以及 XML 中用户界面元素的声明方法。在开发方面要掌握 Activity 的生存周期以及国际化和本地化的一般原则。使用 Android 资源框架把应用程序本地化的外观尽可能的与核心 Java 功能分离,是一个
2、良好的实践。1.可以把大多数或所有的应用程序的用户界面的内容放到资源文件中;2.用户界面的行为,以及其他处理,是通过 Java 代码来驱动的。如,如果用户输入的数据需要依赖不同的地区来格式化或排序,那么就要使用 Java 代码来编程处理这些数据。概要:Android 中的资源切换 资源是文本字符串、布局、声音、图形以及 Android 应用程序中需要的其他静态数据。一个应用程序能够包含多个资源集,每个都是针对不同的设备配置来定制的。当用户运行应用程序时,Android 会自动的选择并加载跟设备最匹配的资源。当编写应用程序时,需要创建一组默认的资源,外加用于不同地区的可选资源。当用户运行应用程序
3、时,Android 系统会基于地区来选择加载合适的资源。在编写应用程序时,要给应用程序创建默认和可选资源。对于这些创建的资源,要把它们放到 res/目录下,特定命名的子目录中的文件中。为什么默认资源是重要的?当 应 用 程序 运 行在 一 个没 有 提供 特 定 语言 文 本的 语 言环 境 中时,Android 会 从res/values/strings.xml 中加载默认的字符串。如果默认的文件不存在,或者是缺少应用程序需要的字符串,那么应用程序就不会运行,并且会显示一个错误。下面的示例演示了当默认文本文件不完整时所发生的问题:应用程序的 Java 代码只引用了两个字符串,text_a和
4、text_b。这个应用程序包含了用英语定义的 text_a 和 text_b 的本地资源文件(res/values-en/strings.xml)。应用程序还包含了一个默认的资源文件(res/values/strings.xml),文件中包含了 text_a 的定义,但没有定义 text_b。1.应用程序编译时可能不会有问题。像 Eclipse 这样的 IDE,如果资源有错误,它是不会报告任何错误的。2.当应用程序在设置了英语语言环境的设备上启动时,应用程序能够正确运行,因为res/values-en/strings.xml 中包含了它所需要的文本字符串。3.但是,当应用程序在设置了英语以外的
5、其他语言环境的设备上启动这个应用程序时,用户会看到一个错误信息和强制关闭按钮。要防止这种情况发生,必须确保 res/values/strings.xml 文件存在,并且定义了每个需要字符串。这适用于所有类型的资源,不只是字符串。你要给应用程序需要的所有类型的资源创建默认资源文件,包括布局资源、可描画资源、动画资源等。使用本地化的资源 如何创建默认资源 把应用程序的默认文本放到下面位置和名称的一个文件中:res/values/strings.xml 在 res/values/strings.xml 中的文本字符串应该使用默认的语言,这种语言是期望大多数应用程序用户会说的语言。必须设置的默认资源还
6、包括其他的任何可描画资源和布局资源,以及动画资源。res/drawable/(这个目录中至少要包含一个图形文件,用于 Android 启动应用的图标)res/layout/(这个目录存放定义默认布局的 XML 文件)res/anim/(如果需要,可以有任意个 res/anim-文件夹)res/xml/(如果需要,可以有任意个 res/xml-文件夹)res/raw/(如果需要,可以有任意个 res/raw-文件夹)提示:在代码中,检查每个引用的 Android 资源。确保每个资源都有默认的资源定义,还要确保默认字符串文件的完整性,本地化字符串文件可以是全部字符串的一个子集,但默认字符串文件必须
7、要包含全部字符串。如何创建可选资源 本地化应用程序的大部分工作是给不同的语言提供可选的文本。在某些情况下,还需要提供可选的图形、声音、布局以及其他特定环境的资源。应用程序能够用不同的限定符指定许多 res/目录。使用特定语言或语言加地区的组合限定符,能够给不同的语言环境创建可选资源。(资源目录的名称必须是在“提供可选资源”文档中介绍的命名方案,否则不会被编译。)例如:假设应用程序的默认语言是英语。还假设要把应用程序中的文本本地化为法语,并且还想要应用程序适用于日语环境(除了应用程序的标题以外)。这时需要创建三个可替代的strings.xml 文件,每个文件被保存在指定的资源目录中:1.res/
8、values/strings.xml:包含应用程序使用的所有的英语文本,包括标题的命名文本。2.res/values-fr/strings.xml:包含字符串的所有法语文本,包含标题。3.res/values-ja/strings.xml:包含除了标题以为的所有字符串的日语文本。如果 Java 代码中应用了 R.string.title 资源,在运行是会发生下面的情况:1.如果设备被设置成法语以外的其他任意语言,那么 Android 会从 res/values/strings.xml 文件中加载标题。2.如果设备被设置成法语语言环境,那么 Android 就会从 res/values-fr/s
9、trings.xml 文件中加载标题。要注意的是,如果设备是日语环境,那么 Android 会首先从 res/vaues-ja/strings.xml 文件中查找标题,但是因为这个文件中没有包含标题字符串,所以 Android 会返回时用默认的标题,即从 res/values/strings.xml 文件中加载标题资源。Android 会优先选择哪个资源?如果有多个资源文件跟设备配置匹配,Android 会使用下列规则来决定使用哪个资源文件。其中有的在资源目录名中指定了限定符,语言环境几乎始终是要优先选择的。例如:假设应用程序包含了一个默认的图形集和两组其他图形,每组都被优化用于不同的设备:1
10、.res/drawable/:包含默认图形。2.res/drawable-small-land-stylus/:包含了用于手写笔输入和 OVGA 低密度横向屏幕设备的图形。3.res/drawable-ja/:包含了适用于日语环境的图形。如果应用程序运行在配置了日语环境的设备上,那么即使是设备期望使用手写笔,并且屏幕是 QVGA 的低密度屏幕,那么 Android 也会从 res/drawable-ja/目录中加载图形。例外:只有 MCC(移动国家代码)和 MNC(移动网络代码)限定符的优先级要高于语言环境。例如:假设下列场景:1.应用程序的代码调用 R.string.text_a 2.有两个
11、可以利用资源:res/values-mcc404/strings.xml,它包含了 text_a 在英语环境中,应用程序中的默认语言。res/values-hi/strings.xml,它包含了 text_a 在印度语中的字符串。3.应用程序运行在下列配置的设备上:SIM 卡被连接到印度的移动网络(MCC 404)。语言环境被设置为印度语(hi)。即使设备被配置成印度语,Android 系统也会从 res/values-mcc404/strings.xml(英语资源)中加载 text_a。这是因为资源选择的过程中,MCC 的优先级要比语言的优先级高。选择的过程不总是像这个例子这样直截了当。详细
12、内容请阅读“Android 应用资源-访问资源”一节中的“如何查找和匹配最佳资源”。所有的限定符都在“Android 应用资源-提供资源”一节中的表 2 中进行了说明。在 Java 代码中引用资源 在应用程 序的 Java 代 码中,引用资源 的语法 是:R.resource_type.resource_name 或android.R.resource_type.resource_name(Android 系统资源)。本地化策略 设计可以在任何语言环境中工作的应用程序 不能假设应用程序所运行的设备上的任何事情。设备可能有你所不期望的硬件,或者设置了你计划外或没有测试过的语言环境。因此要进行程序
13、设计,以便不管它在什么样设备上都能正常的运行或友好的失败。重要:确保应用程序包含所有默认资源集。确保包括了含有应用程序需要的所有图片和文本的 res/drawable/和 res/values/文件夹(在文件夹名称中不带有任何其他修饰)。如果应用程序遇到了即使是一个默认资源错误,它也不会在那个不支持的设备环境上运行。例如,res/values/strings.xml 默认文件可能缺少一个应用程序需要的字符串,在应用程序运行在一个不支持的语言环境中,并且试图加载 res/values/strings.xml 文件时,用户会看到一个错误消息和一个强制关闭按钮。项 Eclipse 这样的 IDE 不
14、会发现这类错误,在被支持语言环境的设备或模拟器上测试时,不会发现这个问题。设计灵活的布局 如果为了适应某种语言(如用长单词的德语),需要重排布局,那么可以为这种语言创键一个可选的布局(如,res/layout-de/main.xml)。但是,这样做会使应用程序更难维护。更好的办法是创建一个更灵活的单一布局。另一种典型的情况是由于语言的差异对布局的不同需求。如,当应用程序运行在日语环境中时,需要一个包含了两个名称字段的通信录格式,而运行在其他的一些语言中时,需要三个名称字段。有两种方法可以处理这种情况:1.创建一个带有三个字段的布局,然后基于语言环境,用编程的方法启用或禁用其中一个名称字段。2.
15、创建一个主布局,主布局中含有包含了另一个可变字段的子布局。第二个布局能够针对不同的语言进行不同的配置。避免创建多余的资源文件和文本字符串 在应用程 序中 不可能 给每种 资源都 创建 特定语 言环境 的可选 资源。如,定义在res/layout/main.xml 文件中的布局可以在任何语言环境中工作,因此没有必要给任何语言环境都创建可选的布局资源文件。还有,可能不需要给每个字符串都创建可选的文本。如,假设下列情况:1.应用程序的默认语言是美式英语。应用程序使用的每个字符串都使用美式英语的拼写,它们被保存在 res/values/strings.xml 文件中。2.对于一些重要的短语,想要提供英
16、式英语拼写。以便应用程序运行在英国的设备上时使用这些可选资源。要做这件事情,需要创建一个叫做 res/values-en-rGB/strings.xml 的小文件,其中只包含了与在美国运 行时 不同的 字符串。其余 所有 的字符 串,应 用程序 都会 使用被 定义在res/values/strings.xml 文件中的默认字符串。使用 Android的 Context 对象手动的查找设备的语言环境 可以使用 Android 提供的 Context 对象来查找设备的语言环境:String locale=context.getResources().getConfiguration().local
17、e.getDisplayName();测试本地化应用程序 在设备上测试 要记住,你所使用的测试设备可能与其他地区消费者使用的设备有明显的不同。测试设备上的语言环境与其他设备存在差异,还有设备屏幕的分辨率和密度也可能不同,这些都会影响到 UI 中的字符串和可描画资源的显示。使用 Android 系统的设置应用程序(Home-Menu-Settings-Locale&text-Select locale),来改变设备的语言环境,以便在不同的语言环境中测试应用程序。在模拟器上测试 有关使用模拟测试的细节,请看“Android 模拟器”文档。创建和使用定制的语言环境 定制的语言环境是 Android
18、系统镜像没有明确支持的语言/地区组合。(在 SDK 选项的版本注释中可以看到 Android 平台支持的语言环境列表。)通过在模拟器中创建定制的语言环境,可以测试应用程序在定制的语言环境中是怎样运行的。有两种创建定制语言环境的方法:1.使用定制语言环境的应用程序,可以从应用程序选项卡中可以访问这个程序。(创建了定制的语言环境之后,可以通过按住这个定制语言环境名称来进行切换。)2.使用下面介绍的方法,从 adb shell 中改变到定制的语言环境。当把模拟器设置成一个 Android 系统镜像所不支持的语言环境时,系统自己会用它的默认语言来显示。但是应用程序应该正确的本地化。从 adb shel
19、l 中改变模拟器的语言环境 1.选择想要测试的语言环境,并且确定它的语言和地区代码,如法国是 fr、加拿大是 CA;2.启动模拟器;3.在计算机的命令行窗口中,运行下列命令:adb shell 或者,如果有设备已经绑定了,那么通过添加 e 选项来指定想要的模拟器 adb e shell 4.在 adb 的提示符(#)下,运行下面的命令:setprop persist.sys.language language code;setprop persist.sys.country country code;stop;sleep 5;start 用步骤 1 中适当的代码来替换方括号中内容。这回导致模拟
20、器重启。(它看上去好像是完全重启,实际上不是。)一旦主屏重新显示了,就会重载你的应用程序,并且会用新的语言环境来启动启动应用程序。测试默认资源 以下是如何测试应用程序是否包含了它所需要的每一个字符串资源方法:1.把模拟器或设备设置成应用程序所不支持的语言环境。例如,如果应用程序在res/values-fr/目录中有法语的字符串,但在 res/values-es/目录中却没有西班牙语字符串,那么就把模拟器的语言环境设置成西班牙语。(可以使用定制语言环境的应用程序给模拟器设置一个不支持的语言环境。)2.运行应用程序 3.如果应用程序显示了一个错误和强制关闭按钮,那么就可能遇到不可用的字符串。要确保
21、 res/values/strings.xml 文件中包含了应用程序需要的每一个字符串的定义。如果测试成功,那么重复其他配置类型的测试。例如,如果应用程序有一个叫做res/layout-land/main.xml的布局文件,但却没有叫做 res/layout-port/main.xml 的布局文件,那么,就把模拟器设置成纵向方向,并看应用程序的运行结果。发布本地化应用程序 Google Play 是 Android 设备主要的应用程序发布系统。要发布本地化的应用程序,就要给应用程序进行数字签名、赋予版本号以及其他的所有步骤。详细请参照“准备发布”文档。http:/ 如果要把应用程序分成几个.a
22、pk 文件,每个针对一个不同的语言环境,那么要遵循以下原则:1.用相同的证书签署每个.apk 文件,有关更多的信息,请参阅“数字签名策略”。http:/ 2.给每个.apk 文件不同的应用程序名,当前,不可能把两个完全相同的名称的应用程序发布到 Google Play 上。3.在每个.apk 文件上要包含完整的默认资源。本地化 Checklists 这些 Checklist 总结了本地化 Android 应用程序的过程,不是列表中的每一项都适用于每个应用程序。规划和设计 Checklist 选择一个本地化策略。应用程序要支持哪些国家和语言?应用程序的默认国家和语言是什么?当给定的语言环境中没有
23、可用的资源时,应用程序应该如何处理?要识别应用程序中需要本地化的每一件事:1.要考虑应用程序具体的细节-文本、图片、声音、音乐、数字、货币、日期和时间等。不是每件事情都要本地化。如,用于看不到的那些文本就不需要本地化,或者是中性文化的图片、或者是每种语言环境中都表达相同意思的图标。2.要考虑宽泛的主题样式。例如,如果希望把应用程序销售到两个文化差异非常大的市场,就需要给每个语言环境设计完全不同的 UI 和表现。尽可能的把资源设计到 Java 代码的外部:1.使用 R.string 和 strings.xml 文件来代替应编码的字符串和字符串常量;2.使用 R.drawable 和 R.layo
24、ut 来代替硬编码的可描画和布局资源。内容 Checklist 在 res/values/和其他 res/文件夹中创建完整的默认资源集。获取可靠的静态文本的翻译,包括菜单文本、按钮名称、错误消息以及帮助文本。把翻译后的字符串放到对应的 res/values-/strings.xml 文件中。确保应用程序能够为其所支持每种语言环境,提供正确的格式化动态文本(如数字和日期)。确保应用程序能够正确的处理所支持的语言的断句、标点符号以及字母排序。如果需要,要创建特殊语言环境下的图形和布局的版本,并且把它们放到res/drawable-/和 res/layout-/文件夹中。创建应用所需要的任何本地化内容,如给每种支持的语言创建声音记录文件。测试和发布 Checklist 要在每种支持的语言环境中测试应用程序,如果可能,可以让每种语言环境的本地人来测试应用程序,并给出反馈。通过在设备或模拟器上加载应用程序不支持的语言环境来测试默认资源的有效性。在横向和纵向的显示模式中都要测试本地化字符串。给应用程序进行数字签名并编译。把.apk 文件上传到 Google Play,在上传是并选择合适的语言。