STRLocalized 是一个强大的 iOS 库,可以在运行时更改语言并使用 JSON 文件本地化字符串。
STRLocalized 提供以下 3 种方法使用特定语言来更改语言,成功则返回 return YES
,失败则返回 return NO
。
[STRLocalized useLanguage:@"zh" // language code
resource:@"zh-Hans"]; // json file name without '.json'
[STRLocalized useLanguage:@"en" // language code
resource:@{ // NSDictionary
@"Hello World!" : @"Hello World!",
@"Back" : @"Back",
@"System Language" : @"System Language"
}];
// 1st: set language packs
[STRLocalized setLanguagePacks:@{
@"zh" : @"zh-Hans", // use json file
@"en" : @{ // NSDictionary
@"Hello World!" : @"Hello World!",
@"Back" : @"Back",
@"System Language" : @"System Language"
},
// can add more languages here
}];
// 2nd: change the language
[STRLocalized usePacksLanguage:@"en"];
更改语言后,使用 NSLocalizedString(key, comment)
来本地化字符串。
当应用设置语言时,STRLocalized 会发送一个名为 STRLocalized - languageChangedNotification
的通知。使用如以下示例中定义的宏 STRLocalized 来添加监听器,以便更新字符串:
@property(weak, nonatomic) IBOutlet UILabel *helloWorldLabel;
@property(nonatomic) BOOL reloadStringsNeeded;
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
// add language changed notification
STRLOCALIZED_ADD_NOTIFICATION
}
return self;
}
// receive language changed notification
STRLOCALIZED_RECEIVE_NOTIFICATION(^{
// set reload strings needed
self.reloadStringsNeeded = YES;
});
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// reload strings
if (self.reloadStringsNeeded)
[self.helloWorldLabel setText:NSLocalizedString(@"Hello World!", nil)];
}
- (void)dealloc {
// remove language changed notification
STRLOCALIZED_REMOVE_NOTIFICATION
}
当应用设置语言时,设置会被记录在 NSUserDefaults 中,但如果应用重新启动,设置将不会被重新加载。因此,如果应用需要在应用启动时加载上次设置,可以执行以下操作:
// AppDelegate.m
[STRLocalized useSettingLanguageIfSet];
if (![STRLocalized useSettingLanguageIfSet]) { // return false, if fail
// use a default language, if no language is set or previous setting is lost
[STRLocalized useLanguage:@"zh" resource:@"zh-Hans"];
}
如果应用支持多种语言且在应用启动时需要跟随系统语言,可以执行以下操作:
// AppDelegate.m
// 1st step: set language packs
[STRLocalized setLanguagePacks:@{
@"zh" : @"zh-Hans",
@"en" : @{
@"Hello World!" : @"Hello World!",
@"Back" : @"Back",
@"System Language" : @"System Language"
}
}];
// 2nd step: follow system language
[STRLocalized useSystemLanguageIfSupported];
if (![STRLocalized useSystemLanguageIfSupported]) { // return false, if fail
// use a default language, if the system language is not supported
[STRLocalized usePacksLanguage:@"en"];
}
如果应用允许用户选择语言(包括跟随系统语言或指定语言),并在应用启动时根据用户行为加载语言,可以使用以下方法:
// AppDelegate.m
[STRLocalized setLanguagePacks:@{
@"zh" : @"zh-Hans",
@"ja" : @"ja",
@"ko" : @"ko",
@"en" : @{
@"Hello World!" : @"Hello World!",
@"Back" : @"Back",
@"System Language" : @"System Language"
},
@"es" : @"es",
@"de" : @"de",
}];
if (![STRLocalized useLanguageByPriority]) {
[STRLocalized usePacksLanguage:@"en"];
}
[STRLocalized
setUsingLanguagePriority:STRLocalizedUsingLanguagePrioritySystem];
[STRLocalized useLanguageByPriority];
[STRLocalized
setUsingLanguagePriority:STRLocalizedUsingLanguagePrioritySetting];
[STRLocalized usePacksLanguage:language];
以上所述,应用
@"en"
;STRLocalized 覆盖了本地化方法,所以不幸的是,应用必须为所有系统单词提供翻译,例如“取消”、“返回”等。为了快速检查任何缺失的翻译,STRLocalized 提供了一个区块回调。
[STRLocalized setLocalizedFailureBlock:^(NSString *str) {
NSLog(@"%@", str);
}];
版权 (c) 2016 Ian Weng | [email protected]