如何在运行时刷新localitable.strings或NSLocalizedString(key,comment)io



我正在开发一款支持多种语言的应用程序。一切都很顺利。但我需要在运行时更改语言
我是这样做的-

NSArray* languages = [NSArray arrayWithObjects:@"es",@"en" nil];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

它运行良好。

NSString *langID = [[NSLocale preferredLanguages] objectAtIndex:0];

langID显示正确的语言。但在重新启动之前,该应用程序不会更改其语言。

有什么方法可以刷新localizable.strings文件或NSLocalizedString(键、注释)吗?或者有其他方法可以在不重新启动的情况下完成?

在StackOverflow(搜索类似iOS change language at runtime的内容)上,这个问题已经被问过很多次了。

使用NSLocalizedString时,无法在运行时更改语言。如果你真的,真的需要,你需要使用一个自定义的本地化系统。更好的是:不要那样做:这是出乎意料的。毕竟,用户可以在系统设置中设置他/她的首选语言(及其顺序)。

有人甚至问了一位苹果工程师,得到的回答是:

通常,您不应该在应用程序中更改iOS系统语言(通过使用AppleLanguages pref键)。这违反了iOS在设置应用程序中切换语言的基本用户模型,还使用了一个未记录的首选密钥,这意味着在未来的某个时候,密钥名称可能会更改,这将破坏您的应用程序。

如果您想在应用程序中切换语言,可以通过手动加载捆绑包中的资源文件来实现。为此,您可以使用NSBundle:pathForResource:Type:inDirectory:forLocalization,但请记住,您的应用程序将负责所有本地化数据的加载。

为了在运行时更改应用程序语言,我手动创建了两个不同的情节串连板。我将语言首选项保存在NSUserDefaults中,但不使用键AppleLanguages,然后调用AppDelegate的didFinishLaunchingWithOptions方法来选择情节提要。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainEnglish" bundle:nil];
UINavigationController *navigationcontroller=[[UINavigationController alloc]init];
RegistorViewController *registor=[storyboard instantiateViewControllerWithIdentifier:@"Registor"];
[self.window setRootViewController:navigationcontroller];
[self.window makeKeyAndVisible];
[navigationvontroller pushViewController:registor animated:NO];

最新更新