はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】多言語対応を簡単に行える公式パッケージ「Localization」の基本的な使い方

概要

アプリケーションのローカライズを支援してくれるパッケージになります。

Use the Localization package to configure localization settings for your application.

機能 意味
String localization Locale(言語と地域)に応じて表示する文字を設定する。
Asset localization Localeに応じて、異なるアセット(ex. テクスチャ・モデル・オーディオファイル)を設定する。
Pseudo-localization 翻訳を追加する前に、プロジェクトがどのようにローカリゼーション対応するかテストする。
- ローカリゼーションデータをXLIFFCSVGoogle 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を入力します。

f:id:hanaaaaaachiru:20220311175018p:plain
gitからインストールする

Localizationの初期設定

Localization Settingsの生成

メニューバーからEdit -> Project Settingsを開きます。

f:id:hanaaaaaachiru:20220311175558p:plain
Project Settingsを開く

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

f:id:hanaaaaaachiru:20220311175832p:plain
Localization Settingsを生成する

Localeの生成

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

Local Generatorウィンドウを開きます。

f:id:hanaaaaaachiru:20220311180332p:plain
Local Generartorウィンドウを開く

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

f:id:hanaaaaaachiru:20220311180648p:plain
Localeを生成する

デフォルトのLocaleを設定

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

  • Specific Locale Selectorに任意の言語を設定
  • Project Locale Identifierに任意の言語を設定
f:id:hanaaaaaachiru:20220311181533p:plain
Specific Locale SelectorとProject Locale Identifierを設定する

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

f:id:hanaaaaaachiru:20220311183313p:plain
Local Selectorsの仕組み

Asset Localization

アセットをローカライズにするにはAsset Tablesを用いる必要があります。

Asset Tablesを生成する

メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げます。

New Table Collectionタブを選択、TypeAsset Table Collectionにし、任意の名前をつけてCreateボタンを押してください。

f:id:hanaaaaaachiru:20220311184320p:plain
Asset Tableの生成

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

f:id:hanaaaaaachiru:20220311184634p:plain
Edit Table Collection

Spriteのローカライズ

公式ドキュメントのサンプルではLocalization Scene Controlsを利用して自動で設定していましたが、個人的に以下の手順を用いた方が仕組みが理解しやすいと思うので別の手法でやっていきます。

メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げ、Edit Table Collectionタブを開きます。(Asset Localizationのときと同様)

f:id:hanaaaaaachiru:20220311184634p:plain
Edit Table Collection

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

Keyとそれに対応するSpriteを設定。

f:id:hanaaaaaachiru:20220311191543p:plain
各言語に対応したSpriteをKeyに紐づける

次にこれを利用する箇所を設定していきます。

任意のImageコンポーネントにて、右にある3点リーダーを押し、Localizeを選択します。

f:id:hanaaaaaachiru:20220311193127p:plain
Localize

するとLocalize Sprite Eventコンポーネントをアタッチされます。

あとはLocalized Asset Referenceに先程設定したKeyを設定すればOKです。

f:id:hanaaaaaachiru:20220311194400p:plain
Localized Asset Rederenceを設定

Audioのローカライズ

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

f:id:hanaaaaaachiru:20220311194957p:plain
Localizeを選択

するとLocalize Audio Clip Eventコンポーネントをアタッチされます。

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

f:id:hanaaaaaachiru:20220311195335p:plain
Entry追加

Stringのローカライズ

String Tablesを生成する

Asset Tablesを先程作成しましたが、今度はString Tablesを生成します。

メニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げます。

New Table Collectionタブを選択、TypeAsset Table Collectionにし、任意の名前をつけてCreateボタンを押してください。

f:id:hanaaaaaachiru:20220312065537p:plain
String Tables生成

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

f:id:hanaaaaaachiru:20220312065658p:plain
Edit Table Collection

静的なローカライズ

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

f:id:hanaaaaaachiru:20220312065658p:plain
Edit Table Collection

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

f:id:hanaaaaaachiru:20220312070525p:plain
StringTableにTable Entry追加

TextMeshPro(UGUI)に対して適応してみます。

TextMeshProコンポーネントの右にある3点リーダーを選択し、Localizeを選択。

f:id:hanaaaaaachiru:20220312070023p:plain
Localize

するとLocalize String Eventコンポーネントがアタッチされます。

あとはString Referenceに先程作成したTable EntryKeyをセットしてあげれば完了です。

f:id:hanaaaaaachiru:20220312070740p:plain
String Referenceの設定

動的なローカライズ

Smart Stringを用いて動的にテキストを生成することができます。

f:id:hanaaaaaachiru:20220313185909p:plain
Smart Stringを利用

利用するにはメニューバーよりWindow -> Asset Management -> Localization Tablesを選択し、Localization Tables Windowを立ち上げ、Edit Table Collectionタブを開きます。

あとはSmartにチェックを入れればOKです。

f:id:hanaaaaaachiru:20220313190216p:plain
Smartにチェックを入れる

またSmart Stringの書き方についてですが、かなりバリエーションがあるようです。
docs.unity3d.com

使いこなすには公式ドキュメントのSourceFomattersの箇所を参照していただければと思いますが、ここでは基本的なことのみ取り上げます。(正直なところ私も使いこなせていません...)

f:id:hanaaaaaachiru:20220313191136p:plain
Smart Stringの利用方法

変数の埋め込み(local variables)

テキストに変数を組み込んでみます。C#で言うところのString.Formatと同じ要領ですね。

私は{player-name}です

player-nameLocalized String Eventより記述できます。

f:id:hanaaaaaachiru:20220313192331p:plain
Local Variables

global variablesの利用

次にグローバル変数を用いた手法を紹介します。

Assets -> Create -> Localization -> Variables Groupを選択し、Variables Groupのアセットを作成。

f:id:hanaaaaaachiru:20220313194031p:plain
Variables Groupの作成

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

f:id:hanaaaaaachiru:20220313194337p:plain
値の設定

最後にメニューバーのEdit -> Project SettingsからProject Settingsを開き、Localizationタブから設定を行います。

String Database -> Smart Format -> Sourceのリストの中にGlobal Variablesという箇所があるのでそこに追加を行います。

f:id:hanaaaaaachiru:20220313195009p:plain
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より確認できます。

f:id:hanaaaaaachiru:20220313181959p:plain
AvailableLocales

ビルド

LocaleString TableAsset TableAddressable Asset Systemを利用してロードしているため、あらかじめAddresable Assetsをビルドする必要があります

メニューバーよりWindow -> Asset Management -> Addressables -> Groupsを選択。

f:id:hanaaaaaachiru:20220313175206p:plain
Addressables Groups

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

f:id:hanaaaaaachiru:20220313181916p:plain
Addressable Assetsのビルド