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


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代码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容