使用Xcode6实现应用“国际化”

1、什么是国际化?测试

  应用国际化简单来讲就是使用你的应用可以让世界各国的用户使用。既然须要使各个国家的用户可以正常的使用,则必然咱们应用必然符合各国用户所使用的语言。那么咱们在应用如何去实现这个功能呢?可以使应用基于系统所设置的语言而进行相应的语言变化,符合用户的须要。下面就来简单总结一下,如何在项目中实现国际化。优化

2、如何在Xcode6中实现应用国际化?spa

1. 要对应用实现国际化,首先咱们得先设置该项目支持哪几种语言,默认只支持英语。按下图所示进行设置(当咱们添加了一种语言后,在 storyboard 文件中会本身添加一个该语言的国际化文件,以.strings结尾):3d

   

2. 对 storyboard 或 xib 文件 实现国际化:code

  a. 首先注意:通常咱们进行国际化操做时,最好是在项目完成以后来作此操做,由于当咱们添加其它语言到项目中的时候,Xcode会自动为storyboard文件生成该语言对应的国际化文件,且只会对现有的控件进行相关描述。若是后面咱们再添加一些其它的控件的话,Xcode不会自动更新对这些控件的国际化支持,须要咱们手动去操做,因此建议在项目开发完成后再作此操做,会方便不少。orm

  b. 因为在 storyboard 中,在添加其它语言后Xcode会自动生成相应的国际化文件,因此 针对 storyboard 中的控件的国际化相对比较简单。咱们只须要在对应语言的国际化文件中将对应key的值改为相应语言的描述便可。以下图所示(左图所示是修改后的中文、右图为英文):blog

   

  在上图中须要注意的一点是,若是在文件中存在相同名称的控件描述,如在两个不一样的控制器中都有一个取消按钮的状况,那么咱们如何区别哪一个按钮在国际化文件中对应的key是哪一个呢?这个咱们能够在 storyboard 中当咱们选中某个控件的时候,在下图所示位置能够就看到对应控件key的名称:ci

  c. 对 storyboard 文件实现国际化就只须要上面几个步骤,很简单。但对于xib文件就不适用了。缘由是当咱们初次建立xib文件的时候,Xcode不会自动为该xib文件实现国际化,不会生成相应的国际化文件(即便你是在建立xib文件以后再添加其它语言)。在xib中咱们须要手动进行设置国际化,步骤也很简单,以下所示(选中xib文件,点击localize,默认选中Base后,在Localization下面就会生成相应支持国际化语言的选项,勾选后,在xib文件前面会出现一个三角形按钮,展开会看到已经生成了相应的国际化文件,一样建议国际化操做最好在项目完成以后进行,以后的操做同上面storyboard同样,编写相应key的国际化描述便可):开发

3. 对项目中的动态文本(即须要在程序中设置的内容,非静态内容)进行国际化字符串

  a. 使用宏(NSLocalizedStringFromTable),宏只针对字符串字面量才有用。

  例如,我须要在程序中设置某个UILabel的值,正常状况下咱们会这样:

self.titleName.text = @"标题名称";  

  但在国际化中,不该该这样写,要否则就没法实现所谓的国际化。应该写成以下的形式:

self.titleName.text = NSLocalizedStringFromTable(@"标题名称", @"Tab1ViewController", @"此字符串用来显示标题名称");

 在国际化版本中应该这样写。(参数对应(key, table, comment))。对于全部须要显示在UI界面上的文本,都须要这样写。

 而后咱们须要使用终端命令来生成.strings国际化文件。方法以下:

 打开终端 -》进行项目所在文件夹 -》 输入命令"genstrings *.m" 回车(能够看到在项目所在文件夹下面生成了一个以.strings结尾的文件,且该文件的文件名将是上面宏中的table的名称,这样不一样的table会对应一个不一样的文件,便于管理,固然也能够放到同一个table里面,若是内容较少的话) -》 将.strings文件拖到工程里面。

      

 只生成文件还不够,接下来还须要对该文件进行“本地化”操做。方法与上面提到的将 xib 文件进行国际化的方法同样:选中该.strings文件 -》 点击“localized” -》 勾选全部须要支持的语言项 -》自动生成对应的语言文件 -》在各自的语言文件中修改相应的key对应的该语言的描述便可。

 b. 若是咱们想将某个变量或某个方法的返回值看成key的话,此时使用宏来完成国际化操做将会不可行,那怎么办呢?

  如须要将变量或方法的返回值做为key的话,咱们就须要使用NSBundle中的方法来进行国际化操做,实际上,在上面的宏中,封装的就是NSBundle的方法,宏只是让咱们操做更方便而已,但对于变量或方法宏就没法支持,须要咱们手动操做。以下所示:

