iOS13でアプリ名のローカライズがおかしくなる問題

日本とと英語に対応したアプリを作成していて開発メンバー向けに配布したところ「iPhoneのホーム画面に表示されるアプリ名を正式版にして欲しい」と連絡が来た。
そのとき実際にはアプリ名を設定済みでSimulatorでも検証機のiPhone7(iOS12.4.1)でもアプリ名の表示を確認していた。

iPhoneのホーム画面に表示されるアプリ名のローカライズ

  1. InfoPlist.string という Strings File を作成

XcodeProjectのLocalizations設定

デフォルトのEnglishに加えて、+ からJapaneseを追加。
このときローカライズ対応するファイルを指定しないと追加されないので、あらかじめ InfoPlist.string を作成しておく。
必要に応じて Use Base Internationalization をチェックするとBaseも追加される。
ローカライズに対応したファイルはXocde上では1つのファイルが折りたたまれたように表示されるが
実体は言語毎にディレクトリが作成されて内包されている。

en.lproj/InfoPlist.strings
ja.lproj/InfoPlist.strings

InfoPlist.stringsにアプリ名を設定する

言語毎にCFBundleDisplayName を指定する。

"CFBundleDisplayName" = "ローカライズ";


以上で通常のアプリ名ローカライズ対応が可能となる。

iOS13でアプリ名のローカライズがおかしくなる問題

問題のプロジェクトは元々Objective-Cで作成されている古いプロジェクトで、今回改修していて再現した問題。

ローカライズの現状

プロジェクトのローカライズ設定は3つ設定済み

  • Base
  • English - Development Language
  • Japanese

InfoPlist.strings は English とJapaneseのみ設定している。

再現環境

  • iOS13系でiPhoneの使用言語が日本語の端末

iOS12系では再現しなかった。

回避策

https://twitter.com/limura/status/1175619714355097601

このツイートのスレッドを見ると解決策が書かれていて、日本語のローカライズをもう一つ追加で解決したとのことなのでマネする。
言語一覧のOthersから Japanese(ja-JP) を追加。Xcodeでは InfoPlist.strings (Japanese (Japan)) と表示される。

この対応で問題解決する事が確認できました。
CFBundleDisplayName ではない通常のローカライズ NSLocalizedString の方は InfoPlist.strings (Japanese (Japan)) ではなく従来通り InfoPlist.strings (Japanese) でローカライズできていたので、iOS13のホーム画面の実装の問題ということでしょうか。

iOS11か12あたりでローカライズのレスポンスも ja_JP の他にも en_JP のような値が取得できるようになっていた気がするのでその関係かもしれないと思いました。

この件はこれにて。