iOS-搞一波国际化

简介

国际化跟字典差不多,比如要支持中文和英文,就会生成两个.string文件,在这两个文件里设一个Key,在中文的.string文件中这个Key对应的是中文,另一个则对应英文。

步骤

1.创建Localizable.string文件
iOS-搞一波国际化_第1张图片
-

PS:命名最好为Localizable.string

iOS-搞一波国际化_第2张图片
-
2.添加Language
iOS-搞一波国际化_第3张图片
-

一般会选择中文(zh-Hans)还有另一种语言(如日语 ja),也可以选择多种语言。

iOS-搞一波国际化_第4张图片
-
iOS-搞一波国际化_第5张图片
-
3.把上面选择的语言添加到Localizable.strings文件
iOS-搞一波国际化_第6张图片
-
iOS-搞一波国际化_第7张图片
-
iOS-搞一波国际化_第8张图片
-

如下图,添加进来了,出现两个文件,对应两种语言的配置文件

iOS-搞一波国际化_第9张图片
-
4.进行语言映射

就是用同一个key,提供两个语言相对应的字符串

iOS-搞一波国际化_第10张图片
-
iOS-搞一波国际化_第11张图片
-
5.给Label设置字符串

使用NSLocalizedString(@"key", @"备注")这个方法,如:

label.text = NSLocalizedString(@"wxtip", @"温馨提示");
6.切换语言
  • 原理
    App的NSUserDefault中有一个Key:AppleLanguages,负责存储App语言的字段,默认这个字段会根据系统语言去变动。如果用代码把AppleLanguages设置值为en、zh-Hanz、ja等,就可以切换语言了。

步骤:
写一个NSBundle的扩展:

#import 

@interface NSBundle (Language)

+ (void)setLanguage:(NSString *)language;

@end
#import "NSBundle+Language.h"
#import 

static const char _bundle = 0;

@interface BundleEx : NSBundle

@end

@implementation BundleEx

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
    NSBundle *bundle = objc_getAssociatedObject(self, &_bundle);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}

@end

@implementation NSBundle (Language)

+ (void)setLanguage:(NSString *)language {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        object_setClass([NSBundle mainBundle], [BundleEx class]);
    });
    
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

切换语言,需要重设APP的根控制器rootvc 生效。

// 公共方法
/// 入参language为:zh-Hans、en、ja等等
- (void)changeLanguageTo:(NSString *)language {
    // 设置语言
    [NSBundle setLanguage:language];
    
    // 将设置好的语言存储好,下次进来直接加载
    [[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    // 重设APP的根控制器rootvc
    // .......
}

完成!

你可能感兴趣的:(iOS-搞一波国际化)