本地资源(res)
Android将运行在许多设备的很多地方,为了延伸到更多的用户,你的应用可能运用文本,音频文件,数字,货币,和图形在你的应用中适当的位置使用。
这个文档Android本地资源的最好练习,这个使用原则适用你正在开发的Android项目,无论是你使用的是ADT和 Eclipse, Ant-based tools, or其他的 IDE.
你应该已经有一个Java的应用知识,熟悉安卓资源加载,在xml中用户界面元素的声明,开发思路例如activity的生命周期和国际化和本地化的一般原则
良好的实践使用Android资源框架对于单独的应用程序的本地化方面尽可能多的使用核心Java功能:
你可以将大部分或者全部的你的应用用户界面内容放进资源文件中,如同本文档和Providing Resources中的描述一样
用户界面的行为,另一方面,是使用Java代码,例如,如果用户输入的数据,需要格式化或排序根据地区不同,然后你会使用Java编程方式来处理数据,本文不讨论如何定位您的Java代码
Hello,L10N教程将介绍的使用特定于本地语言环境的资源在本文档中描述的方式创建一个简单的本地化应用程序的步骤。
概述:在Android中的资源转换
资源是文本字符串、布局、声音、图形和其他静态数据在Android应用程序的需求。每个自定义的设备配置应用程序可以包含多个资源集,当用户运行这个应用,Android自动选择和加载设备最匹配的资源
(本文侧重于本地化和语言环境,对于完整描述资源转换和所有类型的配置,您可以指定---屏幕方向,触屏类型,等等,可以查看《Providing Alternative Resources.》)
写应用程序的时候:你创建一组默认的资源,加上替代品在不同地区使用 ---------》
运行应用程序的时候:Android系统选择哪些资源加载,基于设备的场所。
当写Android应用的时候,你创建一个默认的和可替换的资源在应用中,为了创建资源文件,你的本地文件放在特定的res/目录的子目录里面
默认的资源为什么重要:
无论什么时候运行应用,你没有提供一个特定的本地文本,Android会默认的从res/values/strings.xml默认的加载strings,如果默认的文件不存在,或者你的应用缺失一个字符串,那么你的应用将不能够运行,而且会显示一个错误,下面举例说明,当默认的text文件缺失的时候会发生什么
Example:
一个应用的Java代码查找2个strings资源,text_a和text_b,这个应用包含一个本地的资源文件(res/values-en/strings.xml),在英文中定义了text-a和text_b,这个应用也包含默认的资源文件(res/values/strings.xml)其中包含了text_a,但是不包含text_b;
这个应用编译可能没有问题,如果文件缺失,在eclipse的IDE中可能不会强调任何错误
当应用启动的时候,将本地语言设置为英语,这个应用运行可能没有问题,因为( res/values-en/strings.xml
)包含两个需要的text strings(字符串文本)
然而当应用启动在一个非英语设备上的时候,用户会看到一个错误和一个强制关闭的按钮,这个应用不能够加载。
为了防止这个情况,需要确认(res/values/strings.xml)这个文件存在并且,定义好每个需要的字符串,这种情况适用于所有类型的资源,不仅仅是strings资源,您需要创建一个包含所有的资源在您的应用程序调用的默认资源文件的集合-----布局、画板、动画等信息测试( layouts, drawables, animations, etc. Forinformation about testing),查看《Testing for Default Resources.》
本地资源的使用
怎样创建默认的资源:
把默认的文本文件放在下面的路径和名字里面:
res/values/strings.xml
(要求的文件)
Res/values/strings.xml 中的文本字符串应使用的默认语言,将你的应用所使用的的大多数的语言设置为默认语言
默认的资源设置也必须包括任何默认drawables和布局,而且可以包含其他类型的资源例如animations
res/drawable/
(要求目录支持至少一种图形文件,为了能在Google上应用图标)
res/layout/
(需要持有一个XML文件,它定义了目录默认布局)
res/anim/
(其他的文件夹 res/anim-
<限定符> )
res/xml/
(其他的文件夹res/xml-
<限定符> )
res/raw/
(其他的文件夹res/raw-
<限定符> )
小窍门:在你的代码中,查找每个所引用Android资源,确定每一个默认资源是被定义的,也确保默认字符串文件是完整的:本地的字符串文件可以包含字符串的子集,但是默认字符串文件必须包含所有。
怎样创建替换资源
很大一部分的本地化应用程序提供替代文本不同的语言,在某些情况下,您还将提供替代图形、声音、布局和其他特定于本地语言环境的资源。
一个应用可能指定许多的res/<限定符>/文件,每个都有不同的限定符。若要创建为不同区域的替代性资源,你使用一个特定的语言或者语言—地区的组合(资源文件的名字必须符合《Providing Alternative Resources》,否则它就不会编译)
Example:
假设您的应用程序的默认语言是英语,同时你也想所有的text文本使用法语和大部分的语言使用使用日语(日语中除了应用程序的标题),在这种情况下,你可以创建3个替换的strings文件,每一个保存地区特点特定资源的文件
1、 res/values/strings.xml
包含所有的应用中所使用的字符串文本,包括文本字符串命名标题
2、 res/values-fr/strings.xml
包含所有的法语文本,和命名标题
3、 res/values-ja/strings.xml
包含所有的字符串,除了标题
如果在你的Java代码中查找R.string.title,下面在运行时会发生:
如果设置法语以外的任何语言,Android将会加载title从res/values/strings.xml文件中
如果设置的是法语,加载title将会从res/values-fr/strings.xml文件中加载
注意,如果设备设置的是日语,Android查看title将会从res/values-ja/strings.xml
中加载,但是在文件中没有这样的字符串,Android会回到默认值,将会加载res/values/strings文件
哪些资源优先考虑?
如果多个资源文件匹配设备的配置,Android下面的原则将会决定文件的使用,在限定符中可以指定一个资源文件的名字,本地的几乎都是优先的。
Example:
假设应用程序包括一组默认的图形和其他两套图形,每个优化不同的设备设置:
res/drawable/
包含默认的图形
res/drawable-small-land-stylus/
包含图形优化使用的设备预计从手写输入,在横向QVGA低密度的屏幕
res/drawable-ja/
包含使用日语图形优化
如果应用在运行时设备使用日语,Android加载图形会从res/drawable-ja/即使碰巧设备是一个预计手写输入的在横向QVGA低密度的屏幕
例外:唯一的限定符,优先于语言环境选择的过程是 MCC and MNC (mobile country code and mobile network code)
Example:
假设你遇到下面的情况:
应用代码需要R.string.text_a
两个相关的资源文件是可用的
res/values-mcc404/strings.xml 在应用的默认语言中,在这种情况下的英语包含text_a
res/values-hi/strings.xml 在印度语中包含text_a
应用运行在设备配置中:
这个SIM卡连接的是印度手机网络(MCC 404)
语言设置的是印度语(hi)
Android中加载text_a从res/values-mcc404/strings.xml
(在英语中),即使这个设备配置的是印度,因为这个资源选择的过程,Android中MCC匹配超过语言匹配
这些选择过程并不是简单易懂的,请阅读《 How 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,用户将会看到一个错误信息和强制关闭的按钮,eclipse中的IDE不会强调这种错误,当你在设备或者模拟器上设置本地语言环境测试这个应用的时候不会看见这个错误。
更多的信息,请查看《Testing for Default Resources.》
设计一个灵活的布局
如果你需要重新安排你的布局以适应特定的语言(例如德国长单词),您可以创建该语言的替代布局(例如res/layout-de/main.xml),然而这样做可能使您的应用程序难以维护,最好是创建一个更灵活的布局。
另外一下特定的环境需要一些不同的布局,例如,当应用程序运行在日语中的时候,您可能有一个表单形式,应该包括两个名字字段,但三个名字字段当应用程序运行在其他语言的时候,你可以处理这个问题的两个方法:
创建一个布局和一个字段,您可以通过编程方式启用或禁用,基于语言,或者
主布局包括另一个布局,包括改变的布局,第二个布局可以为不同的语言有不同的配置。
避免创建你所需要的更多的资源文件和text字符串资源
你可能不需要为每个资源在您的应用程序创建一个特定于地区的选择,例如,定义一个布局res/layout/main.xml可能在任何区域起作用,在这种情况下,会有不需要创建任何替代布局文件,同样,你可能不需要为每个字符串创建替代文本,例如,以下假设:
您的应用程序的默认语言是美式英语,每一个字符串定义应用程序使用,使用美式英语写法,在res/values/strings.xml
.之中
对于重要的几个短语,你想要提供英式英语写法,您的应用程序运行在一个英国设备上运行时,你想要这些替代字符串时使用。
为了这样做,你可能创建一个小的文件, res/values-en-rGB/strings.xml
,
只包含字符串应该是不同的,当应用程序运行在英国的时候,对于所有剩下的字符串,应用程序将回到默认值并使用定义在 res/values/strings.xml
.中的值
手动查找本地Android上下文对象
你可以查找本地使用Android的上下文对象
String locale = context.getResources().getConfiguration().locale.getDisplayName();
测试本地化应用
在设备上测试
记住,你所测试的设备可能和你在其他地方自定义的设备有很大的不同,你本地的可用区域可能和其他的设备的可用区域不同,同时,设备的分辨率和密度屏幕可能有所不同,这可能影响到strings and drawables的UI显示。
为了改变本地设备的环境,设置应用(Home> Menu > Settings > Locale & text > Select locale)
在模拟器上测试
详细查看模拟器的使用,请查看《Android Emulator.》
创建和使用一个定制的语言环境
“自定义”区域是一个语言/区域组合,Android系统映像并不明确的支持(在Android平台上支持的地区列表看到SDK的版本记录选项卡)你可以测试在自定义的语言环境运行在自定义的模拟器上,下面有两种方法:
可以从Android应用选项卡中使用Android自定义语言环境的应用(创建一个自定义区域后,开关按下和地区名称)
从adb shell改变语言环境,所述如下:
当你设置本地语言环境模拟器,不可用在安卓系统映像,系统本身将显示其默认语言,你的应用,应该正确定位。
从adb shell改变语言环境
为了使用adb shell来改变语言环境
1、 挑选你想要的现场测试和确定它的语言和地区代码,例如fr法国和CA加拿大。
2、 启动模拟器
3、 在主机电脑的命令行,输入一下命令:
adb shell
或者,如果你有一个设备连接,指定您想要添加的模拟器通过添加 –e选项:
adb -e shell
在adb中提示(#),命令行运行:
setprop persist.sys.language [languagecode];setproppersist.sys.country [country code];stop;sleep 5;start
采用步骤1中的代码替换括号中的部分
比如,测试在加拿大法语:
setprop persist.sys.language fr;setproppersist.sys.country CA;stop;sleep 5;start
这样会造成模拟器重启(看起来像是一个完整的重新启动),一旦屏幕再次出现,重新启动您的应用程序(例如在eclipse中点击运行图标)该应用程序将启动新的区域设置。
测试默认的资源
下面是如何测试一个应用程序是否需要包括每一个字符串资源
1、 设置模拟器或设备到您的应用程序不支持的语言,例如,如果应用程序有法语的字符串在res/values-fr/之中,但是没有任何的西班牙语字符串在res/values-es/之中,然后设置模拟器西班牙语的语言环境(您可以使用自定义区域设置应用程序设置仿真程序为不受支持的区域设置)
2、 运行应用
3、 如果应用显示了一个错误信息,并且显示了强制关闭的按钮,它可能是查找到一个字符串是不可用的,确认一下你的res/values/strings.xml文件,应用程序使用包括定义的每一个字符串
如果这个测试成功,重复一下其他的配置类型,例如应用有res/layout-land/main.xml这个布局文件,但是没有res/layout-port/main.xml这个布局文件,然后设置模拟器或设备到竖屏,看看应用程序运行。
本地化清单
这些检查表总结 Android应用程序的本地化的过程,不是所有这些列表将适用于每个应用程序。
规划和设计检查表
选择一个定位策略,您的应用程序将支持哪个国家和哪个语言?你的应用程序的默认国家和语言是什么?当它没有特定的可用资源对于一个给定的地区,你的应用将会有怎样的表现
确定所有需要本地化资源的在你的应用程序中:
考虑您的应用程序的具体细节——文本、图像、声音、音乐、数字、货币、日期和时间。你可能不需要本地化的一切。例如,您不需要本地化文本,用户不会看到,或文化中性图片,图标,表达相同的含义在每一个地区。
考虑广泛的主题。例如,如果您希望在两种文化不同的市场推销应用程序,您可能想要设计你的应用程序UI和现在,各区域在一个完全不同的方式。
设计Java代码尽可能具体化资源
使用R.string和strings.xml文件,而不是硬编码的字符串或字符串常量。
使用R.drawable的R.layout而不是硬编码的画板或布局
内容清单
创建一个完整的默认资源 res/values/
和其他 res/
文件夹,创建默认的资源描述《 Creating Default Resources.》。
获得可靠的静态文本的翻译,包括菜单文本,按钮名称,错误消息,帮助文本。翻译后的字符串在 res/values-
<qualifiers>/strings.xml
文件。
确保您的应用程序正确格式动态文本(例如数字和日期)为每种受支持的语言环境。确保你的应用程序处理单词休息,标点符号,字母排序正确地为每个受支持的语言。
如果有必要,创建你的图形和布局的特定版本,并将其放在res/drawable-
<qualifiers>/
and res/layout-
<qualifiers>/
文件夹
如果您的应用程序需要,创建任何其他本地化内容,;例如,如需要,
创建为每个语言声音的录音文件,。
测试和发布清单
测试您的应用程序为每个受支持的区域设置。如果可能的话,有一个人是在于每个区域设置测试您的应用程序,并给你反馈。
测试默认资源通过加载一个地区所不能提供的设备或模拟器,请查看《Testing forDefault Resources》
测试本地化字符串的横屏和竖屏显示模式
签署应用程序和创建您的最终buildor builds.
,选择适当的语言在Google上上传你的apk文件
第一次翻译文章,感觉有很多不好理解的地方,希望小伙伴们能够多多交流