Android脚本插件系列(一):安卓国际化多语自动合入脚本
android-scripts 把平时碰到和Android有关的手动操作、人工检查等写成脚本或插件,提高效率和准确度。
Android脚本插件系列(一):安卓国际化多语自动合入脚本
Android脚本插件系列(二):自动打包安装并语音提示脚本
背景
如今越来越多的IT公司都在走国际化,相应的APP也支持国际化。应用国际化首先就是多语言的支持,Android开发支持多语操作比较简洁,在AndroidStudio中分别为不同语言建立相应的values文件夹即可并在其中创建strings.xml(如values、values-ar、values-zh-rCN)。
在这里强调一下values、values-ar这两个文件夹。其中values里的strings.xml是默认使用的文案,在当前手机语言的strings.xml找不到的时候会使用values里的文案,所以一定别忘在values里添加默认的文案,一般添加英文的。values-ar为阿拉伯语言,是一种RTL语言(从右向左)。
一般合入多语的流程是这样的,首先先整理出一份英文的所有的文案,并将该文案写入values文件夹下的strings.xml。然后将该文案交给翻译公司翻译,待翻译的多语返回之后手动把文案写入相应的strings.xml。
碰到的问题
每次发版都要手动合入22种语言的文案,操作僵硬,效率低下。
不同语言返回的文案很有可能出现未转义的特殊字符(例如法语的
j'aime
),导致编译失败,从而要手动一个一个去加转义符。对于
%
在某些情况下会出现不易察觉的问题,如之前向翻译公司提了一条文案为Save %s%%
,是”节省百分之几的意思”(Save 50%
、Save 66%
等等)。%s
是占位符,%
是特殊字符且用反斜杠转义无效,要用%
来转义。然而翻译公司在返回多语时,将%%
都返回为%
(如英文的Save %s%
、中文的节省%s%
、阿拉伯语的حفظ %s%
)。
手动合入多语之后编译是可以通过的,如果合入者不仔细看的话会忽略该问题,当代码运行到使用该多语的对方会Crash抛出UnknownFromatConversionException
异常。合入者没有转义%
的情况还是较容易发现的,因为在不同语言下只要代码运行相应对方必现Crash。
下面详细分析一下合入者在转义了该%
从而产生的问题,之前的合入者合入多语后,在lint的帮助下发现了返回的文案中%
没有转义。于是手动添加%
进行转义,大功告成提交代码,手动测试没有Crash,之后上线进行灰度。一灰的时候发现线上有一个Crash特别高,一看是UnknownFromatConversionException
而且报的就是Save %s%%
这个文案的地方,emmmm这个文案之前合入的时候已经手动把%转义了,不应该抛这个异常的。
看来是合入者在转义的时候转错了,排查的时候发现出现Crash的语言都是ar。ar中的文案为حفظ %s%%
乍一看好像没什么问题,按照从左往右看是没什么毛病的。不过别忘阿拉伯语是从右往左的,现在在来看看右边两个%%
转义之后就是%
,占位符的%就没了所以阿拉伯语中使用该文案会crash,正确的转义写法是حفظ %%s%
。
脚本能做的事
针对以上问题编写了一个脚本,主要功能如下
- 自动合入多语,提高效率
- 对返回的文案进行单双引号正确性检测,并自动纠正
- 对返回的文案进行%正确性检测,发现隐患并自动纠正
效果
因为要输入项目地址、多语返回地址等,所以采用界面化的形式。
选择完项目地址、多语返回地址,输入本次合入注释之后,点击开始合入。