【问题标题】:Always get ISO 639-2 (three character) language code in iOS?总是在 iOS 中获得 ISO 639-2(三字符)语言代码?
【发布时间】:2011-09-20 19:02:22
【问题描述】:

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

【问题讨论】:

    标签: ios localization


    【解决方案1】:

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

    [[NSLocale currentLocale] ISO639_2LanguageIdentifier];
    

    【讨论】:

      【解决方案2】:

      不,你不能那样做。您必须手动转换它们,这不是很简单。

      【讨论】:

      • 如果存在这样的转换,我看不出它会比使用简单的映射表更复杂。
      • 取决于表格的大小和输入数据的格式,顺便说一句,这不是 639-1
      • 如果我正确理解 Apple 的文档,如果当前语言不存在 639-1 代码,它将返回 639-2 代码。我在这里找到了完整的代码列表:loc.gov/standards/iso639-2/php/code_list.php 虽然查找表似乎确实可行,但它会很乏味,而且许多字符串比较会很昂贵。我真的希望他们能在服务器端做。
      【解决方案3】:

      这真的很基础,但我写了这个类来满足我的需要:

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

      【讨论】:

        【解决方案4】:

        我需要对 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 类,这样国家/地区只需加载一次。我没有,因为我不想将国家/地区保留在内存中(在我的应用程序中,这仅在启动期间需要一次)。

        【讨论】:

          【解决方案5】:

          在 Swift 中就这么简单:

          let currentLocale = NSLocale.current as? NSLocale
          let code = currentLocale?.iso639_2LanguageCode()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-06
            • 1970-01-01
            • 2015-06-20
            • 2012-06-15
            • 2019-01-03
            • 1970-01-01
            • 1970-01-01
            • 2013-05-03
            相关资源
            最近更新 更多