2012-10-01 41 views
19

Recupero un nombre de país de un servidor en inglés. Por ejemplo, "España"Obtener el código de país del nombre del país en IOS

Lo que quiero hacer es, suponiendo que el nombre del país vaya a escribirse en inglés, obtener el código del país.

¿Qué debo hacer? He encontrado que obtener el nombre del país del código de país es bastante fácil, pero no tengo idea de cómo hacer la operación opuesta.

Muchas gracias.

+0

¿Cómo está obteniendo el código del nombre del país? Solo haz lo opuesto :) – deanWombourne

+0

Espero que este linke te ayude http://stackoverflow.com/questions/502764/iphone-obtaining-a-list-of-countries-in-an-nsarray –

+0

Ya lo he comprobado, pero lo que quiero es obtener solo un CountryCode según el nombre de un país, no una lista de países – pdrcabrod

Respuesta

29

Jef's answer ayudado aquí, con ligeras incorporaciones.

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]; 

Ahora ve a través de la 'codeForCountryDictionary' con el nombre del país para el que se necesita el código, por ejemplo,

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

produciría el resultado como 'ES', que es el 2 código de país de la letra para España.

+4

Bueno, si sabes que los nombres de los países están en inglés, por supuesto NO deberías usar el actualLocale, sino un escenario fijo. El currentLocale puede estar en cualquier idioma. Utilice [NSLocale initWithLocaleIdentifier: @ "en_UK"] en su lugar. – fishinear

+0

initWithLocaleIdentifier es un método de instancia, no un método de clase, así que use '[[NSLocale alloc] initWithLocaleIdentifier: @" en_UK "]' en su lugar – pyrou

+0

Solo para asegurarse de que también bajaría/mayúsculas las teclas del diccionario. No estamos seguros de qué devuelve el servidor (que es un problema diferente, pero al menos eso puede minimizar la debilidad de "displayName") – surui

3

En el Swift va a utilizar este código

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 
    } 


} 

Obtener los datos:

strP2countrycode = NSLocale.locales1("PASS_COUNTRYNAME") 
1

Mi versión compacta incluyendo el arreglo para hacer coincidir sólo en contra de la versión Inglés nombres de países.

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) ?? "" 
    } 
} 
0

aquí es el código Daxesh Negar en 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 
    } 
} 
1

Usando rápida 3 (algunas de las respuestas anteriores están perdiendo una pieza)

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

Swift 3.0:

Obtener el código del país y el nombre del país como 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) 
2

en Swift 3 que acaba sólo se puede usar

let currentLocale = NSLocale.current 
var countries = NSLocale.isoCountryCodes 
currentLocale.localizedString(forRegionCode: countries.first!) 
+1

Se desaconsejan las respuestas de solo código porque no explican cómo resuelven el problema. Por favor, actualice su respuesta para explicar cómo esto mejora en las otras respuestas aceptadas y votadas que esta pregunta ya tiene. Además, esta pregunta tiene 5 años, sus esfuerzos serán más apreciados por los usuarios que tienen preguntas recientes sin respuesta. Revise [Cómo escribo una buena respuesta] (https://stackoverflow.com/help/how-to-answer). – FluffyKitten

+1

Como puede ver, mi respuesta es solo en 3 líneas y es mejor que otras IMO. Esta pregunta es primero en google, así que decidí compartir mi respuesta. Sé que esta pregunta tiene 5 años, pero muchos desarrolladores tienen un problema. Si no está de acuerdo conmigo, elimínelo. –

0

Esto es cómo hacer esto en Swift 4.0 (también trabajar en 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) 
} 
2

Un Swift 4 versión actualizada @Daxesh Nagar solución:

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 
} 

Por esta entrada como fullCountryName

"Reino Unido"

devolverá el código de país de la siguiente manera

"GB"

Espero que ayuda chicos!

0

Así que esta solución funciona bien en rápida 4 tomada a partir de los comentarios anteriores ...

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} 
} 
} 

disfrutar!

Cuestiones relacionadas