从地区代码接收国家名

问题描述:

我有一个国家代码数组,如:["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)

+0

在Xcode 8.3.1下的10.3模拟器中,这两个版本都适用于我 –

+0

可能是一个游乐场问题。 – rmaddy

+0

@ChrisAllwein有趣的是,如果我仅仅使用'current'而不是初始化单独的区域设置,我的应用程序无法正常工作:/ – njuri

您需要维护一个表格,将每个国家/地区代码映射到默认语言代码,例如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