先说下国际化的问题。首先,一般认为所谓的国际化不包含逻辑的国际化,那么国际化涉及到的内容就是与广义上的用户UI相关的,包括用户能看到、听到、摸到的东西。当然,摸到东西,一般在软件层面就不探讨了。所以,要国际化,那么就要处理用户能看到的和听到的东西,包括了图片、文字、音乐、音效。很多时候,这个范围会被缩小一些,以降低复杂度。当然,无论如何,国际化的首要问题是解决多语言的问题。

在android系统上,有完整的解决国际化的方法,基本思路是以资源文件的方式将需要国际化的内容隔离出来,而资源所处的文件夹的命名是和语言、国家/地区相关的。系统内部有一个对资源进行分层匹配的算法,以达成用户能够看到与他的语言、地区等最匹配的资源。

下面大概说下开发中对各种资源的处理方法:

文字:一般就是用string.xml文件了。为每一种语言创建一个values-**-r??文件夹,与此语言对应的string.xml放进去就行了。其中**是语言代码,??是国家/区域代码。有一个例外情况是美国英语,系统缺省提供了目录,但命名并未遵守这个规则,命名为en,而不是en-rUS。这些资源也是app可用的保底资源。

图片:处理方法与文字相同,但是目录用drawable-**-r??-%mdpi。其中%代表的是匹配分辨率

音乐、音效等其它资源:比如还会包括app使用的本地网页等。开发环境中并没有针对这些资源提供单独的国际化解决方案,但可以利用相同的思路来解决。一种方法是在assets目录下用不同的目录来保存这些资源。这些资源需要手动判断位置和装载。

语言、国家/地区的选择:多数情况下,采用默认的方法来处理,即app的语言/国家/区域跟随系统设置值。但如果应用提供了系统所不能选择的语言(比如,有些厂商的android手机只能选择有限的几种语言),这种方法就不奏效了。那么,必须在app内部能够选择语言。

举例:

对于一个支持3种语言:en-rUS(美国英语),zh-rCN(简体中文),de-rDE(德国德语)的app而言,目录结构可能是这样的:

文本资源放在res下的

values

values-de-rDE

values-zh-rCN

这三个目录中是与语言对应的string.xml文件

图片资源放在res的如下文件夹下:

drawable-hdpi

drawable-mdpi

drawable-xhdpi

drawable-xxhdpi

以上4个目录存放英语使用的资源。

简体中文使用的图片资源放进res下的四个目录:

drawable-zh-rCN-hdpi

drawable-zh-rCN-mdpi

drawable-zh-rCN-xhdpi

drawable-zh-rCN-xxhdpi

德文使用的图片资源放在rs下的这四个目录:

drawable-de-rDE-hdpi

drawable-de-rDE-mdpi

drawable-de-rDE-xhdpi

drawable-de-rDE-xxhdpi

上面涉及的是文字和图片资源,系统会自动根据语言/国家/地区进行处理。系统不能自动处理的资源用下面的方法来解决。

其它需要国际化的资源放在assets目录下,目录结构是这样的:

音乐文件放在以下3个目录:

assets/music/en

assets/music/zh-rCN

assets/music/de-rDE

音效文件、网页等等都可以按照同样的方法来处理。比如对于网页:

assets/page/en

assets/page/zh-rCN

assets/page/de-rDE

注意:目录命名时,同一种语言的资源,目录名要保持一致

最后一个问题是在app中如何引用这些系统不能自动处理的资源。方法很简单:

在每中语言的string.xml中增加一个语言标记 <string name="language">??</string>,对于三种语言,分别是:

<string name="language">en</string>
<string name="language">zh-rCN</string>
<string name="language">de-rDe</string>

在需要载入music资源时,首先,获取当前语言环境下的的语言标记,对于简体中文,就是zh-rCN,那么与中文相关的music资源就存储在 assets/music/zh-rCN下,直接读取文件就行了。

就这样的。