现在我知道苹果不建议这样做。
一般来说,你不应该通过使用AppleLanguages偏好键从你的应用程序中更改iOS系统语言。这违反了基本的iOS用户模型,在设置应用程序中切换语言,同时还使用了一个未记录的偏好键。这意味着在将来的某个时候,偏好键的名称可能会更改,导致你的应用程序无法正常运行。
然而,对于这个应用程序来说,在运行时更改语言是有意义的,相信我吧。我也知道这个问题在这里被问到了:Changing language on the fly, in running iOS, programmatically。然而,这已经过时了,我想知道是否有任何更新、更好或更容易的方法来实现这一点。目前,在我的应用程序中,我有一个语言选择界面。点击这个视图中的一个按钮会调用以下函数,并传入与该按钮相关联的语言:
func changeLang(language: String) {
if language != (currentLang as! String?)! {
func handleCancel(alertView: UIAlertAction!)
{
}
var alert = UIAlertController(title: NSLocalizedString("language", comment: "Language"), message: NSLocalizedString("languageWarning", comment: "Warn User of Language Change Different Than Defaults"), preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler:handleCancel))
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction) in
NSUserDefaults.standardUserDefaults().setObject([language], forKey: "AppleLanguages")
NSUserDefaults.standardUserDefaults().synchronize()
println(self.currentLang)
let alert = UIAlertView()
alert.title = NSLocalizedString("language", comment: "Sign In Failed")
alert.message = NSLocalizedString("languageChangeNotification", comment: "Notify of language change")
alert.addButtonWithTitle(NSLocalizedString("ok", comment: "Okay"))
alert.show()
self.performSegueWithIdentifier("welcome", sender: AnyObject?())
}))
self.presentViewController(alert, animated: true, completion: {
})
} else {
self.performSegueWithIdentifier("welcome", sender: AnyObject?())
}
}
例子:
@IBAction func english(sender: UIButton) {
changeLang("en")
}
如果用户选择与其本身语言不同的语言,则会收到确认警报,然后被要求重新启动设备。这是我想要改变的。看起来,在应用程序重新启动之前,NSUSerDefaults的此部分未同步。证据:
let currentLang: AnyObject? = NSLocale.preferredLanguages()[0]
println(currentLang)
// Prints english
changeLang("zh-Hans")
println(currentLang)
// Prints english still until restart
目前苹果的国际化系统非常出色,我打算使用它。不过,我该如何实现动态更改语言呢?也许可以通过强制更新NSUserDefaults来实现吗?
编辑:我建议现在使用这个库来完成这项工作。祝你好运!