NSString *title = @"标题名称2";
self.titleName.text = [[NSBundle mainBundle] localizedStringForKey:title value:@"国际化测试" table:@"TabBarCustom"];

  这样咱们就能当变量或方法的返回值看成key,生成国际化文件。说到国际化文件,若是咱们不是使用宏的话,当咱们使用命令genstrings的时候,并不会自动生成国际化文件,此命令只会扫描应用中用宏声明的值。因此咱们这里须要去手动建立.strings文件。建立.strings文件的步骤是:新建文件 -》 选择"Resource" -》strings file 便可,但注意这里的文件名应该与上面的table名称一致,若是table有值的话。建立好strings文件后,接下来的操做就跟前面xib中国际化差很少了。也是选中文件 -》选择localize -》勾选须要支持的语言 -》在生成的相应文件中给对应的key实现相应语言的描述便可。

4.对 Setting Bundle 的国际化

  应用程序的 Setting Bundle是提供给用户在系统的“设置”程序中给应用程序作一些快捷设置或默认设置的功能。因为展现在“设置”程序中的内容是由咱们本身去配置的,而在用户更改系统语言时,也并不会自动去更改这里的语言,因此咱们也应该对此进行国际化设置。针对 Setting Bundle 的国际化比较简单。咱们只须要在 Setting Bundle里面增长一个语言文件,并修改相应语言的描述便可。具体操做见下图:

首先咱们能够看到在 Setting.bundle 文件展现下面已经有一个用于语言描述的国际化文件夹,只不过默认是英文的。

而后选中Setting.bundle文件,右键点击 Show in Finder

接着在Finder中选中Setting.bundle文件,右键点击 显示包内容

在包内容中咱们会看到最初只有一个en.lproj的文件夹,此时咱们须要再添加一个您须要支持的语言的文件夹,但此处命名是有规范的,不能随便乱写。以下面我增长的是中文语言支持的文件夹,其中Root.plist能够从en.lproj中copy,但copy后须要修改对应key的相应语言描述便可。(固然你也能够直接copy整个文件夹,修改一下名称便可)这样,当系统切换到相应语言时,设置中对应该应用的描述也会作相应的改变,实现国际化操做。

5.对数字的国际化

咱们都知道,世界上并非每一个国家的数字表示的方式都彻底同样的,可能每一个国家都有各自的特色,因此当咱们在界面上显示某一个数字的时候,也须要符合该用户所使用语言的特色,而不是一个固定的格式。如最为明显的货币符号。

咱们以前的写法是:

CGFloat f = 10002.2;   NSString *str = [NSString stringWithFormat:@“%g”, f]; //将一个CGFloat转换成NSString

上面的形式f是什么就是什么,没有任何格式可言。但在国际化中咱们须要根据用户的习惯来实现。

国际化中的写法:

NSString *str = [NSNumberFormatter localizedStringFromNumber:@(10002.2) numberStyle:NSNumberFormatterDecimalStyle]; //numberStyle也能够是其它值

同时,咱们在将一个字符串解析成一个数字时,也须要对其它转换后的格式进行优化:

以前可能的写法:

NSString *str = @"22000";   int value = [str intValue];

国际化中的写法:

NSString *userInputtedString = @"22223.2";//变量或字面量
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *parsedNumber = [formatter numberFromString:userInputtedString];

6. 对日期的国际化

对于日期,这个咱们接触到的可能更明显,各个国家的日期显示格式也是不尽相同的,有的年在前,有的年在后,因此当咱们在界面上显示一个日期的时候,也须要根据当前用户所使用的系统语言来决定显示什么格式,而不是一个固定的格式。

方法以下:

NSString *dateStr = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]; //返回一个将日期“本地化”后并按指定样式格式化的字符串

7. 总结

关于国际化的内容目前主要的就这么些,后续发现再作补充。

相关文章
相关标签/搜索