从区域代码

时间:2017-04-12 14:52:46

标签: 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"

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

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

1 个答案:

答案 0 :(得分:0)

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

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