公司項目近期需要支持多語言,這兩天虔心拜讀了幾篇文章加上萬能google,雖然國際化做起來簡單,但也是需要慢慢前行的呀,現(xiàn)在也算是成功路上邁出了一小步,為了方便日后再次使用的時候方便理解,所以就把幾篇文章中的精髓和自己遇到的小問題記錄下來,有什么問題也可以共同探討一下~
以下做法針對已經(jīng)開發(fā)完成或者已經(jīng)開發(fā)很久的項目,文章結(jié)尾會放上一些針對新項目進行國際化的文章
正文
一. 添加你所需要國際化的語言
project->info->Localizations
以下用中文和英文為例
二. 替換項目中所有的字符串 之 神奇的正則表達式
xcode 左側(cè)全局搜索框, 切換成replace -> Regular Expression
如圖
搜索條件中輸入 (swift 去掉@)
(@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")
替換成
NSLocalizedString($1, nil)
此處正則表達式兩邊加括號的目的是為了能夠在替換時用$1獲取原有字符串的值懈贺,在替換時把原有值放入宏定義內(nèi)key的位置
點擊replace All
如圖
接下來編譯一下 整個項目中的字符串就被替換成
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更改一下,就算大功告成了.
切換模擬器的語言環(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)崩潰的文件
打開之后排查問題即可.
發(fā)現(xiàn)此處在替換時 comment被替換成@"" 而其他文件都被替換成nil 遂改成
問題解決 成功編譯出來了
四. app名字進行國際化
新建一個strings file 命名為InfoPlist
點擊右側(cè)localization
勾選English Chinese
InfoPlist.strings文件中就會多出兩個文件
分別在其中加入以下代碼 ,填入中英文下app的名字
InfoPlist.strings(English) 中加入
CFBundleDisplayName = "i'm english";
InfoPlist.strings(Chinese) 中加入
CFBundleDisplayName = "我是中文";
小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/