iOS基础国际化:在运行时更改语言

我们知道这是一个古老而痛苦的问题。

如果您不知道 – 让我简要描述一下这个问题。 假设我们有一个应用程序,我们希望使用NSLocalizedString()来使用xcode内置本地化 – 这是Apple推荐的标准方法。 一切都很好,直到你想在运行时改变语言。 您无法强制应用程序使用其他语言,Apple建议始终使用系统语言,或手动加载和管理资源(当然我们不想这样做)。

从这里你几乎没有其他选择。

1)用户默认值

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", nil] forKey:@"AppleLanguages"]; 

这个密钥没有记录,但允许这样做。 此方法的问题是仅在应用程序重新启动后才设置语言。 遗憾的是,您无法自行重启应用程序,您必须要求用户这样做。

2)使用一些自定义宏,如本例所示 。 这种方法的问题在于 – 您必须调整所有代码库 – 故事板和nib文件不会被翻译 – 本地化通常不会起作用,因为XCode使用的genstring实用程序只能识别NSLocalizedStringXXX宏,否则您最终会手动运行genstring一些后期构建步骤。

3)我尝试通过在NSBundle内部调整来实现的解决方案。 我们的想法是在NSBundle对象的实例上覆盖方法localizedStringForKey,然后在另一个使用不同语言的bundle上调用此方法。 样品用法:

 #import "BundleLocalization.h" ... [[BundleLocalization sharedInstance] setLanguage:@"fr"]; 

要么

 [BundleLocalization sharedInstance].language = @"de"; NSLog(@"Application language: %@", [BundleLocalization sharedInstance].language); 

它的工作原理,简单而优雅,完全兼容所有类型的资源。 代码可以在这里找到 。

有人可以评论一下这种方法在Apple政策方面的法律方面吗?