应用程序本地化
一、简介
* 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言
* 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名
* 当本地化的应用程序需要载入某一资源时,如图像、属性列表、nib文件,应用程序会检查用户的语言和地区,并查找相匹配的本地化文件夹。如果找到了相应的文件夹,就会载入这个文件夹中的资源
• 当前项目环境为Xcode8.3.1、iOS9.3,涉及的代码请参考例子YDLocal,暂时还没有整理
• 本文博客参考了M了个J的应用程序本地化和千叶的应用本地化,在此表示感谢。
二、默认的效果图
工程目录结构
运行效果图(因为没有使用本地化功能,所以不管用户选择什么语言环境,运行的效果都是一样的)
现在想在中文语言环境下,换另一套实现,其中包括:
* 更改nib文件中的文字(nib本地化)
* 更改登录按钮下面的图片(图片本地化)
* 更改对话框中的文字(Tip和Ok)(字符串本地化)
* 更改应用名称(应用名称本地化,即本地化Info.plist文件)
三、本地化前的准备
其实就是先创建好中文的本地化文件夹(zh-Hans.lproj),让应用程序支持中文语言环境
选择当前需要本地化的资源(下面这个图是我偷懒,借用别人的,可能跟以后版本的xcode不一样,以当前版本为准,比如我在例子中使用Xcode8.2.1在创建简体中文本地化时只能本地化main.storyboard文件)
选择Finish后,会发现硬盘上多了一个中文的本地化文件夹zh-Hans.lproj,至于Base.lproj文件夹是英文的本地化文件夹,创建项目时默认就有的(这两个文件夹在未导入工程,存在于实体文件夹中)。(说明:下面这个图是我偷懒,借用别人的,可能跟以后版本的xcode不一样,以当前版本为准,比如我在例子中使用Xcode8.2.1在创建简体中文本地化时只能本地化main.storyboard文件)
需要说明的是:
1、项目创建默认使用的是Base的本地化。而PROJECT->Info->”Use Base Internationalization”选项选中则为“Base本地化”创建Main.storyboard和LaunchScreen.stroyboard,默认情况下这个选项就是勾选的。 当我去掉勾时会删除Main.storyboard和LaunchScreen.stroyboard。
2、将storyboard本地化后有的同学可能在zh-Hans中生成的不是xxx.storyboard而是xxx.strings,有两种方法可以解决,一是去掉Base这个本地化(也就是上文中PROJECT->Info->”Use Base Internationalization”这个勾),二是本地化时自己选择,如下图:
3、至于本地化出来的xxx.strings文件也是关于storyboard本地化的一种方法,但是这种方法只能修改控件的title,所以我这里没有使用这个本地化方法来举例
准备工作做完后,就可以开始展开本地化工作了
四、nib文件的本地化
项目中选中MJViewController.xib后点击xib右侧菜单中的“show the file inspector”栏目中的Localize...按钮,创建该xib的base、zh-Hans的本地化,创建后文件左边多了个可以展开的三角形,展开可以发现分别都有2个版本的文件
打开MJViewController.xib(Chinese)文件,修改里面的文字信息(这里不修改图片)
五、应用程序名称本地化(Info.plist本地化)
知识背景:Info.plist中有个叫CFBundleDisplayName的key决定了应用程序的名称
1、为Info.plist添加Application has localized display name字段,赋值为YES,让应用程序支持名称本地化,Info.plist就会去InfoPlist.strings加载CFBundleDisplayName这个key对应的字符串。(这里需要注意不能直接本地化Info.plist,因为这样做之后Info.plist文件会存在各自的本地化文件夹中(像en.lproj)中,这样系统会报Info.plist文件不存在的问题,虽然可以去指定Info.plist文件的位置,但是这样就不能实现本地化的目的了)
2、新建InfoPlist.strings文件,选中InfoPlist.strings后点击其右侧菜单中的“show the file inspector”栏目中的Localize...按钮,创建该InfoPlist.strings文件的base、zh-Hans的本地化,创建后InfoPlist.strings文件左边多了个可以展开的三角形,展开可以看到对应base、zh-Hans的两个文件。
3、在对应的InfoPlist.strings文件中添加各自的应用名
在InfoPlist.strings(English)中添加如下:
CFBundleDisplayName="Localization";
在InfoPlist.strings(Simplified)中添加如下:
CFBundleDisplayName="本地化";
六、图片本地化
1、对工程中的图片本地化(这里演示本地化home.png,nib文件中登录按钮下面的房子图片)
1)、单击选中home.png,后点击其右侧菜单中的“show the file inspector”栏目中的Localize...按钮,创建该home.png文件的base、zh-Hans的本地化,创建后home.png文件左边多了个可以展开的三角形,展开可以看到对应base、zh-Hans的两个文件。
2)、查看下硬盘中home.png的情况
3)、而且项目中的home.png左边也多了个可以展开的三角形,展开可以发现有2个版本的文件
4)、用预先准备好的另外一张图片替换zh-Hans.lproj实体文件夹中的home.png
注意:本地化完图片文件,记得Clean一下项目,而且最好先删除应用程序,再重新安装
2、使Assets.xcassets或者Images.xcassets管理的图片本地化
因为iOS暂不支持.xcassets的本地化,所以这里需要结合字符串的本地化来处理。首先,在.xcassets中放入两张图片,并命名为image1、image2;然后,在各自的Localizable.strings中将两个图片指定给同一个key,如下
在Localizable.strings(English)文件加入:
"imageName" = "image1";
在Localizable.strings(Chinese)文件加入:
"imageName" = "image2";
最后通过key获取图片真实的名字,但是缺点在于xib中无法直接使用这种本地化的图片啊!
七、字符串的本地化
1.创建一个字符串资源文件
2.文件名最好是Localizable.strings,如果使用其他文件名,使用字符串时的调用会有些区别
3.为Localizable.strings添加多语言支持(跟上面图片本地化类似),选中Localizable.strings文件,查看右上角的视图
4.查看下硬盘中Localizable.strings的情况
5.而且项目中的Localizable.strings左边也多了个可以展开的三角形,展开可以发现有2个版本的文件
6.在Localizable.strings(English)文件加入:
Tip="Tip";
Ok="Ok";
7.在Localizable.strings(Chinese)文件加入:
Tip="提示";
Ok="好的";
8.在代码中使用NSLocalizedString(key, comment)来读取本地化字符串,key是Localizable.strings文件中等号左边的字符串,comment纯粹是注释
NSString *tip = NSLocalizedString(@"Tip", nil);
NSString *ok = NSLocalizedString(@"Ok", nil);
如果没有对字符串进行本地化 或者 找不到key对应的值,NSLocalizedString将直接返回key这个字符串
注意:如果你的字符串资源文件名不是Localizable.strings,如mj.strings,那么你就得使用NSLocalizedStringFromTable()来读取本地化字符串:
NSLocalizedStringFromTable(@"Tip", @"mj", nil);
补充:生成字符串资源文件的另一种方式(通过终端命令)==请参考开篇提到的博客
八、其他文件的本地化
跟六中图片本地化的原理是一样的,重复六中的每个步骤即可