iPhone 的国际化

在iPhone项目中如何才能国际化?难道同一个项目,非要写一个英文版的源代码,再写一个中文版的源代码?app

其实大可没必要。咱们可使用iPhone的多语言支持来实现项目的本地(国际)化。函数

一、新建Windows-base Application。打开main.m文件,在main函数中增长代码以下:测试

// 取得用户默认信息atom

NSUserDefaults *defaults = [ NSUserDefaults standardUserDefaults ];spa

// 取得 iPhone 支持的全部语言设置翻译

NSArray *languages = [defaults objectForKey : @"AppleLanguages" ];xml

NSLog ( @"%@" , languages);字符串

   

运行程序,从 console 中输出以下内容:get

"zh-Hans",string

    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 ,则标签中的文本显示为英文了。