國際化(Internationalization ,簡寫為I18N)的作用是防止將本土文化信息寫死仔應用里(所謂本土文化,是指語言、貨幣、日期格式、數(shù)字格式等)。本土化(Localization,簡寫為L10n)的作用是根據(jù)用戶設置的Language and Region Format(語言和區(qū)域格式),為應用提供適當?shù)臄?shù)據(jù)。需要國際化的包括文本信息國際化、xib和storyboard國際化以及資源文件國際化。
首先,在project的Info里添加所需要支持的語言,這里添加的是Chinese(Simplified)和English-Development Language。
然后創(chuàng)建Localizable.strings文件。點擊File - New - File,選擇Strings File,命名為Localizable.strings。
點擊剛剛創(chuàng)建的Localizable.strings,點擊右邊的localize...,彈出的框中選擇localize,再勾選Chinese,此時Localizable.strings下就有三個文件了。接下來就是設置所需要支持的語言了。
應用名稱國際化
與創(chuàng)建Localizable.strings時一樣,創(chuàng)建InfoPlist.strings文件,添加Chinese。
在對應語言的InfoPlist.strings中設置應用的名稱,按照key = “value”(key有沒有雙引號都可以)定義,
CFBundleDisplayName = “國際化”;
CFBundleDisplayName = “Internationalization”;?
Run 一下,切換設置中的語言為英語或中文,可以看到變化
內容國際化
在Localizable.strings中,自行定義key和value。
在Localizable.strings(Base)和Localizable.strings(English)文件中添加
key = “Test";
在Localizable.strings(Chinese(Simplified))文件中添加
key = "測試";
調用的時候利用NSLocalizedString()宏替換字符串常量。使用NSLocalizedString()宏時需要傳入兩個實參:第一個實參是鍵(必需),第二個實參是注釋(可選)。
self.testLabel.text = NSLocalizedString(@"key", nil);
運行時NSLocalizedString()會遍歷程序包中的所有字符串對照表,找出和設備當前的語言設置相匹配的那個,然后在該文件中找出和相應的鍵匹配的字符串翻譯。
Storyboard與xib國際化
Storyboard與xib兩個的國際化操作一樣,這里只講xib。
新建一個xib的文件,隨便往里面拖了一個label,只是為了表示有點東西。選中xib文件,點擊右邊的Show the File inspector中的Localize...,全部勾選。
此時發(fā)現(xiàn)在SecondViewController.strings中顯示的都是下面這些格式,
/* Class = "UILabel"; text = "Hello"; ObjectID = "DNM-aR-9rZ"; */
"DNM-aR-9rZ.text" = "Hello";
我們需要修改SecondViewController.strings(Chinese(Simplified)中"DNM-aR-9rZ.text"的value
"DNM-aR-9rZ.text" = "你好";
那么以后在xib文件的中添加UI控件時,這里的文件不會自動更新怎么辦呢?
這時我們就要自己找到新添加控件的 Object Id, 就是上面 DNM-aR-9rZ這樣的東西,在xib選中相應的控件,然后右邊屬性欄Show the identity inspector里面找 Object Id,然后手動添加上述類似的代碼;
如果不想通過代碼改的話,點擊最右邊的按鈕,選擇Interface Builder Cocoa Touch XIB,
此時選擇的SecondViewController.strings就變成了SecondViewController.xib,直接在xib中改方便多了。
不過,最好是把xib中的頁面全部布局好了,再去弄國際化,后續(xù)添加控件得自己去更新多個xib文件。
資源文件國際化
資源文件包括圖片文件、? 文件以及前面提到的Localizable.strings等文件,圖片文件和聲音文件等資源文件有時也是需要國際化的。
圖片國際化
需要國際化的圖片不要放在Assets.xcassets中,和著上面的國際化操作一樣做國際化,此處不再多說。
聲音文件國際化
資源文件國際化與圖片資源的國際化不同的,圖片可以通過ImageView控件放到視圖界面上,而聲音等資源文件是通過文件目錄訪問的。我們打開項目所在的文件夾,可以看到后綴是.Iproj的文件夾,這就是國際化的文件夾,
然后我們把所需要國際化的聲音文件放到相對應的國際化文件base.lproj、en.lproj和zh-Hans.lproj中,在程序中訪問它們,
- (void)viewDidLoad{
[super viewDidLoad];
......
NSBundle *thisBundle = [NSBundle mainBundle];
NSString *url = [thisBundle pathForResource:@"聲音文件名" ofType:@"后綴名"];
NSLog(@"url : %@",url);
}
NSBundle的pathForResource:ofType:方法可以更具 前 言的設定,可以讀取對應國際化文件 中的資源文 件。我們改變不同的 言設置 出的結果如下:
/....../i18n.app/zh-Hans.lproj/文件名.后綴名
/....../i18n.app/en.lproj/文件名.后綴名
上面介紹的資源文件的訪問方式不止適合于文件, 是要能放置在資源目錄下可以通過 NSBundle的pathForResource:ofType:方法實現(xiàn)國際化。
最后,另外推薦一個國際化腳本工具https://github.com/alexfeng/InternationalizationScript-iOS。在客戶需要再加20多種語言后,看到整個app那么多的字符串我還要一個一個添加國際化,內心是奔潰的??。不過,好在朋友寫的一個腳本,可以把excel直接導入為Localizable.strings 本地化文件,當然,也可以本地化文件導出到Excel,方便多了。具體咋用github上寫的好詳細,就不多說啦。
如果有啥不對的地方,請一定要告訴我哈??