一個(gè)NB的補(bǔ)救項(xiàng)目國(guó)際化的方案

寫在前面

iOS 多語(yǔ)言版本的開(kāi)發(fā)(二)中我們實(shí)現(xiàn)了如何讓用戶自己去切換系統(tǒng)語(yǔ)言的功能,我們還寫了Demo以供輔助學(xué)習(xí);但是,繼以上兩篇文章都是建立在項(xiàng)目剛剛啟動(dòng)或啟動(dòng)不久,項(xiàng)目中存在的中文字符串還不是很多,手動(dòng)改起來(lái)也還可以接受; 那么問(wèn)題來(lái)了,如果項(xiàng)目已經(jīng)竣工或者已經(jīng)迭代幾個(gè)版本了,那該如何實(shí)現(xiàn)了?手動(dòng)改起來(lái)也不太現(xiàn)實(shí),耗時(shí)耗力不討好的手動(dòng),在這里就不用考慮了。 不讓考慮,是因?yàn)槲矣懈?jiǎn)單快捷高效的方法,讓我慢慢與您道來(lái);

如何辨別項(xiàng)目中的中文字符串?

既然要替換項(xiàng)目中使用到的中文字符串,那么前提就必須要先找到這些個(gè)字符串,然后將這些字符串,替換成我們定義的, 為了替換方便,可將這些字符串自身作為key, 這里不理解的不要緊,下面我還會(huì)講到。 既然是辨別中文字符串,那也就是說(shuō)在項(xiàng)目文件中進(jìn)行匹配查找,說(shuō)到匹配,那就需要正則表達(dá)式了,用正則表達(dá)式匹配Xcode中的使用的中文字符串,使用(@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")\s*即可, 打開(kāi)你的Xcode 試試看,切記find 后面的選項(xiàng)要選擇Regular Expression, 默認(rèn)選中的是Text, 如圖

如何取出識(shí)別到的中文字符串?

我們已經(jīng)知道如何識(shí)別項(xiàng)目中的字符串了,但是如何取出來(lái)使用呢? 這就需要遍歷項(xiàng)目中所有的指定后綴(e.g: .h、.m等)的文件,然后利用正則表達(dá)匹配所有使用到的中文字符串,并寫入文件中。為了方便起見(jiàn),我將此過(guò)程寫了一個(gè)Mac客戶端小應(yīng)用,可直接將選中的項(xiàng)目中所有的中文字符串,導(dǎo)出到指定的路徑下;該應(yīng)用還可以選擇對(duì)于重復(fù)出現(xiàn)的中文字符串進(jìn)行處理,以及還可以將中文字符串導(dǎo)出為繁體;小應(yīng)用更值得關(guān)注的是它導(dǎo)出的文件,可以直接拿來(lái)當(dāng)做多語(yǔ)言文件中的key=value使用,非常簡(jiǎn)單,喜歡的可以去下載看看, 含有源碼的哦;小應(yīng)用運(yùn)行圖如下:

如何使用取出的中文字符串?

已經(jīng)拿到取出的中文字符串文件,這個(gè)文件是可以直接拿來(lái)用做多語(yǔ)言文件使用的,小應(yīng)用導(dǎo)出的文件,只可以用于中文以及繁體多語(yǔ)言文件,而對(duì)于其他的語(yǔ)言,就需要你拿著導(dǎo)出的文件,找你們公司的翻譯人員,進(jìn)行翻譯; 拿繁體版來(lái)舉個(gè)例子,導(dǎo)出來(lái)的繁體文件如下(收留我App導(dǎo)出的文件):

這個(gè)繁體文件,可以直接作為繁體多語(yǔ)言使用,如何想要翻譯成英文,可以將此文件拷貝一份,交給翻譯人員,讓其翻譯。翻譯的時(shí)候,你一定要給翻譯人員溝通好,讓其只翻譯value, 也就是圖中=后面雙引號(hào)中的內(nèi)容,格式什么的也不要讓他亂改,否則容易出現(xiàn)問(wèn)題,導(dǎo)致key與value對(duì)不上號(hào)。 一切溝通妥當(dāng)后,等翻譯把文件給你后,直接將文件中的內(nèi)容,復(fù)制到多語(yǔ)言文件的英語(yǔ)文件中即可;

如何將項(xiàng)目中的中文字符串進(jìn)行替換

多語(yǔ)言文件已經(jīng)配置完成,到了這里,那么問(wèn)題來(lái)了,我們只是取出項(xiàng)目中使用的中文字符串,然后將字符串封裝成多語(yǔ)言文件,但是對(duì)于項(xiàng)目中使用的中文字符串依然還是中文字符串,我們還并沒(méi)有進(jìn)行替換處理。當(dāng)然,這一步我們是不能夠忘了,由于是替換項(xiàng)目中所有的使用中文字符串,我們還是謹(jǐn)慎為好,首先將你的項(xiàng)目進(jìn)行備份、備份、備份,非常重要的事情說(shuō)三篇,切記一定要備份。備份好后,我們就可以開(kāi)始替換工作了,沒(méi)有備份的不要往下看了,趕緊備份去;

假設(shè)你已經(jīng)備份好了,你就可以開(kāi)始替換工作了,前面我們說(shuō)過(guò)讓中文字符串自身作為key進(jìn)行替換,之所以讓其自身作為key, 是因?yàn)檫@樣可以大大減輕替換的困難度,而且還有利于代碼的可讀性,基本上算是保持原有代碼;既然要替換項(xiàng)目中的使用中文字符串,就要用到Xcode 自帶的字符串替換功能,首先還需要使用正則表達(dá)式(@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")\s*,匹配出項(xiàng)目中使用的中文字符串,然后在對(duì)其進(jìn)行替換處理。

由于我們?cè)?a target="_blank" rel="nofollow">iOS 多語(yǔ)言版本的開(kāi)發(fā)(二)中,對(duì)取key對(duì)應(yīng)的語(yǔ)言內(nèi)容,進(jìn)行了宏的封裝, 這里我們可以將匹配到的使用中文字符直接替換成我們定義的宏的使用

