当我们把程序发布到AppStore这个大平台时,发现不仅仅只有看得懂中文或者英文的用户,当我们需要更多国家的用户能获得更好的用户体验时,我们不得不修改所有需要显示的内容,当我们要适配10个国家的语言,然后在对每个控件赋值前都要加上一大串的switch判断这样实在太low了,而且代码也会变得很庞大。其实苹果已经为我们提供了很简单的方法实现。(本文所用Xcode版本为Xcode6.1)
文字的国际化
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 50, 300, 40)];
label.text = @"This is my InternationalizationDemo";
[self.view addSubview:label];
如果运行后,lable能正常显示,那我们就可以开始国际化了:1、为程序增加语言类型支持
2、创建Localizable.strings文件
<span style="font-size:14px;">"labelText" = "This is my InternationalizationDemo!";</span>
在Simplified的文件内输入<span style="font-size:14px;">"labelText" = "这是我的国际化栗子!";</span>
这里的输入格式为:“Key” = “Value”;可增加多行。这是最重要的一步,引号与末尾分号为英文状态下的格式,其次两行代码的左侧引号内为相同的内容(内容可随意)。当系统判断好当前语言环境时,会自动在各自语言对应的文件里查找我们在页面代码中用到的Key(这里的Key为lableText,我们之后会用到),并读出Key所对应的具体内容。3、国际化的使用
label.text = NSLocalizedString(@"labelText", nil);
这里的NSLocalizedString(key,comment)是NSBundle中的一个宏定义,也可以调用原来的方法[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]。他们的返回值是NSString类型,内容为Localizable.strings中key对应的value值。也可以在value中添加格式符如:配置“price%i”
= “价格为%i”;使用时:最后进入模拟器的设置:Settings->General->Language&Region->iPhoneLanguage 选择简体中文,然后运行程序就行了。
label.text = [NSString stringWithFormat:NSLocalizedString(@"price%@", nil), @(888)];
图片的国际化
通常在软件中,我们很多文字是通过图片的形式展现的,他们国际化的方式和文字的差不多,但是我们无法在Localizable.strings中的value值中保存图片,但我们可以保存图片名字,例如:我们准备两张图片,并拷贝到程序目录下,分别为“chinesetitle.png”,“englishtitle.png”。
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 90, 262, 162)];
imgView.image = [UIImage imageNamed:NSLocalizedString(@"titleImg", nil)];
[self.view addSubview:imgView];
英文环境下:storyboard国际化
前面介绍的对文字及图片的国际化都是通过代码实现的,但是有很多开发者喜欢用xib或者storyboard来搭建页面,接下来介绍他们的国际化方法:
还记得我们在第一步增加语言支持时的操作吗如下图:
我们在Main.storyboard前打上了勾,意思是让storyboard支持该语言,即storyboard可以对这个语言进行单独设计。我们点开storyboard,并在右侧属性栏中的第一页里找到Localization,这里也会有我们所支持的语言,我们全都打上勾后,在左侧的storyboard目录下就会生成各自的文件,之后就可以为每种语言单独搭建页面了,可以使用不同的图片,不同的文字或是不同的布局。