欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[IOS]app内切换语言国际化

程序员文章站 2022-04-16 12:07:39
...

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的切换办法,参考如下:

https://www.jianshu.com/p/f4a317d83c59

相关标签: 国际化