Android简繁体翻译到底该放哪儿?
Android开发有着和ISO 639-1与BCP 47相似但不同的语言管理方案。
TL;DR
如果minSdk大于等于24(Android 7, Nougat),根据官方文档,简体中文放values-b+zh+Hans
,繁体中文放values-b+zh+Hant
。
但没人会这么做吧!
如果minSdk小于等于23(Android 6, Marshmallow),经过个人测试,简体中文放values-rCN
,繁体中文放values-rTW
。如果要针对香港特殊翻译,再用values-rHK
,澳门、新加坡同理。
官方文档有坑
讲解如何增加翻译的官方文档和前段时间的Android Dev Summit的一个视频中中,都推荐BCP 47格式(比如values-b+zh+Hans
),但都不提示这是Android 7及之后才支持的格式。
在之前的版本使用该格式时,应用并不会崩溃。但在缺少对应的翻译时,系统会发现新格式包含zh
,进而先显示新格式的简体翻译,没有时显示新格式的繁体翻译。
英文翻译
以情况简单的英文为例,Android系统并没有单独的“英语”的语言选择,而有的是诸如“英语(美国)”、“英语(英国)”和“英语(印度)”等选择。这种情况下Locale.getDefault().toLanguageTag()
将会是en-US
、en-GB
和en-IN
等。
这里可以把英文翻译统一放到values-en
,但通常英语是直接放到values
中作为默认语言。
中文翻译
但简繁体中文并不能统一放到一个文件夹中。Android系统团队显然意识到了类似问题,但Android 7才支持为时已晚(要是AGP向前兼容就好了)。
以情况复杂的繁体中文为例,虽然翻译放到了台湾(values-rTW
),但是:
在Android 5和6中,只有“简体中文”和“繁体中文”两个语言选项。前者对应values-rCN
,后者对应values-rTW
。这里并没有之后系统中,可以选择地区的选项。
从Android 7开始,在选择语言的同时,也必须选择语言的地区。这时就出现了港澳台三地的繁体中文版本。
在个人测试中,以香港繁体中文为例,系统选择values-b+zh+Hant
和values-rTW
或values-rHK
的优先级在不同手机上是不同的。但肯定是繁体中文。
系统也足够智能,如果没有values-rHK
,它会选择values-rTW
,即使这里的地区是台湾而不是用户设置的香港。
系统会选择和用户设置地区不同的文件夹,这里是最反直觉的地方。这是因为找不到地区对应的翻译时,系统会选择同语言的其他地区翻译,来确保至少是语言是正确的。
奖励1
build.gradle
中的指定语言的resConfigs
是要和对应文件夹一致的。比如resConfigs 'en', 'zh-rCN', 'zh-rTW'
奖励2
在Per-app language preferences,Android依然沿用了反直觉的缩写。这里似乎和Locale.toLanguageTag()
是一致的。
更新1
不要假设简体中文只有values-rCN
、values-rSG
等几个地区标签。有的手机允许用户分别任意选择语言和地区,这样会有很多很多的组合。不过文件夹的检测顺序是通用的。
更新2
如何检测应用当前是否是简体中文?
1 | val languageTag = Locale.getDefault().toLanguageTag() |
暂时并没有找到更靠谱的办法。
往对应values
文件夹中放对应语言的标识string
似乎可以,但这让翻译协作变得困难。