やりたいこと
UnityでLocalizationパッケージを使って多国語を行おうとしました。
基本的に以下のページを参考にさせていただいてできたのですが、迷ったこと、うまくいかなかったことをまとめておきます。

迷ったこと
LegacyのTextでも使える?
参考にさせていただいた記事ではText – TextMeshProに対してLocalizationを適応していました。
LegacyのTextに対しても使えるか迷いました。
結果
問題なく使用できました。Text – TextMeshProと同様に右上の三点のアイコンをクリックすると”Localize”が表示されます。
”Localize”をクリックするとLocalize String Event コンポーネントが追加され設定が行えます。

困ったこと
Localize String Event のString Referenceが設定できない。
Localize String Event のString Referenceをクリックして対応するキーを設定しようとしたのですが一覧に出てきませんでした。(もちろんテーブルに追加した後です)

解決策
上の検索窓のst:の後に一文字でもキーに含まれる文字を入力すると一覧に表示されます。

LocalizationSettings.AvailableLocales.GetLocaleがnullを返してくる。
LocalizationSettings.AvailableLocales.GetLocaleの引数に追加済みのidを渡してもnullが返ってくる(ことがある)。
解決策
LocalizationSettings.AvailableLocales.GetLocaleを呼ぶ前に、await LocalizationSettings.InitializationOperation.Task;を呼ぶ。
どうもアプリの起動直後は準備ができていないようです。LocalizationSettings.InitializationOperation.Taskが完了するまで待ちます。
任意のキーの翻訳された文字列を取得
メッセージウインドウなど、動的に文字列を変更する必要があるときは取得する必要があります。
解決策
以下のコードで取得できます。table,keyともに文字列で大丈夫です。
string s = LocalizationSettings.StringDatabase.GetLocalizedString(table, key);
任意の言語の任意のキーの翻訳された文字列を取得
さらに特殊な状況では特定の言語の文字列を取得する必要があります。
解決策
以下のコードで取得できます。table,keyともに文字列で大丈夫です。
lang_idは”en”や”ja”などの2文字の言語IDです。
var locale = LocalizationSettings.AvailableLocales.GetLocale(lang_id);
string s = LocalizationSettings.StringDatabase.GetLocalizedString(table, key, locale);
GetLocalizedStringの返り値に関して
GetLocalizedStringに不正(指定のテーブルに指定のキーがない)場合、以下のような返り値が返ってきてエラーなのかよくわかりません。(GUIがテーブル名、aaaがキー)
No translation found for 'aaa' in GUI
以下の設定を変更することで、返り値が空になりエラーチェックがしやすくなります。
”Edi”t → ”Project Settings…”
Localization(左側)→”String Database”内の”Missing Translation State”を”Nothing”か”Print Warning”にすると不正のキーをしていると空の文字列が返ってくるようになります。
(前回の設定値によって意図しない値になることがあるので設定後、設定された値を確認してください。)


コメント