2017-04-12 1 views
0

J'ai un tableau de codes de pays comme: ["US","CZ","FR"] etc et je voudrais obtenir le nom du pays localisé itérer à travers ce tableau.Réception du nom de pays du code de région

Auparavant localizedString(forRegionCode:) fonctionnait parfaitement. Mais probablement depuis 10.3 quelque chose a changé.

Voici un exemple:

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" 

Alors, pourquoi locale actuelle retourne nil pour le code France et les paramètres régionaux initialisé à partir de l'identifiant de localisation en cours retourne France?

Mise à jour: donc la solution de contournement pour faire localizedString(forRegionCode:) travail est de ne pas utiliser Locale.current, mais Locale(identifier: Locale.current.identifier).

+0

Les deux versions fonctionnent pour moi dans le simulateur 10.3 sous Xcode 8.3.1 –

+0

Peut-être un problème de terrain de jeu. – rmaddy

+0

@ChrisAllwein intéressant, mon application ne fonctionne pas correctement si j'utilise simplement 'current' au lieu d'initialiser les paramètres régionaux séparés:/ – njuri

Répondre

0

Vous devez gérer une table mappant chaque code de pays à un code de langue par défaut, tel que this table sur Wikipedia. Choisissez une langue par défaut pour chaque contry, car il peut avoir plusieurs langues officielles, ou même des variantes de la même langue (chinois simplifié vs chinois traditionnel).

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