Android 7.0多语言支持开发浅析

版权声明:本文为 cekiasoo 原创文章,转载请务必注明出处! https://blog.csdn.net/cekiasoo/article/details/53012646

一、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提供了个LocaleListLocaleList.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();
    }


展开阅读全文

没有更多推荐了,返回首页