目錄
- 一、問(wèn)題出現(xiàn)場(chǎng)景
- 二、如何收集需要本地化字符串
前言
首先說(shuō)明為什么要寫這一篇?這一篇的重點(diǎn)是什么?
問(wèn):需要本地化的時(shí)候,你還在一個(gè)個(gè)抽取到Localizable.strings,再翻譯成對(duì)應(yīng)的文本嗎?你不覺(jué)得這樣的方式很笨嗎?如果原本的項(xiàng)目都沒(méi)本地化,那你現(xiàn)在去抽,是不是要抽取到si。。。
你可能會(huì)反問(wèn)我,不一個(gè)個(gè)抽,難道你還能一下子都抽取出來(lái)嗎?是的,我有!這也是我為什么要寫這一篇的原因。如果不是,那網(wǎng)上一大堆的本地化,我何必重復(fù)累訴。
一、問(wèn)題出現(xiàn)場(chǎng)景
為什么會(huì)有這樣的場(chǎng)景出現(xiàn),場(chǎng)景如下:
最近在整理公司的一些老項(xiàng)目的時(shí)候,之前的開(kāi)發(fā)人員,壓根沒(méi)做本地化,導(dǎo)致現(xiàn)在要將項(xiàng)目中的語(yǔ)言根據(jù)當(dāng)?shù)馗某赡沁叺奈淖郑ū热绱蟮娜绮煌瑖?guó)家,小的如不同地區(qū)的方言文字)。如果我一個(gè)個(gè)去每個(gè)文件里抽,那我一天48個(gè)小時(shí)都不夠用,而且一點(diǎn)技術(shù)含量都沒(méi)有,簡(jiǎn)直是弱智的表現(xiàn)。所以,既然"偷懶"作為一個(gè)程序員的"優(yōu)良"品質(zhì),我們就應(yīng)該好好想一想怎么樣才能做到最快最好。所以下面將著重介紹如何高效的處理本地化這一點(diǎn)。
二、如何收集需要本地化字符串
1、基本命令介紹
genstrings -o en.lproj *.m
但是這個(gè)命令只能生成當(dāng)前目錄的,并沒(méi)有遍歷子目錄,所以基本沒(méi)用
附:genstrings命名的基本語(yǔ)法:
genstrings [-a] [-q] [-o <outputDir>] sourcefile
其中參數(shù):
-a 在存在的文件后面追加內(nèi)容
-q 關(guān)閉多個(gè)鍵/值對(duì)的警告
-o 指定輸出目錄
因此如果我們想輸出到en.lproj目錄,則代碼如下:
genstrings -o en.lproj *.m
2、高級(jí)命令介紹
所謂高級(jí),只是多了個(gè)遍歷所有的子目錄文件的方法而已,先忽略這種叫法。即遍歷所有的子目錄文件,去生成Localizable.strings,命令如下:
②高級(jí)命令:
錯(cuò)誤:find ./ -name *.m -print0 | xargs -0 genstrings -o en.lproj("錯(cuò)誤寫法,執(zhí)行無(wú)效, 因?yàn)?.m處兩邊少了雙引號(hào)")
正確:find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj(正確寫法,親測(cè)有效)
等價(jià)于:
正確:find . -name \*.m | xargs genstrings -o en.lproj (正確,未親測(cè))
此命令會(huì)去把當(dāng)前cd到的目錄下的所有文件(含子目錄中的文件)有用到NSLocalizedString函數(shù)的key值都寫到文件里。
兩個(gè)命令執(zhí)行的前提都是你得必須在你所cd到的文件夾下,創(chuàng)建要將生成的Localizable.strings放在什么位置,在上面的命令中是放在en.lproj文件夾中,當(dāng)然這個(gè)名字我們也可以隨便取。最后最后,真正本地化的時(shí)候,需要安裝系統(tǒng)的en.lproj名字來(lái)。
兩個(gè)命令執(zhí)行的結(jié)果都是:如果命令行中的 en.lproj文件夾中沒(méi)有Localizable.strings,那么其會(huì)自動(dòng)創(chuàng)建Localizable.strings文件,并在其中補(bǔ)全東西。如果有,則會(huì)去更新它的內(nèi)容。
3、詳細(xì)操作步驟
通過(guò)終端命令genstrings生成字符串資源文件的步驟如下:
①、構(gòu)造需要本地化的字符串
對(duì)項(xiàng)目中需要本地化的字符串設(shè)置NSLocalizedString,如
NSString *ok = NSLocalizedString(@"OK", @"dialog button");
NSString *ok = NSLocalizedStringFromTable(@"Ok", @"commonTable", @"dialog button");
附:本地化中可能遇到的含格式的字符串的時(shí)候,怎么寫?參考AFNetworking的寫法如下:
[NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode]
②、執(zhí)行命令
打開(kāi)終端,cd到項(xiàng)目文件夾下(包含en.lproj和zh-Hans.lproj)
執(zhí)行上面的命令find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj(正確寫法,親測(cè)有效)
③、生成的資源文件在哪?
答:如果使用NSLocalizedStringFromTable(key, tbl, comment)來(lái)獲取字符串,資源文件會(huì)以tbl參數(shù)作為文件名,比如上訴生成的資源文件為:commonTable.strings
附:執(zhí)行命令遇到的常見(jiàn)問(wèn)題
有時(shí)候執(zhí)行命令后常出現(xiàn)這樣的問(wèn)題,
509D03C5-3AB4-4C1E-A6C5-FF0E60B7876F.png
之前一直以為是命令處理的文件個(gè)數(shù)有限,后來(lái)才發(fā)現(xiàn)原來(lái)是我們的本地化代碼有些地方?jīng)]寫對(duì),或者沒(méi)寫完全。
比如:
①情況1:
1FBDC094-A455-4FED-9E78-14960BB4EFBC.png
或
0A255F9E-DF29-4460-A091-33E2598569F8.png
這種問(wèn)題,可全局查找";替換掉那些語(yǔ)句有問(wèn)題的為", "cjcomment");即可解決問(wèn)題。
②情況2:
下面這個(gè)是括號(hào)沒(méi)對(duì),右括號(hào)是中文的括號(hào),不是英文的(對(duì)于這種問(wèn)題,我們可以搜索中文的括號(hào),將項(xiàng)目中的中文括號(hào),替換成英文括號(hào)即可解決絕大部分問(wèn)題,甚至是全部問(wèn)題)
541E0E79-2BB4-47A4-85F6-54904FF5E263.png
所以,為了解決類似的問(wèn)題,要養(yǎng)成項(xiàng)目中所有的括號(hào),都用英文的括號(hào)表示吧。
End
結(jié)束!



