Android的多语言实现

以前就知道Android的多语言实现很简单,可以在不同的语言环境下使用不同的资源什么的,但是一直没有实际使用过。 最近公司的项目要用到多语言于,是就研究了一下——果然很简单啊。
要使用多语言,首先肯定要有为不同语言准备的资源。

只需要按照Android提供的规范,对不同语言下的资源文件夹进行对应的命名即可。
比如我们知道/valus是Android的默认简单资源(字符串、数值、颜色等)的文件夹,那么对不同语言下提供的values文件夹命名方式就形如:

/values-zh
/values-zh-rCN
/values-zh-rTW

其中values保持不变;后缀的zh表示语言;后缀的rCN、rTW其中‘r’是一个标记,表示后面跟着的CN、TW是国家或地区标志。

所以以上三个资源文件夹表示所对应的语言环境分别为:

中文
中文-中国 (即中文简体)
中文-台湾 (即中文繁体)

默认情况下,Android会根据系统的语言地区设置,自动选择对应的资源。

会首先尝试语言地区全匹配,如果没有权匹配的资源包,则会尝试匹配语言,最后则会取默认的。
比如如果Android系统的语言地区是中文简体,则首先会尝试从/values-zh-rCN中获取资源,如果没有此文件夹或者文件夹中没有响应的资源,则会尝试/values-zh,都获取不到的情况下即从/values中获取。
(/values是必须存在的,否则不能通过编译)
当然,也可以在代码中手动进行控制,指定所选择的语言:

1
2
3
Configuration config = getResources().getConfiguration();//获取系统的配置  
config.locale = Locale.TRADITIONAL_CHINESE;//将语言更改为繁体中文
getResources().updateConfiguration(config, getResources().getDisplayMetrics());//更新配置

这里是一个很简单的DEMO:http://download.csdn.net/detail/barryhappy/717670


另外下面的方法只有在新启动的activity中才能生效。

1
2
3
4
5
6
7
public void switchLanguage(Locale locale) {
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = locale; // 简体中文
resources.updateConfiguration(config, dm);
}

新浪微博以及微信都有多语言项,而且都是在设置界面。也就是说除了当前切换语言界面还有其它已启动的activity存在。

新浪微博使用Activity重新启动的方式实现,微信则看似没有重新启动应用。我猜测分析发现其是将现有的activity栈中的除首页外都finish了,然后手动的将首页activity切换语言。这样就完美实现了。

我的项目需求更加简单,只能在登录页面实现多语言的设置,也就代表着activity栈中只有当前activity,只需要将当前activity根据语言的设置手动同步就可以了。


使用getLanguage()方法和getCountry方法,获取系统设置的语言和区域。

1
2
3
4
5
//获取系统当前使用的语言  
String lan = Locale.getDefault().getLanguage();
//获取区域
String country = Locale.getDefault().getCountry();
//设置成简体中文的时候,getLanguage()返回的是zh,getCountry()返回的是cn.