我似乎有些应用程序可以在应用程序内部更改语言而无需重新启动应用程序,我想知道它们是如何实现的。
例如,对于我们使用 NSLocalizedString
,我知道当您的 AppDelegate
时,可以在 main.m
中设置运行时语言未初始化,但一旦初始化(特别是您的 View Controller 已创建),更改它直到下一次重新启动
[[NSUserDefaults standardUserDefaults]
setObject:[NSMutableArray arrayWithObjects:language, nil]
forKey:@"AppleLanguages"];
有人知道如何在不重启应用程序的情况下完成这些动态语言更改吗?
最佳答案
这里有一些关于其他方法的讨论,特别是基于通知的方法:
iOS: How to change app language programmatically WITHOUT restarting the app?
在我看来,这里实际上有三个任务: (1) 自动从 nibs 加载的资源重新本地化。 (例如,如果您从 nib 动态实例化另一个自定义 UIView,“旧”语言字符串和设置(图像、文本方向)仍将被加载) (2) 重新本地化当前显示在屏幕上的字符串。 (3) 对开发者(您)在程序代码中插入的字符串进行重新本地化。
让我们从 (3) 开始。如果您查找定义,您会注意到 NSLocalizedString 是一个宏。所以如果你不想过多改变现有代码,你可能可以通过创建一个新的头文件来解决(3)的问题。在该头文件中,#undef
然后重新 #define NSLocalizedString
从适当的位置选择本地化字符串——不是 iOS 默认的那个,而是一个您跟踪某些全局变量(例如,在应用程序委托(delegate) ivar 中)。如果你不想重新定义 NSLocalizedString 但你仍然做出自己的选择,你可能仍然应该 #undef NSLocalizedString
如果你不希望 future 的开发人员不小心调用它而不是你替换它的宏和。不是理想的解决方案,但可能是最实用的。
至于 (1),如果您没有在 Interface Builder 中完成本地化,而是在 viewDidLoad 等中动态完成本地化,没问题。您可以使用刚才讨论的相同行为(即修改后的 NSLocalizedString 等)。否则,您可以 (a) 实现上面链接中描述的通知系统(复杂),或 (b) 考虑将本地化从 IB 移动到 viewDidLoad,或 (c) 尝试重写 initWithNibName:
并交换out 加载旧语言资源的对象,一个加载新语言资源的对象。这是穆罕默德在此讨论的最底部提到的一种方法:http://learning-ios.blogspot.ca/2011/04/advance-localization-in-ios-apps.html .他声称这会导致问题(未调用 viewDidLoad)。即使它不起作用,尝试一下也可能会让您找到有用的东西。
最后,(2) 可能是最简单的任务:只需删除并重新添加当前 View (或者在某些情况下,只需重新绘制它)。
关于ios - 在不重启应用程序的情况下更改 iOS 中的应用程序语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12192151/