以前发在 CSDN 上, blog.csdn.net/u014443348/…
掘金氛围感觉更好一点,打算慢慢转过来。
最近项目增加多语言的需求,准备冲出中国,走向世界,当然行不行另说,代码肯定是要适配的。
原本只有中文和英文,value 默认为英文,通过配置多语言 value 目录下各语言的 string ,再用 string 获取就可以完成多语言适配。这个应该大家都知道,所以也不过多介绍,DDDD。
既然 android 适配做得这么“好”,那原生的应用肯定也是适配好了,毕竟是走向了世界的。
上一次有个需求,修改了 com.android.bluetooth 这个系统蓝牙应用,增加了一些字符串,当时还没有多语言这个需求,所以只处理了英语和中文。现在要处理多语言不是,那我直接在对应的 values 中添加了就行。
我们来到源码位置中蓝牙应用目录下。
可以看到很多语言的目录,我们只需要在对应语言的 values-xx/string.xml 中增加需要其他语言的翻译就行了。
但是当我修改完了之后,尝试 make 后,推包 apk 到设备上,一运行发现还是默认英文。
这我就有点想不通了,不是配置好了么,而且目录也没错,因为中英是正常的,但是其他语言就默认是英文了,当我拆包 apk 后发现果然资源中只有中英,那这就不奇怪了,都没打包上。
但是我觉得应该不是默认 Aosp 源码 的问题,而是我们项目改了源码的哪里配置,所以只有中英,问了几个同事都不了解这块,于是决定搜下资料看看有没有什么有效的信息。
看到了这篇文章,当然这个修改默认的语言和我们问题不一样,但是我知道了哪个变量控制语言,看起来应该是 PRODUCT_LOCALES 这个变量。
图中说的 sim.mk 文件在我们项目中没有,但是我决定先在 build/target/product 目录下找找该变量在哪些地方用了。
最后可看到这几个文件中有用到,那都打开看一眼。
languages_default.mk 看起来就是支持了所有语言,更加证实了猜想,默认是支持了所有语言,肯定是哪里重新设置了。
接着看下剩下 2 个文件。
languages_full.mk 这个看起来是新增了语言,不是这里的问题。
这个文件有重新设置 PRODUCT_LOCALES ,但是看注释应该是把英语放在最前,然后把其他语言再添加来保证支持其他语言。假设后续没有添加的话,肯定中文也没有,但是我们打包有中文,我们的推测应该没问题,那应该也不是这里的问题。
那如上几个可疑地方已经排除了,那只能扩大位置,在 Aosp 根目录下搜索一次。因为范围大了很多,要等很久,一直又没有进展,我还以为要失望的时候,想要的来了。
可以看到在 device 中对应的 PRODUCT_LOCALES 被重新改为了 zh_CN zh_TW en_US ,这不就是我们打包时看到的那几个语言么,刚好对应上了,如果不出意外的话,我们把支持的需要加在上面就可以了。
而所有的语言格式在之前 languages_default.mk 中已经看过一次,只需要把用到的语言添加上就行,不出意外,重新打包应用,已经有了所有语言了。
不重新推包已经可以确定这次没有问题了,但是为了验证功能肯定是要推包的。
原来是每个多个项目都用一套源码,但是需要在各自的 device 中重新设置下支持的语言,看来是之前有同事拉分支的时候改过,但是也没事,毕竟要的是一个思路嘛,万一以后有其他类似问题,都可以分析排除一下。
记录一下,说不定对其他朋友有帮助。: )
觉得不错可以点赞支持一下。