こないだのアプリ開発中に、日本語と英語両方とも対応したアプリがiOS8でうまく思う通りに表示されない問題が起きました。

問題の現象

前の利用者にシステム言語を中国語に設定されたiOS8の社内テスト端末で、
作っているアプリを開いたら、日本語が表示されてしまいました。

「CFBundleDevelopmentRegion」を英語に設定しているので、
システム言語が中国語になっているユーザーに英語が表示されるはずだと思っているのに、何故か日本語が表示されています。

[table id=5 /]

想定表示:英語
実際表示:日本語

調査結果

諸々調査と実験した結果、原因を判明しました。

結論から言うと、iOS8から端末の「言語と地域」設定で
「使用する言語の優先順序」という項目が追加されました。

システムの言語設定がアプリの対応言語範囲に入っていない場合、「使用する言語の優先順序」が第一候補として適用されました。「使用する言語の優先順序」になければ、第2候補の「CFBundleDevelopmentRegion」設定が応用されます。

IMG_0265

調査中に、下記の2つの罠に引っかかれてしまいました。
記事を読んでいる方も気をつけてください。

・言語を追加、削除したら、プロジェクトを一度cleanしないと反映されない
・実機ではいけるのに、シミュレータでCFBundleDevelopmentRegionの設定が認識されない。

iOS7

そして実験からiOS7でもシステム言語とアプリの対応言語が合わない場合、
CFBundleDevelopmentRegionが第一候補ではないことを判明しました。

iOS7でもしシステム言語を変更したことがあれば、設定していたシステム言語から、時間の新しい順でアプリの対応言語と比較され、一致する言語が見つけられたら、その言語が表示されることになります。使っていた言語の中に、アプリの対応言語と一致する結果がなかったら、CFBundleDevelopmentRegionが適用されます。

まとめ

最後、複数の言語を対応したアプリの言語適用順をOSバージョン別でまとめました。

[table id=6 /]
※ 「CFDRegion」=「CFBundleDevelopmentRegion」