Подтвердить что ты не робот

Получить код страны из названия страны в IOS

Im получение имени страны с сервера на английском языке. Например, "Испания"

Что я хочу сделать, предполагая, что название страны будет написано на английском языке, получите код страны.

Что мне делать? Я нашел, что получить название страны из кода страны довольно легко, но я не знаю, как сделать противоположную операцию.

Большое спасибо.

4b9b3361

Ответ 1

Jef answer помогли здесь, с небольшими дополнениями.

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

Теперь перейдите в "codeForCountryDictionary" с названием страны, для которой вам нужен код, например

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

даст результат как "ES", который является 2-буквенным кодом страны для испания.

Ответ 2

Обновленная версия решения @Daxesh Nagar для Swift 4:

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
}

Для этого ввода как fullCountryName

"Объединенное Королевство"

Он вернет код страны следующим образом

"GB"

Надеюсь, это поможет вам, ребята!

Ответ 3

В Swift вы будете использовать этот код

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
    }


}

Получить данные:

strP2countrycode = NSLocale.locales1("PASS_COUNTRYNAME")

Ответ 4

В swift 3 вы можете использовать только

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

Ответ 5

Моя компактная версия, в том числе исправление для соответствия только версии английской версии.

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

Ответ 6

Использование swift 3 (некоторые из вышеприведенных ответов отсутствуют)

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

Ответ 7

Swift 3.0:

Получение кода страны и названия страны как 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)

Ответ 8

Так что это решение хорошо работает в Swift 4, взятом из комментариев выше...

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

наслаждаться!

Ответ 9

Я создал библиотеку Swift для управления использованием стран в приложениях для iOS, милостиво и легко, вы можете проверить это здесь:

https://github.com/serjooo/SwiftyCountry

Ответ 10

Вот простое решение, которое работает в Swift 3 или более поздней версии. В зависимости от версии вашей ОС, он поддерживает примерно 256 названий и кодов стран.

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

Хитрость для правильного использования этого заключается в знании языка названий стран, которые вы хотите преобразовать в стандартный двухбуквенный код страны ISO.

Если вы знаете, что названия стран на английском языке, вы должны использовать это в локали, установленной на английский. В таком случае было бы лучше использовать специальную локаль en_US_POSIX.

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

Если у вас есть названия стран на испанском языке, обязательно используйте испанский язык:

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

Ответ 11

здесь Daxesh Negar code в 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
    }
}

Ответ 12

Вот как это сделать в Swift 4.0 (также работает в 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)
}