#defineASLocalizedString(key)[NSStringstringWithFormat:@"%@",[[NSBundlebundleWithPath:[[NSBundlemainBundle]pathForResource:[NSStringstringWithFormat:@"%@",[[NSUserDefaultsstandardUserDefaults]objectForKey:@"appLanguage"]]ofType:@"lproj"]]localizedStringForKey:(key)value:niltable:@"ASLocalized"]]

以上是宏的定義,我們需要將字符串進(jìn)行替換成宏的使用,如:

替換前是這樣的_lbl.text = @"我是多語(yǔ)言";

替換后_lbl.text = ASLocalizedString(@"我是多語(yǔ)言")

替換規(guī)則如圖:

這次選中的是Replace, 不是Find。按圖中所示,選擇完畢后,點(diǎn)擊ReplaceAll, 會(huì)出來(lái)一個(gè)彈框,不用管它直接繼續(xù),即可,然后你在看項(xiàng)目中使用到的中文字符串是否已經(jīng)替換掉了,到這里基本上大功告成了;

遺留問(wèn)題

1、正則表達(dá)式,不懂得可以先照文章里寫就行,然后再去學(xué)習(xí)下,這里有篇基礎(chǔ)文章

2、ASLocalizedString(key) , 該宏使用面積廣,可以將其定義成公共頭文件中,然后用時(shí)引用頭文件即可,也可將文件封裝進(jìn)pch文件中,這樣無(wú)需使用頭文件接口使用

3、替換后,可能會(huì)有些地方報(bào)錯(cuò),command + b 編譯下,看看報(bào)錯(cuò)的地方,進(jìn)行相應(yīng)修改即可。報(bào)錯(cuò)原因:a. 可能是你定義的常量字符串; b. 可能是定義的宏; c. 可能是替換后沒(méi)有換行; 基本上報(bào)的錯(cuò)誤很明顯,進(jìn)行修改即可;

4、在迭代版本中,再次使用中文字符串,就需要使用ASLocalizedString(key), 來(lái)代替了,然后再多語(yǔ)言文件中,進(jìn)行key=value配置;

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,203評(píng)論 2 33
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,922評(píng)論 25 709
  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,859評(píng)論 0 12
  • 又到一年畢業(yè)季,不管你有多么不舍的離開(kāi),時(shí)間依然毫不留情的碾過(guò)了你的大學(xué)。一張大學(xué)畢業(yè)證書(shū),將你趕出校園,褪去了所...
    小馬亦能過(guò)河閱讀 749評(píng)論 2 2

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