从地区代码接收国家名
问题描述:
我有一个国家代码数组,如:["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(identifier: Locale.current.identifier)
。
答
您需要维护一个表格,将每个国家/地区代码映射到默认语言代码,例如Wikipedia上的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
在Xcode 8.3.1下的10.3模拟器中,这两个版本都适用于我 –
可能是一个游乐场问题。 – rmaddy
@ChrisAllwein有趣的是,如果我仅仅使用'current'而不是初始化单独的区域设置,我的应用程序无法正常工作:/ – njuri