最近公司项目中要求本地化,以及实现内部修改语言的功能,通俗来说本地化或者国际化就是app显示的语言和手机系统设定的语言一致.
本地化配置,大家百度一搜一大堆 我就不详述了,下面主要说下怎么实现app内部修改其语言.首先我们我们看下APP本地化怎么实现的(以字符串本地化为例).
首先app会存储系统语言通过下面这个方法可以获取手机系统设置的语言:
NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
NSString *current = [languages objectAtIndex:0];
这是我简单配置一个label显示的字符串(英文)
这是我配置的同上label简体中文显示的字符串
然后我们可以通过系统提供的宏来找到配置的本地化文件中的key(如上click)找到对应的显示内容.
1 NSLocalizedString("label",nil); <根据设置的key得到对应的内容*文件名必须是Localizable*>
2 NSLocalizedStringFromTable(@"label", @"STLocalizable",nil); <根据文件命名和key>
3 NSLocalizedStringFromTableInBundle(@"label", @"STLocalizable", bundle,nil); <根据文件名 bundle和key>
4 NSLocalizedStringWithDefaultValue(@"label", @"STLocalizable", bundle, @"label",nil); <根据key 文件名 文件名 和 key>
从上我们可以看出其实得到对应的字符串自由度越来越大.show in finder上面配置本地化文件我们可以看到:
这两个文件夹里面的Localizable.strings中就存储着我们要内容<这两个文件夹名刚好是设置语言的标志+lproj>.
通过上面分析:我们只要找到所需要的文件夹,读取对应的内容就可以达到修改app语言的内容.
一.首先app内部得记录我们所要显示的语言<可以选择偏好设置-例如如下写法>
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
二, 第一次启动app时需要初始化语言<因为我们始终都要通过我们记录的语言来设置对应的内容> 第一次就按照系统的语言来设置吧 如下:
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *string = [def valueForKey:@"userLanguage"];
if(string.length == 0){
//获取系统当前语言版本(中文zh-Hans,英文en)
NSArray* languages = [def objectForKey:@"AppleLanguages"];
NSString *current = [languages objectAtIndex:0];
string = current;
[def setValue:current forKey:@"userLanguage"];
[def synchronize];//持久化,不加的话不会保存
}
三,大家是否还记得我们找到对应的内容是通过找到带有语言标志的文件夹里面的的内容,故还要记录当前语言下的文件夹路径也就是bundle<声明全局的的变量就可以> **上面第二部初始化语言也应该记录当前的bundle**
//获取文件路径
l例如 NSString *language = @"en";
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];
四,然后我们通过记录的bundle找到对应的内容
NSString *content = [bundle localizedStringForKey:key value:nil table:@"Localizable"];
五,实现修改语言
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//1.第一步改变bundle的值 假如language是我要设置的语言
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
bundle = [NSBundle bundleWithPath:path];
//2.持久化
[def setValue:language forKey:@"userLanguage"];
[def synchronize];
本人写了一个app内部实现 中英文切换的demo 欢迎下载~github.com/guojingjingghost/APPInternational.git