如何获取操作系统的语言和区域设置?

6

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

    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")
    }

我想提供一种方法,可以将语言设置为列表,并选择正确的语言,其中之一是将语言设置回“系统默认”。但是,我找不到任何查找操作系统级别语言和区域设置的方法。因为在我尝试更改UserDefaults后,Bundle.main.preferredLocalizations不可靠且与系统默认值不匹配(即使我从User Default中删除该键)。
有没有一种方法可以获取操作系统级别的语言和区域设置而不是应用程序级别的呢?

1
https://dev59.com/zF8d5IYBdhLWcg3wNAKy#27053592 - Leo Dabus
@LeoDabus 这是个好想法,但我不想仅仅根据用户的位置来假定他们的语言/区域设置,因为他们可能已经从iOS设置中选择了自己的语言/区域设置。 - TruMan1
7
你打算通过这样做达到什么目的?建议重新启动是一种相当糟糕的用户体验,并违反了苹果的人机交互指南。 - GetSwifty
我提供更改他们的语言和区域设置并重新启动,他们可以选择点击“稍后”或“确定”来退出(0)。虽然不如Android好,但比swizzling更好。但是,我该如何让他们切换回“系统默认值”,系统级别的选择在哪里? - TruMan1
1
@TruMan1 你可以使用 Locale.current.languageCode 获取应用程序语言,使用 Locale.preferredLanguages 获取用户首选语言。在重置时,可以从 Locale.current.languageCode 获取当前语言代码。 - LC 웃
显示剩余12条评论
4个回答

4

4
为什么 sleepwalkerrfx 的回答不正确,您能描述一下吗?@TruMan1 - roy

1
我找到了一个类似的答案,通过操作应用程序的Bundle语言文件来实现。就像设置正确的语言一样。
虽然您表示使用Bundle属性似乎会干扰您的用例,但我建议您将设置的语言保存在Core Data中,存储在应用程序文件中或XML(.plist)中。您可以在didFinishWithOptions中设置一个检查方法,检查该变量的存在,然后运行语言提示(如果不存在),或者保留原来的语言(如果存在)(添加一个检查以确保设置了正确的语言可能是明智的)。由于这不会改变设置的语言,因此,如果用户选择这样做,您始终可以通过NSLocale获得快速参考点,轻松切换回它。
这里是帖子 免责声明1:我没有测试过这个,但它似乎是一个合理的、被苹果容许的事情。 免责声明2:正如链接中的OP所述,以及一些人在这里提到的那样,更改应用程序语言并不被苹果推荐。特别是由于NSLocale键以及Swift经常更新,这可能导致您的代码无法使用或需要进行大规模的修改。正如我在上面的评论中提到的那样,我很遗憾地重新考虑了这种用例。

1

1
我建议您使用来自Cocoa Pods的这个库。 在您的Podfile中添加以下行:
pod 'Localize-Swift', '~> 1.7'

然后使用以下命令安装您的pods:
pod install

如果您没有 Localizable.strings 文件,例如 Localizable.strings (English),请添加以下内容。
"LD" = "Loading ...";
"CAMP" = "Campus";
"MAP" = "MAP";

第一个单词就像你的TAG,下一个单词是你的

然后在你的视图控制器中,你可以这样使用你的字符串。

使用示例:

let progressHUD = ProgressHUD(text: "LD".localized())
let progressHUD = ProgressHUD(text: "CAMP".localized())
let progressHUD = ProgressHUD(text: "MAP".localized())

那就是全部内容。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接