Swift 基础-什么是区域标识符?

Swift 基础-什么是区域标识符?,swift,nsdateformatter,foundation,Swift,Nsdateformatter,Foundation,实现的目标 在表中,有一列日期。日期的格式应基于用户的区域设置。 例如: 2020年1月24日或20年1月24日(我不介意)供法国用户使用 20年1月24日适用于美国用户 注意:该应用程序(目前)仅使用英语 我有一个Date对象,我想以正确的格式显示给用户。为此,我想我必须使用DateFormatter,它有一个locale参数。但我遇到了后者的一个问题 问题 在Xcode操场上,在法语(Regio=BE)(但英语为Xcode)的Mac上,以下代码返回奇怪的东西 Locale.current

实现的目标

在表中,有一列日期。日期的格式应基于用户的区域设置。 例如:

  • 2020年1月24日或20年1月24日(我不介意)供法国用户使用
  • 20年1月24日适用于美国用户
注意:该应用程序(目前)仅使用英语

我有一个
Date
对象,我想以正确的格式显示给用户。为此,我想我必须使用DateFormatter,它有一个
locale
参数。但我遇到了后者的一个问题

问题

在Xcode操场上,在法语(Regio=BE)(但英语为Xcode)的Mac上,以下代码返回奇怪的东西

Locale.current.regionCode // returns "BE"
Locale.current.languageCode // returns "en"
Locale.preferredLanguages[0] // returns "en"
Locale.current.identifier // returns "en_BE"
Locale.current.collatorIdentifier // returns "fr-BE"
Locale.current.collationIdentifier // returns nil
注:法语是比利时的语言之一


collatorIdentifier
让我感兴趣,因为它是唯一检测到我的mac是法语的。但这是什么呢?它的目标是什么?为什么它返回的东西与其他东西有显著的不同?

首先,要解决您的问题:在Xcode中,语言环境很复杂,特别是在操场上。如果你的游戏场以iOS为目标,那么它将基于模拟器的区域设置。如果它的目标是macOS,我觉得这有点奇怪,因为Xcode覆盖了一切。请注意,区域设置更改通常需要重新启动才能完全生效(无论是模拟器还是Mac),但我仍然发现操场是不可靠的,因为Xcode没有正确本地化(或者我猜根本没有本地化…),如果您没有重新启动,则可能会发生不匹配。如果你在操场上跑步,即使你重新启动了,所有的赌注都没有了。我建议创建Mac命令行工具。它们更可靠

如果要使用游乐场,请使用初始化的特定区域设置,而不是当前的

至于它是什么的问题,排序通常是字母应该如何被认为是“排序的”。这在不同的语言之间,在共享一种语言的文化之间,甚至在同一种文化中的用法之间都是不同的。以下是几个例子(还有很多):

  • 字母A-Z可以按与英语不同的顺序排序。例如,在立陶宛语中,“y”在“i”和“k”之间排序

  • 字母组合可以被视为一个字母。例如,在传统西班牙语中,“ch”被视为一个单数 字母,并在“c”和“d”之间排序

  • 重音字母可以被视为非重音字母的次要变体。例如,“é”可以等同于“e”

  • 重音字母可以被视为不同的字母。例如,丹麦语中的“Å”被视为一个单独的字母,紧接着排序 “Z”

  • 在一种语言中被认为是不同的无重音字母在另一种语言中可能是模糊的。例如,字母“v”和“w”是两个 不同的英文字母。然而,“v”和“w”是 瑞典语中同一字母的传统变体

collationIdentifier
是整个标识符,
collationIdentifier
是特定于用法的部分

let l = Locale(identifier: "de@collation=phonebook")
l.collatorIdentifier  // "de@collation=phonebook"
l.collationIdentifier // "phonebook"

谢谢你的链接,这当然很有趣。但是,我想知道它是如何回答“Locale.collatorIdentifier”是什么以及为什么它返回的结果与其他示例不同的问题的。您说过您的目标是什么,这就是您应该如何根据用户区域设置和设备设置显示本地化日期的。如果这不能解决您的问题,请告诉我,以便我可以重新打开您的问题。这确实是最终目标,但问题在于语言环境。Cfr问题的问题部分。非常感谢Rob的解释!