最近接触到iOS应用本地化的相关使用,于是花了点时间研究了一下,下面把成果分享给大家。
使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言
- 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名
- 当本地化的应用程序需要载入某一资源时,如图像、属性列表、nib文件,应用程序会检查用户的语言和地区,并查找相匹配的本地化文件夹。如果找到了相应的文件夹,就会载入这个文件夹中的资源
当前项目环境为Xcode7.3、iOS9.3,涉及的代码可以去我们github上下载:https://github.com/peanutNote/QYLocalization.git
- 为了节约时间本文大致基于李明杰老师的博客进行写作
运行效果图(因为没有使用本地化功能,所以不管用户选择什么语言环境,运行的效果都是一样的)
* 更改登录按钮下面的图片(图片本地化)
* 更改对话框中的文字(Tip和Ok)(字符串本地化)
* 更改应用名称(应用名称本地化,即本地化Info.plist文件)
三、本地化前的准备
/* Class = "UILabel"; text = "Password"; ObjectID = "6Jw-lK-yZp"; */
"6Jw-lK-yZp.text" = "Password";
/* Class = "UIButton"; normalTitle = "Login"; ObjectID = "M8g-w0-oLf"; */
"M8g-w0-oLf.normalTitle" = "Login";
/* Class = "UILabel"; text = "UserName"; ObjectID = "io8-3O-gpY"; */
"io8-3O-gpY.text" = "UserName";
)
四、nib文件的本地化
打开Main.storyboard(Simplified)文件,修改里面的文字信息(这里不修改图片)
五、应用程序名称本地化(Info.plist本地化)
知识背景:Info.plist中有个叫CFBundleDisplayName的key决定了应用程序的名称
1.为Info.plist添加一个key-value,让应用程序支持名称本地化,Info.plist就会去InfoPlist.strings加载CFBundleDisplayName对应的字符串,(这里需要注意不能直接本地化Info.plist,因为这样做之后Info.plist文件会存在各自的本地化文件夹中(像en.lproj)中,这样系统会报Info.plist文件不存在的问题,虽然可以去指定Info.plist文件的位置,但是这样就不能实现本地化的目的了,所以需要用到InfoPlist.strings文件)。
用这种方法分别为英文和中文本地化添加InfoPlist.strings文件并且在Info.plst中添加Application has localized display name字段,赋值为YES
在对应的InfoPlist.strings文件中添加各自的应用名
InfoPlist.strings(English):
CFBundleDisplayName="Localization";
在InfoPlist.strings(Simplifid):
CFBundleDisplayName="本地化";
六、图片本地化
1.直接拖拽到项目的图片本地化(这里演示本地化home.png,nib文件中登录按钮下面的房子图片)
用上面添加InfoPlist.strings的方法添加该图片的本地化,分别为英文和中文环境添加home.png文件
查看下项目文件中home.png的情况
在代码中使用[UIImage imageNamed:@"home.png"]; 即可
注意:本地化完图片文件,记得Clean一下项目,而且最好先删除应用程序,再重新安装
2.使用Assets.xcassets或者Images.xcassets管理图片本地化
因为iOS暂不支持.xcassets的本地化,所以这里需要结合字符串的本地化来处理(这里也放在后面介绍)
七、字符串的本地化
1.创建一个字符串资源文件 文件名最好是Localizable.strings,如果使用其他文件名,使用字符串时的调用会有些区别
2.依旧按照上面的方法为Localizable.strings添加多语言支持
3.在Localizable.strings(English)文件加入:
Tip="Tip";
Ok="Ok";
"Please input your userName"="Please input your userName";
4.在Localizable.strings(Chinese)文件加入:
Tip="提示";
Ok="好的";
"Please input your userName"="请输入用户名";
5.在代码中使用NSLocalizedString(key, comment)来读取本地化字符串,key是Localizable.strings文件中等号左边的字符串,comment纯粹是注释。同时上文中提到的.xcassets本地化也需要用到这个。首先添加各自的图片并命名如:image1,image2,本地化一个字符串imageName用作图片的名字,然后在各自的Localizable.strings中对应到各自的实际图片名称即可。
在Localizable.strings(English)文件加入:
"imageName" = "image1";
在Localizable.strings(Chinese)文件加入:
"imageName" = "image2";
如果没有对字符串进行本地化 或者 找不到key对应的值,NSLocalizedString将直接返回key这个字符串
注意:如果你的字符串资源文件名不是Localizable.strings,如qy.strings,那么你就得使用NSLocalizedStringFromTable()来读取本地化字符串:
NSLocalizedStringFromTable(@"Tip", @"qy", nil);
1.首先添加获取字符串的代码,比如在ViewController.m。(其实这里就是方便我们不用针对每一个需要本地化字符串的地方都去上面Localizable.strings文件中一一添加,我们只需要使用NSLocalizedString取字符串然后用genstrings命令就可以帮我们完善Localizable.strings文件啦)
NSString *tip = NSLocalizedString(@"Tip", @"dialog title");
NSString *ok = NSLocalizedString(@"Ok", @"dialog button");
2.打开终端,cd到项目文件夹下(包含en.lproj和zh-Hans.lproj,否则会报错couldn't connect to output directory xx.lproj)
find ./ -name "*.m" -print0 | xargs -0 genstrings -o en.lproj // 注意*.m旁边的引号,这个不可缺少,网上有很多这种命令是没有加引号的,这样执行会报错xx.m: unknown primary or operator
如果使用NSLocalizedStringFromTable(key, tbl, comment)来获取字符串,资源文件会以tbl参数作为文件名,比如
NSString *tip = NSLocalizedStringFromTable(@"Tip", @"qy", @"dialog title");
NSString *ok = NSLocalizedStringFromTable(@"Ok", @"qy", @"dialog button");
生成的资源文件为:qy.strings
4.将资源文件导入项目即可,然后打开资源文件,可以发现已经生成了key和comment
八、其他文件的本地化
跟六中图片本地化的原理是一样的,重复六中的每个步骤即可
九、最终效果演示
1.英文环境下
2.中文环境下
最后给大家推荐一篇不错的本地化博客,提供给大家参考。