[转帖]Android应用本地化(Localization)_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3129 | 回复: 0   主题: [转帖]Android应用本地化(Localization)        下一篇 
huizai
注册用户
等级:少校
经验:933
发帖:83
精华:0
注册:2013-6-18
状态:离线
发送短消息息给huizai 加好友    发送短消息息给huizai 发消息
发表于: IP:您无权察看 2013-6-25 16:29:27 | [全部帖] [楼主帖] 楼主

负责人:CuGBabyBeaR

原文链接:http://docs.eoeandroid.com/guide/topics/resources/localization.html

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

本文档描述了本地化Android应用最好的实例。原则上允许您用Eclipse、Ant-based tools、或者其他任何IED搭载ADT来开发Android应用。

您应该已经有了一些Java的工作经验并熟悉Android资源的加载,熟悉在XML中声明用户界面元素,了解一些开发的知识(如Activity的生命周期),了解国际化和本地化的基本原则。

这将是使用Android资源框架来尽可能的分离您应用本地化过的方面和Java功能性代码的一个好的实践:

  • 您可以将您应用的用户界面大部分或所有目录放在您的资源文件夹下,正如本文和Providing Resources中描述的那样。

  • 另一方面来说,用户界面的行为是由您的Java代码驱动的。例如如果用户输入的数据需要格式化或者基于本地选择,您就需要用Java以程序的形式储存这些数据。本文不会涉及如何本地化您的Java代码。

L10N 教程将会一步步教会你以本文描述的方法,使用本地化资源创建一个简单的本地化应用。

概览:Android的资源切换

资源包括文本的字符串、布局文件、声音、图片,以及其他任何您的Android应用所需的静态数据。一个应用可以包含多套资源,每套为不同的设备设置定义。当用户运行应用的时候,Android自动选择并加载最适合设备的资源。

(本文档着眼于本地化和区域设置。更多有关资源切换和您可以指定的所有配置类型信息,例如屏幕方向、触摸屏类型等,请查阅Providing Alternative Resources。)

您在写应用时:
创建一组默认资源,加上在其他不同区域设置下使用的可替换资源。

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

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

默认资源为什么很重要

当应用运行在您没有定义本地文本的某个区域设置时,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文件存在,并定义了您所需的所以字符串。这种情况适用于所有类型的资源,而不仅限于字符串:您需要创建一组包含所有您应用调用到的默认资源文件,如布局,图片,动画等。有关调试的信息,请浏览Localization#默认资源的测试|默认资源的测试。

用资源文件来进行本地化

如何创建默认资源

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

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


:res/values/strings.xml中的文本字符串必须使用默认语言,即为您预期您的用户最经常说的语言。
:默认资源必须同样包括所有默认的图片、布局,并能包含其他类型的资源,例如动画。

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


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

如何创建替换用资源

应用本地化的很大一部分工作是为不同的语言提供替换用的文本。在某些情况下,您同样需要提供替换用的图形、声音、布局、以及其他本地化的资源。
应用可以为不同的修饰符指定很多res//文件���。为了向不同语言提供替换用的资源,您需要使用一个指定为一种语言或者语言-区域组合的修饰符。(资源文件夹的名字必须遵从Providing Alternative Resources中描述的命名方法,否则这些将不会被编译。)

例:
假定您应用的默认语言是英语。同样假定您想将您应用中所有的文本翻译成法语,并将应用中的大部分文本(除开应用标题之外的作用东西)翻译为日语。这样的话,您应该建立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文件中加载英文标题。

哪组资源将获得优先权?

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

  • res/drawable/ 包含默认图像
  • res/drawable-small-land-stylus/ 包含为预期使用stylus输入,并有一个横向的低密度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匹配的优先级提升超过语言匹配。

选择进程并不是始终和本例中显示的那么直接。请阅读Android Finds the Best-matching Resource一节以获得资源选择进程中更为细节的描述。所有的修饰符都在Table 2 of Providing Alternative Resources中以优先权顺序描述并列出了。

在Java代码中引用资源

在您应用的Java代码中,您可以以R.resource_type.resource_name 或者是android.R.resource_type.resource_name的语法来调用资源。获得于此相关的更多信息,请浏览Accessing Resources。

本地化策略

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

您不能假设任何有关用户拿来运行您应用的设备的任何东西。这个设备可能拥有您无法预测的硬件,或有可能将区域设置为一个您没有预想过或者您无法测试的地区。请设计您的应用能够正常实现功能或者软性的失败,而与应用运行在什么设备无关。

