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

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

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

在Github上查看我的代码,获取ISO 639.2语言代码。 这是如此简单:

 [[NSLocale currentLocale] ISO639_2LanguageIdentifier]; 

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

  1. find一个资源文件/ 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类,所以只需要加载一次。 我没有,因为我不想保持国家记忆(在我的应用程序,这只是在启动时需要一次)。

在Swift中就像这样简单:

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