Localeは、言語と地域を組み合わせたロケール情報を保持する構造体です。
日付や時間、金額、数値等の書式の決定に影響します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.2
【iOS】13.4
【macOS】Catalina バージョン 10.15.4
Locale識別子
Locale構造体は言語と地域に関するいくつかのプロパティを持ちますが、その中で最も重要なのがロケール識別子(Locale.identifier)です。
Locale識別子は、言語(Language)と地域(Region)を組み合わせたString型の文字列です。
en_US(英語+米国地域)
ja_JP(日本語+日本地域)
en_JP(英語+日本地域)
Fr_FR(フランス語+フランス地域)
「言語」+「地域」の基本形だけでなく、「言語」のみや、「字体」「方言」などが付く例外もあります。
Localeと書式の関係
Localeが決まると、日付・時間の表記、小数点、桁区切り文字、通貨記号などの書式が自動的に決まります。
いくつか例を示します。
en_US_POSIX
言語や地域による書式は、現時点の文化や習慣によって定められていますが、将来変更される可能性があります。
en_US_POSIX はAppleにより将来的に書式が変わらないと保証されている特別なLocale識別子です。
現時点ではen_USと書式が同じですが、将来en_USの書式が変わったとしても、en_US_POSIXは変わりません。
また、このLocale識別子を使うと、端末のカレンダー設定を無視して常に西暦として処理してくれるので、和暦と西暦の違いで年の解釈が変わりません。
ユーザーの端末設定により処理に影響を及ぼしたくない場合に有効です。
iPhone端末でのロケール情報変更方法
iPhone端末のロケール情報は、「設定」→「一般」→「言語と地域」で確認できます。
「iPhoneの使用言語」と「地域」の変更で端末のロケール情報を変更可能です。
現在のLocale情報の取得
現在のLocale構造体およびLocale識別子の取得方法は次の通りです。
1 2 3 4 5 6 7 8 9 |
/// 現在のLocale構造体の取得 let locale = Locale.current /// Locale識別子の取得 let localeId = locale.identifier print(localeId) // ex: en_US |
注意点として、ここで取得したLocale情報は必ずしも端末のロケール情報とイコールではありません。
地域(Region)は端末の情報が取得されますが、言語(Language)についてはそのアプリが対応しているローカライズ言語と、端末の「使用する言語の優先順位」の中で一致する最上位の言語が採用される仕組みです。
Xcodeで新規作成したプロジェクトでは、通常ローカライズ言語に登録されているのはEnglishのみですので、端末のロケール設定を「日本語」+「日本地域」にしても、アプリ側で取得できるLocale情報は”en_JP”となります。
アプリのローカライズ言語に言語を追加する方法
対象のアプリをXcodeで開き、図に示した順番でクリックしていくと、そのアプリのローカライズ言語(Localizations)が参照できます。
④で+(プラス)をクリックして表示されるリストの中から、追加したい言語を選択します。
この状態でコンパイルしたアプリを、ロケール設定「日本語」+「日本地域」に設定した端末で動かすと、取得されるLocale設定情報が”ja_JP”となります。
Locale構造体の生成
Locale構造体は、イニシャライザで特定のロケール識別子を指定して生成します。
生成したLocale構造体は、アプリ上の書式決定の為の使用を目的としており、端末自体のLocale設定は変更できません。
1 2 3 4 5 6 |
/// ロケール識別子を指定して生成 let locale = Locale(identifier: "ja_JP") print(locale) // ja_JP (fixed) |
なお、次の方法で、指定可能な全てのLocale識別子一覧を取得可能です。
1 2 3 4 5 6 |
/// 使用可能なLocale識別子一覧の取得 let identifiers = Locale.availableIdentifiers print(identifiers) // ["eu", "hr_BA", "en_CM", "en_BI" ・・・] |