サーバーから国名を英語で取得しています。例:「スペイン」
私がしたいのは、国名が英語で書かれると仮定して、国コードを取得することです。
私は何をすべきか?国コードから国名を取得するのは非常に簡単ですが、反対の操作を行う方法がわかりません。
どうもありがとう。
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"]);
結果は、スペインの2文字の国コードである「ES」として得られます。
A Swift 4@ Daxesh Nagarソリューションの更新バージョン:
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」
皆さんのお役に立てば幸いです。
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")
英語の国名バージョンのみと照合するための修正を含む私のコンパクトバージョン。
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) ?? ""
}
}
Swift 3では、使用できるのは
let currentLocale = NSLocale.current
var countries = NSLocale.isoCountryCodes
currentLocale.localizedString(forRegionCode: countries.first!)
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
}
}
Swift 3以降で機能する簡単なソリューションを次に示します。OSのバージョンに応じて、これは約256の国名とコードをサポートします。
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
})
}
}
これを正しく使用する秘訣は、標準の2文字の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`
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)
これは、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)
}
ここにSwift 3のDaxesh Negarコードがあります
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
}
}
したがって、このソリューションは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}
}
}
楽しい!