tofucodes diary

にほんごのほう

iOS 11からNSLocaleの仕様が変更されたらしい

使用言語の設定が日本語のデバイスでしか利用できないサービスで、iOS 11にアップデートしたら動作しなくなったという問い合わせが届いたので調べてみたら、どうやらiOS 11からNSLocaleの仕様が変更されたらしいことが分かった。

NSLocale.current.identifier

iOS 10以前はjp_JPで取得されていたものが、iOS 11ではen_JPで返ってくるケースがある。

ググってもあんまり盛り上がってないのがちょっと不思議なんだが、唯一見つけた内容がこちら。

抜粋すると

  • iOS 10以前は[NSLocale currentLocale]はアプリのローカライズは関係なく端末の言語設定を直接参照していた
  • iOS 11において[NSLocale currentLocale]はアプリのローカライズしてる言語しか返さなくなった
  • もしアプリが英語しかローカライズしてない場合(デフォルト)は、端末でどんな言語を設定してもcurrentLocaleは英語しか返さない

実際に手元で検証した結果もまとめてみた。

iPhoneの使用言語設定 アプリのローカライズ NSLocaleLanguageCode
1. 日本語, 2. 英語 English en
1. 日本語, 2. 英語 English, Japanese ja
1. 日本語, 2. 中国語 English en
1. 日本語, 2. 中国語 English, Japanese ja
1. 日本語 English ja

stackoverflowで指摘されてる通りの結果になったことが分かる。 公式のリンクはまだ見つかってないようだが、検証結果から見てもどうやら本当ぽい。
実際の検証結果から見ると、iPhoneの使用言語が1つしか選択されてない場合はローカライズされてなくてもその言語が返ってくるぽい。紛らわしい。

つまり端末の設定言語をロジックで利用するようなアプリは、ロジックの対象にしてる言語がアプリでローカライズされているかiOS 11からは注意する必要ある。