2012-10-01 231 views
19

從英語服務器中檢索國家名稱。例如,「西班牙」在IOS中從國家名稱獲取國家代碼

我想要做的是,假設國家名稱將用英文寫成,請獲取國家/地區代碼。

我該怎麼辦?我發現從國家代碼中獲取國名很容易,但我不知道如何做相反的操作。

非常感謝。

+0

過得好從國家名稱的代碼?只是做相反:) – deanWombourne

+0

我希望這臨客將幫助您http://stackoverflow.com/questions/502764/iphone-obtaining-a-list-of-countries-in-an-nsarray –

+0

香港專業教育學院已經簽了,但我想是根據一個國家的名字,而不是國家 – pdrcabrod

回答

29

傑夫的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爲西班牙寫信國家代碼。

+4

好吧,如果你知道這個國家的名字都是英文的,你當然應該不要用currentLocale的列表,而是一個固定的區域得到的只是一個COUNTRYCODE。 currentLocale可以使用任何語言。改爲使用[NSLocale initWithLocaleIdentifier:@「en_UK」]。 – fishinear

+0

initWithLocaleIdentifier是一個實例方法,而不是一個類的方法,因此使用'[NSLocale頁頭] initWithLocaleIdentifier:@「en_UK」]',而不是 – pyrou

+0

只是爲了確保我也要小寫/大寫的字典鍵。我們不知道什麼是服務器返回(這是一個不同的問題,但至少可以最大限度地減少「顯示名」虛弱) – surui

3

在斯威夫特,您將使用此代碼

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") 
1

我的精簡版包括修復只針對英文國名的版本匹配。

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

這裏是Daxesh Negar代碼在迅速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

使用迅速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 
} 
} 
1

夫特3.0:

獲取國家代碼和國家名稱作爲NS字典-

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

在SWIFT 3你可以只使用

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

代碼只答案是沮喪,因爲他們沒有解釋他們是如何解決這個問題。請更新您的答案,以解釋這個問題已經具有的其他已接受和已獲得解答的答案是如何改進的。此外,這個問題已經5年了,您的努力將會得到最近沒有答案的用戶的讚賞。請複習[我如何寫出一個好答案](https://stackoverflow.com/help/how-to-answer)。 – FluffyKitten

+1

正如你可以看到我的答案只有3行,比其他國際海事組織更好。這個問題首先在谷歌,所以我決定分享我的答案。我知道這個問題已經有5年了,但我有很多開發者有問題。如果您不同意我的意見,請刪除。 –

0

這是如何在雨燕4.0做到這一點(在斯威夫特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

@Daxesh的斯威夫特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」

希望它可以幫助你們這將返回國家代碼!

0

所以這個解決方案工作得很好,從上述評論迅速採取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} 
} 
} 

享受!