簡介
國際化跟字典差不多,比如要支持中文和英文勋眯,就會生成兩個.string文件浪箭,在這兩個文件里設一個Key穗椅,在中文的.string文件中這個Key對應的是中文,另一個則對應英文奶栖。
步驟
1.創(chuàng)建Localizable.string文件
PS:命名最好為Localizable.string
2.添加Language
一般會選擇中文(zh-Hans)還有另一種語言(如日語 ja)匹表,也可以選擇多種語言门坷。
3.把上面選擇的語言添加到Localizable.strings文件
如下圖,添加進來了袍镀,出現(xiàn)兩個文件默蚌,對應兩種語言的配置文件
4.進行語言映射
就是用同一個key,提供兩個語言相對應的字符串
5.給Label設置字符串
使用NSLocalizedString(@"key", @"備注")
這個方法苇羡,如:
label.text = NSLocalizedString(@"wxtip", @"溫馨提示");
6.切換語言
- 原理
App的NSUserDefault
中有一個Key:AppleLanguages
绸吸,負責存儲App語言的字段,默認這個字段會根據(jù)系統(tǒng)語言去變動设江。如果用代碼把AppleLanguages
設置值為en锦茁、zh-Hanz、ja
等叉存,就可以切換語言了蜻势。
步驟:
寫一個NSBundle的擴展:
#import <Foundation/Foundation.h>
@interface NSBundle (Language)
+ (void)setLanguage:(NSString *)language;
@end
#import "NSBundle+Language.h"
#import <objc/runtime.h>
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 生效鹉胖。
// 公共方法
/// 入?yún)anguage為:zh-Hans、en够傍、ja等等
- (void)changeLanguageTo:(NSString *)language {
// 設置語言
[NSBundle setLanguage:language];
// 將設置好的語言存儲好甫菠,下次進來直接加載
[[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"];
[[NSUserDefaults standardUserDefaults] synchronize];
// 重設APP的根控制器rootvc
// .......
}