Android简繁体翻译到底该放哪儿?

Android开发有着和ISO 639-1BCP 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-USen-GBen-IN等。

这里可以把英文翻译统一放到values-en,但通常英语是直接放到values中作为默认语言。

中文翻译

但简繁体中文并不能统一放到一个文件夹中。Android系统团队显然意识到了类似问题,但Android 7才支持为时已晚(要是AGP向前兼容就好了)

以情况复杂的繁体中文为例,虽然翻译放到了台湾(values-rTW),但是:

在Android 5和6中,只有“简体中文”和“繁体中文”两个语言选项。前者对应values-rCN,后者对应values-rTW。这里并没有之后系统中,可以选择地区的选项。

从Android 7开始,在选择语言的同时,也必须选择语言的地区。这时就出现了港澳台三地的繁体中文版本。

在个人测试中,以香港繁体中文为例,系统选择values-b+zh+Hantvalues-rTWvalues-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-rCNvalues-rSG等几个地区标签。有的手机允许用户分别任意选择语言和地区,这样会有很多很多的组合。不过文件夹的检测顺序是通用的。

更新2

如何检测应用当前是否是简体中文?

1
2
3
4
val languageTag = Locale.getDefault().toLanguageTag()
if (languageTag == "zh-CN" || languageTag.startsWith("zh-Hans")) {
// ...
}

暂时并没有找到更靠谱的办法。

往对应values文件夹中放对应语言的标识string似乎可以,但这让翻译协作变得困难。

参考