はじめに
今回は多言語対応を簡単に行える公式パッケージLocalizationパッケージについて書いていきたいと思います。
概要
アプリケーションのローカライズを支援してくれるパッケージになります。
Use the Localization package to configure localization settings for your application.
| 機能 | 意味 |
|---|---|
| String localization | Locale(言語と地域)に応じて表示する文字を設定する。 |
| Asset localization | Localeに応じて、異なるアセット(ex. テクスチャ・モデル・オーディオファイル)を設定する。 |
| Pseudo-localization | 翻訳を追加する前に、プロジェクトがどのようにローカリゼーション対応するかテストする。 |
| - | ローカリゼーションデータをXLIFF、CSV、Google Sheetsにインポートおよびエクスポートする。 |
環境
Unity 2020.3.29f1
Localization v1.2.1
インストール方法
Unity2021.2以上
Package Managerに表示されているので、インストールを行います。
Unity2021.2未満
Package Managerの“Add package from git URL”からcom.unity.localizationを入力します。

Localizationの初期設定
Localization Settingsの生成
メニューバーからEdit -> Project Settingsを開きます。

Localizationというタブができているので開き、Createボタンを押すことで、Localizationの設定アセットが生成されます。

Localeの生成
設定アセットが作成できたら、まずはLocale(言語と地域を表すもの)を設定してあげます。
Local Generatorウィンドウを開きます。

利用したいLocaleにチェックを入れ、Generate Localesボタンを選択することでアセットが生成されます。

デフォルトのLocaleを設定
Locale Selectorというアプリケーションの初回起動時やアクティブなLocaleが選択されていない場合に、Unityが使用すべきLocaleを決定する機能があるのですが、そこにデフォルトで利用するLocaleを設定してあげます。
Specific Locale Selectorに任意の言語を設定Project Locale Identifierに任意の言語を設定

少し補足しておくと、Locale Selectorsに設定されたLocale Selectorを上から順番に実行していき、見つかったものを利用する仕組みになっています。

Asset Localization
アセットをローカライズにするにはAsset Tablesを用いる必要があります。
Asset Tablesを生成する
メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げます。
New Table Collectionタブを選択、TypeをAsset Table Collectionにし、任意の名前をつけてCreateボタンを押してください。

無事生成されるとEdit Table Collectionタブから以下のような編集画面を見ることができます。

Spriteのローカライズ
公式ドキュメントのサンプルではLocalization Scene Controlsを利用して自動で設定していましたが、個人的に以下の手順を用いた方が仕組みが理解しやすいと思うので別の手法でやっていきます。
メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げ、Edit Table Collectionタブを開きます。(Asset Localizationのときと同様)

対象のAsset Tableであることを確認した後、Add Key Entryを選択し、新しいKey-Valueを追加します。
Keyとそれに対応するSpriteを設定。

次にこれを利用する箇所を設定していきます。
任意のImageコンポーネントにて、右にある3点リーダーを押し、Localizeを選択します。

するとLocalize Sprite Eventコンポーネントをアタッチされます。
あとはLocalized Asset Referenceに先程設定したKeyを設定すればOKです。

Audioのローカライズ
任意のAudio Sourceコンポーネントに対して、右にある3点リーダーを選択し、Localizeを選択。

するとLocalize Audio Clip Eventコンポーネントをアタッチされます。
あとはSpriteのときと同様ですが、今回はLocalize Audio Clip EventコンポーネントのインスペクターからEntryを追加してみました。

Stringのローカライズ
String Tablesを生成する
Asset Tablesを先程作成しましたが、今度はString Tablesを生成します。
メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げます。
New Table Collectionタブを選択、TypeをAsset Table Collectionにし、任意の名前をつけてCreateボタンを押してください。

無事生成されるとEdit Table Collectionタブから以下のような編集画面を見ることができます。

静的なローカライズ
メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げ、Edit Table Collectionタブを開きます。

対象のString Tableであることを確認した後、Add Key Entryを選択し、新しいKey-Valueを追加します。

TextMeshPro(UGUI)に対して適応してみます。
TextMeshProコンポーネントの右にある3点リーダーを選択し、Localizeを選択。

するとLocalize String Eventコンポーネントがアタッチされます。
あとはString Referenceに先程作成したTable EntryのKeyをセットしてあげれば完了です。

