Android 7.0 Locales 中文的處理

若用戶的地區語選擇了香港的話,是會使用 values-zh 的資源的。就算 official document 也是這樣寫的,但在 Android 7.0 (SDK 25)上的實際測試結果卻不是如此。

以往在 TargetSDK=24 時,任何 values-zh-HKvalues-zh-TWvalues-zh-MO中找不到的話,都會 fallback 去 values-zh。但到 TargetSDK=25 時,卻只會 fallback 去 values, 而不是 values-zh。所以要在 Android 7.0 顯示正體中文(香港)的話,需將文字放在 values-zh-rHKvalues-zh-rTW 下!

有興趣了解多一點的可看看以下 issues:

https://code.google.com/p/android/issues/detail?id=211776

https://code.google.com/p/android/issues/detail?id=206865

移除 appcompat-v7 的多國言問題

另外,若你有使用 appcompat-v7 的話 (我相信大部份人也有),而你又只提供少部份的語言檔的話,建議在 gradles 中加入 resConfigs 設定,以移走多餘的語言檔。這樣可以令語言 fallback 「正常」一點。

例如以官方 doc 的例子為例,正常情況下會是這樣:

User Settings App Resources Resource Resolution
  1. fr_CH
default (en)
de_DE
es_ES
fr_FR
it_IT
Try fr_CH => Fail
Try fr => Fail
Try children of fr => fr_FR
Use fr_FR

appcompat-v7 的多語言問題

因為 appcompat-v7 有包括世界各國的語言檔,經 gradles 打包後,在最後的 apk 中會有各國的語言(包括 fr_CH)。android 會到 values-fr-CH 找 strings,但因為 strings.xml 裹面只有 appcompat-v7 的內容,而沒有你的 app 所需的 string, android 便會到 values 中找字串了。

User Settings App Resources Resource Resolution
  1. fr_CH
default (en)
de_DE
es_ES
fr_FR
it_IT
Try fr_CH => OK, but string not found
Use default

使用 Android Studio 的 Analyze APK 功能 (Build > Analyze APK)分析 apk ,可看到在 resources.arsc 的 strings type 包含各地語言你沒有使用過的語言檔。

要移除這些多餘的語言設定,可以在 gradles 中加入:

defaultConfig{
    ....
    resConfigs "en", "zh-rHK"
}

這樣,在最終生成的 apk 便會只剩下 enzh-rHK 的語言了,不會引起「不知原因」 resolve 問題。

相關連結