最近一个一直在迭代的老项目收到一份新的开发需求,项目需要做国际化适配,简体中文+英文。由于项目中采用了storyboard和纯代码两种布局方式,所以国际化也要同时实现。上网查了些资料,实现了更改系统语言后,修改app内语言的问题。具体国际化方式可以参考下文:
3分钟实现iOS语言本地化/国际化
这篇文章讲的比较详细,很容易实现。
这个需求实现后不久,产品又给我提了一个需求,让我要在app内实现语言切换。还好之前的国际化也做了些准备,不慌不慌。
接下来就是方案的选定,通过广泛查阅资料,得出两个备选方案:
方案一:在原国际化版本的基础上做修改,在info.plist文件中新增key="appLanguage"的键值对,保存用户设定的语言类别。通过切换语言类别来改变语言。(例子:微信)
优点:之前有国际化操作的基础,执行起来并不复杂。
缺点:切换完语言后,需要重新创建app keywindow的跟控制器,会有个跳转的过程,用户体验不好。
方案二:切换语言后,发送通知,每个控制器收到通知后,更改语言。(例子:新浪微博)
优点:很自然的切换语言,选择语言后即可切换,不需要重置根控制器,用户体验好。
缺点:每个控制器都得注册接收通知,工作量太大,而且storyboard也得单独处理。
综合两个方案的优缺点,我们选择方案一。
中英切换,就是让App根据自身设置的语言去读取对应的国际化文件。在NSUserDefault中有一个字段:"AppleLanguages",这个字段就是负责存储App语言的字段,默认这个字段会根据系统语言去变动,中文系统他就存储中文,英文系统就存储英文。
废话少说,切换语言的过程上代:
// NTVLocalized.h #import <Foundation/Foundation.h> static NSString * const AppLanguage = @"appLanguage"; @interface NTVLocalized : NSObject + (NTVLocalized *)sharedInstance; //初始化多语言功能 - (void)initLanguage; //当前语言 - (NSString *)currentLanguage; //设置要转换的语言 - (void)setLanguage:(NSString *)language; //设置为系统语言 - (void)systemLanguage; @end