ios设置app内部语言国际化

前言:最近遇到一个客户需求,修改app内语言,除中文外都为英文,搜了很多资料,最终完成。
第一步:我们都知道首先需要获取系统语言
NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"]; NSString *currentLanguage = languages.firstObject;
第二步:我们要判断当前是中文还是非中文
if([currentLanguage isEqualToString:@"zh-Hans-CN"]){//简体中文处理
}else{//非中文处理}
如果 [[NSUserDefaults standardUserDefaults] setObject:@"语言" forKey:@"AppleLanguages"]; 来处理
那么,会导致每次进入app时,都会读取AppleLanguages的首个元素,最后只会读取本地的语言,不会读取系统语言。
因此我们要想办法避开AppleLanguages。
使用另外一个key替代原来的AppleLanguages,这里我用的myLanguage,保存我们需要保存的语言
- (void)changeLanguageTo:(NSString *)language {// 设置好的语言存储好,下次进来直接加载[[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"]; [[NSUserDefaults standardUserDefaults] synchronize]; }
首次进入需要读取本地存储的语言
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"myLanguage"] && ![[[NSUserDefaults standardUserDefaults] objectForKey:@"myLanguage"] isEqualToString:@""]) {
//非首次同样判断当前系统语言,然后我们需要做的就是修改语言
}else{ //首次没有本地存储时读取系统语言并存储
if([currentLanguage isEqualToString:@"zh-Hans-CN"]){
[self changeLanguageTo:@"zh-Hans-CN"];
}else{
[self changeLanguageTo:@"en"];
}}
第三步:修改系统语言
在App启动后会生成了一个Bundle,里面识别好了对应着AppleLanguages的国际化文件,在app运行期间,我们只需要去修改bundle,这里我们写一个bundle的扩展
#import
@interfaceNSBundle(Language)
+ (void)setLanguage:(NSString *)language;
@end
.m实现代码:
#import "NSBundle+Language.h"
#import
static const char _bundle = 0;
@interface BundleZd : NSBundle
@end
@implementation BundleZd
- (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
@implementationNSBundle (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
在appdelegate中使用[NSBundle setLanguage:@"语言"]来设置具体语言
if([currentLanguage isEqualToString:@"zh-Hans-CN"]){
[NSBundle setLanguage:@"zh-Hans-CN"];
}else{
[NSBundle setLanguage:@"en"];
}
【ios设置app内部语言国际化】changeLanguageTo方法中也需要加入 [NSBundle setLanguage:@"当前的语言"]; //即首次进入也需要设置

    推荐阅读