應用國際化

一、啟動項目國際化支持

首先在項目中增添需要支持的語言,默認是英語坯癣。如圖:


屏幕快照 2019-03-14 下午5.28.26.png

無論是給APP名字還是APP內添加國際化都需要先做這步。

二最欠、給APP名字(CFBundleDisplayName)國際化

新建一個Strings文件


屏幕快照 2019-03-14 下午5.35.37.png
并一定要取名為 InfoPlist.strings

注意后綴是 strings, 不是string.
然后選中這個新建的文件示罗,在右邊點擊Localization展開并選擇需要支持的語言。


屏幕快照 2019-03-14 下午5.41.25.png

選擇支持的語言后芝硬,剛才新建的InfoPlist.strings文件就會變成可展開的列表蚜点。子項目就是所支持的語言配置文件。


屏幕快照 2019-03-14 下午5.44.45.png

然后在英語配置文件里寫入 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。如圖

屏幕快照 2019-03-14 下午6.16.35.png

這個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鍵值對格式已經寫好了咕村。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末场钉,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子懈涛,更是在濱河造成了極大的恐慌逛万,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批钠,死亡現場離奇詭異宇植,居然都是意外死亡,警方通過查閱死者的電腦和手機埋心,發(fā)現死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門指郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拷呆,你說我怎么就攤上這事闲坎。” “怎么了茬斧?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵腰懂,是天一觀的道長。 經常有香客問我项秉,道長悯恍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任伙狐,我火速辦了婚禮涮毫,結果婚禮上,老公的妹妹穿的比我還像新娘贷屎。我一直安慰自己罢防,他們只是感情好,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布唉侄。 她就那樣靜靜地躺著咒吐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪属划。 梳的紋絲不亂的頭發(fā)上恬叹,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音同眯,去河邊找鬼绽昼。 笑死,一個胖子當著我的面吹牛须蜗,可吹牛的內容都是我干的硅确。 我是一名探鬼主播目溉,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菱农!你這毒婦竟也來了缭付?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤循未,失蹤者是張志新(化名)和其女友劉穎陷猫,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體的妖,經...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡绣檬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了羔味。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡钠右,死狀恐怖赋元,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情飒房,我是刑警寧澤搁凸,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站狠毯,受9級特大地震影響护糖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嚼松,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一嫡良、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧献酗,春花似錦寝受、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颜及,卻和暖如春甩苛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俏站。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工讯蒲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肄扎。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓爱葵,卻偏偏與公主長得像施戴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萌丈,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361