作为iOS开发实习生生涯的第一个任务,就是喊我调研一个国际化方案,最好是可以实现开发人员这边不用担心翻译的问题,只在意写代码;然后翻译端那边只管翻译,同步工作自动化完成。
做过iOS项目国际化的应该都知道痛点,所有需要翻译的字段都需要挨个添加到Localizable.strings或者其他的一些strings文件里面,这就需要翻译端那边提供翻译,然后开发人员这边挨个添加到里面。 而我的工作就是减少这一步,让开发人员只关心写代码。
我的思路是这样的:
思路很简单,但是要怎么去实施呢?
在开发端:Xcode6之后可以支持导出xliff文件,什么是xliff文件呢?xliff 文件其实就是 针对 string - translation - comment 的一个文件 ,具体导出过程和导入在百度或者谷歌上搜索可以搜索到大片。xliff文件里面包含了所有需要翻译成其他语言的关键字,并且你只需要在开发代码的过程中,将需要翻译的字段通过NSLocallizedString关键字进行标记,导出的时候它会自动获取并导出被NSLocallizedString标记了的关键字。而xliff文件是基于xml样式的,这个下面会讲。类似于这样:
翻译端:翻译端这边给我的要求是,他们只需要关心翻译或者增加删除修改需要翻译的关键字以及翻译过后的字段(很绕口 逃。 所以这时候就出现了问题,最开始我想到的是写一个web端来对xliff文件进行解析,把关键字提取出来供他们翻译,但是仅仅是用前端的话,当翻译后的文件需要重新下载,它很难自动对本地的文件直接进行操作。而!翻译端那边又要求 ,他们觉得下载这个过程太麻烦,不要这个过程;这就很难受了,最后我想了下,最后敲定用客户端(python)来实现这个方式。(当时我其实没接触过python和前端的开发,所以这俩个难度对我来说差别不大)
协作工具当然可以用svn或者git来实现,作为现在多人协助的中间工具,简直不能太适合。
好了,现在背景大概介绍清楚了(我猜应该清楚了。下面开始说说操作流程:
开发端在开发的时候首先利用NSLocallizedString 对需翻译字段进行标记 ---> 在某一特定的时候利用Xcode将xliff文件导出,并上传到git(这里我是写的脚本,) ---> 翻译端在打开客户端的时候,先从git上面pull一次xliff文件,然后读入文件 -----> 呈现信息,翻译中...... ----> 翻译后,点击保存后会将翻译后的自动添加到xliff文件里面,然后上传到git -----> 开发端在每次编译或者安装编译的时候自动从git上面pull xliff文件(这里我也是用脚本做的)
现在流程大概介绍清楚了(我猜应该清楚了。下面开始说说开发思路:
翻译端( 客户端):首先需要三个文件:1、python源代码(翻译人员操作的客户端) 2、需要解析的xliff文件 3、 一个保存关键字和翻译后字段的文件,我这里用的是excel表格。
首先在客户端运行的时候,会自动从git上面pull一次xliff文件(因为有可能在开发端那边增加了字段,pull一次就可以实时同步),然后把xliff里需要翻译的关键字提取出来(因为xliff文件是基于xml格式的,所以提取还是蛮容易的),然后根据提取的字段放入excel表格里面,类似于这样:
然后在python写的客户端是这样的:
点击读入按钮后,会呈现左边的文本。呈现出来的文本是直接从excel文件里面读的(因为对于xliff的操作是开发和翻译都会对它进行操作,所以很可能造成冲突)。 -----> 直接对左边文本进行修改和操作,修改完后点击保存,会进行先对excel进行复写修改,然后根据excel文件的内容对xliff的文件进行修改,并上传到git。
以上就是客户端(翻译端)这边的开发思路,下面是开发端:
开发端这边就比较简单了,写一个脚本,脚本的思路是:每次项目build的时候使用git的diff指令(diff指令是拿项目与本地仓库进行比对,不同的地方会输出),将输出保存成文本,然后对文本进行遍历,如果出现类似于NSLocallizedString 的关键字(代表项目里面有标记需要翻译的字段),就会进行以下操作:首先,对xliff文件进行一次pull,因为可能翻译端那边对翻译有进行改变;其次,根据情况判断是否需要对项目里的xliff文件重新导出(因为可能在开发端这边有新增加的需要翻译的字段);然后让xliff文件与excel文件进行比对修改,因为excel是主要保存翻译的,无论项目里面是否来得及或者没有写上需要翻译的东西,只要翻译端那边翻译了的字段就会在excel里面出现;然后上传并导入xliff文件。
好了,通过上面的一些讲解和开发思路,我想实时同步开发和翻译俩个端的数据是可以实现的,可能上面的讲解对于没接触过国际化的人来说并不是很详细,但是我想做过国际化的人来说应该是能看懂的,如果有不懂的可以联系我vx:zx4652737,也可以给我留言。
后续补充:以上的思路并未考虑到项目的大小,若项目过大,导出和导入xliff文件都会消耗大量的时候,这是在编译的时候承担不起的;那么我们就可以换一种思路:在特定的时候去执行一次导出和导入操作,比如在项目打包的时候去做一次,或者在翻译端那边给出一个反馈之后去做一次。这样算是一种在时机上的一种优化。
demo可能需要自己去配一下路径
如果本文章有点帮助的,请给小弟一个赞鼓励下 嘿嘿