目次
環境
- Xcode12.1
- Swift 5.3
- シミュレータ: iOS 14.1
取得するコード
let language = NSLocale.preferredLanguages.first?.components(separatedBy: "-").first
print("🐱: \(String(describing: language))") // 🐱: Optional("ja")
取得できるのは ja や en などのアルファベット2文字です。
これは言語の国際規格 ISO 639-1 で定義されている言語コードです。
メジャーではない言語に関しては ISO 639-2 で返却される可能性もありますがそれは調べていません😣
が、メジャーな言語は ISO 639-1 でカバーされているので、言語の専門アプリでもない限りそれで事足りるかと思います。
ISO 639 については、本ブログで以前書いた 言語の国際規格: ISO 639 について も参考になるかもしれません🙌
NSLocale.preferredLanguages の返り値についてもう少し詳しく
記事タイトルは上の項目でさくっと回収できましたが、返り値についてもう少しまとめておきます。
設定の優先順に複数の値を返す
NSLocale.preferredLanguages を呼び出すと以下のような String の配列が返ってきます。
["ja-JP", "en-JP", "en-GB", "es-ES"]
このときの端末の設定は以下のような状態です。

言語を4つ設定しており、それが優先度順に返ってきている形です。
一つ一つの値について
配列の1つ1つは 言語コード - 地域コード という形式になっています。
参考: Apple の公式ドキュメント Language and Locale IDs
言語コードは先述の通り ISO 639 に、地域コードは国名の国際規格 ISO 3166-1 alpha-2 に沿っているようです。
(ISO 3166 に関しても本ブログの 国名の国際規格: ISO 3166 について に概要をまとめたので、よろしければ)
以下の例で言うと、
["ja-JP", "en-JP", "en-GB", "es-ES"]
ja-JP は言語が日本語で地域が日本となります。
en-JP は言語が英語で地域が日本となります。
これは上図の通り、「地域」を日本に設定しているからです。
en-GB は言語が英語で地域がイギリスとなります。
es-ES は言語がスペイン語で地域がスペインとなります。
地域が日本になっていないのはなぜなのか🤔
それは↓
端末の設定との関係について
以下のように末尾に (国名) と表示している言語は、地域コードをその国名で返すという仕様のようです。

つまり、英語のイギリス方言は地域コードがイギリス(GB)になり、
スペイン語のスペイン方言は地域コードがスペイン(ES)になります。
言語と地域が被っていてやや分かりづらいので更に言うと、英語のオーストラリア方言は「en-AU」のようになります。
一方、以下のように国名が表示されていない言語は、端末設定の「地域」を地域コードとして採用するようです。

「地域」設定の存在感は実はやや薄めかも。。🤔
端末の「地域」設定について
ちなみにこの「地域」の設定は、日付表記などをその地域の慣習に合わせた形式で表現するために使用されるようです。
例えば日本だと日付は「年月日」ですが、アメリカだと「月日年」の順になる、というようなことです。
参考: Apple の公式ドキュメント Reviewing Language and Region Settings
しかし、シミュレータのカレンダーアプリで確認したところ、
en-JP の場合でも日付は「月日年」形式になっていて、日本の「年月日」形式ではありませんでした。
このあたりを実装する際は注意が必要かもしれません😔
最後に
NSLocale.preferredLanguages の理解が深まった感があります。
以上です。お疲れ様でした!
