第二章:国际化

国际化是指应用程序运行时,可根据客户端请求来自个国家/地区、语言的不同而现实不同的界面.例如:如果请求来自于中文操作系统的客户端,则应用程序中的各种提示信息和帮助等都使用中文文字;如果客户端使用英文操作系统,则应用程序能自动识别,并做出英文的响应.

国际化的英文单词是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]);

二、国际化界面设计文件

为应用增加简体中文对应的本地文件夹,步骤如下:

  1. 、选中项目导航面板中的项目图标,再选中项目导航面板右面Dock列表区的PROJECT标题下得项目图标.
  2. 、单击中间编辑区的”Info”选项卡,然后找到其中的Localizations区域.
  3. 、单击Localizations区域左下角的”+”图标,系统弹出语言列表.
  4. 、如果需要为简体中文、中国大陆环境添加本地化文件夹,则可以单击列表中的”Chinese-China(zh-Hans-CN)”列表项(代表简体中文、中国大陆区域).
    这里写图片描述
    这里写图片描述

  5. 、然后弹出如下对话框,对于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命令添加国际化消息
省略……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxiaobukuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值