iOS开发之 oc 国际化 切换语言

344 阅读2分钟

很多项目在面向国外的时候,都需要在项目里做好国际化,也就是切换不同语言,一般可切换中英文两种,当然也有可能有其他语言,这里以切换中英文为例。当了解了切换中英文,增加其他语言的时候,就只需要增加翻译文件了。

Step1、添加string翻译文件,并命名为Language

Step2、在project-》info里找到Localizations里点击左下角的“+”,找到English英语和Chinese,Simplified中文简体,点击选中再选择Language,等添加后如下图:

Step3、增加Language.string翻译文件的内容,当选中Language(English)时,可增加以下内容:

"账号" = "Account";

"密码" = "Password";

"登录" = "Log in";

"还没有账号?" = "Don't have an account yet?";

"注册" = "Register";

当选中Language(Chinese,Simplified)时,可增加以下内容:

"账号" = "账号";

"密码" = "密码";

"登录" = "登录";

"还没有账号?" = "还没有账号?";

"注册" = "注册";

Step4、新建ACChangeLanguage工具类

.h文件

#import <Foundation/Foundation.h>

#define LocalLanguageKey @"LocalLanguageKey" //选择语言

NS_ASSUME_NONNULL_BEGIN

@interface ACChangeLanguage : NSObject

+(NSBundle *)bundle;//获取当前资源文件

+(void)initUserLanguage;//初始化语言文件

+(NSString *)getCurrentLanguage;//获取应用当前语言

+(void)setUserlanguage:(NSString *)language;//设置当前语言

@end

NS_ASSUME_NONNULL_END

.m文件

#import "ACChangeLanguage.h"

@implementation ACChangeLanguage

static NSBundle *bundle = nil;

+ ( NSBundle * )bundle{

return bundle;

}

//首次加载的时候先检测语言是否存在

+(void)initUserLanguage{

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

NSString *currLanguage = [def valueForKey:LocalLanguageKey];

if(!currLanguage){

currLanguage = @"en";

NSArray *preferredLanguages = [NSLocale preferredLanguages];

currLanguage = preferredLanguages[0];

if ([currLanguage hasPrefix:@"en"]) {

currLanguage = @"en";

} else if ([currLanguage hasPrefix:@"zh"]) {

currLanguage = @"zh-Hans";

} else {

currLanguage = @"en";

}

[def setValue:currLanguage forKey:LocalLanguageKey];

[def synchronize];

}

//获取文件路径

NSString *path = [[NSBundle mainBundle] pathForResource:currLanguage ofType:@"lproj"];

bundle = [NSBundle bundleWithPath:path];//生成bundle

}

//获取当前语言

+(NSString *)getCurrentLanguage{

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

NSString *language = [def valueForKey:LocalLanguageKey];

return language;

}

// 设置语言

+(void)setUserlanguage:(NSString *)language{

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSString *currLanguage = [userDefaults valueForKey:LocalLanguageKey];

if ([currLanguage isEqualToString:language]) {

return;

}

[userDefaults setValue:language forKey:LocalLanguageKey];

[userDefaults synchronize];

NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];

bundle = [NSBundle bundleWithPath:path];

}

@end

Step5、在需要切换语言的地方导入头文件和预定义

#import "ACChangeLanguage.h"

#define LocalizationKey(key) [[ACChangeLanguage bundle] localizedStringForKey:key value:nil table:@"Language"]

然后,在相应的点击事件中去调用以及刷新UI

- (IBAction)flagBtnAction:(UIButton *)sender {

self.changeLanguageTipView.hidden = NO;

}

- (IBAction)englishBtnAction:(UIButton *)sender {

self.flagImageView.image = [UIImage imageNamed:@"flagEnglish"];

[ACChangeLanguage setUserlanguage:@"en"];

[self resetUIAction];

}

- (IBAction)chineseBtnAction:(UIButton *)sender {

self.flagImageView.image = [UIImage imageNamed:@"flagChinese"];

[ACChangeLanguage setUserlanguage:@"zh-Hans"];

[self resetUIAction];

}

- (void)resetUIAction {

if ([[ACChangeLanguage getCurrentLanguage] isEqualToString:@"en"]) {

self.flagImageView.image = [UIImage imageNamed:@"flagEnglish"];

} else if ([[ACChangeLanguage getCurrentLanguage] isEqualToString:@"zh-Hans"]) {

self.flagImageView.image = [UIImage imageNamed:@"flagChinese"];

}

self.changeLanguageTipView.hidden = YES;

self.accountTF.placeholder = LocalizationKey(@"账号");

self.passwordTF.placeholder = LocalizationKey(@"密码");

[self.logInBtn setTitle:LocalizationKey(@"登录") forState:UIControlStateNormal];

self.noAccountYetLabel.text = LocalizationKey(@"还没有账号?");

[self.registerBtn setTitle:LocalizationKey(@"注册") forState:UIControlStateNormal];

}