现在许多app需要做国际业务,国际化也越来越多,本文讲述的是国际化的一种实现,该实现是仿照支付宝的实现。
首先大体的实现思路是这样的,点击切换按钮后,发出系统通知刷新根控制器完成切换,语言方面创建一个资源文件来实现语言对照。
在appdelegate.h中的代码:
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化语言设置
[GLJInternationHelper setLanguageDidAppFirstLaunch];
[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(changeLanguage) name:ResetLanguageNotification object:nil];
return YES;
}
- (void)changeLanguage {
[GLJProgressHUD setFont:[UIFont fontWithName:[GLJInternationHelper isLangZH]?@"KaiTi":@"SourceSansPro-Regular"size:15]];
// 切换语言后, 重新设置窗口的根控制器
[self.window setupRootViewControllerWithIndex:2];//设置根控制器的方法(根据自己的实际要求更改)
}
在需要切换处的代码
- (void)languageClick:(UIButton*)btn {
GLJAccountItem *account = [GLJAccountTool account]
if ([GLJInternationHelper isLangZH]) {
[GLJInternationHelper setLanguageWith:@"en-us"];
account.userLanguage=@"en-us";
}else{
[GLJInternationHelper setLanguageWith:@"zh-cn"];
account.userLanguage=@"zh-cn";
}
[GLJAccountToolsave:account];
btn.selected= !btn.selected;
[[NSNotificationCenter defaultCenter] postNotificationName:ResetLanguageNotification object:nil];
}
语言的代码
.h
#import
extern NSString *const kGLJLanguageManagerSetLanguageNotification; //设置语言通知
typedef enum {
GLJLanguageManagerSystem =0, //系统
GLJLanguageManagerEn, //英文
GLJLanguageManagerZh, //简体中文
GLJLanguageManagerZhHant, //繁体中文
GLJLanguageManagerKo, //韩文
GLJLanguageManagerAr, //阿拉伯文
GLJLanguageManagerRu, //俄语
GLJLanguageManagerEs, //西班牙语
GLJLanguageManagerJa, //日语
GLJLanguageManagerDe, //德语
GLJLanguageManagerFr, //法语
GLJLanguageManagerNl, //荷兰语
GLJLanguageManagerPt, //葡语
GLJLanguageManagerIt //意大利语
} GLJLanguageManagerType;
#ifndef GLJLanguageManagerH
#define GLJLanguageManagerH1
#define IsMinWidth ([UIScreen mainScreen].bounds.size.width ==320)
#endif
@interface GLJLanguageManager : NSObject
//当前语言Key
@property (nonatomic, strong) NSString *currentKeyValue;
+ (GLJLanguageManager *)sharedManager;
//设置语言
- (void)setLanguageType:(GLJLanguageManagerType)type;
//获取本地语言
- (NSArray *)getLocationLanguages;
//自动设置语言
- (void)autoSetLanguage;
@end
@interface GLJLanguage : NSObject
//名称
@property (nonatomic, strong) NSString *name;
//语言Key
@property (nonatomic, strong) NSString *keyValue;
//选中状态
@property (nonatomic, assign) BOOL isSelect;
@end
.m
#import "GLJLanguageManager.h"
#import "GLJInternationHelper.h"
#define GLJLanguageManagerKeyValue @"GLJLanguageManagerKeyValue"
NSString *const kGLJLanguageManagerSetLanguageNotification = @"kGLJLanguageManagerSetLanguageNotification";
@interface GLJLanguageManager ()
@property (nonatomic, strong) NSString *keyValue;//语言Key
@end
@implementation GLJLanguageManager
+ (GLJLanguageManager *)sharedManager {
staticidobj;
static dispatch_once_t once;
dispatch_once(&once, ^{
obj = [selfnew];
});
returnobj;
}
//设置语言
- (void)setLanguageType:(GLJLanguageManagerType)type {
switch(type) {
case GLJLanguageManagerSystem:
{
self.keyValue=@"";
}
break;
case GLJLanguageManagerEn:
{
self.keyValue=@"en";
}
break;
case GLJLanguageManagerZh:
{
self.keyValue=@"zh-Hans";
}
break;
case GLJLanguageManagerZhHant:
{
self.keyValue=@"zh-Hant";
}
break;
case GLJLanguageManagerKo:
{
self.keyValue=@"ko";
}
break;
case GLJLanguageManagerAr:
{
self.keyValue=@"ar";
}
break;
case GLJLanguageManagerRu:
{
self.keyValue=@"ru";
}
break;
case GLJLanguageManagerEs:
{
self.keyValue=@"es";
}
break;
case GLJLanguageManagerJa:
{
self.keyValue=@"ja";
}
break;
case GLJLanguageManagerDe:
{
self.keyValue=@"de";
}
break;
case GLJLanguageManagerFr:
{
self.keyValue=@"fr";
}
break;
case GLJLanguageManagerNl:
{
self.keyValue=@"nl";
}
break;
case GLJLanguageManagerPt:
{
self.keyValue=@"pt";
}
break;
case GLJLanguageManagerIt:
{
self.keyValue=@"it";
}
break;
default:
break;
}
//本地与库语言设置
[GLJInternationHelper setLanguageWith:self.keyValue];
//保存设置的语言key
[self saveValue:self.keyValue forKey:GLJLanguageManagerKeyValue];
//通知重置界面
[[NSNotificationCenter defaultCenter] postNotificationName:kGLJLanguageManagerSetLanguageNotification object:nil];
}
///获取本地语言
- (NSArray *)getLocationLanguages {
NSArray*names =@[@"跟随系统",
@"简体中文",
@"繁體中文",
@"English",
@"한국어",
@"العربية",
@"Pусский",
@"Español",//西班牙文
@"日本語",//日语
@"Deutsch",//德文
@"Français",//法文
@"Nederlands",//荷兰文
@"Português",//葡萄牙文
@"Italiano"//意大利文
];
NSArray*keys =@[@"system",
@"zh-Hans",
@"zh-Hant",
@"en",
@"ko",
@"ar",
@"ru",
@"es",
@"ja",
@"de",
@"fr",
@"nl",
@"pt",
@"it"];
//当前语言key
NSString*value =self.currentKeyValue;
NSMutableArray *tempArray = [NSMutableArray array];
for(NSIntegeri =0; i < [namescount]; i ++) {
GLJLanguage*language = [GLJLanguagenew];
language.name= names[i];
language.keyValue= keys[i];
//如果一致,标记选中
if([language.keyValueisEqualToString:value]) {
language.isSelect=YES;
}else{
language.isSelect=NO;
}
[tempArrayaddObject:language];
}
returntempArray;
}
//当前语言key
- (NSString *)currentKeyValue {
NSString *value = [self getValueForKey:GLJLanguageManagerKeyValue];
if(!value || [valuelength] <=0) {
value =@"system";
}
returnvalue;
}
//自动设置语言
- (void)autoSetLanguage {
NSString*keyValue =self.currentKeyValue;
if([keyValueisEqualToString:@"system"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerSystem];
}elseif([keyValueisEqualToString:@"zh-Hans"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerZh];
}elseif([keyValueisEqualToString:@"zh-Hant"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerZhHant];
}elseif([keyValueisEqualToString:@"en"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerEn];
}elseif([keyValueisEqualToString:@"ko"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerKo];
}elseif([keyValueisEqualToString:@"ar"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerAr];
}elseif([keyValueisEqualToString:@"ru"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerRu];
}elseif([keyValueisEqualToString:@"es"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerEs];
}elseif([keyValueisEqualToString:@"ja"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerJa];
}elseif([keyValueisEqualToString:@"de"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerDe];
}elseif([keyValueisEqualToString:@"fr"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerFr];
}elseif([keyValueisEqualToString:@"nl"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerNl];
}elseif([keyValueisEqualToString:@"pt"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerPt];
}elseif([keyValueisEqualToString:@"it"]) {
[[GLJLanguageManager sharedManager] setLanguageType:GLJLanguageManagerIt];
}
}
#pragma mark-
#pragma mark- 辅助方法
- (void)saveValue:(NSString*)valueforKey:(NSString*)key {
[[NSUserDefaults standardUserDefaults] setValue:value forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (NSString*)getValueForKey:(NSString*)key {
return [[NSUserDefaults standardUserDefaults] valueForKey:key];
}
@end
@implementation GLJLanguage
@end
语言使用
.h
#import
#import "GLJLanguageManager.h"
#ifndef GLJInternationHelperH
#define GLJInternationHelperH
//当前语言
#define CURR_LANG ([[NSLocale preferredLanguages] objectAtIndex:0])
//快速获取国际化字符串宏
#define LocalizedString(a) [GLJInternationHelper localizedString:a]
#endif
/**
* 国际化协助类
*/
@interface GLJInternationHelper : NSObject
/**
* 根据Key查询国际化本文内容
*
* @param translationKey 国际化文本查询Key
*
* @return 国际化本文内容
*/
+ (NSString*)localizedString:(NSString*)translationKey;
/**
* 判断是否为中文
*
* @return YES | NO
*/
+ (BOOL)isLangZH;
/**
* 本地语言类型(简化值)
*
* @return 本地语言类型
*/
+ (NSString *)localizedShortString;
/**
* 设置语言
*/
+ (void)setLanguageWith:(NSString *)key;
+ (void)setLanguageDidAppFirstLaunch;
@end
.m
#import "GLJInternationHelper.h"
static NSString *keyStr = nil;
@interface GLJInternationHelper()
@property (nonatomic,strong) NSString *currentCacheLocalized;
@property (nonatomic,strong) NSDictionary *allLocalizedStringDic;
@end
@implementation GLJInternationHelper
+ (GLJInternationHelper *)shared
{
static GLJInternationHelper *helper = nil;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
helper = [selfnew];
});
returnhelper;
}
/**
* 根据Key查询国际化本文内容
*
* @param translationKey 国际化文本查询Key
*
* @return 国际化本文内容
*/
+ (NSString*)localizedString:(NSString*)translationKey {
if(translationKey.length<=0) {
returnnil;
}
//获取当前语言
BOOLneedReloadData =NO;
NSString*curr_local;
if (![GLJAccountTool account].userLanguage) {
curr_local = [GLJInternationHelperlocalizedShortString];
}else{
curr_local = [GLJAccountToolaccount].userLanguage;
[selfsetLanguageWith:curr_local];
}
GLJInternationHelper *shareHelper = [GLJInternationHelper shared];
if([@"zh-tw"isEqualToString:curr_local]) {
//繁体中文
if(![shareHelper.currentCacheLocalizedisEqualToString:@"tt-zh-hant"]) {
shareHelper.currentCacheLocalized=@"tt-zh-hant";
needReloadData =YES;
}
}
elseif([@"zh-cn"isEqualToString:curr_local]) {
//简体中文
if(![shareHelper.currentCacheLocalizedisEqualToString:@"tt-zh-hans"]) {
shareHelper.currentCacheLocalized=@"tt-zh-hans";
needReloadData =YES;
}
}
elseif([@"ar"isEqualToString:curr_local]) {
//阿拉伯文
if(![shareHelper.currentCacheLocalizedisEqualToString:@"tt-ar"]) {
shareHelper.currentCacheLocalized=@"tt-ar";
needReloadData =YES;
}
}
elseif([@"fr"isEqualToString:curr_local]) {
//法语
if(![shareHelper.currentCacheLocalizedisEqualToString:@"tt-fr"]) {
shareHelper.currentCacheLocalized=@"tt-fr";
needReloadData =YES;
}
}
elseif([@"vn"isEqualToString:curr_local]) {
if(![shareHelper.currentCacheLocalizedisEqualToString:@"tt-vn"]) {
shareHelper.currentCacheLocalized=@"tt-vn";
needReloadData =YES;
}
}
else{
//默认英文
if(![shareHelper.currentCacheLocalizedisEqualToString:@"tt-en"]) {
shareHelper.currentCacheLocalized=@"tt-en";
needReloadData =YES;
}
}
if(needReloadData || !shareHelper.allLocalizedStringDic) {
NSBundle*mainBudle = [NSBundlemainBundle];
NSString*languagePath = [[mainBudleresourcePath]stringByAppendingPathComponent:@"Language"];
NSString*resourcePath = [languagePathstringByAppendingPathComponent:shareHelper.currentCacheLocalized];
NSData*jsonData = [NSDatadataWithContentsOfFile:resourcePath];
NSError*error =nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
shareHelper.allLocalizedStringDic= jsonObject;
}
NSString*resultstr = [shareHelper.allLocalizedStringDicobjectForKey:translationKey];
if(resultstr.length==0) {
resultstr = [NSStringstringWithString:translationKey];
}
returnresultstr;
}
/**
* 判断是否为中文
*
* @return YES | NO
*/
+ (BOOL)isLangZH
{
NSString*currentLang =CURR_LANG;
//选择语言时调用
if(keyStr&& [keyStrlength] >0) {
currentLang =keyStr;
}
if([currentLangrangeOfString:@"zh"].length>0) {
returnYES;
}
return NO;
}
/**
* 本地语言类型(简化值)
*
* @return 本地语言类型
*/
+ (NSString *)localizedShortString
{
return [self languageCodeStr];
//[self moreLanguageCodeStr]; //十四国语言
}
/**
* 设置语言
*/
+ (void)setLanguageWith:(NSString *)key {
keyStr= key;
}
+ (void)setLanguageDidAppFirstLaunch {
GLJAccountItem *account = [GLJAccountTool account];
account.isFirstLaunch=YES;
[GLJAccountToolsave:account];
[GLJInternationHelper setLanguageWith:[self getSystemLanguageCode]];
}
+ (NSString *)moreGetSystemLanguageCode {
NSArray*languages = [NSLocalepreferredLanguages];//zh-Hans-CN 中国简体
NSString *localeLanguageCode = [languages objectAtIndex:0];//zh-Hant-CN 中国繁体; zh-Hant-TW 台湾繁体 zh-Hant-HK 香港繁体
if([localeLanguageCodecontainsString:@"zh"] && ![localeLanguageCodecontainsString:@"Hant"]) {
return@"zh-cn";
}elseif([localeLanguageCodecontainsString:@"zh"] && [localeLanguageCodecontainsString:@"Hant"]) {
return@"zh-tw";
}elseif([localeLanguageCodecontainsString:@"en"]) {
return@"en-us";
}elseif([localeLanguageCodecontainsString:@"fr"]) {
return@"fr";
}elseif([localeLanguageCodecontainsString:@"ko"]) {
return@"ko";
}
elseif([localeLanguageCodecontainsString:@"ja"]) {
return@"ja";
}elseif([localeLanguageCodecontainsString:@"ar"]) {
return@"ar";
}elseif([localeLanguageCodecontainsString:@"de"]) {
return@"de";
}elseif([localeLanguageCodecontainsString:@"ru"]) {
return@"ru";
}elseif([localeLanguageCodecontainsString:@"es"]) {
return@"es";
}
elseif([localeLanguageCodecontainsString:@"nl"]) {
return@"nl";
}elseif([localeLanguageCodecontainsString:@"pt"]) {
return@"pt";
}elseif([localeLanguageCodecontainsString:@"it"]) {
return@"it";
}elseif([localeLanguageCodecontainsString:@"vi"]) {
return@"vn";
}else{
return@"en-us";
}
}
+ (NSString *)moreLanguageCodeStr {
NSString*currentLang =CURR_LANG;
//选择语言时调用
if(keyStr&& [keyStrlength] >0) {
currentLang =keyStr;
}
if([currentLangrangeOfString:@"zh-cn"].length>0) {
return@"zh-cn";//简体中文
}
if([currentLangrangeOfString:@"zh-tw"].length>0) {
return@"zh-tw";//繁体中文
}
if([currentLangrangeOfString:@"ko"].length>0) {
return@"ko";//韩文
}
if([currentLangrangeOfString:@"ja"].length>0) {
return@"ja"; //日语
}
if([currentLangrangeOfString:@"ar"].length>0) {
return@"ar";//阿拉伯文
}
if([currentLangrangeOfString:@"ru"].length>0) {
return@"ru"; // 俄语
}
if([currentLangrangeOfString:@"es"].length>0) {
return@"es"; // 西班牙语
}
if([currentLangrangeOfString:@"de"].length>0) {
return@"de"; // 德语
}
if([currentLangrangeOfString:@"fr"].length>0) {
return@"fr";// 法语
}
if([currentLangrangeOfString:@"nl"].length>0) {
return@"nl";// 荷兰语
}
if([currentLangrangeOfString:@"pt"].length>0) {
return@"pt";//葡萄牙语
}
if([currentLangrangeOfString:@"it"].length>0) {
return@"it";//意大利语
}
if([currentLangrangeOfString:@"vn"].length>0) {
return@"vn";//越语
}
return @"en-us";//英文
}
//简体中文 : zh-cn
//繁体中文 : zh-tw
//英语 : en-us
//阿语 : ar
//越语 : vn
//多国语言中
+ (NSString *)languageCodeStr {
NSString*currentLang =CURR_LANG;
//选择语言时调用
if(keyStr&& [keyStrlength] >0) {
currentLang =keyStr;
}
if([currentLangrangeOfString:@"zh-cn"].length>0) {
return@"zh-cn";//简体中文
}
if([currentLangrangeOfString:@"zh-tw"].length>0) {
return@"zh-tw";//繁体中文
}
if([currentLangrangeOfString:@"ar"].length>0) {
return@"ar";//阿拉伯文
}
if([currentLangrangeOfString:@"vn"].length>0) {
return@"vn";//越语
}
if([currentLangrangeOfString:@"fr"].length>0) {
return@"fr";//法语
}
return @"en-us";//英文
}
+ (NSString *)getSystemLanguageCode {
NSArray*languages = [NSLocalepreferredLanguages];//zh-Hans-CN 中国简体
NSString *localeLanguageCode = [languages objectAtIndex:0];//zh-Hant-CN 中国繁体; zh-Hant-TW 台湾繁体 zh-Hant-HK 香港繁体
if([localeLanguageCodecontainsString:@"zh"] && ![localeLanguageCodecontainsString:@"Hant"]) {
return@"zh-cn";
}elseif([localeLanguageCodecontainsString:@"zh"] && [localeLanguageCodecontainsString:@"Hant"]) {
return@"zh-tw";
}elseif([localeLanguageCodecontainsString:@"en"]) {
return@"en-us";
}elseif([localeLanguageCodecontainsString:@"ar"]) {
return@"ar";
}elseif([localeLanguageCodecontainsString:@"vi"]) {
return@"vn";
}
elseif([localeLanguageCodecontainsString:@"fr"]) {
return@"fr";
}
else{
return@"en-us";
}
}
@end
其实国际化实现起来倒是很简单,中英文对比的字段文件我就不贴出来了,主要是UI问题比较严重,就比如我做的中英文,英文一般比中文长,很多显示不全。