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