iOS 国际化的实现方案

现在许多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问题比较严重,就比如我做的中英文,英文一般比中文长,很多显示不全。

你可能感兴趣的:(iOS 国际化的实现方案)