总是在iOS中获得ISO 639-2(三个字符)语言代码?

问题描述 投票:4回答:5

我正在开发一个需要三个字母(ISO 639-2)语言代码才能访问REST服务的项目。我希望使用[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]来使用当前的语言设置。不幸的是,这种方法更喜欢返回两个字母(ISO 639-1)语言代码。有没有办法可以强制NSLocale返回更新的代码,还是有另一种方法可以用来将双字母语言代码转换为三字母语言代码?

ios localization
5个回答
5
投票

不,你做不到。你必须手动转换它们,这不是很简单。


8
投票

Github上查看我的代码,获取NSLocale上的类别以获取ISO 639.2语言代码。它很简单:

[[NSLocale currentLocale] ISO639_2LanguageIdentifier];

1
投票

我需要对ISO 3166-1国家/地区代码进行类似的转换。 iOS给了我2个字母的代码,但我需要3个字母的代码。这是我的解决方案:

  1. 查找资源文件/ API以获取ISO国家/地区。 (例如:https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes/tree/master/all
  2. 查找2个字母的代码并将其转换为匹配的3个字母代码。

一些示例代码(假设你有一个上面的lukes GIT项目格式的iso-countries.json文件)

import UIKit 

import CoreTelephony

class CountryCode {

internal var _countries: [String: [AnyHashable: Any]]?
internal var countries: [String: [AnyHashable: Any]]? {
    get {
        if _countries == nil {
            _countries = countriesDictionary()
        }
        return _countries
    }
}

func convertToThreeCharacterCountryCode(twoCharacterCountryCode: String) -> String? {
    let country = countries?[twoCharacterCountryCode.uppercased()]
    return country?["alpha-3"] as? String
}

fileprivate func countriesDictionary() -> [String: [AnyHashable: Any]] {
    var countries = [String: [AnyHashable: Any]]()
    guard let url = Bundle.main.url(forResource: "iso-countries", withExtension: "json") else {
        return countries
    }
    do {
        let data = try Data(contentsOf: url)
        if let dictionaries = try JSONSerialization.jsonObject(with: data, options: []) as? [[AnyHashable: Any]] {
            for countryDictionary in dictionaries {
                if let key = countryDictionary["alpha-2"] as? String {
                    countries[key] = countryDictionary
                }
            }
            return countries
        }
        return countries
    } catch {
        return countries
    }

}
}

您可以考虑将其设为Singleton类,因此这些国家/地区只需加载一次。我没有,因为我不想让这些国家保持在记忆中(在我的应用程序中,这只是在启动期间只需要一次)。


1
投票

这是非常基本的,但我写了这个课来满足我的需求:

class CountryUtilities {
  
  class func getAlphaThreeCode(byAlpha2Code alpha2code: String) -> String? {
    return countries[alpha2code]
  }
  
  private static let countries: [String: String] = [
    "AF": "AFG",
    "AX": "ALA",
    "AL": "ALB",
    "DZ": "DZA",
    "AS": "ASM",
    "AD": "AND",
    "AO": "AGO",
    "AI": "AIA",
    "AQ": "ATA",
    "AG": "ATG",
    "AR": "ARG",
    "AM": "ARM",
    "AW": "ABW",
    "AU": "AUS",
    "AT": "AUT",
    "AZ": "AZE",
    "BS": "BHS",
    "BH": "BHR",
    "BD": "BGD",
    "BB": "BRB",
    "BY": "BLR",
    "BE": "BEL",
    "BZ": "BLZ",
    "BJ": "BEN",
    "BM": "BMU",
    "BT": "BTN",
    "BO": "BOL",
    "BQ": "BES",
    "BA": "BIH",
    "BW": "BWA",
    "BV": "BVT",
    "BR": "BRA",
    "IO": "IOT",
    "BN": "BRN",
    "BG": "BGR",
    "BF": "BFA",
    "BI": "BDI",
    "CV": "CPV",
    "KH": "KHM",
    "CM": "CMR",
    "CA": "CAN",
    "KY": "CYM",
    "CF": "CAF",
    "TD": "TCD",
    "CL": "CHL",
    "CN": "CHN",
    "CX": "CXR",
    "CC": "CCK",
    "CO": "COL",
    "KM": "COM",
    "CG": "COG",
    "CD": "COD",
    "CK": "COK",
    "CR": "CRI",
    "CI": "CIV",
    "HR": "HRV",
    "CU": "CUB",
    "CW": "CUW",
    "CY": "CYP",
    "CZ": "CZE",
    "DK": "DNK",
    "DJ": "DJI",
    "DM": "DMA",
    "DO": "DOM",
    "EC": "ECU",
    "EG": "EGY",
    "SV": "SLV",
    "GQ": "GNQ",
    "ER": "ERI",
    "EE": "EST",
    "SZ": "SWZ",
    "ET": "ETH",
    "FK": "FLK",
    "FO": "FRO",
    "FJ": "FJI",
    "FI": "FIN",
    "FR": "FRA",
    "GF": "GUF",
    "PF": "PYF",
    "TF": "ATF",
    "GA": "GAB",
    "GM": "GMB",
    "GE": "GEO",
    "DE": "DEU",
    "GH": "GHA",
    "GI": "GIB",
    "GR": "GRC",
    "GL": "GRL",
    "GD": "GRD",
    "GP": "GLP",
    "GU": "GUM",
    "GT": "GTM",
    "GG": "GGY",
    "GN": "GIN",
    "GW": "GNB",
    "GY": "GUY",
    "HT": "HTI",
    "HM": "HMD",
    "VA": "VAT",
    "HN": "HND",
    "HK": "HKG",
    "HU": "HUN",
    "IS": "ISL",
    "IN": "IND",
    "ID": "IDN",
    "IR": "IRN",
    "IQ": "IRQ",
    "IE": "IRL",
    "IM": "IMN",
    "IL": "ISR",
    "IT": "ITA",
    "JM": "JAM",
    "JP": "JPN",
    "JE": "JEY",
    "JO": "JOR",
    "KZ": "KAZ",
    "KE": "KEN",
    "KI": "KIR",
    "KP": "PRK",
    "KR": "KOR",
    "KW": "KWT",
    "KG": "KGZ",
    "LA": "LAO",
    "LV": "LVA",
    "LB": "LBN",
    "LS": "LSO",
    "LR": "LBR",
    "LY": "LBY",
    "LI": "LIE",
    "LT": "LTU",
    "LU": "LUX",
    "MO": "MAC",
    "MK": "MKD",
    "MG": "MDG",
    "MW": "MWI",
    "MY": "MYS",
    "MV": "MDV",
    "ML": "MLI",
    "MT": "MLT",
    "MH": "MHL",
    "MQ": "MTQ",
    "MR": "MRT",
    "MU": "MUS",
    "YT": "MYT",
    "MX": "MEX",
    "FM": "FSM",
    "MD": "MDA",
    "MC": "MCO",
    "MN": "MNG",
    "ME": "MNE",
    "MS": "MSR",
    "MA": "MAR",
    "MZ": "MOZ",
    "MM": "MMR",
    "NA": "NAM",
    "NR": "NRU",
    "NP": "NPL",
    "NL": "NLD",
    "NC": "NCL",
    "NZ": "NZL",
    "NI": "NIC",
    "NE": "NER",
    "NG": "NGA",
    "NU": "NIU",
    "NF": "NFK",
    "MP": "MNP",
    "NO": "NOR",
    "OM": "OMN",
    "PK": "PAK",
    "PW": "PLW",
    "PS": "PSE",
    "PA": "PAN",
    "PG": "PNG",
    "PY": "PRY",
    "PE": "PER",
    "PH": "PHL",
    "PN": "PCN",
    "PL": "POL",
    "PT": "PRT",
    "PR": "PRI",
    "QA": "QAT",
    "RE": "REU",
    "RO": "ROU",
    "RU": "RUS",
    "RW": "RWA",
    "BL": "BLM",
    "SH": "SHN",
    "KN": "KNA",
    "LC": "LCA",
    "MF": "MAF",
    "PM": "SPM",
    "VC": "VCT",
    "WS": "WSM",
    "SM": "SMR",
    "ST": "STP",
    "SA": "SAU",
    "SN": "SEN",
    "RS": "SRB",
    "SC": "SYC",
    "SL": "SLE",
    "SG": "SGP",
    "SX": "SXM",
    "SK": "SVK",
    "SI": "SVN",
    "SB": "SLB",
    "SO": "SOM",
    "ZA": "ZAF",
    "GS": "SGS",
    "SS": "SSD",
    "ES": "ESP",
    "LK": "LKA",
    "SD": "SDN",
    "SR": "SUR",
    "SJ": "SJM",
    "SE": "SWE",
    "CH": "CHE",
    "SY": "SYR",
    "TW": "TWN",
    "TJ": "TJK",
    "TZ": "TZA",
    "TH": "THA",
    "TL": "TLS",
    "TG": "TGO",
    "TK": "TKL",
    "TO": "TON",
    "TT": "TTO",
    "TN": "TUN",
    "TR": "TUR",
    "TM": "TKM",
    "TC": "TCA",
    "TV": "TUV",
    "UG": "UGA",
    "UA": "UKR",
    "AE": "ARE",
    "GB": "GBR",
    "US": "USA",
    "UM": "UMI",
    "UY": "URY",
    "UZ": "UZB",
    "VU": "VUT",
    "VE": "VEN",
    "VN": "VNM",
    "VG": "VGB",
    "VI": "VIR",
    "WF": "WLF",
    "EH": "ESH",
    "YE": "YEM",
    "ZM": "ZMB",
    "ZW": "ZWE"
    ]
}

-1
投票

在Swift中,它就像这样简单:

let currentLocale = NSLocale.current as? NSLocale
let code = currentLocale?.iso639_2LanguageCode()
© www.soinside.com 2019 - 2024. All rights reserved.