HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iOS开发教程之APP内部切换语言的实现方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

相信大家在iOS开发中都遇到了一个问题,随着APP越来越完善,很多APP都做了国际化,也实现了APP内部切换语言。那么如何实现的呢?下面来一起看看详细的介绍吧

原理

国际化都会走到NSBundle的- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tablename方法,使用自定义Bundle替换NSBundle,通过切换根控制器来完成APP内部切换语言。

1.拦截国际化方法

通过分类和runtime来实现拦截,将Bundle替换为自定义CLBundle。

+ (void)load {
 static dispatch_once_t onCEToken;
 dispatch_once(&onCEToken,^{
  //动态继承、交换,方法类似KVO,通过修改[NSBundle mainBundle]对象的isa指针,使其指向它的子类CLBundle,这样便可以调用子类的方法;其实这里也可以使用method_swizzling来交换mainBundle的实现,来动态判断,可以同样实现。
  object_setClass([NSBundle mainBundle],[CLBundle class]);
 });
}

2.重写方法判断加载哪一种语言

重写mainBundle方法,通过语言管理类获取当前应该加载哪一种语言。

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tablename {
 if ([CLBundle cl_mainBundle]) {
  return [[CLBundle cl_mainBundle] localizedStringForKey:key value:value table:tablename];
 } else {
  return [super localizedStringForKey:key value:value table:tablename];
 }
}

+ (NSBundle *)cl_mainBundle {
 if ([NSBundle currentLanguage].length) {
  NSString *path = [[NSBundle mainBundle] pathForresource:[NSBundle currentLanguage] ofType:@"lproj"];
  if (path.length) {
   return [NSBundle bundleWithPath:path];
  }
 }
 return nil;
}

+ (NSString *)currentLanguage {
 return [CLLanguageManager userLanguage] ? : [NSLocale preferredLanguages].firstObject;
}

3.语言管理类

将语言切换调用设置简单封装,方便调用

+ (void)setUserLanguage:(NSString *)userLanguage {
 //跟随手机系统
 if (!userLanguage.length) {
  [self resetSystemLanguage];
  return;
 }
 //用户自定义
 [[NSUserDefaults standardUserDefaults] SETVALue:userLanguage forKey:CLUserLanguageKey];
 [[NSUserDefaults standardUserDefaults] SETVALue:@[userLanguage] forKey:@"AppleLanguages"];
 [[NSUserDefaults standardUserDefaults] synchronize];
}

+ (NSString *)userLanguage {
 return [[NSUserDefaults standardUserDefaults] valueForKey:CLUserLanguageKey];
}

/**
 重置系统语言
 */
+ (void)resetSystemLanguage {
 [[NSUserDefaults standardUserDefaults] removeObjectForKey:CLUserLanguageKey];
 [[NSUserDefaults standardUserDefaults] SETVALue:nil forKey:@"AppleLanguages"];
 [[NSUserDefaults standardUserDefaults] synchronize];
}

4.切换根控制器来切换语言

为了减少工作量,直接切换根控制器来达到语言切换。

[CLLanguageManager setUserLanguage:@"en"];
 CLTabbarController *tabbarController = [[CLTabbarController alloc] init];
tabbarController.SELEctedIndex = 3;
UINavigationController *navigationController = tabbarController.SELEctedViewController;
NSMutableArray *viewControllers = navigationController.viewControllers.mutableCopy;
 //取出我的页面,提前加载,解决返回按钮不变化
 CLMyController *me = (CLMyController *)[viewControllers firstObject];
[me loadViewIfNeeded];
 //新建设置语言页面
CLChangeLanguageController *languageController = [[CLChangeLanguageController alloc] init];
languageController.hidesBottomBarWhenPushed = YES;
[viewControllers addObject:languageController];
 //解决奇怪的动画bug。
dispatch_async(dispatch_get_main_queue(),^{
 [UIApplication sharedApplication].keyWindow.rootViewController = tabbarController;
 navigationController.viewControllers = viewControllers;
 CLLog(@"已切换到语言 %@",[NSBundle currentLanguage]);
});

@L_696_25@图

iOS开发教程之APP内部切换语言的实现方法

总结

以上是使用国际化来实现APP内部切换语言,希望能够给大家帮助,demo地址--->>CLDemo (本地下载)

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持

大佬总结

以上是大佬教程为你收集整理的iOS开发教程之APP内部切换语言的实现方法全部内容,希望文章能够帮你解决iOS开发教程之APP内部切换语言的实现方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:ios