動的なローカライズ
Smart Stringを用いて動的にテキストを生成することができます。

利用するにはメニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げ、Edit Table Collectionタブを開きます。
あとはSmartにチェックを入れればOKです。

またSmart Stringの書き方についてですが、かなりバリエーションがあるようです。
docs.unity3d.com
使いこなすには公式ドキュメントのSource・Fomattersの箇所を参照していただければと思いますが、ここでは基本的なことのみ取り上げます。(正直なところ私も使いこなせていません...)

変数の埋め込み(local variables)
テキストに変数を組み込んでみます。C#で言うところのString.Formatと同じ要領ですね。
私は{player-name}です
player-nameはLocalized String Eventより記述できます。

global variablesの利用
次にグローバル変数を用いた手法を紹介します。
Assets -> Create -> Localization -> Variables Groupを選択し、Variables Groupのアセットを作成。

そこにグローバル変数にしたい値を打ち込みます。

最後にメニューバーのEdit -> Project SettingsからProject Settingsを開き、Localizationタブから設定を行います。
String Database -> Smart Format -> Sourceのリストの中にGlobal Variablesという箇所があるのでそこに追加を行います。

こうすることで以下のように記述できます。
私は{global.player-name}です
スクリプトからローカライズされた文字列・Table・Entryを参照する
ローカライズされた文字列を取得
private void Start() { const string tableName = "SampleStringTable"; const string entryKey = "SampleSmartString"; // ローカライズされた文字列を取得 var entry = LocalizationSettings.StringDatabase.GetLocalizedString( tableReference:tableName,tableEntryReference: entryKey); }
Class LocalizedStringDatabase | Package Manager UI website
private async void Start() { const string tableName = "SampleStringTable"; const string entryKey = "SampleSmartString"; // ローカライズされた文字列を非同期で取得 var entry = await LocalizationSettings.StringDatabase.GetLocalizedStringAsync( tableReference:tableName,tableEntryReference: entryKey).Task; }
また本来であればGetLocalizedStringAsyncを呼ぶとInitializationOperationをおこなってくれるはずですが、一部のバージョンではバグでエラーが出てしまうことがあるそうです。(私の場合は出なかったです)
LocalizationSettings.InitializationOperation
Help Wanted - How to load string by key in script? - Unity Forum
private async void Start() { const string tableName = "SampleStringTable"; const string entryKey = "SampleSmartString"; // LocalizationSettingが初期化されるのを待つ await LocalizationSettings.InitializationOperation.Task; // 非同期でローカライズされたテキストを取得する var value = await LocalizationSettings.StringDatabase.GetLocalizedStringAsync( tableReference:tableName,tableEntryReference: entryKey).Task; }
まあ書いておくに越したことはないのかもしれませんが、要調査。
Tableの参照
private void Start() { const string tableName = "SampleStringTable"; // テーブルを取得 var table = LocalizationSettings.StringDatabase.GetTable(tableName); }
private async void Start() { const string tableName = "SampleStringTable"; // 非同期でテーブルを取得する var table = await LocalizationSettings.StringDatabase.GetTableAsync(tableName).Task; }
Entryの取得
private void Start() { const string tableName = "SampleStringTable"; const string entryKey = "SampleSmartString"; // Entry取得 var entry = LocalizationSettings.StringDatabase.GetTableEntry(tableName, entryKey).Entry; Debug.Log(entry.Value); Debug.Log(entry.GetLocalizedString()); }
private async void Start() { const string tableName = "SampleStringTable"; const string entryKey = "SampleSmartString"; // 非同期でEntry取得 var entry = (await LocalizationSettings.StringDatabase.GetTableEntryAsync(tableName, entryKey).Task).Entry; Debug.Log(entry.Value); Debug.Log(entry.GetLocalizedString()); }
スクリプトから言語変更
LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[0];
AvailableLocales.Locales[0]の添字の番号は、ProjectSettings -> Localizationより確認できます。

ビルド
LocaleやString Table・Asset TableはAddressable Asset Systemを利用してロードしているため、あらかじめAddresable Assetsをビルドする必要があります。
メニューバーよりWindow -> Asset Management -> Addressables -> Groupsを選択。

Build -> New Build -> Default Build Scriptを選択するとビルドが実行されます。
