Получить код страны из названия страны в IOS
Im получение имени страны с сервера на английском языке. Например, "Испания"
Что я хочу сделать, предполагая, что название страны будет написано на английском языке, получите код страны.
Что мне делать? Я нашел, что получить название страны из кода страны довольно легко, но я не знаю, как сделать противоположную операцию.
Большое спасибо.
Ответы
Ответ 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)
}