[iOS] Swift で端末の使用言語を取得する

環境

  1. Xcode12.1
  2. Swift 5.3
  3. シミュレータ: iOS 14.1

取得するコード

let language = NSLocale.preferredLanguages.first?.components(separatedBy: "-").first

print("🐱: \(String(describing: language))") // 🐱: Optional("ja")

取得できるのは jaen などのアルファベット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 の理解が深まった感があります。

以上です。お疲れ様でした!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。