iOS 实现国际化

github仓库地址:App国际化

前言

因为我看的书里面提到国际化,而且我最近把手机上的语言更改成了英文,有很多App换成了英文名,比如微信。所以我开始学习国际化,虽然国内的App大多数很少需要国际化,但是目光不能短浅,还是要学习丰富自己。(日常鸡汤句)

这里不妨给大家展示一下我的手机界面,系统语言分别为英文和中文对比。

iOS 实现国际化_第1张图片iOS 实现国际化_第2张图片

大家可以进行对比,是否这些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。接下来为该应用增加简体中文对应的本地文件夹,英文也会有对应的文件夹,这也是为什么后面可以添加两张相同名称的图片的原因,因为存放于不同的文件夹中。
iOS 实现国际化_第3张图片
步骤如下。
iOS 实现国际化_第4张图片
点击+号出现很多语言。
iOS 实现国际化_第5张图片
往下拉,会有个其他,点击其他会出现更多更详细的语言及地区。
iOS 实现国际化_第6张图片
此处以简体中文为例。选择后出现此界面。
iOS 实现国际化_第7张图片
File Types有两个参数
iOS 实现国际化_第8张图片
选择上面这种条件会出现下图的情况。
iOS 实现国际化_第9张图片
对,你想的没有错!两个参数,一个是创建一个中文版本的原文件,彻底的国际化,一个是原文件的strings文件,不彻底的国际化。
选择Interface Builder Cocoa Touch Storyboard。表示系统要对整个界面设计文件进行国际化——在不同的语言、国家环境下,分别使用不同的Storyboard文件,这样不同语言、国家的用户看到的应用界面都不同,这是最彻底的国际化。
选择Localizable Strings。表示只对界面设计文件上的字符串内容进行国际化——在不同的语言、国家环境下使用的是相同的Storyboard文件,这样不同语言、国家的用户看到的应用界面是相同的,只是界面上的文本内容不同而已。

在两个main.storyboard文件上设置不同的背景颜色,切换系统语言会出现不同的界面。大家可以试一试。语言不同,看到的背景颜色也不同。如图所示。
iOS 实现国际化_第10张图片 iOS 实现国际化_第11张图片
到此,我们实现了界面的国际化。

3.国际化App的BundleDisplayName(应用名)

首先我们需要创建一个InfoPlist.strings文件
iOS 实现国际化_第12张图片
命名为InfoPlist
iOS 实现国际化_第13张图片
创建好了,我们就可以把它国际化成英语和中文两个版本
iOS 实现国际化_第14张图片
iOS 实现国际化_第15张图片
选择中文,在localization勾选英文,就可以创建一个英文版本。
iOS 实现国际化_第16张图片
点开Info.plist文件,在空白处点击鼠标右键,出现列表,选择Show Raw Keys/Values,出现真正控制的key名。
iOS 实现国际化_第17张图片
CFBundleDisplayName或者CFBundleName事实上是控制App名称的key。
这时候我们分别在InfoPlist.strings文件中修改不同语言不同名称,再切换系统语言就可以显示不同的名称。
iOS 实现国际化_第18张图片

到此,我们实现了应用名称的国际化,我们也可以像微信一样中文名微信英文名WeChat了~~~开心吗?激动吗?关我什么事啊~

4.国际化图片

国际化图片是个很简单的操作,我给大家演示一下~

下面两张图片是我p的简单文字图,以展示效果,读者可以保存使用~

iOS 实现国际化_第19张图片iOS 实现国际化_第20张图片
们现在把第一张图拖进项目中。
iOS 实现国际化_第21张图片

选择Localize
iOS 实现国际化_第22张图片
我们再把第二张英文图拖进来,执行同样的操作。这样就可以存在两张同名的图片,因为他们存放在不同的文件夹里。
iOS 实现国际化_第23张图片
然后在Main.storyboard放一个UIImageView设置UIImage为上面图片名称,切换不同语言就可以看到不同图片。
相同界面,不同图片,Storyboard以及代码同样道理。
iOS 实现国际化_第24张图片 iOS 实现国际化_第25张图片
到此,我们实现了图片的国际化。

5.国际化文本

国际化文本,这里我们主要介绍的是相同界面,同一个Label不同语言显示不同文本。
这里我们主要借助于NSLocalizedString(NSString *key,NSString *comment)方法,该方法第一个参数key是国际化消息的key,第二个参数comment是该消息的注释,这里我们可以写成nil。
    //通过NSLocalizedString()函数使用国际化消息
    self.label.text = NSLocalizedString(@"locale", nil);
然后我们和前面创建InfoPlist.strings文件步骤一样,创建名为Localizable的strings文件。如下图设置key的值即可。
iOS 实现国际化_第26张图片
这样Label在不同语言下显示的则是不同的文本。
到此,我们实现了文本的国际化。

书上写我们可以通过genstrings命令添加国际化消息。我没有实践过,因为我还是喜欢代码解决问题。但是同大家分享一下。

启动终端窗口,然后使用cd命令进入iOS项目所在目录,执行如下命令。
genstrings * .m
该命令是提取多有*.m文件中通过NSLocalizedString()方法用过的国际化消息key。并将这些key添加到资源文件中,运行该命令就会生成一个Localizable.strings文件,而且已经包含了你设定的所有key。

但是要注意的是,执行这个命令每次生成的都是全新的文件,因此如果开发者对Localizable文件进行过修改,需要慎重使用genstrings命令,避免该命令覆盖已有的资源文件。

将生成的文件分别复制到不同的语言文件夹的子目录下,还需要通过XCode的项目导航面板中“Add Files to项目名”的右键菜单添加这两个资源文件。
接下来将Localizable文件改为如下形式。
   "key" = "value";
然后编译,运行程序,就可以实现文本的国际化。

小结

成熟的iOS应用,面对的是全球各种主流语言、许多国家的用户,这就需要iOS应用能提供国际化支持。所以掌握国际化的知识,开发出自适应全球各种主流语言,大量国家的应用的未来便是你的!嘻嘻嘻,加油~




你可能感兴趣的:(iOS)