國際化跟字典差很少,好比要支持中文和英文,就會生成兩個.string文件,在這兩個文件裏設一個Key,在中文的.string文件中這個Key對應的是中文,另外一個則對應英文。markdown
PS:命名最好爲Localizable.stringspa
通常會選擇中文(zh-Hans)還有另外一種語言(如日語 ja),也能夠選擇多種語言。3d
以下圖,添加進來了,出現兩個文件,對應兩種語言的配置文件code
就是用同一個key,提供兩個語言相對應的字符串orm
使用NSLocalizedString(@"key", @"備註")
這個方法,如:ip
label.text = NSLocalizedString(@"wxtip", @"舒適提示");
複製代碼
App的NSUserDefault
中有一個Key:AppleLanguages
,負責存儲App語言的字段,默認這個字段會根據系統語言去變更。若是用代碼把AppleLanguages
設置值爲en、zh-Hanz、ja
等,就能夠切換語言了。ci
步驟: 寫一個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 生效。get
// 公共方法
/// 入參language爲:zh-Hans、en、ja等等
- (void)changeLanguageTo:(NSString *)language {
// 設置語言
[NSBundle setLanguage:language];
// 將設置好的語言存儲好,下次進來直接加載
[[NSUserDefaults standardUserDefaults] setObject:language forKey:@"myLanguage"];
[[NSUserDefaults standardUserDefaults] synchronize];
// 重設APP的根控制器rootvc
// .......
}
複製代碼