swift - 从地区代码接收国家名称

标签 swift locale foundation

我有一组国家/地区代码,例如:["US","CZ","FR"] 等,我想通过此数组迭代获取本地化的国家/地区名称。

以前 localizedString(forRegionCode:) 工作得很好。但可能自 10.3 以来,情况发生了变化。

这是一个例子:

let currentLocale = Locale.current
// en_US (current)
let currentIdentifier = Locale.current.identifier
// "en_US"
let localeFromCurrentIdentifier = Locale(identifier: currentIdentifier)
// "en_US" (fixed)

let franceCode = "fr"

let franceName = currentLocale.localizedString(forRegionCode: franceCode)
// nil
let franceName2 = localeFromCurrentIdentifier.localizedString(forRegionCode: franceCode)
// "France"

那么,为什么当前语言环境对法国代码返回 nil 而从当前语言环境标识符初始化的语言环境返回 France

更新:所以使 localizedString(forRegionCode:) 工作的解决方法不是使用 Locale.current,而是使用 Locale (标识符:Locale.current.identifier)

最佳答案

您需要维护一个表,将每个国家/地区代码映射到默认语言代码,例如 this table在维基百科上。为每个国家/地区选择一种默认语言,因为它可能有多种官方语言,甚至是同一种语言的变体(简体中文与繁体中文)。

let countryCodes = ["US","CZ","FR"]

// Ideally, this should come from a plist
let defaultLanguageCodes = [
    "US": "en",
    "CZ": "cs",
    "FR": "fr"
]

let countryNames : [String] = countryCodes.map {
    let languageCode = defaultLanguageCodes[$0]!
    let localeIdentifier = "\(languageCode)_\($0.lowercased())"
    let locale = Locale(identifier: localeIdentifier)

    return locale.localizedString(forRegionCode: $0)!
}

print(countryNames) // United States, Česká republika, France

关于swift - 从地区代码接收国家名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43373009/

相关文章:

arrays - 两个总和 : Elements in 2 arrays equal predetermined Sum Swift 3

javascript - 更改 Fullcalendar React 组件的语言

java - 在java中检测windows系统区域设置

objective-c - 使用 componentsSeparatedByString 拆分 NSString

ios - Youtube 风格的投票。这是什么逻辑?

objective-c - 如何覆盖 Swift 类属性以进行测试

ios - 打开设置 iOS 8 URL

java - 带分页的语言环境敏感排序策略

objective-c - 如何使用AVQueuePlayer nad AVPlayerItem

objective-c - NSPredicate 'OR' 基于 NSArray 键的过滤