#はじめに
Localeの言語関連の備忘メモを残します。
Locale.current.identifier
値として、"ja_JP"のような書式の値が返ってきます。ja(日本語)_JP(日本で使われている) という意味。(ちなみに、current.descriptionだと末尾に (current)
がつく。)
Localeのプロパティに.languageCodeと.regionCodeがあり、これを_で結合すれば多くの場合にlocaleの識別子として使えます。
ただし、.scriptCode(例えば、繁体字の別)の情報がある場合は、.languageCodeの後ろに"-\(locale.scriptCode)"
を挿入する必要があります。
香港繁体字
設定言語を使いたい場合、Locale.current.identifierでは不十分。香港繁体字の場合、"Zh-Hant-Hk_CN"となるべきところ、"Zh-Hant_CN"としか取得できません。繁体字までの情報しかなくて、例えば台湾繁体字と区別できません。
そこで、Locale.current.identifierではなく、Locale.prefferedLanguages.firstを使います。"ZH-HANT-HK"が返ってきます。
これに、"_\(Locale.regionCode)"
をつけて、Locale(identifier: )にそのまま入れると、適切に変換してくれて、対応するlocaleを取得できます。(prefferedLanguages.firstの値はアッパーケースですが、Locale(identifier:)が内部変換してくれるようです。)
グレゴリアン以外のカレンダー(例えば、和暦)を設定している場合
Locale.identifier は、ja_JP@calendar=japanese
のように、カレンダー情報が添付される。グレゴアンカレンダにキャストしたい場合、Locale(identifier: "ja_JP")
とすればよい。前掲の方法で識別子を生成すれば、設定にもとづいて西暦表示にキャストされたlocaleを取得できます。キャストしたlocaleをdateFormat(fromTemplate:options:locale:)などで使います。
locale.calendarを直接セットできればシンプルなのですが、getしか用意されていません。
iOS 11+
iOS 11からLocale.currentの値は、アプリがローカライズ対応している言語に制約されるようになりました。それ以外は、設定値がそのまま返ってきます。
前掲のprefferedLanguages.firstの値は、仕様変更がないようで、設定値がそのまま返ってきます。
#以上です
もっと良い方法をご存知の方がいたら教えていただきたいです。