美文网首页cocoaPods的安装、更新、使用
iOS开发之国际化多语言切换

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

作者: mrChan1234 | 来源:发表于2017-12-05 15:52 被阅读0次

    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开发之国际化多语言切换

        本文链接:https://www.haomeiwen.com/subject/itjcixtx.html