はじめに
今回は多言語対応を簡単に行える公式パッケージ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
を選択するとビルドが実行されます。