web-dev-qa-db-fra.com

Obtenir le code pays du nom du pays dans IOS

Je récupère un nom de pays depuis un serveur en anglais. Par exemple, "Espagne"

Ce que je veux faire est, en supposant que le nom du pays soit écrit en anglais, obtenir le code du pays. 

Que devrais-je faire? J'ai trouvé qu'il était assez facile d'obtenir le nom du pays à partir du code de pays, mais je n'ai aucune idée de la façon de procéder.

Merci beaucoup.

22
pdrcabrod

Jef's answer a aidé ici, avec de légers ajouts.

NSArray *countryCodes = [NSLocale ISOCountryCodes];
NSMutableArray *countries = [NSMutableArray arrayWithCapacity:[countryCodes count]];

for (NSString *countryCode in countryCodes)
{
    NSString *identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary dictionaryWithObject: countryCode forKey: NSLocaleCountryCode]];
    NSString *country = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"] displayNameForKey: NSLocaleIdentifier value: identifier];
    [countries addObject: country];
}

NSDictionary *codeForCountryDictionary = [[NSDictionary alloc] initWithObjects:countryCodes forKeys:countries];

Maintenant, parcourez le 'codeForCountryDictionary' avec le nom du pays pour lequel vous avez besoin du code, par exemple,

NSLog(@"%@",[codeForCountryDictionary objectForKey:@"Spain"]);

donnerait le résultat en 'ES', qui est le code de pays à 2 lettres pour l'Espagne.

29
Breakpoint

A Swift 4 version mise à jour de @Daxesh Nagar solution:

private func locale(for fullCountryName : String) -> String {
    var locales : String = ""
    for localeCode in NSLocale.isoCountryCodes {
        let identifier = NSLocale(localeIdentifier: localeCode)
        let countryName = identifier.displayName(forKey: NSLocale.Key.countryCode, value: localeCode)
        if fullCountryName.lowercased() == countryName?.lowercased() {
            return localeCode as! String
        }
    }
    return locales
}

Pour cette entrée en tant que fullCountryName

"Royaume-Uni" 

Il retournera le code du pays comme suit

"GB"

J'espère que ça vous aide les gars!

6
GuilhermeM

Dans le Swift, vous utiliserez ce code

extension NSLocale {
    class func locales1(countryName1 : String) -> String {
        var locales : String = ""
        for localeCode in NSLocale.ISOCountryCodes() {
            let countryName = NSLocale.systemLocale().displayNameForKey(NSLocaleCountryCode, value: localeCode)!
            if countryName1.lowercaseString == countryName.lowercaseString {
                return localeCode as! String
            }
        }
        return locales
    }


}

Obtenir les données:

strP2countrycode = NSLocale.locales1("PASS_COUNTRYNAME")
4
Daxesh Nagar

Dans Swift 3, vous ne pouvez utiliser que 

let currentLocale = NSLocale.current
var countries = NSLocale.isoCountryCodes
currentLocale.localizedString(forRegionCode: countries.first!)
3
Piotr Badura

Ma version compacte, y compris le correctif destiné à correspondre uniquement à la version anglaise des noms de pays.

extension NSLocale
{
    class func localeForCountry(countryName : String) -> String?
    {
        return NSLocale.ISOCountryCodes().first{self.countryNameFromLocaleCode($0 as! String) == countryName} as? String
    }

    private class func countryNameFromLocaleCode(localeCode : String) -> String
    {
        return NSLocale(localeIdentifier: "en_UK").displayNameForKey(NSLocaleCountryCode, value: localeCode) ?? ""
    }
}
1
Fawkes

Utilisation de Swift 3 (il manque un morceau à certaines des réponses ci-dessus)

extension NSLocale {
class func locales1(countryName1 : String) -> String {
    let locales : String = ""
    for localeCode in NSLocale.isoCountryCodes {
        let countryName = (Locale.current as NSLocale).displayName(forKey: .countryCode, value: localeCode)
        if countryName1.lowercased() == countryName?.lowercased() {
            return localeCode
        }
    }
    return locales
}
}
1
Robert Varga

Swift 3.0:

Obtenir le code de pays et le nom du pays comme NS Dictionary-

let countryCodes: [AnyObject] = NSLocale.isoCountryCodes as [AnyObject]

        let countries: NSMutableArray = NSMutableArray(capacity: countryCodes.count)

        for countryCode in countryCodes {
            let identifier: String = NSLocale.localeIdentifier(fromComponents: NSDictionary(object: countryCode, forKey: NSLocale.Key.countryCode as NSCopying) as! [String : String])
            let country: String = NSLocale(localeIdentifier: "en_US").displayName(forKey: NSLocale.Key.identifier, value: identifier)!
            countries.add(country)
        }
        let codeForCountryDictionary: [NSObject : AnyObject] = NSDictionary(objects: countryCodes, forKeys: countries as! [NSCopying]) as [NSObject : AnyObject]

        print(codeForCountryDictionary)
1
A.G

Voici comment procéder dans Swift 4.0 (fonctionne également dans Swift 3.2).

NSLocale.isoCountryCodes.forEach { (code) in
    print(code)
    let name = NSLocale(localeIdentifier: "zh_CN").displayName(forKey: NSLocale.Key.countryCode, value: code)
    print(name)
}
0
Lumialxk

voici le code Daxesh Negar dans Swift 3

    extension NSLocale {
    class func locales1(countryName1 : String) -> String {
        let locales : String = ""
        for localeCode in NSLocale.isoCountryCodes {
            let countryName = Locale.current.regionCode
            if countryName1.lowercased() == countryName?.lowercased() {
                return localeCode
            }
        }
        return locales
    }
}
0

Voici une solution simple qui fonctionne dans Swift 3 ou version ultérieure. Selon la version de votre système d'exploitation, cela prend en charge environ 256 noms de pays et codes.

extension Locale {
    func isoCode(for countryName: String) -> String? {
        return Locale.isoRegionCodes.first(where: { (code) -> Bool in
            localizedString(forRegionCode: code)?.compare(countryName, options: [.caseInsensitive, .diacriticInsensitive]) == .orderedSame
        })
    }
}

L'astuce pour l'utiliser correctement consiste à connaître la langue des noms de pays que vous souhaitez convertir en code de pays ISO à 2 lettres.

Si vous savez que les noms de pays sont en anglais, vous devez l’utiliser dans des paramètres régionaux définis en anglais. Il serait préférable d’utiliser les paramètres régionaux spéciaux de en_US_POSIX dans un tel cas.

let locale = Locale(identifier: "en_US_POSIX") 
print(locale.isoCode(for: "Spain")) // result is `ES`

Si vous avez des noms de pays en espagnol, veillez à utiliser des paramètres régionaux espagnols:

let locale = Locale(identifier: "es") 
print(locale.isoCode(for: "España")) // result is `ES`
0
rmaddy

Donc, cette solution fonctionne bien dans Swift 4 à partir des commentaires ci-dessus ...

extension NSLocale {
   struct Locale {
    let countryCode: String
    let countryName: String
   }

  class func locales() -> [Locale] {

    var locales = [Locale]()

    for localeCode in NSLocale.isoCountryCodes {
        let identifier = NSLocale(localeIdentifier: localeCode)
        let countryName = identifier.displayName(forKey: NSLocale.Key.countryCode, value: localeCode)!
        let countryCode = localeCode
        let locale = Locale(countryCode: countryCode, countryName: countryName)
        locales.append(locale)
    }

    return locales.sorted{$0.countryName.localizedCaseInsensitiveCompare($1.countryName) == ComparisonResult.orderedAscending}
 }
}

prendre plaisir!

0
Pablo Segura