我们手机升级到android 7.0或购买到最新的android(大于7.0)机后,我们突然发现在系统设置语言切换的方式上有了很大的区别。这还好,只要我们按部就班设置好第一第二第N语言,使用上还是无二差别。但是当我们使用我们开发的app时会发现,切换到繁体中文后,app内的语言会变成英文,甚是恐惧。
现针对语言切换混乱问题,做如下调整(如有不准确地方,还请各位指正):
先看一下android 7.0之前的文件目录(我的工程默认语言是英语):


CN是中文简体文件夹,zh是繁体文件夹,在7.0之前版本,这样写完全没有问题。当升级到7.0后,切换繁体后app却显示的英文。

为什么升级到7.0后繁体找不到了?

对此我们做一个简单测试,分别在6.0和7.0上,来获取当前使用的语言:

Log.d(TAG, "Locale = " + Locale.getDefault().toLanguageTag());

android 6.0
Local = zh-TW

android 7.0
Local = zh-Hant-TW

zh-Hant-TW?这是什么东西

在此我们需要知道,Android 多语言是根据ICU标准制定,使用ICU4J框架

这里就需要我们先了解一下ICU
ICU (International Components for Unicode)是一个开放软体专案,最早由Taligent公司开发,后被并入IBM全球化认证中心,由IBM和opensource组织继续开发,为软体应用提供Unicode和全球化的类别库。
ICU 规格中的语言代码,zh为中文,zh_Hans为简体中文,zh_Hant为繁体中文。在Android中的ICU对照档,光中文就有

  • zh.txt
  • zh_CN.txt
  • zh_HK.txt
  • zh_Hans.txt
  • zh_Hans_CN.txt
  • zh_Hans_HK.txt
  • zh_Hans_MO.txt
  • zh_Hans_SG.txt
  • zh_Hant.txt
  • zh_Hant_HK.txt
  • zh_Hant_MO.txt
  • zh_Hant_TW.txt
  • zh_MO.txt
  • zh_SG.txt
  • zh_TW.txt

    其中
    zh_CN = zh_Hans_CN
    zh_HK = zh_Hant_HK
    zh_MO = zh_Hant_MO
    zh_SG = zh_Hans_SG
    zh_TW = zh_Hant_TW

在7.0之前,resource直接使用zh是没问题的,我们的资源档不就是放在/values-zh/strings.xml中,而升级为7.0以后,查出来的语系为zh-Hant-TW,但是,我们的APP内并没有提供此资源,所以系统会采用预设值(默认语言)/values/strings.xml的资源。

假设系统设定语言如下图

该如何取得目前语言清单? (API Level 24以上)

Log.d(TAG, "LocaleList.getDefault() : " + LocaleList.getDefault().toLanguageTags());

我们得到的结果如下:
LocaleList.getDefault():zh-Hnat-TW,en-US

按照规格,系统查找资源档顺序应为:
zh-Hant-TW
zh-Hant
zh-Hant 子项
zh
zh 子项
en-US
en 子项

有趣的是规格虽如此,但实际上zh-Hant并不会往上找zh及其子项(zh-Hans),但同属zh-Hant的繁体中文(台湾、香港、澳门)则会查询子项。有兴趣深究者请参考 https://android.googlesource.com/platform/external/icu/+/icu56/icu4c/source/data/locales/

由此可见,zh-Hant及zh-Hans虽然都是中文,但在7.0中分属不同的两种语言,系统查询时。实际为:

zh-Hant-TW
zh-Hant 子项
en-US
en 子项

那么,该如何正确显示中文呢?

语言代码-r区域代码

台湾地区的繁体中文即 zh-rTW (代码无大小写之分),详见 https://developer.android.com/reference/java/util/Locale.html

现在我们回到我的工程目录里,由于我的工程里已经存在values-zh-rTW和values-zh-rHK文件夹,现在我只要把values-zh(繁体文件夹)里的strings.xml分别拷贝到以上两个文件夹内,

就可以实现7.0上下都可正常切换(繁体,英文)语言了。

更多相关文章

  1. 谈谈Android中文短信的实现
  2. Android(安卓)SDK 1.5中文版 (Application基础—4)
  3. Android(安卓)SDK 1.5中文版 (Application基础—5)
  4. [送给不懂android的开发者]react-native如何替换android图标资源
  5. 《Java和Android开发实战详解》——1.5节习题
  6. Android(安卓)apk安装过程及Java、JNI读取安装包内assets资源文
  7. Android数据安全之URLEncoder编码
  8. Android实现自定义铃音
  9. android studio修改项目名,模块名,包名

随机推荐

  1. 在Android中自定义IOS风格的按钮
  2. Android中Local Service最本质的作用是什
  3. Android系统调试wifi总结
  4. android 出现gen already exists but is
  5. 设置activity为Dialog类型的设置
  6. Android之 UI主线程ZT
  7. Android(安卓)系统编译
  8. 系出名门Android(8) - 控件(View)之TextS
  9. Android之间互相的录屏直播 --点对点传输
  10. android tabwidget style