相信大家在iOS开发中都遇到了一个问题,随着应用越来越完善,很多应用都做了国际化,也实现了应用程序内部切换语言。那么如何实现的呢?下面来一起看看详细的介绍吧
国际化都会走到NSBundle的<代码> - (NSString *) localizedStringForKey: (NSString *)键值:(nullable NSString *)值表:(nullable NSString *)表> 代码方法,使用自定义包替换NSBundle,通过切换根控制器来完成应用程序内部切换语言。
<强> 1。拦截国际化方法强>
通过分类和运行时来实现拦截,将包替换为自定义CLBundle。
+(空白)负载{ 静态dispatch_once_t> (NSString *) localizedStringForKey:(NSString *)键值:(NSString *)值表:(NSString *)表名{ 如果([CLBundle cl_mainBundle]) { 返回[[CLBundle cl_mainBundle] localizedStringForKey:键值:价值表:表名); 其他}{ 返回(超级localizedStringForKey:键值:值表:表名); } } + (NSBundle *) cl_mainBundle { 如果([NSBundle currentLanguage] . length) { NSString *路径=[[NSBundle mainBundle] pathForResource: [NSBundle currentLanguage]减低:@“lproj”); 如果(path.length) { 返回(NSBundle bundleWithPath:路径); } } 返回nil; } + (NSString *) currentLanguage { 返回(CLLanguageManager userLanguage] & # 63;当做又NSLocale: [preferredLanguages] .firstObject; }
<强> 3。语言管理类强>
将语言切换调用设置简单封装,方便调用。
+ (void) setUserLanguage:(NSString *) userLanguage {//跟随手机系统 如果(! userLanguage.length) { (自我resetSystemLanguage); 返回; }//用户自定义 [[NSUserDefaults standardUserDefaults] setValue: userLanguage forKey: CLUserLanguageKey); [[NSUserDefaults standardUserDefaults] setValue: @ [userLanguage] forKey: @“AppleLanguages”); [[NSUserDefaults standardUserDefaults)同步); } + (NSString *) userLanguage { 返回[[NSUserDefaults standardUserDefaults] valueForKey CLUserLanguageKey):; }/* * 重置系统语言 */+ (void) resetSystemLanguage { [[NSUserDefaults standardUserDefaults] removeObjectForKey CLUserLanguageKey):; [[NSUserDefaults standardUserDefaults] setValue: nil forKey: @“AppleLanguages”); [[NSUserDefaults standardUserDefaults)同步); }
<强> 4。切换根控制器来切换语言强>
为了减少工作量,直接切换根控制器来达到语言切换。
[CLLanguageManager setUserLanguage: @“en”); CLTabbarController *选项=[[CLTabbarController alloc] init); 选项卡。selectedIndex=3; UINavigationController *导航控制器=tabbarController.selectedViewController; NSMutableArray * viewcontroller=navigationController.viewControllers.mutableCopy;//取出我的页面,提前加载,解决返回按钮不变化 CLMyController *我=(CLMyController *) [viewcontroller firstObject); [我loadViewIfNeeded];//新建设置语言页面 CLChangeLanguageController * languageController=[[CLChangeLanguageController alloc] init); languageController。hidesBottomBarWhenPushed=是的; [viewcontroller addObject languageController):;//解决奇怪的动画bug。 设置(dispatch_get_main_queue ()、^ { UIApplication sharedApplication .keyWindow。rootViewController=选项; 导航控制器。viewcontroller=viewcontroller; CLLog(@”已切换到语言% @”,[NSBundle currentLanguage]); });
效果图