iOS app内语言的切换

  继上一篇文字,这次写一下app内切换语言。上一篇传送门iOS语言国际化
  上周一个星期都不在状态,原来是感冒了,眼睛也不舒服,还上火,我丢· 我是干了什么啊· 心累。。。。。

回归正题

 我的实现是这样的。
 废话不多说,先上代码。(不对 先上图)


iOS app内语言的切换_第1张图片
假装模仿一下支付宝切换语言
+ (void)initUserLanguage{
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString *string = [def valueForKey:UserLanguage];
    if(string.length == 0)
    {
        //获取系统当前语言版本(中文zh-Hans,英文en)
        NSArray *languages = [NSLocale preferredLanguages];
        NSString *current = [languages objectAtIndex:0];
        string = [self languageFormat:current];
        //个人需求 目前就两种语言
        if (![string isEqualToString:@"zh-Hans"]&&![string isEqualToString:@"en"]) {
            string=@"en";
        }
        [def setValue:current forKey:UserLanguage];
        [def synchronize];
        
    }
    //获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:string] ofType:@"lproj"];
    
    bundle = [NSBundle bundleWithPath:path];//生成bundle
}

///语言和语言对应的.lproj的文件夹前缀不一致时在这里做处理
+ (NSString *)languageFormat:(NSString*)language {
    if([language rangeOfString:@"zh-Hans"].location != NSNotFound)
    {
        return @"zh-Hans";
    }
    else if([language rangeOfString:@"zh-Hant"].location != NSNotFound)
    {
        return @"zh-Hant";
    }
    else
    {
        //字符串查找
        if([language rangeOfString:@"-"].location != NSNotFound) {
            //除了中文以外的其他语言统一处理@"ru_RU" @"ko_KR"取前面一部分
            NSArray *ary = [language componentsSeparatedByString:@"-"];
            if (ary.count > 1) {
                NSString *str = ary[0];
                return str;
            }
        }
    }
    return language;
}

首先初始化你的语言,存储到偏好设置。取不到对应的key 就用系统的语言。这边对获取到的语言做了一点小处理。
你可以在AppDelegate里初始化一下。

+ (NSString *)getStringByKey:(NSString *)key
{
    if (![[LocalizationManager bundle] localizedStringForKey:key value:@"" table:nil]) {
        return [[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil];
    }
    return [[LocalizationManager bundle] localizedStringForKey:key value:@"" table:nil];
}

需要语言国际化的字符串用这个方法来取值。

最后就是改变语言了。

+ (void)setUserlanguage:(NSString *)language{
    
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    
    //1.第一步改变bundle的值
    NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:language] ofType:@"lproj" ];
    
    bundle = [NSBundle bundleWithPath:path];
    
    //2.持久化
    [def setValue:language forKey:UserLanguage];
    
    [def synchronize];
    //重置app
    [self resetRootViewController];
}

重置app就看个人需求了·做了一个小 Demo,假装模仿一下支付宝设置多语言。可以简单参考参考,很简单的啦。

你可能感兴趣的:(iOS app内语言的切换)