8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

言語設定を取得したい場合はLocale.prefferedLanguagesを使う

Last updated at Posted at 2018-05-24

#はじめに
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の値は、仕様変更がないようで、設定値がそのまま返ってきます。

#以上です
もっと良い方法をご存知の方がいたら教えていただきたいです。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?