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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 个字母的代码。这是我的解决方案:

    查找资源文件/API 以获取 ISO 国家/地区。 (例如这里:https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes/tree/master/all) 查找 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()

【讨论】:

以上是关于总是在 iOS 中获得 ISO 639-2(三字符)语言代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 在 iOS 上获取 ISO 639-2 国家代码

带有PHP数组名称的语言代码ISO 2字母(ISO 639-1)和3字母(ISO 639-2)

三字符搜索不起作用[重复]

VC MFC下 定义 CString str 怎样获取str的第二个和第三字符(用啥函数)?

今日知识回顾: 一运行程序的三个核心硬件及计算机系统 二Python解释器运行一个.py文件步骤 三字符编码 四文件处理

IFC标准参考文献(Bibliography)