旧文新录,好多主流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 |