重要:请保证您的应用包含了一套完整的默认资源。

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

设计一个灵活的布局

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

另一个典型的情况是有的语言需要在布局文件中请求其他不同的资源。例如,您可能有一个 表单,当应用在日语环境下运行时应该包括两个字段的名字空间,但是在其他语言环境下运行需要三个字段的名字空间。您可以用如下两种方法中的一种来实现:

  • 创建一个布局文件,使之含有一个可以用程序控制显示或者不现实的输入空间。或者
  • 让主要布局文件包含其他的具有可变输入空间的布局���件。被包含的布局文件根据不同的语言有不同的配置。

避免创建过多的资源文件

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

同样的,您可能不必为所有的字符串都创建替换文本。例如,如下假设:

  • 您的应用的默认语言是美国英语。应用用到的每一个字符串都用美国英语的拼写,定义在in res/values/strings.xml文件中
  • 您想为几个重要的短语提供英国英语的拼写。您想让您的应用在英国的设备上运行时使用这些字符串。

为了达到您的目的,您可以创建一个叫做res/values-en-rGB/strings.xml的小文件,仅包括应用在英国运行时需要的不同的字符串。而其他没有定义的字符串,应用将会回到默认语言,并使用定义在res/values/strings.xm中的字符串。

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

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

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


本地化应用的测试

在设备上测试

注意您用来测试的设备的可能与其他地区顾客使用的设备完全不同。您设备的可用区域设置可能与其他的设备不同。同样,设备屏幕的分辨率和密度也可能不同,这可能会影响您的UI上字符串和图片的显示。

请使用Settings应用来改变设备的区域设置(Home > Menu > Settings > Locale & text > Select locale)。

在模拟器上测试

有关使用模拟器的详细信息,请浏览See Android Emulator。

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

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

  • 使用应用列表中提供的Custom Locale应用。(当您创建一个自定义区域设置后,长按名字以切换到此区域设置项。)
  • 在adb shell中切换到一个自定义区域设置,方法在下一节 当您将模拟器设置为一个Android系统镜像中不存在的区域设置时,系统自身会显示为他自己的默认语言。但是,您的应用应该完全本地化了。

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

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

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

启动模拟器。

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

:adb shell

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

:adb -e shell

当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图标),这样您的应用会在新的区域设置下运行。

默认资源的测试

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

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

运行应用

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

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

本地化清单

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

计划和设计清单

  • 选择一个本地化策略。您的应用将支持那些国家以及什么语言?您应用的默认国家和语言是什么?当您的应用在给出的区域设置下没有特定的资源时,应该有什么表现?
  • 分辨您应用中的哪些东西是需要本地化的:
  • * 请考虑您应用中特定的细节-文本、图片、声音、音乐、数字、货币、日期和时间。您或许不需要本地化所有的东西。例如,您不必本地化用户不会* * 看见的文本,或者不带倾向的图片,或者在每个区域设置下都能传达相同意义的图标.
  • 设计您的Java代码使之无论在哪都能可以实例化资源:
  • * 使用R.string和strings.xml文件来取代代码中定义的字符串或者字符串常量。
  • * 使用R.drawable和R.layout来取代代码中定义的图片或布局。

内容清单

  • 在res/values/和其他res/文件夹中创建一组完整的默认资源,正如Localization#创建默认资源一节中描述的那样
  • 获得这些静态文本的可靠翻译,包括菜单文本、按键名、错误信息、以及帮助文本。将这些已翻译的文本放在res/values-/strings.xml文件中。
  • 确信您的应用为每一个支持的区域设置正确的格式化了动态字符(例如数字和日期)。确信您的应用为每一个支持的语言拥有了正确的换行、标点、以及排列顺序。
  • 创建您的应用请求的其他本地化的内容;例如,为每一个语言创建所需要的声音文件。

测试发布清单

  • 在所有支持的区域和语言设置下测试您的应用。如果有可能的话找该区域的本地人来测试您的应用并给您回复。
  • 通过加载设备或模拟器不支持的区域设置来测试默认资源。测试方法见Localization#默认资源的测试一节。
  • 在横向和竖向(landscape and portrait)模式下测试本地化的字符串。
  • 标记您的应用并创建最终版本。
  • 上传您的.apk文件到Google Play,在您上传时选择适当的语言。



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论