如何获得操作系统语言和语言环境?

时间:2017-06-30 21:36:45

标签: ios swift localization nslocale

我的应用程序在运行时更改语言并建议用户重新启动应用程序。我是这样做的:

    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中删除密钥时发生事件)。

有没有办法获得操作系统级别的语言和语言环境,而不是应用程序级别?

4 个答案:

答案 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