【问题标题】:Why does NSLocale.current.identifier include currency on macOS?为什么 NSLocale.current.identifier 在 macOS 上包含货币?
【发布时间】:2017-01-07 12:23:20
【问题描述】:

如果我在 iOS 上请求当前的语言环境标识符,它只返回标识符字符串:

let identifier = NSLocale.current.identifier // en_GB

但是,在 macOS 10.12.2 上,它也会返回货币:

let identifier = NSLocale.current.identifier // en_GB@currency=GBP

这是错误还是预期行为?

【问题讨论】:

  • en_GBen_US这样的标识符有没有更合适的方式?
  • 我在 macOS 10.12.2 上没有看到这个。您确定系统偏好设置 > 语言和地区 > 地区弹出菜单显示“英国”而不是“英国(自定义)”或类似的内容吗?如果单击窗口底部的高级按钮,是否启用了恢复默认值?如果你点击它并重新测试,问题是否仍然存在?
  • 有趣。它被设置为United Kingom (Custom)。然而,这让我重新思考了我的方法。

标签: swift macos appkit


【解决方案1】:

我最近遇到了这个问题。我不知道为什么,但显然从 10.12 开始,localeIdentifiercan include a bunch of stuff besides country and language

不幸的是,文档没有详细说明包含其他元数据的情况。

但是,同样从 10.12 开始,还有另一个属性 languageCode,与 countryCode 一起,您可以使用它来生成 en_US

这就是iTerm2 does

【讨论】:

    【解决方案2】:

    我认为对我来说最好的选择是自己生成代码。为了解决这个问题,我在Locale 上创建了一个扩展:

    extension Locale {
        var iso3166code: String {
            guard
                let language = languageCode,
                let region = regionCode
                else { return "en-US" }
            return "\(language)-\(region)"
        }
    }
    

    虽然这对于我的目的来说足够准确,但您可能应该确保它为您的项目返回预期值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多