github仓库地址:App国际化
前言
因为我看的书里面提到国际化,而且我最近把手机上的语言更改成了英文,有很多App换成了英文名,比如微信。所以我开始学习国际化,虽然国内的App大多数很少需要国际化,但是目光不能短浅,还是要学习丰富自己。(日常鸡汤句)
这里不妨给大家展示一下我的手机界面,系统语言分别为英文和中文对比。
大家可以进行对比,是否这些App本身如此优秀,而在细节上也更加完美呢?
那你是否也想让自己研发的App打上国际化的标签呢?
快动动手指跟我一起做吧~
正文
1.支持语言一览
在开始之前,我们需要了解,实际上,OC可能并不支持所有的国家和语言,所以我们要获取其支持的国家和语言。也能获取到当前的语言。
//返回系统所支持的全部国家和语言的集合
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);
其中,NSLocale还提供了ISOCountryCodes,ISOLanguageCodes两个类方法获取ISO标准支持的所有国家和语言代码。
2.国际化界面设计文件
新建一个Single View Application。接下来为该应用增加简体中文对应的本地文件夹,英文也会有对应的文件夹,这也是为什么后面可以添加两张相同名称的图片的原因,因为存放于不同的文件夹中。
步骤如下。
点击+号出现很多语言。
往下拉,会有个其他,点击其他会出现更多更详细的语言及地区。
此处以简体中文为例。选择后出现此界面。
File Types有两个参数
选择上面这种条件会出现下图的情况。
对,你想的没有错!两个参数,一个是创建一个中文版本的原文件,彻底的国际化,一个是原文件的strings文件,不彻底的国际化。
选择Interface Builder Cocoa Touch Storyboard。表示系统要对整个界面设计文件进行国际化——在不同的语言、国家环境下,分别使用不同的Storyboard文件,这样不同语言、国家的用户看到的应用界面都不同,这是最彻底的国际化。
选择Localizable Strings。表示只对界面设计文件上的字符串内容进行国际化——在不同的语言、国家环境下使用的是相同的Storyboard文件,这样不同语言、国家的用户看到的应用界面是相同的,只是界面上的文本内容不同而已。
在两个main.storyboard文件上设置不同的背景颜色,切换系统语言会出现不同的界面。大家可以试一试。语言不同,看到的背景颜色也不同。如图所示。
到此,我们实现了界面的国际化。
3.国际化App的BundleDisplayName(应用名)
首先我们需要创建一个InfoPlist.strings文件
命名为InfoPlist
创建好了,我们就可以把它国际化成英语和中文两个版本
选择中文,在localization勾选英文,就可以创建一个英文版本。
点开Info.plist文件,在空白处点击鼠标右键,出现列表,选择Show Raw Keys/Values,出现真正控制的key名。
CFBundleDisplayName或者CFBundleName事实上是控制App名称的key。
这时候我们分别在InfoPlist.strings文件中修改不同语言不同名称,再切换系统语言就可以显示不同的名称。
到此,我们实现了应用名称的国际化,我们也可以像微信一样中文名微信英文名WeChat了~~~开心吗?激动吗?关我什么事啊~
4.国际化图片
国际化图片是个很简单的操作,我给大家演示一下~
下面两张图片是我p的简单文字图,以展示效果,读者可以保存使用~
我们现在把第一张图拖进项目中。
选择Localize
我们再把第二张英文图拖进来,执行同样的操作。这样就可以存在两张同名的图片,因为他们存放在不同的文件夹里。
然后在Main.storyboard放一个UIImageView设置UIImage为上面图片名称,切换不同语言就可以看到不同图片。
相同界面,不同图片,Storyboard以及代码同样道理。
到此,我们实现了图片的国际化。
5.国际化文本
国际化文本,这里我们主要介绍的是相同界面,同一个Label不同语言显示不同文本。
这里我们主要借助于NSLocalizedString(NSString *key,NSString *comment)方法,该方法第一个参数key是国际化消息的key,第二个参数comment是该消息的注释,这里我们可以写成nil。
//通过NSLocalizedString()函数使用国际化消息
self.label.text = NSLocalizedString(@"locale", nil);
然后我们和前面创建InfoPlist.strings文件步骤一样,创建名为Localizable的strings文件。如下图设置key的值即可。
这样Label在不同语言下显示的则是不同的文本。
到此,我们实现了文本的国际化。
书上写我们可以通过genstrings命令添加国际化消息。我没有实践过,因为我还是喜欢代码解决问题。但是同大家分享一下。
启动终端窗口,然后使用cd命令进入iOS项目所在目录,执行如下命令。
genstrings * .m
该命令是提取多有*.m文件中通过NSLocalizedString()方法用过的国际化消息key。并将这些key添加到资源文件中,运行该命令就会生成一个Localizable.strings文件,而且已经包含了你设定的所有key。
但是要注意的是,执行这个命令每次生成的都是全新的文件,因此如果开发者对Localizable文件进行过修改,需要慎重使用genstrings命令,避免该命令覆盖已有的资源文件。
将生成的文件分别复制到不同的语言文件夹的子目录下,还需要通过XCode的项目导航面板中“Add Files to项目名”的右键菜单添加这两个资源文件。
接下来将Localizable文件改为如下形式。
"key" = "value";
然后编译,运行程序,就可以实现文本的国际化。
小结
成熟的iOS应用,面对的是全球各种主流语言、许多国家的用户,这就需要iOS应用能提供国际化支持。所以掌握国际化的知识,开发出自适应全球各种主流语言,大量国家的应用的未来便是你的!嘻嘻嘻,加油~