在iPhone項目中如何才能國際化?難道同一個項目,非要寫一個英文版的源代碼,再寫一個中文版的源代碼?
其實大可不必。我們可以使用iPhone的多語言支持來實現項目的本地(國際)化。
1、新建Windows-base Application。打開main.m文件,在main函數中增加代碼如下:
// 取得用戶默認信息
NSUserDefaults *defaults = [ NSUserDefaults standardUserDefaults ];
// 取得 iPhone 支持的所有語言設置
NSArray *languages = [defaults objectForKey : @"AppleLanguages" ];
NSLog ( @"%@" , languages);
運行程序,從 console 中輸出如下內容:
"zh-Hans",
en,
fr,
de,
"zh-Hant",
……
可以看到, iPhone 設備上支持的所有語言,有英、法、德,還有兩個 ”zh” 開頭的語言(簡體/繁體)。我們知道,以 ”zh” 開頭的就是中文。
2 、在 Resources 上右鍵, Add à New File ,文件類型選擇 Resource->Strings File,文件名為 Localizable.strings 。在該文件上使用 getInfo 命令,在如下界面中點擊Make File Localizable 按鈕:
然後 , 你去 Finder 中查看工程目錄,會發現多了一個 English.lproj 的目錄,其下有一個 Localizable.strings 文件(不過其中的內容是空的)。
再次打開 getInfo 窗口,顯示如下界面:
可以看見 Localizations 列表中只有一個語言 English ,我們需要點擊 Add Localization按鈕,增加中文 zh_CN :
這時,你再去 Finder 中查看工程目錄,發現又多了一個 zh_CN.lproj 的目錄,其下也有一個 Localizable.strings 文件(內容也是空的)。
同時,在 Target 下的 Copy Bundle Resources 目錄下多出兩個不同語言版本的Localizabel.strings 文件(一個 English ,一個 zh_CN ):
3 、打開 MainWindow.xib ,拖一個 UILable 到 window 中。
4 、打開 AppDelegate.h 文件,在其中申明 UILable 變量並增加一個 IBOutlet :
UILabel * label ;
……
@property ( nonatomic , retain ) IBOutlet UILabel* label;
5 、打開 AppDelegate.m 文件,
@synthesize window,label;
在 ( BOOL )applicationv:application didFinishLaunchingWithOptionsv: 方法中增加代碼:
// 使用NSLocalizedString函數根據iPhone的多語言設置獲取國際化的字符串
label . text = NSLocalizedString ( @"Localizable Test" , @"" );
6 、回到 IB ,將 UILable 控件和 IBOutlet 變量 label 進行連接:
7 、打開終端程序,進入工程目錄,運行命令:
genstrings -o English.lproj ./classes/*.m
你會發現 English.lproj 目錄下的那個 Localizable.strings 文件中增加了一行代碼:
"Localizable Test" = "Localizable Test" ;
再運行命令:
genstrings -o zh_CN.lproj ./classes/*.m
同樣 , 在 zh_CN.lproj 目錄下的那個 Localizable.strings 文件中也會增加一行代碼:
"Localizable Test" = "Localizable Test" ;
打開 zh_CN.lproj 目錄下的 Localizable.strings (雙擊),修改為
"Localizable Test" = " 本地化測試 " ;
這樣,每當源代碼有改變後,我們都需要用 genstrings 命令重新生成Localizable.strings 文件。但是,每次重新生成後,原來的編輯(翻譯)結果又不見了,我們又必須重頭翻譯。這是個很大的麻煩,建議以後每次 genstrings 之前把文件進行備份,減少重復工作。
8 、運行程序,效果如下(如果模擬器的多語言設置為簡體中文):
當你把多語言設置改為 English ,則標簽中的文本顯示為英文了。