在iPhone上NSLocalizedString返回iPhone 语言的字符串.是否可以强制NSLocalizedString使用特定语言使应用程序使用与设备不同的语言?
localization objective-c internationalization nslocalizedstring ios
当我在设备语言上单独更改应用程序使用的语言时,在我关闭应用程序并重新启动它之前它不会生效.如何根据所选语言不再要求重新启动应用程序以再次加载所有nib文件和.strings文件?
我用它在运行时更改语言:
NSArray* languages = [NSArray arrayWithObjects:@"ar", @"en", nil];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
Run Code Online (Sandbox Code Playgroud) 我似乎有些应用程序可以在应用程序内部更改语言,而无需重新启动应用程序,我想知道它们是如何实现的.
例如,对于我们使用NSLocalizedString,我知道可以在运行时在未初始化main.m时设置语言AppDelegate,但是一旦初始化(特别是创建了视图控制器),更改它直到下次重新启动才会生效
[[NSUserDefaults standardUserDefaults]
setObject:[NSMutableArray arrayWithObjects:language, nil]
forKey:@"AppleLanguages"];
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何在不重新启动应用程序的情况下完成这些动态语言更改?
我正在编写一个iOS应用程序,我希望用户能够独立于iPhone或iPad的语言更改UI语言.问题是,当语言发生变化时,如何为当前显示的视图重新加载适当的NIB文件,如何加载相应的.strings文件以使其NSLocalizedString正常工作?
我正在为我的应用程序使用单个本地化的Storyboard.该应用程序必须有一个选项来动态更改语言.到目前为止,我想出了如何更改应用程序启动期间使用的语言:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate
Run Code Online (Sandbox Code Playgroud)
并设法通过删除关键窗口的所有子视图重新加载我的整个应用程序,从故事板重新加载初始视图控制器并使其成为新的根视图控制器.(它有一些问题,比如管理开放资源,但可以做到.)
我唯一想知道的是如何强制iOS以新语言重新加载故事板?似乎故事板以某种方式缓存,并且-UIStoryboad:stroyboardWithName:fromNib不会完全重新加载它,所以它出现在最后一种语言中.
我已经考虑了其他两个选择:
每种语言都有不同的故事板文件(这是无法管理的,我不想这样做)
在我的所有视图控制器中使用事件侦听器,它们响应语言更改并在UI上设置新字符串(每次从故事板中实例化任何接口元素时也必须调用它).这个解决方案需要更多的时间,而不是我们想要花费的时间,并且还大大增加了错误的可能性.
还有一些更聪明的方法吗?我不想保持我的应用程序的当前状态,所以重新启动它就像它被杀死和实现似乎是一个合理的解决方案.