我的应用程序在运行时更改语言并建议用户重新启动应用程序。我是这样做的:
typealias LanguageLocaleType = (language: String?, locale: String?, title: String)
let elements: [LanguageLocaleType] = [
(nil, nil, "System Default"),
("en", "en_US", "English"),
("ar", "ar_SA", "Arabic"),
]
//...func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)...
let element = elements[indexPath.row]
guard let language = element.language else {
// How to really reset app back to OS language/locale???
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
UserDefaults.standard.removeObject(forKey: "AppleLocale")
return
}
UserDefaults.standard.set([language], forKey: "AppleLanguages")
if let locale = element.locale, !locale.isEmpty,
Locale.current.identifier != locale,
!Locale.current.identifier.hasPrefix("\(language)_") {
UserDefaults.standard.set(locale, forKey: "AppleLocale")
}
我想提供一个列表中的语言,并选择正确的语言,其中一个用于将语言设置回System Default
。但是,没有办法找到我能找到的操作系统级语言和语言环境。因为在我设置UserDefaults
之后,Bundle.main.preferredLocalizations
不可靠并且与系统默认值不匹配(当我从User Default
中删除密钥时发生事件)。
有没有办法获得操作系统级别的语言和语言环境,而不是应用程序级别?
答案 0 :(得分:4)
您应该能够获得当前选择的操作系统语言。
let language = NSLocale.preferredLanguages[0]
如果这不是您要找的,请参阅此答案 https://stackoverflow.com/a/30750120/809821
答案 1 :(得分:1)
我建议你使用Cocoa pods中的这个库。
在 Podfile 中添加以下行:
pod 'Localize-Swift', '~> 1.7'
然后使用此命令安装您的pod:
pod install
然后,如果您没有 Localizable.strings ,例如 Localizable.strings(英文) 文件,请添加以下行。
"LD" = "Loading ...";
"CAMP" = "Campus";
"MAP" = "MAP";
第一个字就像您的 TAG ,下一个字就是值。
然后在 ViewController 中,您可以像这样使用字符串。
使用示例:
let progressHUD = ProgressHUD(text: "LD".localized())
let progressHUD = ProgressHUD(text: "CAMP".localized())
let progressHUD = ProgressHUD(text: "MAP".localized())
就是这样。
我希望这有帮助。
答案 2 :(得分:1)
通过使用应用的Bundle语言文件,我找到了一个类似的答案。正如设置正确的一样。
虽然您声明使用Bundle属性似乎与您的用例有关,但我会考虑使用Core Data,app文件或内部以及XML(.plist)保存设置的语言。您可以在didFinishWithOptions中设置一个检查方法,检查此变量的存在,然后在缺席时运行语言提示,或者如果存在则离开(添加检查以确保设置正确的语言是明智的)。由于这不会改变设置设置语言,因此如果用户选择,您可以通过NSLocale在应用程序之外始终拥有一个快速参考点,以便轻松切换回它。
此处the post
免责声明1:我没有对此进行过测试,但这似乎是一个看似合理且容易受到Apple限制的事情。 免责声明2:正如链接中的OP所述,并且正如此处提到的那样,Apple不建议更改应用程序语言。值得注意的是,由于NSLocale密钥,以及Swift的更新频率,这可能导致您的代码无法使用或需要进行大规模的大修。正如我在上面的评论中所提到的,我很遗憾地重新考虑这个用例:(
答案 3 :(得分:1)
参考上述问题,您可以按照上述说明创建自己的捆绑包或使用预建的类,如下所示:https://github.com/mumensh/iOS-Localization