iOS 本地化 genstrings 一行命令搞定收集(高級(jí))

目錄

  • 一、問(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é)束!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS 的吸引力是全球性的——iOS 用戶生活在許多國(guó)家,并使用多種語(yǔ)言。 您可以通過(guò) 國(guó)際化(internati...
    titvax閱讀 1,174評(píng)論 0 0
  • 前言 語(yǔ)言本地化,又叫做語(yǔ)言國(guó)際化。是指根據(jù)用戶操作系統(tǒng)的語(yǔ)言設(shè)置,自動(dòng)將應(yīng)用程序的語(yǔ)言設(shè)置為和用戶操作系統(tǒng)語(yǔ)言一...
    一只不會(huì)飛的小艷子閱讀 1,812評(píng)論 1 2
  • 字符串資源 本地化過(guò)程的一個(gè)重要部分是本地化應(yīng)用程序顯示的所有文本字符串。根據(jù)其性質(zhì),位于nib文件中的字符串可以...
    nicedayCoco閱讀 393評(píng)論 0 0
  • NSLocalizedString NSLocalizedString 這個(gè)宏是字符串本地化的核心工具。它還有三個(gè)...
    冰魄城主閱讀 1,907評(píng)論 0 0
  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪問(wèn),管理...
    chen_000閱讀 4,148評(píng)論 0 19

友情鏈接更多精彩內(nèi)容