Ios 为什么Locale.current.identifier无效?

Ios 为什么Locale.current.identifier无效?,ios,swift,locale,Ios,Swift,Locale,按如下方式设置“语言和区域”(设置=>常规=>语言和区域)时会出现问题: “iPhone语言”改为“英语(加拿大)” “区域”改为“约旦” 但是,(正如前面提到的回答:呼叫: 日志: 恩乔 这是无效的(从逻辑上讲,约旦是一个以阿拉伯语而非英语为母语的中东国家) 我还检查了: 显然,它不包含“en_JO” 此外,我尝试: if let regionCode = Locale.current.regionCode, let languageCode = Locale.current.langua

按如下方式设置“语言和区域”(设置=>常规=>语言和区域)时会出现问题:

  • “iPhone语言”改为“英语(加拿大)”
  • “区域”改为“约旦”
但是,(正如前面提到的回答:呼叫:

日志:

恩乔

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

我还检查了:

显然,它不包含“en_JO”

此外,我尝试:

if let regionCode = Locale.current.regionCode, let languageCode = Locale.current.languageCode {
    print("\(languageCode)_\(regionCode)")
}
结果是一样的

这似乎与标识符的有效性无关,但如何确保获得有效的标识符?例如,在我的情况下,预期结果应该是:

恩努卡


那么,我在这里遗漏了什么呢?

每个地区标识符都包括一个语言代码(如en)和一个地区代码(如JO)。这一点从苹果的:

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

这意味着您关于en_JO是无效标识符的声明不正确。之所以形成此声明,是因为您选择了英语作为约旦的语言和地区

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

或通过当前
语言环境

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


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

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


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

实际上,调用
print(locale.availableIdentifiers)
不包含
en\u JO
languageCode
只返回“en”,如何获取“en\u CA”?此外,您可以检查“en_JO”是否存在于list@AhmadF:编辑了有关如何获取语言idBoth
首选语言的答案。first
Locale.current.collatorIdentifier
值为“en”,不带“-CA”。当我检查我的模拟器时,情况绝对不是这样。附上我模拟器的屏幕截图。我很好奇:实际问题是什么?你有一个可以使用的
Locale
。-还有
Locale(标识符:“en_JO”)。currencyCode
在我的测试中返回“JOD”,所以“en_JO”似乎是一个可识别的标识符,即使在
availableIdentifiers
列表中不存在。@MartinR这种标识符造成的实际问题是,它无法识别……我还尝试检查了“en_JO”在上,我找不到它…@Martinar,我还试图检查
区域设置。availableIdentifiers
数组,它不包含“en_JO”…该区域设置不是无效的。它只是意味着没有特定的设置,因此大多数设置可能只来自“en”那么,有没有办法获得所选语言的国家(在我的例子中是加拿大)?我试图检查属性,但没有得到有用的结果。提前谢谢。另外,为了确保我得到了正确的结果:它是有效的,但不可用;在这种情况下,
en
独立地将是有效的,对吗?如果是这样,我将无法识别它是否可用(除非我手动执行),否则我必须始终使用
Locale.current.languageCode
。。。
if let regionCode = Locale.current.regionCode, let languageCode = Locale.current.languageCode {
    print("\(languageCode)_\(regionCode)")
}
let langId = Locale.preferredLanguages.first
let langId = Locale.current.collatorIdentifier // returns optional string