MILLEN BOX 2

個人iOSアプリ開発者hollymotoによる勉強の記録。時々雑記。

Locale.currentで取得されるlocaleは現在iOS端末に設定されている「言語+地域」ではない!

こんにちは。hollymoto@anthrgrnwrld です。
これの続きっぽい感じです。

www.millenbox2.com

私は日本人で日本在住なのでiPhoneの設定言語は勿論「言語 : 日本語」「地域 : 日本」にしています。
しかしテストアプリでLocale.currentをJ実行して取得したlocale構造体の中身を見ると"en_JP"(つまり地域は日本だが言語は英語)になってしまう、、、という問題に打ち当たりました。

何でやねん。

目次

1. 言語設定が日本語でもLocale構造体が"en_JP"となる理由

ググったところ、この記事に回答が。

qiita.com

記事の中盤に「【重要】アプリ内コードから Locale.current で取得されるロケールは、いまiOS端末に設定されている「言語+地域」ではない!」との記載があります(本記事のタイトルはこれのちょい変です。。。すいません)。

え?そうなの??

記事の中を確認いただけば分かりますが、
『そのアプリが対応しているローカライズ言語(Localizable.stringsファイルの存在)のなかから、iOS端末で『使用する言語の優先順位』で設定された言語のはじめから該当する言語をさがして一致したもの、それを「言語」』とするようなんです(またコピペです。すいません)。

なるほど。。。つまりテストアプリは全くローカライズがされていなかった為、「言語 : 英語」となった訳ですね。

2. ちなみに言語設定を取得したい場合はどうしよう

Locale.prefferedLanguages を使えばいいみたい(参考)。

let currentLanguages = Locale.preferredLanguages    // これは追加されている全ての言語と現在の地域の組み合わせのLocale等 ex) ["ja-JP", "es-JP", "en-JP"]
let firstLanguage = Locale.preferredLanguages.first    // firstで指定すれば一番優先度が高い言語(=つまり言語設定)と現在の地域の組み合わせのLocale文言(String型)が取得可能

注意しなければならないのは、この方法で取得したものはLocale型ではなくString型であることでしょうか。つまりそのままDateFormatter.localeなどにいれることは出来ません。

3. 所感

前にLocaleについて書いた記事で「もうLocaleで迷うことはない!」って思ってましたが、結構早々に迷子になってしまい泣きそうです。やはりLocaleは奥深いです。