一、Google官方有关多语言的描述
Google官网关于多语言的描述
二、Android 6.0及之前与Android 7.0语言设置的区别
(一)Android 6.0中语言设置界面
在Android 6.0及以前的语言设置都是单一的语言,只能选一种语言
(二)Android 7.0的语言设置界面
在Android 7.0开始允许用户在设置的语言配置中选择多个语言设置,像这样
点击添加语言,然后选择一种语言就可以添加进来。
现在就有两种语言,一般的第一的就相当于是你的母语(譬如中文),第二的相当于是你的第二语言(譬如英文)。
这样有什么作用呢?
三、Android 6.0及之前与Android 7.0加载资源的区别
(一)strings和布局及Activity
1.strings
如果App中设置有默认语言(values)和美国英文(values-en-rUS),values文件夹中,
美国英语资源放在values-en-rUS文件夹中,
2.布局文件
3.Activity文件
(二)在Android 6.0中资源加载情况
如果系统语言是简体中文,App就会加载values下的资源,
如果系统语言是美国英文App就会加载values-en-rUS资源,
如果系统语言是英国英文App则会加载默认资源即values资源,但是系统并不知道用户能否看得懂中文.
(二)来看看在Android 7.0中是如何呢?
在设置中只设置简体中文,是加载values的资源。
再设置中添加个美国英语进来并排在简体中文下面,App竟然去加载values-en-rUS资源了,
那我们在App中添加个values-zh的资源,
现在系统会去加载values-zh下的资源,
现在再添加个values-zh-rCN的资源,
App加载的是values-zh-rCN的资源,
当美国英文排第一时位时App也是去加载values-en-rUS资源,
在设置中再添加个英国英文并置为第一位,App一样是去加载values-en-rUS资源,
现在我们在项目中添加个values-en的资源,再来看看在Android 7.0中英文是如何加载的,
会发现在系统语言为英国英文的情况下会去加载values-en的资源,
在项目中再添加个英国英语的资源(values-en-rGB)在Android 7.0中又会怎样呢,
在系统语言为英国英文的情况下,加载了values-en-rGB的资源
从上面测试种我们可以得出在Android 7.0中资源加载的结论有,
1.App资源的加载首先会去寻找系统语言对应的资源(简体中文),如果找不到会去找系统语言所属的语言(中文),如果没找到就会去找在设置中的其他语言(美国英语)看看有没有对应的资源,如果也没有就会去加载默认资源。
2.App资源的加载首先会去寻找系统语言对应的资源(英国英文),如果没找到的话,会去寻找系统语言所属的语言(英文),如果也没找到的话,就会去寻找系统语言所属的语言的其他分支(美国英文)。
结合以上两条结论可以推出:首先App会去寻找与系统设置的第一语言最匹配的资源,如果没找到就会去寻找系统语言所属的语言的资源,也没找到的话就去找系统语言所属的语言的其他分支资源,如果第一语言的资源都没有找到,就会去看看有没有设置多个语言,如果有就看看有没有和第二语言最匹配的资源,如果没有就会去寻找第二语言所属的语言的资源,还没有的话就去寻找第二语言所属的语言的其他分支的资源,如果也没有,就去找第三语言、第四语言等等语言的资源,如果都没有就去加载默认资源,如果默认资源也没有就异常了。
四、一些坑
(一)坑之一
在系统语言中添加个繁体中文并置为第一语言,美国英语置为第二语言,这样,
但App加载出来的却是美国英语,App中明明有values-zh的资源的,
先添加个values-zh-rTW的资源再运行看看
发现加载的是values-zh-rTW的资源,
那再添加个values-zh-rHK再试试,
现在加载的则是values-zh-rHK的资源
在语言设置中添加个香港简体中文
但加载到的资源却是values-zh的资源
可以推出:中文简体和繁体是分开的,但简体与简体之间或繁体与繁体之间是可以加载到的,并且values-zh是属于简体中文的,这点有点奇怪,不像官网描述那样去加载,可能是个bug。
至于香港、澳门简体中文,Google没有提供对应的最精确的资源文件夹,用values-zh_HK_#Hans、values-zh_MO_#Hans是编译不过的,应该也还是个bug。
(二)坑之二
如果你自定义的Activity是继承自AppCompatActivity的话7.0的加载也是不像官网描述那样的,会加载同语言的资源,如果没有与系统语言对于的资源是不会加载其他语言的资源的,而是去加载默认语言,继承自Activity是正常的,继承自其他Activity的还没试过。
五、Android 7.0多语言列表的获取
Android 7.0提供了个LocaleList类。LocaleList.getDefault()就能获取LocaleList对象,这里演示打印一下语言列表,其他的各位就去看LocaleList有哪些方法。
@TargetApi(Build.VERSION_CODES.N)
public void pringLanguageList() {
LocaleList _LocaleList = LocaleList.getDefault();
for (int i = 0; i < _LocaleList.size(); i++) {
Locale _Locale = _LocaleList.get(i);
Log.v("Language", "Language " + i + " = " + _Locale.toString());
}
}
调用这个pringLanguageList()方法,就打印出添加了的语言列表。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pringLanguageList();
}