为什么Locale.current.identifier无效?

时间:2017-11-26 11:06:42

标签: ios swift locale

设置"语言&区域" (Settings => General => Language& Region)如下:

  • " iPhone语言"到"英语(加拿大)"。
  • "地区#34;到"乔丹"。

但是,(正如上面提到的答案:How to get detailed language of device in swift呼叫:

print(Locale.current.identifier)

日志:

  

en_JO

这是无效 local identifier(从逻辑上讲,约旦是一个中东国家,其母语是阿拉伯语而非英语)。

我还检查了availableIdentifiers

print(Locale.availableIdentifiers)

和 - 显然-it 包含" en_JO"。

另外,我试过了:

if let regionCode = Locale.current.regionCode, let languageCode = Locale.current.languageCode {
    print("\(languageCode)_\(regionCode)")
}

并且输出相同。

它似乎与标识符有效性无关,但我怎样才能确保获得有效的标识符?例如,在我的情况下,预期结果应为:

  

en_CA

那我在这里错过了什么?

2 个答案:

答案 0 :(得分:2)

标识符en_JO没有任何效果。根据Unicode标准,标识符完全有效,作为约旦地区英语的标识符。

但是,这并不意味着该地区的数据必须可用。系统不需要为每种疯狂的语言和区域组合提供数据。

请参阅Unicode标准中的Language Matching。如果所请求的区域设置没有数据,则使用后备区域设置,在这种情况下可能是区域设置en

答案 1 :(得分:1)

每个区域设置标识符包括语言代码(例如en)和区域代码(例如JO)。从Apple的documentation

可以看出这一点
  

区域设置ID标识特定区域及其文化   约定 - 例如日期,时间和数字的格式。至   指定区域设置,使用下划线字符组合语言ID   与区域指示符

这意味着您的en_JO是无效标识符的声明不正确。之所以成立是因为你选择了英语作为乔丹的语言和地区。

现在,如果你只想获得langauge部分,你可以通过preferredLangauges获得它,

let langId = Locale.preferredLanguages.first

collatorIdentifier关于当前Locale

let langId = Locale.current.collatorIdentifier // returns optional string

enter image description here

enter image description here