iOS 已有項目多語言國際化 及碰到的問題

公司項目近期需要支持多語言,這兩天虔心拜讀了幾篇文章加上萬能google,雖然國際化做起來簡單,但也是需要慢慢前行的呀,現(xiàn)在也算是成功路上邁出了一小步,為了方便日后再次使用的時候方便理解,所以就把幾篇文章中的精髓和自己遇到的小問題記錄下來,有什么問題也可以共同探討一下~

以下做法針對已經(jīng)開發(fā)完成或者已經(jīng)開發(fā)很久的項目,文章結(jié)尾會放上一些針對新項目進行國際化的文章

正文

一. 添加你所需要國際化的語言

project->info->Localizations
以下用中文和英文為例

Paste_Image.png

二. 替換項目中所有的字符串 之 神奇的正則表達式

xcode 左側(cè)全局搜索框, 切換成replace -> Regular Expression

如圖
Paste_Image.png

搜索條件中輸入 (swift 去掉@)
(@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")
替換成
NSLocalizedString($1, nil)

此處正則表達式兩邊加括號的目的是為了能夠在替換時用$1獲取原有字符串的值懈贺,在替換時把原有值放入宏定義內(nèi)key的位置

點擊replace All

如圖
Paste_Image.png

接下來編譯一下 整個項目中的字符串就被替換成
NSLocalizedString(key, comment) 形式了
沒有問題繼續(xù)

三. 生成多語言文件 -> xcode 自帶genStrings

想要支持哪種語言,就生成幾種語言文件,在該文件中配置字符串所對應(yīng)的各國語言.以下用英文和中文為例.

首先打開控制臺

切換到當前需要國際化的項目的目錄

cd 工程目錄名
mkdir en.lproj
mkdir zh-Hans.lproj

然后我們遍歷所有的.m子目錄文件幸斥,去生成Localizable.strings,其中包含key 和value ,key即為本地的中文名字, value可以改成想要支持的語言.app會根據(jù)系統(tǒng)當前的語言模式,選擇該語言文件下對應(yīng)的value來顯示.

find . -name *.m | xargs genstrings -o en.lproj
find . -name *.m | xargs genstrings -o zh-Hans.lproj

如果沒有出現(xiàn)問題
en.lproj和zh-Hans.lproj文件夾中就應(yīng)該有了相應(yīng)的Localizable.string文件了
把這兩個文件夾加入到工程中
打開en.lproj中的Localizable.strings文件, 把英文對應(yīng)的value更改一下,就算大功告成了.

Localizable.strings文件.png

切換模擬器的語言環(huán)境到英文,就可以看到相應(yīng)的效果了~~鼓掌????

當然我沒有那么順利啦(≧▽≦)/
以下是運行此命令遇到了以下錯誤

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString characterAtIndex:]: Range or index out of bounds'
*** First throw call stack:
(
0 CoreFoundation 0x00007fffaf4e2e7b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fffc40cdcad objc_exception_throw + 48
2 CoreFoundation 0x00007fffaf56199d +[NSException raise:format:] + 205
3 CoreFoundation 0x00007fffaf45a876 -[__NSCFString characterAtIndex:] + 102
4 genstrings 0x0000000100754ff8 genstrings + 12280
5 genstrings 0x0000000100753cd5 genstrings + 7381
6 genstrings 0x00000001007537fa genstrings + 6138
7 libdyld.dylib 0x00007fffc49b1255 start + 1
8 ??? 0x0000000000000322 0x0 + 802
)

從崩潰信息中并看不出來問題出在哪,只能一點點排查

在當前項目目錄下 輸入

find . -name \*.m | head -5 | xargs genstrings -o ~/Documents/GenStringsTest

其中 ~/Documents/GenStringsTest 是自行在Documents下已經(jīng)建過的GenStringsTest 文件夾 可以更改為任一位置,你也可以在桌面上建議一個文件夾用來保存.

接下來手動做一個二叉查找吧

其中head -5 意思為先編譯5個文件, 一直更改以上命令中head -5 中5, 可以改到 100 , 500. 舉個栗子 假如出現(xiàn)崩潰的文件是第80個, 那輸入

find . -name \*.m | head - 70 | xargs genstrings -o ~/Documents/GenStringsTest

是可以成功編譯出文件的

那么輸入

find . -name \*.m | head - 100 | xargs genstrings -o ~/Documents/GenStringsTest

就會成功崩潰的

這樣一點點定位到文件的位置之后,輸入命令
find . -name \*.m | head -<minimum number of files for crash>

其中<minimum number of files for crash>即為上面定位到的崩潰的文件的數(shù)字80

接下來會打印出所有成功編譯的文件的名字,最后一個文件 就是出現(xiàn)崩潰的文件
打開之后排查問題即可.

Paste_Image.png

發(fā)現(xiàn)此處在替換時 comment被替換成@"" 而其他文件都被替換成nil 遂改成

Paste_Image.png

問題解決 成功編譯出來了

四. app名字進行國際化

新建一個strings file 命名為InfoPlist

Paste_Image.png

點擊右側(cè)localization
勾選English Chinese


Paste_Image.png

InfoPlist.strings文件中就會多出兩個文件

Paste_Image.png

分別在其中加入以下代碼 ,填入中英文下app的名字
InfoPlist.strings(English) 中加入
CFBundleDisplayName = "i'm english";
InfoPlist.strings(Chinese) 中加入
CFBundleDisplayName = "我是中文";

系統(tǒng)語言是英文.png
系統(tǒng)語言是中文.png

小tips

一般更改模擬器語言,都是通過偏好設(shè)置中更改,比較麻煩時間也較長,以下方法可以直接修改系統(tǒng)語言 本質(zhì)上就是給NSUserDefaults中名為AppleLanguages的key賦值
Edit->Scheme->Run->Arguments Passed On Launch ->AppLauguages(en)(語言對應(yīng)的代碼,此次是切換到英文en)

文章參考:
http://www.reibang.com/p/88c1b65e3ddb
http://xiaolei0808.com/2016/04/24/Localized-iOS/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寻咒,隨后出現(xiàn)的幾起案子财喳,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遣妥,居然都是意外死亡,警方通過查閱死者的電腦和手機爆阶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門燥透,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沙咏,“玉大人辨图,你說我怎么就攤上這事≈辏” “怎么了故河?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吆豹。 經(jīng)常有香客問我鱼的,道長,這世上最難降的妖魔是什么痘煤? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任凑阶,我火速辦了婚禮,結(jié)果婚禮上衷快,老公的妹妹穿的比我還像新娘宙橱。我一直安慰自己,他們只是感情好蘸拔,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布师郑。 她就那樣靜靜地躺著,像睡著了一般调窍。 火紅的嫁衣襯著肌膚如雪宝冕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天邓萨,我揣著相機與錄音地梨,去河邊找鬼菊卷。 笑死,一個胖子當著我的面吹牛湿刽,可吹牛的內(nèi)容都是我干的的烁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诈闺,長吁一口氣:“原來是場噩夢啊……” “哼渴庆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雅镊,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤襟雷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仁烹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耸弄,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年卓缰,在試婚紗的時候發(fā)現(xiàn)自己被綠了计呈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡征唬,死狀恐怖捌显,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情总寒,我是刑警寧澤扶歪,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站摄闸,受9級特大地震影響善镰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜年枕,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一炫欺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熏兄,春花似錦品洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至典格,卻和暖如春岛宦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耍缴。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工砾肺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挽霉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓变汪,卻偏偏與公主長得像侠坎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裙盾,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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