iOS開(kāi)發(fā)之國(guó)際化多語(yǔ)言切換

iOS項(xiàng)目中的多語(yǔ)言切換其實(shí)實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,其大致原理就是創(chuàng)建幾個(gè)語(yǔ)言包,里面以鍵值對(duì)的形式寫著各種語(yǔ)言對(duì)應(yīng)的內(nèi)容,在進(jìn)行語(yǔ)言切換的時(shí)候通過(guò)鍵去指定的語(yǔ)言包里面去獲取對(duì)應(yīng)的值;這里值得注意的是,語(yǔ)言包中鍵值對(duì)格式是固定的.并且同一個(gè)內(nèi)容對(duì)應(yīng)的鍵的名稱要保持名字一致的,格式為:"back" = "返回";
其大致步驟如下所示:
首先創(chuàng)建資源文件,取名為L(zhǎng)ocalizable

創(chuàng)建語(yǔ)言資源文件.png

下一步選中Localizable.strings文件看右邊工具欄點(diǎn)擊Localize...:
點(diǎn)擊Localize....png

continue.png

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

點(diǎn)擊+,添加你要國(guó)際化的若干種語(yǔ)言 :
點(diǎn)擊+號(hào).png

工程中就出現(xiàn)了一一對(duì)應(yīng)的語(yǔ)言資源文件,鍵值對(duì)就是寫在這里面的:
語(yǔ)言包文件.png

這里要特別注意的是同一個(gè)內(nèi)容對(duì)應(yīng)的鍵必須是一致的,在代碼中根據(jù)語(yǔ)言包直接取對(duì)應(yīng)的鍵對(duì)應(yīng)的值:

- (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秒之后發(fā)送通知改變語(yǔ)言
        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{
    //獲取當(dāng)前語(yǔ)言
    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;
}

在切換成功以后一般發(fā)送一個(gè)通知給tabbarController也就是keyWindow的rootViewController或者給AppDelegate,讓其重新初始化一遍,實(shí)現(xiàn)界面的重新賦值。
作者-------mrChan1234

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容