iOS項(xiàng)目:國(guó)際化翻譯端和開發(fā)端自動(dòng)同步

? ? ?作為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地址

demo可能需要自己去配一下路徑

如果本文章有點(diǎn)幫助的像云,請(qǐng)給小弟一個(gè)贊鼓勵(lì)下 嘿嘿

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倒堕,一起剝皮案震驚了整個(gè)濱河市滨攻,隨后出現(xiàn)的幾起案子糯俗,更是在濱河造成了極大的恐慌顶霞,老刑警劉巖肄程,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異选浑,居然都是意外死亡蓝厌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門古徒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拓提,“玉大人,你說(shuō)我怎么就攤上這事隧膘〈” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵疹吃,是天一觀的道長(zhǎng)蹦疑。 經(jīng)常有香客問我,道長(zhǎng)互墓,這世上最難降的妖魔是什么必尼? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上判莉,老公的妹妹穿的比我還像新娘豆挽。我一直安慰自己,他們只是感情好券盅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布帮哈。 她就那樣靜靜地躺著,像睡著了一般锰镀。 火紅的嫁衣襯著肌膚如雪娘侍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天泳炉,我揣著相機(jī)與錄音憾筏,去河邊找鬼。 笑死花鹅,一個(gè)胖子當(dāng)著我的面吹牛氧腰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刨肃,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼古拴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了真友?” 一聲冷哼從身側(cè)響起黄痪,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盔然,沒想到半個(gè)月后桅打,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愈案,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年油额,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻帚。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涩嚣,靈堂內(nèi)的尸體忽然破棺而出崇众,到底是詐尸還是另有隱情,我是刑警寧澤航厚,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布顷歌,位于F島的核電站,受9級(jí)特大地震影響幔睬,放射性物質(zhì)發(fā)生泄漏眯漩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赦抖。 院中可真熱鬧舱卡,春花似錦、人聲如沸队萤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)要尔。三九已至舍杜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赵辕,已是汗流浹背既绩。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留还惠,地道東北人饲握。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吸重,于是被迫代替她去往敵國(guó)和親互拾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,285評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理嚎幸,服務(wù)發(fā)現(xiàn)颜矿,斷路器,智...
    卡卡羅2017閱讀 134,701評(píng)論 18 139
  • 之前一直在糾結(jié)于自己是一個(gè)家庭主婦嫉晶,沒理想沒人生骑疆。看完本書替废,我才明白箍铭,其實(shí)作為女人,家庭是最為珍貴的椎镣。對(duì)生活充滿熱...
    菜小東西閱讀 146評(píng)論 0 1
  • 看了今天的文章感受到很多暖意诈火,人的認(rèn)知改變竟能產(chǎn)生如此大的效果,給自己的生活帶來(lái)切實(shí)的改變状答。今天的文章是關(guān)于見得別...
    雅倩1120閱讀 141評(píng)論 0 0
  • Docker 是一個(gè)開源的應(yīng)用容器引擎冷守。 Docker的應(yīng)用場(chǎng)景 Web 應(yīng)用的自動(dòng)化打包和發(fā)布。 自動(dòng)化測(cè)試和持...
    萬(wàn)總有點(diǎn)菜閱讀 265評(píng)論 1 1