我們手機升級到android 7.0或購買到最新的android(大于7.0)機后,我們突然發(fā)現(xiàn)在系統(tǒng)設置語言切換的方式上有了很大的區(qū)別。這還好,只要我們按部就班設置好第一第二第N語言,使用上還是無二差別。但是當我們使用我們開發(fā)的app時會發(fā)現(xiàn),切換到繁體中文后,app內的語言會變成英文,甚是恐懼。
現(xiàn)針對語言切換混亂問題,做如下調整(如有不準確地方,還請各位指正):
先看一下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公司開發(fā),后被并入IBM全球化認證中心,由IBM和opensource組織繼續(xù)開發(fā),為軟體應用提供Unicode和全球化的類別庫。
ICU 規(guī)格中的語言代碼,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內并沒有提供此資源,所以系統(tǒng)會采用預設值(默認語言)/values/strings.xml的資源。
假設系統(tǒng)設定語言如下圖

該如何取得目前語言清單? (API Level 24以上)
Log.d(TAG, "LocaleList.getDefault() : " + LocaleList.getDefault().toLanguageTags());``
我們得到的結果如下:
LocaleList.getDefault():zh-Hnat-TW,en-US
按照規(guī)格,系統(tǒng)查找資源檔順序應為:
zh-Hant-TW
zh-Hant
zh-Hant 子項
zh
zh 子項
en-US
en 子項
有趣的是規(guī)格雖如此,但實際上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中分屬不同的兩種語言,系統(tǒng)查詢時。實際為:
zh-Hant-TW
zh-Hant 子項
en-US
en 子項
那么,該如何正確顯示中文呢?
語言代碼-r區(qū)域代碼
臺灣地區(qū)的繁體中文即 zh-rTW (代碼無大小寫之分),詳見 https://developer.android.com/reference/java/util/Locale.html
現(xiàn)在我們回到我的工程目錄里,由于我的工程里已經存在values-zh-rTW和values-zh-rHK文件夾,現(xiàn)在我只要把values-zh(繁體文件夾)里的strings.xml分別拷貝到以上兩個文件夾內,

就可以實現(xiàn)7.0上下都可正常切換(繁體,英文)語言了。
轉自 https://blog.csdn.net/caijinghuacaijinghua/article/details/72870103