iOS多语言开发
好多主流app都支持多语言(或者叫本地化),有的是自动适应系统语言,有的是用户选择修改。比如微信支持如下语言,可以根据系统自适应,也可以用户更改。
创建多语言文件
在工程中command + n创建文件,选择iOS -> Resource -> Strings File文件,自定义文件名,创建完成。
添加多语言
选中新创建的多语言文件,展开右侧的侧边栏,在侧边栏里,点击Localization下的Localize...按钮,选择English,点击Localize。
选中工程在PROJECT里面的Localizations,添加语言。
每添加一个,在新建的多语言文件下就会多一个以.strings为后缀名的文件,这就是每个语言对应的语言文件。里面存放的语言文字是以key - value形式保存,每个文件中key是一样的,value对应着该语言下的文字。比如:
中文简体文件File.strings(Chinese(Simplified))里面存放的是:
"text"="世界,你好。";
英文文件File.strings(English)里存放的是:
"text"="hello,world.";
key值保持一致,是text,value对应该文字翻译的每种语言。
适应系统语言
访问语言文件的宏定义
#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。使用方式如下:
_label.text = NSLocalizedStringFromTable(@"text", @"File", nil);
还可以使用宏NSLocalizedString(key, comment),没有tbl文件名参数,这时工程里的多语言文件名必须为Localizable。
手动设定语言
语言文件在工程内是以.lproj格式存储的,比如简体中文是zh-Hans.lproj,繁体中文是zh-Hant.lproj,英文是en.lproj。
手动设定语言就是让工程访问哪个文件。要保留app的语言设置,下次打开app还是上次设置好的语言环境。语言设置属于偏好设置,一般用NSUserDefaults存储。
保存环境设置:
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];//以简体中文为例
[userd synchronize];
设置语言环境:
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里简单判断一下即可。如果没有,即存入简体中文
NSUserDefaults *userd = [NSUserDefaults standardUserDefaults];
if (![userd objectForKey:@"appLanguage"]) {
[userd setObject:@"zh-Hans" forKey:@"appLanguage"];
[userd synchronize];
}
显示系统语言设置
首先要获取系统环境的语言,然后与app支持的语言做比较,如果app支持的语言里有目前系统语言,则显示该语言,如果没有则显示默认语言。
获取系统环境语言:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
具体实现:
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"];//设置为简体中文
}
}