Android 7.0 Locales 中文的處理
若用戶的地區語選擇了香港的話,是會使用 values-zh
的資源的。就算 official document 也是這樣寫的,但在 Android 7.0 (SDK 25)上的實際測試結果卻不是如此。
以往在 TargetSDK=24
時,任何 values-zh-HK
、values-zh-TW
、values-zh-MO
中找不到的話,都會 fallback 去 values-zh
。但到 TargetSDK=25
時,卻只會 fallback 去 values
, 而不是 values-zh
。所以要在 Android 7.0 顯示正體中文(香港)的話,需將文字放在 values-zh-rHK
或 values-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 |
---|---|---|
|
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 |
---|---|---|
|
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 便會只剩下 en
和 zh-rHK
的語言了,不會引起「不知原因」 resolve 問題。