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"];

        }

changeLanguageTo方法中也需要加入 [NSBundle setLanguage:@"当前的语言"];//即首次进入也需要设置


你可能感兴趣的:(ios设置app内部语言国际化)