iOS项目中的多语言切换其实实现起来很简单,其大致原理就是创建几个语言包,里面以键值对的形式写着各种语言对应的内容,在进行语言切换的时候通过键去指定的语言包里面去获取对应的值;这里值得注意的是,语言包中键值对格式是固定的.并且同一个内容对应的键的名称要保持名字一致的,格式为:"back" = "返回";
其大致步骤如下所示:
首先创建资源文件,取名为Localizable
下一步选中Localizable.strings文件看右边工具栏点击Localize...:
然后选中工程project,注意不是target:
点击+,添加你要国际化的若干种语言 :
工程中就出现了一一对应的语言资源文件,键值对就是写在这里面的:
这里要特别注意的是同一个内容对应的键必须是一致的,在代码中根据语言包直接取对应的键对应的值:
- (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