开发java的时候要求实现语言国际化,在java中用了i18来进行处理,移动端也可以进行处理:

方法可以有以下两种:

方案一:在原国际化版本的基础上做修改,在info.plist文件中新增key="appLanguage"的键值对,保存用户设定的语言类别。通过切换语言类别来改变语言。(例子:微信)
优点:之前有国际化操作的基础,执行起来并不复杂。
缺点:切换完语言后,需要重新创建app keywindow的跟控制器,会有个跳转的过程,用户体验不好。
方案二:切换语言后,发送通知,每个控制器收到通知后,更改语言。(例子:新浪微博)
优点:很自然的切换语言,选择语言后即可切换,不需要重置根控制器,用户体验好。
缺点:每个控制器都得注册接收通知,工作量太大,而且storyboard也得单独处理。

两种方法都可实现,我们来看方案一:

中英切换,就是让App根据自身设置的语言去读取对应的国际化文件。在NSUserDefault中有一个字段:"AppleLanguages",这个字段就是负责存储App语言的字段,默认这个字段会根据系统语言去变动,中文系统他就存储中文,英文系统就存储英文。

.h文件:

// 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

.m文件:

// NTVLocalized.m#import "NTVLocalized.h"@implementation NTVLocalized
+ (NTVLocalized *)sharedInstance {static NTVLocalized *instance = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{instance = [[NTVLocalized alloc] init];});return instance;
}- (void)initLanguage{NSString *language=[self currentLanguage];if (language.length>0) {NSLog(@"自设置语言:%@",language);}else{[self systemLanguage];}
}- (NSString *)currentLanguage{NSString *language=[[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];return language;
}- (void)setLanguage:(NSString *)language{[[NSUserDefaults standardUserDefaults] setObject:language forKey:AppLanguage];
}- (void)systemLanguage{NSString *languageCode = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0];NSLog(@"系统语言:%@",languageCode);if([languageCode hasPrefix:@"zh-Hans"]){languageCode = @"zh-Hans";//简体中文}else if([languageCode hasPrefix:@"en"]){languageCode = @"en";//英语
    }[self setLanguage:languageCode];
}@end

当语言设置完成后,需要重新设置keywindow的rootViewController才可以实现语言的切换。
然而这样设置后,我们发现只有NSLocalizedString(key, comment)设置的语言才能正常显示我们需要的语言,storyBoard和xib配置的页面语言不跟着切换。

设置AppleLanguages字段的话,只会在下次启动App才会生效,在App启动后就已经生成了一个Bundle,里面识别好了对应着AppleLanguages的国际化文件,在App运行期间设置这个字段,是不生效的,所以我们去修改这个Bundle,写一个NSBundle的扩展。

// NSBundle+language.m#import "NSBundle+language.h"
#import <objc/runtime.h>static const char _bundle = 0;@interface BundleEx : NSBundle@end@implementation BundleEx- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}@end@implementation NSBundle (Language)+ (void)setLanguage:(NSString *)language {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{object_setClass([NSBundle mainBundle], [BundleEx class]);});objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}@end
// NSBundle+language.h#import <Foundation/Foundation.h>@interface NSBundle (language)
// 设置语言
+ (void)setLanguage:(NSString *)language;
@end

重新写一下设置语言的方法:

- (void)setLanguage:(NSString *)language{[NSBundle setLanguage:language];[[NSUserDefaults standardUserDefaults] setObject:language forKey:AppLanguage];[[NSUserDefaults standardUserDefaults] synchronize];
}

修改bundle后可实现语言的全部切换,不需要重启APP

若有疑问咨询QQ:1147726728

iOS国际化APP内语言切换相关推荐

  1. iOS App内语言切换(国际化)

    想要实现App内的语言切换功能,那么首先要创建国际化语言文件,用于存储对应语言显示的文本. 1.创建国际化语言文件 command+N,选择Other里面的Empty文件. 我们将其命名为Locali ...

  2. 关于iOS 国际化(类似微信切换语言)

    (1)第一次启动App 获取当前App语言版本 NSUserDefaults *userDefaults = [[NSUserDefaults standardUserDefaults] valueF ...

  3. app系统语言切换及app内部切换语言

    今天闲来无事看了点关于android系统语言及app内语言的切换,有点小感想就做了个demo,拿出来分享下 1.根据系统语言app适配 这个相对来说比较简单我们只需要建一个相应的values文件夹就好 ...

  4. Android实现应用内语言切换,android 应用内切换 多国语言

    微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能. 我们知道,android本身就支持多国语言版本的. 不过这个语言的切换 依赖于系统的的语言设置,见图 也依赖apk本身values多国语 ...

  5. iOS国际化(多国语言设置)

    1. 基本设置 第一步:先在Project的info里添加所需要支持的语言,这里选择的是Chinese(Simplified)和English-Development Language,点击Finis ...

  6. android自动切换暗色,超实用!Android 深色模式适配(可定时开启的APP内主题切换管理工具)...

    前言 前面分享了一篇"黑白化主题"的文,主要适用场景是不久就要到来的"清明"等时节或者是其他的国家公祭日什么的(一名成熟的程序员,要学会自己提产品需求). 今天 ...

  7. iOS 上 App 内购买(in-app purchase)的误消费可以退款吗?

    iOS 上 App 内购买(in-app purchase)的误消费可以退款吗?修改 周二晚按照@任轶 的答案做了,把购物清单的四个订单号列在内容里,当晚收到了苹果公司自动回复,周三受到苹果公司团队中 ...

  8. Android app内语言环境切换

    逻辑很简单: 1  app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创 ...

  9. iOS 程序内语言切换 -- 中英文切换

    随着时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等:想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界 ...

最新文章

  1. Android ScrollView 滑动指定的距离
  2. 观《逻辑思维,如何成为一个高手》
  3. DNA测序,第一代DNA测序,第二代DNA测序,第三代DNA测序,sanger法
  4. 归并排序(转载http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html)
  5. SpringBoot处理JSON数据
  6. Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包...
  7. No tag datetimepicker defined in tag library imported with prefix s解决
  8. mysql业务繁忙时能建索引吗_MySQL DBA面试高频三十问
  9. IDEA中中文乱码问题解决方案
  10. 一、Web服务器——Tomcat Servlet学习笔记
  11. 使用fstream在C++工程中读取文件到二维数组
  12. Linux调用可执行程序
  13. Linux字符串转换函数汇总
  14. LOAM: Lidar Odometry and Mapping in Real-time
  15. calender get方法_Calendar.get()方法--- WEEK_OF_YEAR 、MONTH、
  16. BZOJ 2301 Problem b
  17. Spring: Export - WAR file - 404 Not Found 问题
  18. 高级GIS-0.整体裁剪
  19. matlab中求雅克比矩阵的方法及cov函数的用法,协方差矩阵—Hessian矩阵—正定矩阵
  20. 计算机行为治疗模式,抑郁症的计算机化认知行为治疗(27页)-原创力文档

热门文章

  1. “程序媛”往往比“程序猿”更受认可,但前提是不能公开性别
  2. MS-Model【1】:nnU-Net
  3. Ventuz打包vpr显示鼠标图标设置
  4. 【UEFI】PCIE学习笔记
  5. NAS SAN DAS都是什么
  6. 微信小程序const app=getApp()的作用,实现page页面获取全局数据
  7. 矩阵的对数运算公式_HanLP-对数概率转概率
  8. js中的NaN并不等于NaN
  9. GAN omaly: Anomaly Detection using GANs
  10. Qt开发 — QDebug 使用小结