2011-06-22 11 views
4

私は、RESTサービスにアクセスするために3文字(ISO 639-2)の言語コードが必要なプロジェクトに取り組んでいます。 [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]を使用して現在の言語設定を使用したいと考えていました。残念なことに、このメソッドは2文字(ISO 639-1)の言語コードを返すことを好みます。 NSLocaleに更新されたコードを返させる方法はありますか?または2文字の言語コードを3文字の言語コードに変換するために使用できる別の方法がありますか?iOSでは常にISO 639-2(3文字)の言語コードを取得しますか?

答えて

5

いいえ、できません。手動で変換する必要があります。これはあまり簡単ではありません。

+2

、私はそれは、単純なマッピングテーブルを使用するよりも、それ以上に複雑になりますどのように表示されません。 –

+0

は、テーブルのサイズと入力データのフォーマットに依存します.btwはそれほどではありません。639-1 – sorin

+0

Appleのマニュアルを正しく理解すると、639-1コードが存在しない場合は639-2コードが返されます現在の言語。私はここでコードの完全なリストを見つけました:http://www.loc.gov/standards/iso639-2/php/code_list.phpルックアップテーブルは確かに可能なようですが、それは面倒なことであり、多くの文字列の比較は高価である。私は本当に彼らがサーバー側でそれをやりたいと思う。 –

8

Githubで私のコードをチェックし、NSLocaleのカテゴリでISO 639.2言語コードを取得してください。

[[NSLocale currentLocale] ISO639_2LanguageIdentifier]; 
0

ISO 3166-1の国コードについても同様の変換が必要でした。 iOSは私に2文字のコードをくれましたが、3文字のコードが必要でした。ここに私の解決策がある:

  1. ISOの国を取得するためのリソースファイル/ APIを見つける。 (例:https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes/tree/master/all
  2. 2文字コードを検索し、一致する3文字コードに変換します。

あなたはこのシングルトンクラスすることを検討することができ、その国が唯一持っているいくつかのサンプルコード(与えられたあなたは上記のルークス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 
    } 

} 
} 

一度ロードする。私は国を覚えておきたくないので(私のアプリではこれは起動時に一度だけ必要であった)、私はしなかった。

0

スウィフトでは、それはこのような単純なのです。このような変換が存在する場合

let currentLocale = NSLocale.current as? NSLocale 
let code = currentLocale?.iso639_2LanguageCode() 
関連する問題