斗地主怎样记牌|宋小宝斗地主搞笑视频
登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

ios内部切换语言

[复制链接]
来自: JmoVxia 分类: iOS精品源码 上传时间: 2019-2-17 23:59:39
Tag:

项目介绍:

前言

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, ^{  
? ?? ???//动态?#22363;小⒔换唬?#26041;法类似KVO,通过修改[NSBundle mainBundle]对象的isa指针,使其指向它的子类CLBundle,这样便可以调用子类的方法;其实这里?#37096;?#20197;使用method_swizzling来?#25442;籱ainBundle的实现,来动态判断,可以同样实现。  
? ?? ???object_setClass([NSBundle mainBundle], [CLBundle class]);  
? ? });  
}  

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

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

- (NSString *)localizedStringForKey![:(](static/image/smiley/default/sad.gif)NSString *)key value![:(](static/image/smiley/default/sad.gif)NSString *)value table![:(](static/image/smiley/default/sad.gif)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![:@](static/image/smiley/default/huffy.gif)"lproj"];  
? ?? ???if (path.length) {  
? ?? ?? ?? ?return [NSBundle bundleWithPath:path];  
? ?? ???}  
? ? }  
? ? return nil;  
}  

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

3.语言管理类

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

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

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

/**  
重置系统语言  
*/  
+ (void)resetSystemLanguage {  
? ? [[NSUserDefaults standardUserDefaults] removeObjectForKey:CLUserLanguageKey];  
? ? [[NSUserDefaults standardUserDefaults] setValue:nil forKey![:@](static/image/smiley/default/huffy.gif)"AppleLanguages"];  
? ? [[NSUserDefaults standardUserDefaults] synchronize];  
}  

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

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

[CLLanguageManager setUserLanguage![:@](static/image/smiley/default/huffy.gif)"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];  
? ? //解决奇?#20540;?#21160;画bug。  
dispatch_async(dispatch_get_main_queue(), ^{  
? ? [UIApplication sharedApplication].keyWindow.rootViewController = tabbarController;  
? ? navigationController.viewControllers = viewControllers;  
? ? CLLog(@"已切换到语言 %@", [NSBundle currentLanguage]);  
});  

总结

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

相关源码推荐:

我来说两句
*滑动验证:
所有评论(17)
ff12345 2019-2-18 09:56:47
感谢大神分享,必须顶!
回复
t8569 2019-2-18 09:56:54
小弟学习了~支持,支持
回复
op568f 2019-2-18 09:56:57
code4app好的代码demo真的很多,谢谢啦~
回复
inta加加 2019-2-18 09:57:40
感谢大神分享,必须顶!
回复
kengsir 2019-2-18 09:57:43
学习...学习...
回复
这是个逗比 2019-2-18 09:57:56
感谢大神~
回复
code4app热心网友 2019-2-18 15:52:13
我只是路过打酱油的。
回复
code4app热心网友 2019-2-19 09:05:14
我只是路过打酱油的。
回复
code4app热心网友 2019-2-19 09:05:41
淡定,淡定,淡定……
回复
12下一页
提取码:  下载?#38382;?8 状态:已购或VIP 售价:0(原价:15)金钱 下载权限:初级码农 
669 2 18
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡?#23376;?#38596;榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
[email protected]
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表
斗地主怎样记牌