2017年10月23日 星期一

Android 7.0 中文開發語言坑

Android 系統支援多國語言,若開發 app 時想要支援不同語系的話,會將 default language string resource 放在 values 目錄中,其他想支援的語系放在 values-XX 目錄中,例如我的 app 想支援英文跟繁體中文,可以將英文放在 values 目錄,繁體中文放在 values-zh 目錄

如此,使用者不管是選擇大陸地區或是香港地區,app 都會顯示繁體中文,這是因為 android 在搜尋 string resource 時,只要是 zh-* 的 locale,找不到 resource 時都會 fallback 到 zh 去,所以 zh-HK 或 zh-CN locale 最後會使用到 values-zh 目錄中的 resource,多年來 app 照著這樣的 locale resource search rule 開發,一直運作的很好,直到 Android N 的出現

在 Android N 上面,若是 app 只在 values-zh 中放入中文,在 values 放入英文,手機語系選擇台灣地區會發現 app 顯示的是英文

這是因為從 Android N 開始,locale system 與 resource search rule 都改變了,但其實改變了也就算了,最坑的地方是這個改變不會向前相容,就算你 app 的 targetSdkVersion 設定是 N 之前的系統也沒用,大概絕大多數中文 app 恐怕都要更新才能在 N 上面顯示中文了,真不知 google 是忘了做向下相容還是真的想要讓許多的 app 做更新來適應這個變化

回來看這次 Android N 的改變,照 google 在 issue tracker 的回應,他覺得所有 zh-* 的 locale 最後都 fallback 到 values-zh 是不對的行為,Android 裡面有演算法會自動找出他覺得最適合的 resource

根據 CLDR,Android N 上,zh 會被自動轉為 zh-Hans,zh-CN 會被轉為 zh-Hans-CN,zh-TW 會被轉為 zh-Hant-TW
 
所以我猜想原本 values-zh 應該會被轉為 values-zh-Hans,也就是 values-zh 預設已經變成簡體中文,而台灣地區的 locale 為 zh-Hant-TW,Android N 找不到 zh-Hant-TW 的 resource就會往上找 zh-Hant,還是找不到就找 default resource 了

這樣看來在 Android N 之後,繁體中文跟簡體中文 resource 的 search tree 為不同的兩個分支,彼此間不會有交集

Reference
https://litotom.com/2017/05/02/android7-locale-language/
http://blog.30sparks.com/android-7-0-locales-chinese-problem/
https://issuetracker.google.com/issues/37102249
https://issuetracker.google.com/issues/37093759

沒有留言:

張貼留言