Android 7.0多语言支持开发浅析

一、Google官方有关多语言的描述


Google官网关于多语言的描述


二、Android 6.0及之前与Android 7.0语言设置的区别


(一)Android 6.0中语言设置界面

在Android 6.0及以前的语言设置都是单一的语言,只能选一种语言

Android 7.0多语言支持开发浅析_第1张图片


(二)Android 7.0的语言设置界面

在Android 7.0开始允许用户在设置的语言配置中选择多个语言设置,像这样

Android 7.0多语言支持开发浅析_第2张图片

点击添加语言,然后选择一种语言就可以添加进来。

Android 7.0多语言支持开发浅析_第3张图片

现在就有两种语言,一般的第一的就相当于是你的母语(譬如中文),第二的相当于是你的第二语言(譬如英文)。

这样有什么作用呢?


三、Android 6.0及之前与Android 7.0加载资源的区别


(一)strings和布局及Activity

1.strings

如果App中设置有默认语言(values)和美国英文(values-en-rUS),values文件夹中,

Android 7.0多语言支持开发浅析_第4张图片

美国英语资源放在values-en-rUS文件夹中,

Android 7.0多语言支持开发浅析_第5张图片


2.布局文件

Android 7.0多语言支持开发浅析_第6张图片


3.Activity文件

Android 7.0多语言支持开发浅析_第7张图片


(二)在Android 6.0中资源加载情况

如果系统语言是简体中文,App就会加载values下的资源,

Android 7.0多语言支持开发浅析_第8张图片Android 7.0多语言支持开发浅析_第9张图片


如果系统语言是美国英文App就会加载values-en-rUS资源,

Android 7.0多语言支持开发浅析_第10张图片Android 7.0多语言支持开发浅析_第11张图片


如果系统语言是英国英文App则会加载默认资源即values资源,但是系统并不知道用户能否看得懂中文.

Android 7.0多语言支持开发浅析_第12张图片Android 7.0多语言支持开发浅析_第13张图片


(二)来看看在Android 7.0中是如何呢?

在设置中只设置简体中文,是加载values的资源。

Android 7.0多语言支持开发浅析_第14张图片Android 7.0多语言支持开发浅析_第15张图片


再设置中添加个美国英语进来并排在简体中文下面,App竟然去加载values-en-rUS资源了,

Android 7.0多语言支持开发浅析_第16张图片Android 7.0多语言支持开发浅析_第17张图片


那我们在App中添加个values-zh的资源,

Android 7.0多语言支持开发浅析_第18张图片


现在系统会去加载values-zh下的资源,

Android 7.0多语言支持开发浅析_第19张图片Android 7.0多语言支持开发浅析_第20张图片


现在再添加个values-zh-rCN的资源,

Android 7.0多语言支持开发浅析_第21张图片


App加载的是values-zh-rCN的资源,

Android 7.0多语言支持开发浅析_第22张图片Android 7.0多语言支持开发浅析_第23张图片


美国英文排第一时位时App也是去加载values-en-rUS资源,

Android 7.0多语言支持开发浅析_第24张图片Android 7.0多语言支持开发浅析_第25张图片


在设置中再添加个英国英文并置为第一位,App一样是去加载values-en-rUS资源,

Android 7.0多语言支持开发浅析_第26张图片Android 7.0多语言支持开发浅析_第27张图片


现在我们在项目中添加个values-en的资源,再来看看在Android 7.0中英文是如何加载的,

Android 7.0多语言支持开发浅析_第28张图片


会发现在系统语言为英国英文的情况下会去加载values-en的资源,

Android 7.0多语言支持开发浅析_第29张图片Android 7.0多语言支持开发浅析_第30张图片


在项目中再添加个英国英语的资源(values-en-rGB)在Android 7.0中又会怎样呢,

Android 7.0多语言支持开发浅析_第31张图片


在系统语言为英国英文的情况下,加载了values-en-rGB的资源

Android 7.0多语言支持开发浅析_第32张图片Android 7.0多语言支持开发浅析_第33张图片


从上面测试种我们可以得出在Android 7.0中资源加载的结论有,

1.App资源的加载首先会去寻找系统语言对应的资源(简体中文),如果找不到会去找系统语言所属的语言(中文),如果没找到就会去找在设置中的其他语言(美国英语)看看有没有对应的资源,如果也没有就会去加载默认资源。

2.App资源的加载首先会去寻找系统语言对应的资源(英国英文),如果没找到的话,会去寻找系统语言所属的语言(英文),如果也没找到的话,就会去寻找系统语言所属的语言的其他分支(美国英文)。

结合以上两条结论可以推出:首先App会去寻找与系统设置的第一语言最匹配的资源,如果没找到就会去寻找系统语言所属的语言的资源,也没找到的话就去找系统语言所属的语言的其他分支资源,如果第一语言的资源都没有找到,就会去看看有没有设置多个语言,如果有就看看有没有和第二语言最匹配的资源,如果没有就会去寻找第二语言所属的语言的资源,还没有的话就去寻找第二语言所属的语言的其他分支的资源,如果也没有,就去找第三语言、第四语言等等语言的资源,如果都没有就去加载默认资源,如果默认资源也没有就异常了。


四、一些坑

(一)坑之一

在系统语言中添加个繁体中文并置为第一语言,美国英语置为第二语言,这样,

Android 7.0多语言支持开发浅析_第34张图片


但App加载出来的却是美国英语,App中明明有values-zh的资源的,

Android 7.0多语言支持开发浅析_第35张图片


先添加个values-zh-rTW的资源再运行看看

Android 7.0多语言支持开发浅析_第36张图片


发现加载的是values-zh-rTW的资源,

Android 7.0多语言支持开发浅析_第37张图片Android 7.0多语言支持开发浅析_第38张图片


那再添加个values-zh-rHK再试试,

Android 7.0多语言支持开发浅析_第39张图片


现在加载的则是values-zh-rHK的资源

Android 7.0多语言支持开发浅析_第40张图片Android 7.0多语言支持开发浅析_第41张图片


在语言设置中添加个香港简体中文

Android 7.0多语言支持开发浅析_第42张图片


但加载到的资源却是values-zh的资源

Android 7.0多语言支持开发浅析_第43张图片


可以推出:中文简体和繁体是分开的,但简体与简体之间或繁体与繁体之间是可以加载到的,并且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();
    }

Android 7.0多语言支持开发浅析_第44张图片Android 7.0多语言支持开发浅析_第45张图片

你可能感兴趣的:(Android,7.X)