美文网首页
iOS 多语言处理/本地化处理/APP内语言切换

iOS 多语言处理/本地化处理/APP内语言切换

作者: 唐人街的乞丐 | 来源:发表于2019-11-14 16:52 被阅读0次


iOS项目中本地化处理一共4点:

1、APP名称

2、文字

3、图片

4、SB和XIB

1、APP名称

APP名称主要是跟随系统的语言来进行展示

添加需要配置的语言

创建 InfoPlist.strings (注:名称不能改变!!!!)

创建 InfoPlist.strings

设置本地显示名称  指定CFBundleDisplayName的内容,语言跟随系统(CFBundleDisplayName不能改,没有@符号)


2.文字

文字的话,可以可以跟随系统,也可以设置多语言,不跟随系统(同一个APP内部进行语言切换)

跟随系统,多语言设置

跟随系统的文字本地化处理和App名称本地化过程一样,只是创建名称不同,必须创建名称是Localizable.strings

使用的时候用    NSLocalizedString(@"setting", nil) 代替原来的@"setting";

多语言本地化,不跟随系统(APP内语言切换)

思路:创建配置文件,根据偏好设置,进行多语言切换

跟随系统的文字本地化处理和跟随系统,多语言设置本地化过程一样,只是创建名称可以随意取

使用的时候用    跟随系统,多语言设置本地化 NSLocalizedString(@"", nil) 是系统写好的;

多语言本地化,不跟随系统可以自己封装一个。

效果

实现

本地化取值封装

#define LOCALIZATION(text) [[CJLocalizable shareLocalizable] localStringForKey:(text)]

typedef NS_ENUM(NSInteger,languageType) {

    KChiese,

    KJapanese

};

@interface CJLocalizable : NSObject

@property (nonatomic, assign) languageType  nowCurrentLanguageType;

+(instancetype)shareLocalizable;

//  取值

-(NSString * )localStringForKey:(NSString *)key;

//  重置当前的语言

-(void)setNewLanguage:(languageType)languageType;

@end

#define LanguageDefaultKey @"LanguageDefaultKey"

@interface CJLocalizable ()

@property(nonatomic,copy)NSString * currentLanguage;//当前语言

@property(nonatomic,strong) NSDictionary * currentLanguageDict;//当前自定义语言的字典

@end

@implementation CJLocalizable

+ (instancetype)shareLocalizable{

    static CJLocalizable * _localizable = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _localizable = [[CJLocalizable alloc]init];

    });

    return _localizable;

}

- (instancetype)init

{

    self = [super init];

    if (self) {

            // 本地默认的现在使用的语言

        NSArray * languageS = [NSLocale preferredLanguages];

        NSString * currentLanguage = languageS.firstObject;

        // 本地保存的现在使用的语言

        NSString * localLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageDefaultKey];

        if (localLanguage) {

            if ([localLanguage isEqualToString: @"zh-Hans"]) {

                self.nowCurrentLanguageType = KChiese;

            }else if([localLanguage isEqualToString: @"ja"]){

                self.nowCurrentLanguageType = KJapanese;

            }

            [self loadDictForNewLanguage:localLanguage];

        }else{

            [self loadDictForNewLanguage:currentLanguage];

        }

    }

    return self;

}

-(void)loadDictForNewLanguage:(NSString *)newLanguage{

    NSString * path = [[NSBundle mainBundle] pathForResource:@" mainLocailzable" ofType:@"strings" inDirectory:nil forLocalization:newLanguage];

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {

        self.currentLanguage = newLanguage;

        self.currentLanguageDict = [NSDictionary dictionaryWithContentsOfFile:path];
    }

}

//  取值

-(NSString *)localStringForKey:(NSString *)key

{

    if (self.currentLanguageDict == nil) {

// 如果为空,使用默认

        return NSLocalizedString(key, key);

    }else{

        NSString * localString = self.currentLanguageDict[key];

        if (localString) {

            return localString;

        }else{

            return key;

        }

    }

}

//  重置当前的语言

-(void)setNewLanguage:(languageType)languageType{

    if (self.nowCurrentLanguageType == languageType) {

        return;

    }

    if (languageType == KChiese) {

        self.currentLanguage = @"zh-Hans";

    }else if(languageType == KJapanese){

        self.currentLanguage = @"ja";

    }

    self.nowCurrentLanguageType = languageType;

    [self loadDictForNewLanguage:self.currentLanguage];

    [[NSUserDefaults standardUserDefaults] setValue:self.currentLanguage forKey:LanguageDefaultKey];

    [[NSUserDefaults standardUserDefaults] synchronize];

}

@end

3、图片

我把图片放在了Assets.xcassets中

1.根据图片名称不同,在封装的类中封装一个方法

#define LOCALIMAGE(imageName) [[CJLocalizable shareLocalizable] getImageNameWithString:(imageName)]

-(NSString *)getImageNameWithString:(NSString *)name{

    if (self.nowCurrentLanguageType == KChiese) {

        return [NSString stringWithFormat:@"%@_zh",name];

    }else if(self.nowCurrentLanguageType == KJapanese){

        return [NSString stringWithFormat:@"%@_ja",name];

    }

    return @"";
}

2.跟文字本地化处理一样,在相应的文件中,填上相应的名称就可以了。

如果是在本地文件Localizable.strings中添加名称, 使用的时候就是NSLocalizedString(@"", nil) 。

如果是在自定义的 mainLocailzable.strings中添加名称,使用的就是LOCALIZATION(@"icon")。

添加配置
本地化使用


4、SB和XIB

(跟随系统的语言进行展示,不跟随APP 内部选择的语言展示,如需要跟随APP内部选择语言展示,重新用LOCALIZATION()赋值)

创建XIB 然后本地化操作

获取label 的ID
KHZ-dZ-IHg= label

GitHub代码地址

相关文章

网友评论

      本文标题:iOS 多语言处理/本地化处理/APP内语言切换

      本文链接:https://www.haomeiwen.com/subject/dqifictx.html