這里不講國(guó)際化的方法冰啃,網(wǎng)上資料挺多的龙致。想要對(duì)已有項(xiàng)目做本地化蛀缝,很多人會(huì)選擇一句句復(fù)制出來(lái)。復(fù)制幾百上千次目代,想想就做不到屈梁。本著偷懶為目的開始思考有沒有更好的解決方案,能把所有字符串提取出來(lái)榛了。
genstrings
于是找到了這個(gè)能把所有需要國(guó)際化的字符串給提取出來(lái)的家伙在讶。
但是他怎么知道哪些字符串是我們需要國(guó)際化的呢?
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]
他的原理其實(shí)就是通過查找這四個(gè)方法中的key霜大,來(lái)提取我們需要國(guó)際化的字符串构哺。你只需要給需要國(guó)際化的字符串,一個(gè)個(gè)套上這個(gè)方法就可以了战坤。
一鍵替換
看完上面說(shuō)得曙强,說(shuō)好的偷懶呢,還是得操作幾百上千次途茫?
冷靜旗扑,先把刀收起來(lái),當(dāng)然也是有偷懶方法滴慈省。
兩張圖很清晰明了臀防,@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?"
這個(gè)正則表示包含中文的字符串(根據(jù)自己需求選擇正則)。NSLocalizedString($0, nil)
,$0即代表查找到的字符串边败。一鍵全局套上方法袱衷,就是這么簡(jiǎn)單。
ps:這樣會(huì)給NSLog中的字符串套上方法笑窜,這些東西肯定是不需要翻譯的致燥。我的方法是全局搜索NSLog(NSLocalizedString(@"
然后替換成NSlog(NSLocalizedString(@"打印:
然后將包含打优沤亍:
的給剔除掉
使用方法
- 進(jìn)入你要提取字符串的文件夾嫌蚤,然后創(chuàng)建輸出目錄购撼。
mkdir en.lproj
- 這行命令的作用就是查找所有文件夾內(nèi)的.m文件撩幽,在en.lproj中生成Localizable.strings文件并將調(diào)用了上述宏的所有key添加上去式矫。
find ./ -name "*.m" | xargs genstrings -o en.lproj
自定義方法使用genstrings
可能有人要說(shuō)了无蜂,國(guó)際化不一定要調(diào)用系統(tǒng)的宏,我可以自己實(shí)現(xiàn)简软。比如我們公司就用了自定義的方法- -
static NSString * LocalizedActivityTrackerString(NSString *key, NSString *comment) {
return [[LocalizableService shareInstance].langBundle localizedStringForKey:key value:key table:@"ActivityTracker"];
}
好在你只需要稍微修改一下上面的命令就可以支持自定義方法了
find ./ -name "*.m" | xargs genstrings -o en.lproj -s LocalizedActivityTrackerString
中文路徑
當(dāng)我在試驗(yàn)項(xiàng)目上取得成功后煤杀,信心滿滿的在項(xiàng)目中使用卻發(fā)現(xiàn)只拉到了幾句字符串汇陆。一頓推理,才發(fā)現(xiàn)是因?yàn)槲覀冺?xiàng)目的文件夾用的都是中文宦搬。畢竟我是新來(lái)的牙瓢,咱也不敢說(shuō)名字不該用中文怪尷尬的。所以我想了個(gè)辦法间校,就是把所有.m文件復(fù)制到一個(gè)文件夾矾克,在那個(gè)文件夾中提取字符串。有相同情況的小伙伴可以借鑒一下
find ./ -name "*.m" | xargs -I x cp x new/
最后展示一下成果憔足,把這個(gè)文件丟給翻譯胁附,到時(shí)候一替換就齊活了。