我们知道这是一个古老而痛苦的问题。
如果你不知道 - 让我简单描述一下这个问题。 假设我们有一个应用程序,我们想使用NSLocalizedString()来使用xcode内置本地化 - 这是Apple推荐的标准方法。 一切都很好,直到你想在运行时改变语言。您无法强制应用程序使用其他语言,Apple建议始终使用系统语言,或手动加载和管理资源(当然我们不想这样做)。
从这里你几乎没有其他选择。
1)用户默认
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", nil] forKey:@"AppleLanguages"];
此密钥未记录,但允许这样做。 此方法的问题是仅在应用程序重新启动后才设置语言。遗憾的是,您无法自行重启应用程序,您必须要求用户这样做。
2)使用this example中的一些自定义宏。 这种方法的问题是 - 您必须调整所有代码库 - 故事板和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);
它的工作原理,简单而优雅,完全兼容所有类型的资源。 代码can be found here。
请问有人可以评论一下这种方法在Apple政策方面的法律方面吗?