【发布时间】:2015-10-28 16:21:45
【问题描述】:
现在我知道苹果不推荐这个。
一般来说,您不应在应用程序中更改 iOS 系统语言(通过使用 AppleLanguages 首选项键)。这违背了在设置应用程序中切换语言的基本 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 来动态更改语言?
编辑:我建议现在使用这个library 来执行此操作。祝你好运!
【问题讨论】:
-
NSLocalizedString - 为了添加新语言,我们必须发布新应用程序,这是唯一不适合 NSLocalizedString 的地方
标签: ios iphone swift internationalization nsuserdefaults