STRLocalized 1.0.2

STRLocalized 1.0.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2016年5月

Ian Weng 维护。



  • 作者:
  • Ian Weng

STRLocalized 是一个强大的 iOS 库,可以在运行时更改语言并使用 JSON 文件本地化字符串。

Screenshot 01

更改到特定语言

STRLocalized 提供以下 3 种方法使用特定语言来更改语言,成功则返回 return YES,失败则返回 return NO

使用 JSON 文件
[STRLocalized useLanguage:@"zh"        // language code
                 resource:@"zh-Hans"]; // json file name without '.json'
使用 NSDictionary
[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];
在第 2 步中建议的操作
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);
}];

安装

许可

MIT 许可证 (MIT)

版权 (c) 2016 Ian Weng | [email protected]