1. 创建一个新应用
在Xcode的Single Application View模版中,Xcode对English做了本地化。
国际化了两个文件:Main.storyboard和LaunchScreen.storyboard
2. 开始国际化
选中project,在上图的Localizations选项下,添加简体中文;Xcode会询问你是否国际化以下文件,这个地方并不重要,因为项目中所有的资源文件都可以很方便的国际化和去国际化。
观察一下有哪些文件是可以国际化的:
- xib和storyboard资源文件;
- info.plist文件
- strings文件等等
简而言之,除了代码文件和xcassets,都可以国际化。
3. 国际化代码中的文本
国际化是基于.strings文件的,该文件的内容只是简单的key value对,如下:
"KEY1" = "CONTENT1"; "KEY2" = "CONTENT2";
其中Localizable和InfoPlist两个strings文件尤为重要,前者在这一小节介绍,后者在`国际化info.plist`中介绍。
如果你在.m文件中,使用代码的方式设置按钮的title,可以使用NSLocalizedString宏定义
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
该方法会在Localizable.strings中查找key对应的value。
完整处理过程:
- 新建Localizable.strings文件;
- 打开右侧file inspector,打开Localization选项,选中Base和中文简体;
- 如下,Localizable.strings文件就会从一个文件变成两个文件,编译各种语言对应的文件即可;
- 在代码中使用NSLocalizedString(key, nil),key为Localizable.strings中的key。
注释:NSLocalizedString宏定义中的comment参数并没有实际意义。
4. 国际化storyboard和xib文件
国际化storyboard和xib文件国际化也是在file inspector的Localization中。
国际化的结果就是在Xcode中可以看到一个文件变成了对应的两个文件。
再观察一下目录结构:
Base.lproj:
en.lproj:
这类资源文件,Xcode的处理方式是,原文件放在Base中,在其它语言版本中只有一个对应文件名的strings文件,再看一下LaunchScreen,strings的部分内容:
/* Class = "UILabel"; text = "Detail view content goes here"; ObjectID = "0XM-y9-sOw"; */ "0XM-y9-sOw.text" = "Detail view content goes here"; /* Class = "UITableViewController"; title = "Master"; ObjectID = "7bK-jq-Zjz"; */ "7bK-jq-Zjz.title" = "Master";
其中的ObjectID是什么?
用source code的方式,打开LaunchScreen.storyboard,全局搜索一下 0XM-y9-sOw,结果如下:
<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">
ObjectID是原文件中对应的对象。
5. 国际化info.plist
按照上面的思路,国际化一下info.plist,然后编译,碰到了什么问题?
Xcode找不到info.plist。
因为通过file inspector的Localization,Xcode会创建两个info.plist分别放在Base.lproj和zh-Hans.lproj文件夹下。
还记得上面没讲的 InfoPlist.strings 吗?
处理过程:
1. 新建一个 InfoPlist.strings 文件;
2. Localization该文件;
3. 编辑对应语言的InfoPlist.strings文件即可。比如,英文版本应用名叫English,中文版本叫中文,如下:
"CFBundleDisplayName" = "English"; 和 "CFBundleDisplayName" = "中文";
6. 练习:国际化音频文件
以下是必要步骤的简单描述:
1. 把音频文件A拷贝到项目中。
2. 打开音频文件inspector,选择本地化按钮,选择了Base和简体中文作为支持语言。
3. 重命名第二个音频文件B,和第一个名字A一样,然后将其拷贝到es.lproj文件夹。
4. 确保你在Finder提示中选择了“Replace File”。
7. 国际化与多target问题
问题描述:
我们应用有4个分身(4个相似的app),同时还做了国际化,此时我就迷茫了!四个应用有a,b,c,d四个info.plist文件名,但是国际化info.plist的文件名都是InfoPlist.strings。。。
解决办法:
- 创建四个文件夹;
- 在四个文件夹中分别创建一个InfoPlist.strings;
- 4个InfoPlist.strings关联到不同target。OK啦~