Table of Contents
Unity で開発したアプリの多言語化対応(ローカライズ)を行うためのパッケージに Localization があります。
現時点での最新バージョンは 0.1.0 であり、まだ正式版ではなくプレビューバージョンとなっています。そのためか、ドキュメント通りに実装を行っても予期せぬエラーが出る場合があるようです。また、このパッケージは Addressable に依存しているため、それに関連するエラーも発生することがあります。
筆者はiOSアプリの多言語化を行った際に複数のエラーに遭遇したため、それらを解決するために行った操作の手順について紹介します。
AddressableGroupのビルド時にエラー
Unityのエディタ上ではなく実機でローカライズを有効にするためには、多言語化した文字列やアセットを含むテーブルを Addressable によってビルドする必要があります。
これを行った際、以下のエラーが発生してビルドが中止されてしまう現象が起こりました。
InvalidCastException: Specified cast is not valid. UnityEditor.AddressableAssets.Build.DataBuilders.BuildScriptPackedMode.DoBuild[TResult] ...
解決方法:Addressableのバージョンを上げる
Addressable のバージョンを 1.16.6 から最新版の 1.16.16 に上げてビルドし直したところ、エラーは発生しなくなりました。依存しているパッケージのバージョンを最新のものにしておくと良いと思われます。
実機で対応した言語が選択されない不具合
上記ビルドの問題を解決後、実機にアプリをインストールしたのですが、何度やっても実機上の言語設定が反映されない不具合に遭遇しました。
Addressable でビルドする前に”Clean All“を行ったり、iOSプロジェクト出力の際に Replace でプロジェクトフォルダを完全に置き換えたりしましたが、結果は変わりませんでした。
Xcodeのコンソール上には以下のエラーが出力されていました。
ArgumentNullException: Value cannot be null. Parameter name: locale
Exception encountered in operation Resource(localization-locales_assets_all.bundle) , status=Failed ...
どうやら Locale が見つからず、必要なファイルも発見できない状態のようでした。
解決方法:Addressableの対象となっているアセットのバンドル命名法を変更する
多言語化に必要な”Addressable Asset Group”には Localization-Locales や、自分で作成した言語テーブルのアセットグループなどがあります。
これらを選択し、インスペクターで”Advanced Options”のメニューを表示すると、下の方に “Bundle Naming” という項目があります。
多言語化に関わる全てのファイルにおいて、この項目を Filename から “Append Hash to Filename“に変更したところ、無事に実機でも言語が変化するようになりました。
ちなみに Localization-Locales のみバンドル命名法を変更した場合 Locale が見つからない不具合は解決しましたが、結局 localization-locales_assets_all.bundle が見つからないエラーが残ってしまいました。
多言語化に関わるファイル全てで”Bundle Naming“を変更すると良いみたいです。これはどうやら Addressable の不具合のようです。
以上の対処を行ったところ、実機でも多言語表示することができました。
また、iOSプロジェクトでビルドした際、時々、何故か言語ファイルが読み込めない不具合が出ることがありますが、ビルドし直すと元に戻ったりする現象に遭遇していますが、これに関しては調査中です。