OC:
Util:
#import "LanguageTool.h"
#import "SessionManager.h"
#define CNS @"zh"
#define EN @"en"
#define tap @"change_language"
static NSBundle *localeBundle = nil;
static NSString *currentLanguage = nil;
@interface LanguageTool()
@end
@implementation LanguageTool
+(instancetype)getInstance{
static LanguageTool *manager = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
manager = [[LanguageTool alloc] init];
});
return manager;
}
-(void)getLastTimeLanguage{
}
-(void)changeLanguage:(NSString*)language{
currentLanguage = language;
NSString *path = [[NSBundle mainBundle]pathForResource:language ofType:@"lproj"];
if (path && ![@"en" isEqualToString:language]) {
localeBundle = [NSBundle bundleWithPath:path];
}else{
localeBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]];
}
}
-(void)judgeLanguage{
//Get last change language
NSString *lastChangeLanguage = nil;
lastChangeLanguage = [SessionManager getSession:[SessionManager getLastLanguageTap]];
// NSLog(@"last chage language: %@",lastChangeLanguage);
//语言优先级:currentLanguage > lastChangeLanguage > system default language
//user 没有设定语言时:获取系统默认语言
if (!lastChangeLanguage) {
if (!currentLanguage) {
//获取系统默认语言:
//截取:zh-Hant-HK 去掉区域保留:zh-Hant
NSLog(@"-------system language:%@",[NSLocale preferredLanguages][0]);
currentLanguage = [[NSLocale preferredLanguages][0] substringToIndex:2];
if ([currentLanguage containsString:@"zh"]) {
currentLanguage = [NSString stringWithFormat:@"%@%@",currentLanguage,@"-Hant"];
}
}
}else if(!currentLanguage){
//当前没有切换语言,app内有设定语言,优先app内语言
currentLanguage = lastChangeLanguage;
}
}
- (NSBundle *)getLocaleBundle{
[self judgeLanguage];
// NSLog(@"------current language :%@",currentLanguage);
// NSLog(@"-------system language:%@",[NSLocale preferredLanguages][0]);
NSString *path = [[NSBundle mainBundle]pathForResource:currentLanguage ofType:@"lproj"];
if (path) {
localeBundle = [NSBundle bundleWithPath:path];
}else{
localeBundle= [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]];
}
return localeBundle;
}
-(NSString *)getTap{
return tap;
}
-(NSString *)getCurrentLanguage{
// if (!currentLanguage) {
// //截取:zh-Hant-HK 去掉区域保留:zh-Hant
// currentLanguage = [[NSLocale preferredLanguages][0] substringToIndex:2];
// }
[self judgeLanguage];
NSLog(@"current language:%@",currentLanguage);
return currentLanguage;
}
@end
NSString *account = NSLocalizedStringFromTableInBundle(Account_Lb_Title, nil, [[LanguageTool getInstance] getLocaleBundle] , @"");
这样就能显示实时切换语言,不用退出app
这里是tableview的点击事件,点击切换语言
if(row == 0){
[self changeLanguage:@"en" BeforeCell:temp AfterCell:indexPath];
// [self changeLanguage:@"en"];
// [self changeLanguage:@"en" BeforeCell:_selectRow AfterCell:row]
}else if(row == 1){
[self changeLanguage:@"zh-Hant" BeforeCell:temp AfterCell:indexPath];
// [self changeLanguage:@"zh-Hant"];
}
swift:
原理一样,可以引用上面的Util
调用:
let menuPingTest = NSLocalizedString(Config.advanced.menu_ping_test, tableName: nil, bundle: (LanguageTool.getInstance()?.getLocaleBundle())! ,value: "", comment: "")
还有其他针对swift的切换办法,参考如下: