2017-04-12 116 views
0

我有一個國家代碼數組,如:["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

回答

0

您需要維護一個表格,將每個國家/地區代碼映射到默認語言代碼,例如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 
相關問題