国际化是指应用程序运行时,可根据客户端请求来自个国家/地区、语言的不同而现实不同的界面.例如:如果请求来自于中文操作系统的客户端,则应用程序中的各种提示信息和帮助等都使用中文文字;如果客户端使用英文操作系统,则应用程序能自动识别,并做出英文的响应.
国际化的英文单词是Internationalization,简称I18N,其中I是这个单词的第一个字母,18代表中间省略的字母个数,而N代表这个单次的最后一个字母.提供了国际化支持的应用,会随着在不同区域使用而呈现出本地语言的提示.这个过程也被称为Localization,即本地化.
一、iOS应用国际化的基础
1、iOS应用的国际化思路
iOS应用的国际化思路是将程序中的标签、提示等信息放在资源文件中,程序需要支持那些国家、语言环境,就对提供相应的资源文件.资源文件就是key-value对,每个资源文件中的key是不变的,但value则随不同国家、语言改变.iOS应用的国际化还得靠Objective-C语言来实现,而Objective-C的国际化主要通过如下类和函数完成:
- (1)、NSLocale:用于封装特定的国家/区域、语言环境.
- (2)、NSLocalizedString(NSString *key,NSString *comment):根据key来获取国际化消息.
本地文件夹:资源文件的文件名通常为Localizable.strings,但这就产生了一个问题:iOS应用如何区分不同语言、国家的资源文件呢?答案是使用不同的文件夹,即不同语言、国家环境的语言文件放在不同文件夹下,比如简体中文、中国大陆环境的资源文件放在zh-Hans-CN.lproj文件夹下,美式英语的资源文件放在en-US.lproj文件夹下—这种特殊的文件夹被称为本地化文件夹。
本地化文件夹的命名有严格的规范,它必须符合如下两种形式之一:
①、language-country.lproj
②、language.lproj
2、Objective-C国际化支持的语言和国家
如果需要获取Objective-C所支持的语言和国家,则可调用NSLocale类的availableLocaleIdentifiers类方法获取,该方法返回一个NSArray集合,该集合元素师Objective-C所支持的所有NSLocale的标识字符串.NSLocale还提供了一个currentLocale类方法,用于获取系统当前的NSLocale.
例如:
//返回系统所支持的全部国家和语言的集合
NSArray* locales = [NSLocale availableLocaleIdentifiers];
//遍历数组的每个元素,依次获取所支持的所有NSLocale
for (int i = 0; i < locales.count; i ++) {
NSString* localeId = [locales objectAtIndex:i];
NSLog(@"%@",localeId);
}
//获取系统的当前Locale
NSLocale* curLocale = [NSLocale currentLocale];
NSLog(@"当前Locale:%@",curLocale.localeIdentifier);
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
//在默认值中找到AppleLanguages,返回值是一个NSArray集合
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSLog(@"所有的语言包括:%@",languages);
//languages中的第一项就是用户的首选语言
NSLog(@"首选语言是:%@",[languages objectAtIndex:0]);
二、国际化界面设计文件
为应用增加简体中文对应的本地文件夹,步骤如下:
- 、选中项目导航面板中的项目图标,再选中项目导航面板右面Dock列表区的PROJECT标题下得项目图标.
- 、单击中间编辑区的”Info”选项卡,然后找到其中的Localizations区域.
- 、单击Localizations区域左下角的”+”图标,系统弹出语言列表.
、如果需要为简体中文、中国大陆环境添加本地化文件夹,则可以单击列表中的”Chinese-China(zh-Hans-CN)”列表项(代表简体中文、中国大陆区域).
、然后弹出如下对话框,对于Main.storyboard文件国际化时,”File Types”处有两个选择,其中Xcode 5和Xcode 6出现情况不一样
- (1)、Interface Builder Cocoa Touch Storyboard:如果选择该选项,表示系统要对整个界面设计进行国际化—在不同的语言、国家环境下,分别使用不同的Storyboard文件,这样不同语言、国家的用户看到的应用界面都不同,这就是彻底的国际化.
- (2)、Localizable Strings:如果悬着该列表项,表明只对界面设计文件上的字符串内容进行国际化.不同语言、国家的用户看到的应用界面是相同的,只是界面上的文本内容不同而已.
对于Xcode 5来说
会自动创建InfoPlist.strings文件
对于Xcode 6来说
需要手动创建InfoPlist.strings文件
三、国际化应用程序的显示名称
应用程序的显示名称可通过XXX-Info.plist文件进行设置,该文件中的key为Bundle display name的值就代表了该应用的显示名称,开发者可通过编辑该项的值来改变iOS应用的显示名称.在默认情况下,Bundle display name的值为${PRODUCT_NAME}—表明该应用默认的显示名称为PRODUCT_NAME变量的值,这意味着该应用的显示名称就是它的”产品名”。
它InfoPlist.strings文件负责对XXX-Info.plist文件内容执行国际化,因此只要为XXX-Info.plist文件提供了不同的本地化副本,即可对XXX-Info.plist文件内容执行国际化.我们的项目为InfoPlist.strings提供了两个本地化副本:英文的本地化副本和简体中文的本地化副本,因此只要在InfoPlist.strings文件的本地化副本中设置应用程序的显示名称即可.
在XXX-Info.plist空白地方单击鼠标右键,然后单击”Show Raw Keys/Values”菜单项,即可看到如上图key.
然后在InfoPlist.strings中设置CFBundleName = “test”;
四、国际化图片
- ①、将一张图片拖入到iOS项目中;
- ②、在项目导航面板中选中刚刚拖入的图片,打开Xcode右侧的文件检查器面板,找到其中的Localization区域;
- ③、单击Localization区域中的”Localize…”按钮.出现如下对话框。
- ④、单击”Localize”按钮,刚刚添加的图片将会变为”中文”本地化副本—也就是该图片移动到了zh-Hans.plroj文件夹中.
五、国际化文本
(1)、NSLocalizedString(NSString *key,NSString *comment)函数
#define NSLocalizedString(key, comment) \ [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
第一个参数是国际化消息的key,第2个参数是该消息的注释.
例如:
NSLog(@"%@",NSLocalizedString(@"test", nil));
(2)、NSLocalizedStringFromTable(NSString key,NSString tbl,NSString *comment);
#define NSLocalizedStringFromTable(key, tbl, comment) \[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
第一个参数为对应的key,第二参数是多语言文 件名,第三个参数是对这个内容的注释,可以为nil
例如:
NSLog(@"%@",NSLocalizedStringFromTable(@"locale", @"Localizable", nil));
提供国际化消息有如下两种方式:
(1)、通过Xcode的新建文件添加国际化消息
- ①、单击Xcode主菜单的”File”—>”New”菜单项
- ②、选择Resource分类下的”Strings File”资源项,单击”Next”按钮
- ③、将该文件名设为”Localizable.strings”,并将该文件保存到en.lproj子目录下,这就相当于添加了该资源文件的英语的本地化副本.
- ④、设置key-value值
例如:
"wugong" = "独孤九剑";
"test" = "简体中文测试";
"locale" = "简体中文";
(2)、通过genstrings命令添加国际化消息
省略……