一、啟動項目國際化支持
首先在項目中增添需要支持的語言,默認是英語坯癣。如圖:
無論是給APP名字還是APP內添加國際化都需要先做這步。
二最欠、給APP名字(CFBundleDisplayName)國際化
新建一個Strings文件
并一定要取名為 InfoPlist.strings
注意后綴是 strings, 不是string.
然后選中這個新建的文件示罗,在右邊點擊Localization展開并選擇需要支持的語言。
選擇支持的語言后芝硬,剛才新建的InfoPlist.strings文件就會變成可展開的列表蚜点。子項目就是所支持的語言配置文件。
然后在英語配置文件里寫入 CFBundleDisplayName = "EngName";
在中文配置文件里寫入 CFBundleDisplayName = "中文名";
然后運行吵取,切換系統(tǒng)語言環(huán)境APP圖標就會對應的顯示 EngName 或 "中文名" 字樣禽额。
三锯厢、應用內容的國際化
和上面一樣創(chuàng)建一個Strings 文件皮官。但是取名為: Localizable.strings
這個是默認名字脯倒,如果不是這個名字,在接下來使用宏的時候就要指定文件名捺氢。
和上面同樣的操作藻丢,產生支持的國際化語言子文件。
1摄乒、假設有個label,在代碼中設置其text悠反。代碼中這樣寫。
self.label.text = NSLocalizedString(@"label_001_text", nil);
其中 @"label_001_text" 就是一個key, 宏 NSLocalizedString(key, comment) 的意思就是去默認的Bundle中馍佑,去尋找當前語言對應的默認的本地化文件斋否,尋找這個key,取得value作為返回值拭荤,給label的text賦值茵臭。
2、然后我們就在 Localizable.strings 的子文件中舅世,英文配置文件里面輸入
"label_001_text" = "Is a EnglishText";
同理旦委,在中文配置文件中輸入:
"label_001_text" = "我是一個標簽";
就這樣,在切換不同系統(tǒng)語言的情況下雏亚,剛才的宏就會去尋找對應的文件缨硝,根據key值獲取不同的值,完成國際化的過程罢低。
四查辩、UIStoryBoard 里面直接輸入的文字國際化
1、在本文的第一步奕短,創(chuàng)建國際化支持的時候宜肉,就會彈出一個窗口,默認選中自帶的StoryBoard支持國際化翎碑,在那一步操作完成后谬返,其實StoryBoard已經自動的添加了國際化子文件了。這個子文件日杈,與上面兩種情況自己手動創(chuàng)建的文件是一樣的遣铝。只是它是為這個UIStoryBoard配置的而已。
我們一樣在配置文件中寫入需要對應的 " key "= "value"莉擒。
但是酿炸,這個key哪里來?這個可以是從 StoryBoard涨冀,選中目標控件填硕,右邊就可以獲得控件的ID。如圖
這個label的 ID 就是: 5TS-Zs-DwC
然后我們就可以在語言配置文件中寫入
// 英文配置文件中這樣寫:
"5TS-Zs-DwC.text" = "Is a EnglishText";
// 中文配置文件中這樣寫:
"5TS-Zs-DwC.text" = "我是一個標簽";
這樣,根據標簽的屬性扁眯,就完成了 UIStoryBoard 的國際化壮莹。
五、新建的 UIStoryBoard 或者 xib 文件國際化
自己創(chuàng)建的UIStoryBoard 或者 xib 文件國際化其實同理姻檀,選中文件后命满,點擊右邊的第一個標簽(show the file inspector)里面的 Localization 展開并選擇需要支持的語言。然后剛才選中的文件就會自動配置好對應的本地化文件了绣版。然后像上面一樣寫對應的配置內容胶台。
六、國際化代碼的四個宏
1杂抽、NSLocalizedString(key, comment)
NSLocalizedString其實是從mainBundle中默認讀取了Localizable.string中的key所對應的value诈唬。comment參數則是對key的描述,有利于翻譯人員理解這個key所適用的場景缩麸。
2讯榕、NSLocalizedStringFromTable(key, tbl, comment)
NSLocalizedStringFromTable則是從mainBundle中讀取指定多語言文件中的key所對應的value。tbl參數就是用于指定多語言文件名的參數匙睹。
3愚屁、NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
NSLocalizedStringFromTableInBundle會讀取指定Bundle中所指定的多語言文件中的key所對應的value。bundle參數就是用于傳入所指定的Bundle痕檬。
4霎槐、NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment)
NSLocalizedStringWithDefaultValue則是從指定Bundle中讀取指定多語言文件中的key所對應的value,如果取不到對應的value梦谜,允許指定一個默認的value丘跌。val參數就是用于傳入默認的value值。
key: 獲取value的key
tbl: 國際化配置文件的文件名
bundle: 國際化配置文件所在的bundle
comment: 對key的描述唁桩,翻遍翻譯人員理解的描述
val: 如果找不到value的時候的默認值
七闭树、已經創(chuàng)建好的項目,后期才做國際化怎么辦
思路:
1荒澡、開啟國際化支持
2报辱、使用某種正則匹配代碼文件,在需要字符串復制的地方单山,都加上國際化的宏碍现。(或手動搞。米奸。昼接。這個正則沒那么容易完全完美匹配)
3、使用Xcode自帶了一個命令行工具genstrings悴晰。我們可以利用這個工具生成所需的多語言文件慢睡。
先打開終端,(安裝了xcode工具行命令的情況下)切換到xcode的命令工具
sudo xcode-select -switch /Applications/Xcode.app/
到項目目錄下創(chuàng)建兩個文件夾
cd 工程目錄
mkdir en.lproj
mkdir zh-Hans.lproj
在文件夾中用 genstrings 根據之前代碼文件中已經批量添加的國際化代碼的前提下,批量把 key = value 寫到配置文件中漂辐。
注意:項目文件路徑中不能包含中文钻弄,否則中文路徑的識別不了。
find ./ -name \*.m -print0 | xargs -0 genstrings -o en.lproj
find ./ -name \*.m -print0 | xargs -0 genstrings -o zh-Hans.lproj
4者吁、將生成的Localizable.strings文件拖入到項目,然后對立面的value進行翻譯替換饲帅。
5复凳、這樣代碼中有了國際化的宏,又有了對應的配置文件灶泵,就能實現國際化育八。
八、在應用內實現實時切換語言
1赦邻、首先需要上面幾個步驟中的某些步驟先有了配置文件髓棋,這是首要條件。
2惶洲、我們查看國際化宏的定義本質:
#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)]
其實就是用了 mainBundle 的 localizedStringForKey:的一些列方法而已按声,從指定bundle、配置文件恬吕、key签则、讀取value,不成功就返回默認value铐料。那么我們就可以自己寫個宏渐裂,然后將文件參數,或者bundle參數動態(tài)修改钠惩。然后再將APP清除到根視圖柒凉,重新加載。就能替換了篓跛。
// 宏的本質
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *value = [mainBundle localizedStringForKey:@"key" value:@"defaultValue" table:@"somefile.strings"];
九膝捞、NSUserDefaults 存放著語言設置
應用啟動時,首先會讀取NSUserDefaults中的key為AppleLanguages對應的value愧沟,該value是一個String數組绑警,也就是說,我們訪問這個名為AppleLanguages的key可以返回一個string數組央渣,該數組存儲著APP支持的語言列表计盒,數組的第一項為APP當前默認的語言。
十芽丹、xib 或者 UIStoryBoard 國際化時
先創(chuàng)建好視圖全部設定好后再點擊 右邊的 Localizable北启,展開自動創(chuàng)建國際化文件,這樣的話,會自動有一系列的控件ID鍵值對格式已經寫好了咕村。