项目要求:多国语言适配。
正确姿势有两种:1、根据系统的语言设置软件对应的语言。2、应用内切换语言。
意外:客户要求 能够灵活的设置语言,不用重新上架,就能够读取对应的语言。上帝发话 就只能做第三种方案:根据接口来读取翻译好的字符,然后赋值。所以就做了一个接口,传语种id,返回 一个界面 对应的一组字段,后台做翻译列表,据说上帝很满意,介于界面不是很多,就不吐槽他了(注:这种方式虽然比较灵活,但是请慎用)。
NOW,开始记录前两种方式,demo在此
(1)、新建一个项目,选中该项目 点击 + 号,添加自己所需要的语言
(2)、新建一个 配置文件 string file,命名 InfoPlist
(3)、选中该文件 ,点击Localize 将设置的语言 添加进去
(4)、在生成的文件里 写入关键字 CFBundleDisplayName 设置不同语言对应的APP名称
(5)、切换系统语言 查看APP的名字 是否对应改变。
(1)、新建一个 string file 文件,命名 Localizable,重述以上步骤。
(2)、在生成的文件里添加 对应的 key = value,例如
(3)、使用方式,NSLocalizedString 这个宏其实就是在当前bundle中查找资源文件名Localizable.strings中键值key所指向的字符串
self.title = NSLocalizedString(@"首页标题", nil);
xib/storyboard 的适配 用到了脚本、自动生成 key = value,快捷而又简单。
(1)、选中项目、Build Phases 点击 + 号,选中 New Run Script Phase 添加脚本
${SRCROOT}/${TARGET_NAME}/RunScript/AutoGenStrings.py ${SRCROOT}/${TARGET_NAME}
(2)、新建一个UITableViewCell的xib文件,添加一个标题
(4)、command + B 编译一下 就会生成 对应的 值,例如
应用内切换语言是APP最常用的一种,例如微信、支付宝等都使用这种方式。
1、按照上述所示方式,建立 string file 文件,命名可以根据模块来区分。
2、创建一个单例,用于切换语言,单例中主要有三个方法,可以 看 demo
initLanguage方法,程序初始化时,读取设置的语言,默认为中文。
- (void)initLanguage {
NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:LANGUAGE_KEY];
if (language) {
self.language = language;
}else {
self.language = ZH; //默认 中文
}
self.bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:self.language ofType:@"lproj"]];
}
changeLanguage方法,切换语言,读取对应资源,并将该语言的值存储到本地。
- (void)changeLanguage:(NSString *)language {
if ([language isEqualToString:self.language]) {
return;
}else {
self.language = language;
}
self.bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:self.language ofType:@"lproj"]];
[[NSUserDefaults standardUserDefaults]setObject:self.language forKey:LANGUAGE_KEY];
}
getStringForKey方法, 读取资源文件 对应的key值,name:创建的string file 的文件名。
- (NSString *)getStringForKey:(NSString *)key name:(NSString *)name {
if (self.bundle) {
return NSLocalizedStringFromTableInBundle(key, name, self.bundle, nil);
}else {
return NSLocalizedStringFromTable(key, name, @"");
}
}
3、使用方式,详情见 demo,切换语言后 重新加载资源文件,即可实现 所见即所得。
self.title = [[LanguageManage share] getStringForKey:@"首页标题" name:@"HomeString"];
有不完善的地方,后续会继续补充。