这是有关如何在Swift 3中使用Novarg的方法的即用型和分步指南:
步骤1:实施语言选择器
如何做到最好取决于您,具体取决于项目。但是用
Bundle.main.localizations.filter({ $0 != "Base" }) // => ["en", "de", "tr"]
以编程方式获取所有支持的语言环境代码列表。你也可以用
Locale.current.localizedString(forLanguageCode: "en")
以应用程序当前语言显示语言名称。
作为一个完整的示例,您可以在单击如下按钮后显示弹出操作表:
@IBOutlet var changeLanguageButton: UIButton!
@IBAction func didPressChangeLanguageButton() {
let message = "Change language of this app including its content."
let sheetCtrl = UIAlertController(title: "Choose language", message: message, preferredStyle: .actionSheet)
for languageCode in Bundle.main.localizations.filter({ $0 != "Base" }) {
let langName = Locale.current.localizedString(forLanguageCode: languageCode)
let action = UIAlertAction(title: langName, style: .default) { _ in
self.changeToLanguage(languageCode)
}
sheetCtrl.addAction(action)
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
sheetCtrl.addAction(cancelAction)
sheetCtrl.popoverPresentationController?.sourceView = self.view
sheetCtrl.popoverPresentationController?.sourceRect = self.changeLanguageButton.frame
present(sheetCtrl, animated: true, completion: nil)
}
步骤#2:向用户解释该怎么做+重新启动后更改语言
您可能已经注意到,步骤#1中的代码调用了名为的方法changeToLanguage(langCode:)
。无论用户如何设计选择器,当用户选择一种要更改的新语言时,这也是您应该执行的操作。这是其实现,只需将其复制到您的项目中即可:
private func changeToLanguage(_ langCode: String) {
if Bundle.main.preferredLocalizations.first != langCode {
let message = "In order to change the language, the App must be closed and reopened by you."
let confirmAlertCtrl = UIAlertController(title: "App restart required", message: message, preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "Close now", style: .destructive) { _ in
UserDefaults.standard.set([langCode], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
exit(EXIT_SUCCESS)
}
confirmAlertCtrl.addAction(confirmAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
confirmAlertCtrl.addAction(cancelAction)
present(confirmAlertCtrl, animated: true, completion: nil)
}
}
这将询问并通知用户他是否要进行更改以及如何进行更改。此外,它还会在下一次启动时使用以下命令设置应用程序语言:
UserDefaults.standard.set([langCode], forKey: "AppleLanguages")
UserDefaults.standard.synchronize() // required on real device
步骤#3(可选):本地化字符串
您可能想通过使用NSLocalizedString
宏(或任何其他增强方法)来对诸如“立即关闭”之类的字符串进行本地化。
现实世界的例子
我正在针对iOS 10的应用程序中使用此确切的实现,我可以确认它在模拟器和设备上均适用。该应用程序实际上是开源的,因此您可以在此处找到上述代码,并将其分发到不同的类中。