2017-04-12 3 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" 

、なぜ現在のロケールフランスコードとFranceを返し、現在のロケールの識別子から初期化ロケールのnilを返しますか?

更新:だから、localizedString(forRegionCode:)作品を作るための回避策がLocale.currentが、Locale(identifier: Locale.current.identifier)を使用することではありません。

+0

どちらのバージョンが8.3.1 Xcodeの –

+0

下10.3シミュレータで私のために働くには、遊び場の問題になる可能性があります。 – rmaddy

+0

@ChrisAllwein面白い、別のロケールを初期化するのではなく、単に 'current'を使うと、私のアプリが正しく動作しない:/ – njuri

答えて

0

各国コードをデフォルトの言語コード(Wikipediaのthis tableなど)にマッピングするテーブルを維持する必要があります。複数の公用語、または同じ言語のバリエーション(簡体字中国語と繁体字中国語)がある可能性があるため、各コモンのデフォルト言語を選択します。

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 
関連する問題