我有一系列国家/地区代码,例如:["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)
。
答案 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