? ? ?作為iOS開發(fā)實(shí)習(xí)生生涯的第一個(gè)任務(wù),就是喊我調(diào)研一個(gè)國(guó)際化方案稿饰,最好是可以實(shí)現(xiàn)開發(fā)人員這邊不用擔(dān)心翻譯的問題锦秒,只在意寫代碼;然后翻譯端那邊只管翻譯喉镰,同步工作自動(dòng)化完成旅择。
? ? 做過(guò)iOS項(xiàng)目國(guó)際化的應(yīng)該都知道痛點(diǎn),所有需要翻譯的字段都需要挨個(gè)添加到Localizable.strings或者其他的一些strings文件里面侣姆,這就需要翻譯端那邊提供翻譯生真,然后開發(fā)人員這邊挨個(gè)添加到里面脖咐。 ? 而我的工作就是減少這一步,讓開發(fā)人員只關(guān)心寫代碼汇歹。
? ?我的思路是這樣的:
? 思路很簡(jiǎn)單屁擅,但是要怎么去實(shí)施呢?
? ? ?在開發(fā)端:Xcode6之后可以支持導(dǎo)出xliff文件产弹,什么是xliff文件呢派歌?xliff 文件其實(shí)就是 針對(duì) string - translation - comment 的一個(gè)文件 ?,具體導(dǎo)出過(guò)程和導(dǎo)入在百度或者谷歌上搜索可以搜索到大片痰哨。xliff文件里面包含了所有需要翻譯成其他語(yǔ)言的關(guān)鍵字胶果,并且你只需要在開發(fā)代碼的過(guò)程中,將需要翻譯的字段通過(guò)NSLocallizedString關(guān)鍵字進(jìn)行標(biāo)記斤斧,導(dǎo)出的時(shí)候它會(huì)自動(dòng)獲取并導(dǎo)出被NSLocallizedString標(biāo)記了的關(guān)鍵字早抠。而xliff文件是基于xml樣式的,這個(gè)下面會(huì)講撬讽。類似于這樣:
? ? 翻譯端:翻譯端這邊給我的要求是蕊连,他們只需要關(guān)心翻譯或者增加刪除修改需要翻譯的關(guān)鍵字以及翻譯過(guò)后的字段(很繞口 ? 逃。 ? 所以這時(shí)候就出現(xiàn)了問題游昼,最開始我想到的是寫一個(gè)web端來(lái)對(duì)xliff文件進(jìn)行解析甘苍,把關(guān)鍵字提取出來(lái)供他們翻譯,但是僅僅是用前端的話烘豌,當(dāng)翻譯后的文件需要重新下載载庭,它很難自動(dòng)對(duì)本地的文件直接進(jìn)行操作。而廊佩!翻譯端那邊又要求 囚聚,他們覺得下載這個(gè)過(guò)程太麻煩,不要這個(gè)過(guò)程标锄;這就很難受了顽铸,最后我想了下,最后敲定用客戶端(python)來(lái)實(shí)現(xiàn)這個(gè)方式鸯绿。(當(dāng)時(shí)我其實(shí)沒接觸過(guò)python和前端的開發(fā)跋破,所以這倆個(gè)難度對(duì)我來(lái)說(shuō)差別不大)
? 協(xié)作工具當(dāng)然可以用svn或者git來(lái)實(shí)現(xiàn),作為現(xiàn)在多人協(xié)助的中間工具瓶蝴,簡(jiǎn)直不能太適合毒返。
? 好了,現(xiàn)在背景大概介紹清楚了(我猜應(yīng)該清楚了舷手。下面開始說(shuō)說(shuō)操作流程:
? ? 開發(fā)端在開發(fā)的時(shí)候首先利用NSLocallizedString ?對(duì)需翻譯字段進(jìn)行標(biāo)記 ? ? ---> ? ? 在某一特定的時(shí)候利用Xcode將xliff文件導(dǎo)出拧簸,并上傳到git(這里我是寫的腳本,) ? ---> ? ?翻譯端在打開客戶端的時(shí)候男窟,先從git上面pull一次xliff文件盆赤,然后讀入文件 ? ?-----> ? ?呈現(xiàn)信息贾富,翻譯中...... ? ----> ? 翻譯后,點(diǎn)擊保存后會(huì)將翻譯后的自動(dòng)添加到xliff文件里面牺六,然后上傳到git ? ? ?-----> ? 開發(fā)端在每次編譯或者安裝編譯的時(shí)候自動(dòng)從git上面pull xliff文件(這里我也是用腳本做的)
? ? 現(xiàn)在流程大概介紹清楚了(我猜應(yīng)該清楚了颤枪。下面開始說(shuō)說(shuō)開發(fā)思路:
? ? ?翻譯端( 客戶端):首先需要三個(gè)文件:1、python源代碼(翻譯人員操作的客戶端) ?2淑际、需要解析的xliff文件 ?3畏纲、 一個(gè)保存關(guān)鍵字和翻譯后字段的文件,我這里用的是excel表格春缕。
? ? 首先在客戶端運(yùn)行的時(shí)候盗胀,會(huì)自動(dòng)從git上面pull一次xliff文件(因?yàn)橛锌赡茉陂_發(fā)端那邊增加了字段,pull一次就可以實(shí)時(shí)同步)锄贼,然后把xliff里需要翻譯的關(guān)鍵字提取出來(lái)(因?yàn)閤liff文件是基于xml格式的票灰,所以提取還是蠻容易的),然后根據(jù)提取的字段放入excel表格里面宅荤,類似于這樣:
然后在python寫的客戶端是這樣的:
點(diǎn)擊讀入按鈕后屑迂,會(huì)呈現(xiàn)左邊的文本。呈現(xiàn)出來(lái)的文本是直接從excel文件里面讀的(因?yàn)閷?duì)于xliff的操作是開發(fā)和翻譯都會(huì)對(duì)它進(jìn)行操作膘侮,所以很可能造成沖突)屈糊。 ? -----> ? ?直接對(duì)左邊文本進(jìn)行修改和操作,修改完后點(diǎn)擊保存琼了,會(huì)進(jìn)行先對(duì)excel進(jìn)行復(fù)寫修改,然后根據(jù)excel文件的內(nèi)容對(duì)xliff的文件進(jìn)行修改夫晌,并上傳到git雕薪。
以上就是客戶端(翻譯端)這邊的開發(fā)思路,下面是開發(fā)端:
? ? 開發(fā)端這邊就比較簡(jiǎn)單了晓淀,寫一個(gè)腳本所袁,腳本的思路是:每次項(xiàng)目build的時(shí)候使用git的diff指令(diff指令是拿項(xiàng)目與本地倉(cāng)庫(kù)進(jìn)行比對(duì),不同的地方會(huì)輸出),將輸出保存成文本凶掰,然后對(duì)文本進(jìn)行遍歷燥爷,如果出現(xiàn)類似于NSLocallizedString ? ?的關(guān)鍵字(代表項(xiàng)目里面有標(biāo)記需要翻譯的字段),就會(huì)進(jìn)行以下操作:首先懦窘,對(duì)xliff文件進(jìn)行一次pull前翎,因?yàn)榭赡芊g端那邊對(duì)翻譯有進(jìn)行改變;其次畅涂,根據(jù)情況判斷是否需要對(duì)項(xiàng)目里的xliff文件重新導(dǎo)出(因?yàn)榭赡茉陂_發(fā)端這邊有新增加的需要翻譯的字段)港华;然后讓xliff文件與excel文件進(jìn)行比對(duì)修改,因?yàn)閑xcel是主要保存翻譯的午衰,無(wú)論項(xiàng)目里面是否來(lái)得及或者沒有寫上需要翻譯的東西立宜,只要翻譯端那邊翻譯了的字段就會(huì)在excel里面出現(xiàn)冒萄;然后上傳并導(dǎo)入xliff文件。
好了橙数,通過(guò)上面的一些講解和開發(fā)思路尊流,我想實(shí)時(shí)同步開發(fā)和翻譯倆個(gè)端的數(shù)據(jù)是可以實(shí)現(xiàn)的,可能上面的講解對(duì)于沒接觸過(guò)國(guó)際化的人來(lái)說(shuō)并不是很詳細(xì)灯帮,但是我想做過(guò)國(guó)際化的人來(lái)說(shuō)應(yīng)該是能看懂的崖技,如果有不懂的可以聯(lián)系我vx:zx4652737,也可以給我留言施流。
后續(xù)補(bǔ)充:以上的思路并未考慮到項(xiàng)目的大小响疚,若項(xiàng)目過(guò)大,導(dǎo)出和導(dǎo)入xliff文件都會(huì)消耗大量的時(shí)候瞪醋,這是在編譯的時(shí)候承擔(dān)不起的忿晕;那么我們就可以換一種思路:在特定的時(shí)候去執(zhí)行一次導(dǎo)出和導(dǎo)入操作堰燎,比如在項(xiàng)目打包的時(shí)候去做一次厚脉,或者在翻譯端那邊給出一個(gè)反饋之后去做一次殊鞭。這樣算是一種在時(shí)機(jī)上的一種優(yōu)化接谨。
demo可能需要自己去配一下路徑
如果本文章有點(diǎn)幫助的像云,請(qǐng)給小弟一個(gè)贊鼓勵(lì)下 嘿嘿