iOS开发之国际化多语言切换

iOS项目中的多语言切换其实实现起来很简单,其大致原理就是创建几个语言包,里面以键值对的形式写着各种语言对应的内容,在进行语言切换的时候通过键去指定的语言包里面去获取对应的值;这里值得注意的是,语言包中键值对格式是固定的.并且同一个内容对应的键的名称要保持名字一致的,格式为:"back" = "返回";
其大致步骤如下所示:
首先创建资源文件,取名为Localizable

创建语言资源文件.png

下一步选中Localizable.strings文件看右边工具栏点击Localize...:
点击Localize....png

continue.png

然后选中工程project,注意不是target:
选中工程.png

点击+,添加你要国际化的若干种语言 :
点击+号.png

工程中就出现了一一对应的语言资源文件,键值对就是写在这里面的:
语言包文件.png

这里要特别注意的是同一个内容对应的键必须是一致的,在代码中根据语言包直接取对应的键对应的值:

- (NSString *)internationalizedStringForKey:(NSString *)key value:(nullable NSString *)value{
    return [self.currentBundle localizedStringForKey:key value:@"" table:nil];
}

- (NSString *)getCurrentLanguage{
    return [self currentLanguage];
}

- (NSArray *)getAppConfigLanguages{
    return self.languages;
}

- (void)setAppLanguageWithLanguageIndex:(NSInteger)index complete:(SettingLanguageSuccess)complete{
    NSAssert(index < self.languages.count, @"Please check pre-setting languages array");
    NSString *language = kuserDefaults(appLanguageKey);
    if (![language isEqualToString:self.languages[index]]) {
        NSLog(@"======>>>>>>>>new language:%@",self.languages[index]);
        kuserDefaultsSet(_languages[index], appLanguageKey);
        ksynchronize;
        //1秒之后发送通知改变语言
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] postNotificationName:kAppLanguageDidChange object:nil];
            if (complete) {
                complete(YES);
            }
        });
    }
}

#pragma mark - private
- (NSBundle *)currentBundle{
    _currentBundle = [NSBundle bundleWithPath:[self getBundlePath]];
    return _currentBundle;
}

- (NSString *)getBundlePath{
    NSString *path = [[NSBundle mainBundle] pathForResource:[self currentLanguage] ofType:@"lproj"];
    return path;
}

- (NSString *)currentLanguage{
    //获取当前语言
    NSString *language = [[[NSBundle mainBundle] preferredLocalizations] firstObject];
    if ( kuserDefaults(appLanguageKey)&& ![kuserDefaults(appLanguageKey) isEqualToString:language]) {
        language = kuserDefaults(appLanguageKey);
    }
    return language;
}

- (NSArray *)languages{
    if (!_languages) {
        _languages = @[@"en", @"zh-Hans",@"fr"];
    }
    return _languages;
}

在切换成功以后一般发送一个通知给tabbarController也就是keyWindow的rootViewController或者给AppDelegate,让其重新初始化一遍,实现界面的重新赋值。
作者-------mrChan1234

你可能感兴趣的:(iOS开发之国际化多语言切换)