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からは注意する必要ある。