APP国际化

旧文新录,好多主流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值保持一致textvalue对应该处文本的每种语言翻译。

适应系统语言

访问语言文件的宏定义

1
2
3
4
5
6
7
8
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
[NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
[bundle localizedStringForKey:(key) value:@"" table:(tbl)]
#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
[bundle localizedStringForKey:(key) value:(val) table:(tbl)]

使用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
2
3
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];//以简体中文为例
[userd synchronize];

设置语言环境:

1
2
3
4
NSString *lanType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]];
NSString *path = [[NSBundle mainBundle] pathForResource:lanType ofType:@"lproj"];
NSString *showValue = [[NSBundle bundleWithPath:path] localizedStringForKey:@"showTxt" value:nil table:@"File"];
_label.text = showValue;

第一次打开app

手动设置默认语言

第一次打开app,本地UserDefaults没有存储语言信息,这时可以代码存入一个,后续即可正常访问。

didFinishLaunchingWithOptions里简单判断一下即可。如果没有,即存入简体中文

1
2
3
4
5
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
if (![userd objectForKey:@"appLanguage"]) {
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];
[userd synchronize];
}

显示系统语言设置

首先要获取系统环境的语言,然后与app支持的语言做比较,如果app支持的语言里有目前系统语言,则显示该语言,如果没有则显示默认语言。

获取系统环境语言:

1
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
if (![userd objectForKey:@"appLanguage"]) {//如果本地没有设置语言
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];//获取系统语言环境
if ([language hasPrefix:@"zh-Hans"]) {//简体中文
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];//设置为简体中文
} else if ([language hasPrefix:@"zh-TW"] || [language hasPrefix:@"zh-HK"] || [language hasPrefix:@"zh-Hant"]) {//台湾繁体,香港繁体和繁体
[userd setObject:@"zh-Hant" forKey:@"appLanguage"];//设置为繁体
} else if ([language hasPrefix:@"en"]) {//英文
[userd setObject:@"en" forKey:@"appLanguage"];//设置为英文
}else{//没有支持的语言
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];//设置为简体中文
}
}

多语言开发的坑

LaunchScreen不支持多语言开发,苹果建议不要对启动页进行多语言开发。在LaunchScreen.strings文件中更改不同语言环境下的字符串,并没有效果。

解决办法:删除这些没用的LaunchScreen.strings文件

每种语言添加一个LaunchScreen.storyboard。比如英文对应:LaunchScreen_en.storyboard,繁体中文对应LaunchScreen_zhHant.storyboard

InfoPlish.strings下面对应的语言文件中,分别添加如下字段:

1
UILaunchStoryboardName = "LaunchScreen_en";//英文文件下添加的

其实这样做也有局限性,在首次安装启动时能选择正确的语言显示,手动更改手机语言环境,重新打开app则无法显示更改后的语言。—— 在模拟器上测试

storyboard和xib多语言

storyboardxib多语言只支持跟随系统,不支持手动切换。

选中storyboardxib文件,在右侧面板的Localization中添加语言文件,语言文件会自动检测该storyboardxib文件中哪些地方进行多语言化。并在文件中给出类似下面的内容,只需要在相应语言文件中修改"title"文本即可

1
2
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "sxW-84-y91"; */
"sxW-84-y91.title" = "title";

storyboardxib的多语言化是根据ObjectID来区分的。

ObjectID

国际化自动脚本

有一个很大的问题是多语言文本不能实时更新,当你新拖入一个控件,多语言文件中并不会更新该控件的ObjectID。添加脚本,实现编译工程多语言文件实时更新。

  1. Xcode中添加脚本,脚本地址和添加脚本的方法:AutoLocalization

  2. 终端运行脚本,首先更改脚本文件中的filePath

1
2
#如果在终端运行,注意要修改自己需要国际化的项目文件夹的路径!
filePath = '/Users/inspiry/Desktop/work/workCode/XDProject/mremind/mremind'

然后在终端中执行Python文件

1
python AutoGenStrings.py
打赏作者一杯咖啡
显示 Gitment 评论