旧文新录,好多主流app都支持多语言(或者叫本地化/国际化),有的是自动适应系统语言,有的是用户选择修改。比如微信支持如下语言,可以根据系统自适应,也可以用户更改。

创建多语言文件
在工程中command + n创建文件,选择iOS -> Resource -> Strings File文件,自定义文件名,创建完成。
添加多语言
选中新创建的多语言文件,展开右侧的侧边栏,在侧边栏里,点击Localization下的Localize...按钮,选择English,点击Localize。
选中工程在PROJECT里面的Localizations,添加语言。
每添加一个,在新建的多语言文件下就会多一个以.strings为后缀名的文件,这就是每个语言对应的语言文件。里面存放的语言文字是以key - value形式保存,每个文件中key是一样的,value对应着该语言下的文字。比如:
中文简体文件File.strings(Chinese(Simplified))里面存放的是:
1 | "text"="世界,你好。"; |
英文文件File.strings(English)里存放的是:
1 | "text"="hello,world."; |
key值保持一致text,value对应该处文本的每种语言翻译。
适应系统语言
访问语言文件的宏定义
1 | #define NSLocalizedString(key, comment) \ |
使用NSLocalizedStringFromTable(key, tbl, comment)宏定义赋值显示多语言的控件,key是多语言文件里的key值,tbl是多语言文件名,comment是注释,可空填nil。使用方式如下:
1 | _label.text = NSLocalizedStringFromTable(@"text", @"File", nil); |
还可以使用宏NSLocalizedString(key, comment),没有tbl文件名参数,这时工程里的多语言文件名必须为Localizable。
手动设定语言
语言文件在工程内是以.lproj格式存储的,比如简体中文是zh-Hans.lproj,繁体中文是zh-Hant.lproj,英文是en.lproj。
手动设定语言就是让工程访问哪个文件。要保留app的语言设置,下次打开app还是上次设置好的语言环境。语言设置属于偏好设置,一般用NSUserDefaults存储。
保存环境设置:
1 | NSUserDefaults *userd = [NSUserDefaults standardUserDefaults]; |
设置语言环境:
1 | NSString *lanType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]]; |
第一次打开app
手动设置默认语言
第一次打开app,本地UserDefaults没有存储语言信息,这时可以代码存入一个,后续即可正常访问。
在didFinishLaunchingWithOptions里简单判断一下即可。如果没有,即存入简体中文
1 | NSUserDefaults *userd = [NSUserDefaults standardUserDefaults]; |
显示系统语言设置
首先要获取系统环境的语言,然后与app支持的语言做比较,如果app支持的语言里有目前系统语言,则显示该语言,如果没有则显示默认语言。
获取系统环境语言:
1 | NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; |
具体实现:
1 | NSUserDefaults *userd = [NSUserDefaults standardUserDefaults]; |
多语言开发的坑
LaunchScreen不支持多语言开发,苹果建议不要对启动页进行多语言开发。在LaunchScreen.strings文件中更改不同语言环境下的字符串,并没有效果。
解决办法:删除这些没用的LaunchScreen.strings文件
每种语言添加一个LaunchScreen.storyboard。比如英文对应:LaunchScreen_en.storyboard,繁体中文对应LaunchScreen_zhHant.storyboard。
在InfoPlish.strings下面对应的语言文件中,分别添加如下字段:
1 | UILaunchStoryboardName = "LaunchScreen_en";//英文文件下添加的 |
其实这样做也有局限性,在首次安装启动时能选择正确的语言显示,手动更改手机语言环境,重新打开app则无法显示更改后的语言。—— 在模拟器上测试
storyboard和xib多语言
storyboard和xib多语言只支持跟随系统,不支持手动切换。
选中storyboard或xib文件,在右侧面板的Localization中添加语言文件,语言文件会自动检测该storyboard或xib文件中哪些地方进行多语言化。并在文件中给出类似下面的内容,只需要在相应语言文件中修改"title"文本即可
1 | /* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "sxW-84-y91"; */ |
storyboard和xib的多语言化是根据ObjectID来区分的。

国际化自动脚本
有一个很大的问题是多语言文本不能实时更新,当你新拖入一个控件,多语言文件中并不会更新该控件的ObjectID。添加脚本,实现编译工程多语言文件实时更新。
Xcode中添加脚本,脚本地址和添加脚本的方法:AutoLocalization
终端运行脚本,首先更改脚本文件中的
filePath
1 | #如果在终端运行,注意要修改自己需要国际化的项目文件夹的路径! |
然后在终端中执行Python文件
1 | python AutoGenStrings.py |