ローカライズ(多言語)対応する


宴2.5.2からローカライズ機能が追加されました。

目次

ローカライズの設定

ローカライズに関する設定は、Projectウィンドウ内の、「プロジェクト名」/ScriptableObject/LanguageManager から詳細設定できます。


名前 内容
Language 起動時の言語設定。空欄の場合は、実行環境の言語を自動的に判別してその言語を使う
DefaultLanguage ゲームプレイヤー用のデフォルト言語。詳細は下記
DataLanguage 開発者用のデフォルト言語。シナリオデータのText列などの言語指定。デフォルトは空欄。詳細は下記
LanguageData エラーメッセージなどのデータ。ローカライズシートで設定・上書きできるが、基本設定の言語を削除するときなどは編集が必要。詳細は下記
Igonore Localize UI Text UIのテキスト変更を無視する
Igonore Localize Voice ボイスのローカライズを無視する
Voice Language ボイスのローカライズ対象として指定する言語
Blank Text Type ローカライズ対象となる言語のテキストが空だった場合にエラーを出す。詳細
Text Column Languages ローカライズ対象とするテキストの言語指定。詳細
Change Events 言語が変更されたときのイベントを定義するScriptableObjectを設定可能。
主にTextMeshProのフォントアセットのために使用する。詳細
宴4以降での機能。
Error Check Blank Text ローカライズ対象となる言語のテキストが空だった場合にエラーを出す。
宴3.8.4~3.8.6のみの機能。宴3.8.7からはアップデート後、Unityを再起動してから「Blank Text Type」を設定してください
Text Column Error Check Languages ローカライズ対象とするテキストの言語指定。ここに設定された言語のテキスト列そのものがない場合はエラーを出す
宴3.8.4~3.8.6のみの機能。宴3.8.7からは「Text Column Languages」を使用してください

シナリオのテキストをローカライズする

基本的には、各シナリオシートに対応する言語名の列を追加し、対応言語のテキストを記述する形になります。(対応言語名の一覧は、Unityのリファレンスを参照。)

Text Column Languagesに対応言語をすべて記述(重要)

LanguageManagerの「Text Column Languages」に対応する言語をすべて設定してください。

宴4以降は、「この設定+DataLanguage」が対応言語一覧になります。

DataLanguage(開発者用のデフォルト言語)とDefaultLanguage(ゲームプレイヤーのデフォルト言語)の指定

通常Text列は、ゲームプレイヤーの言語に対応する翻訳データがない場合のデフォルトの表示テキストとしても使われます。
ただこの方法ですと、「Text」列を日本語で作成してしまうと、アプリ実行時は日本語が基本となってしまい、「対応言語がない場合は英語を表示する」ということができません。
「DataLanguage」(開発者用のデフォルト言語)と「DefaultLanguage」(ゲームプレイヤーのデフォルト言語)を個別に設定することで、
「開発は日本語。アプリの基本言語は英語」といった設定が可能になります。

サンプル

「開発は日本語。アプリの基本言語は英語」とする場合はLanguageManagerの「DefaultLanguage」を「English」に。「DataLanguage」を「Japanese」にしてください。

対応言語が空だった場合の動作設定


「Blank Text Type」はゲームプレイヤーの言語に対応する翻訳テキストがない場合の動作設定です。
ローカライズをする場合は、基本的には「No Blank Text」にすることを推奨します。
宴3.8.4以前は、空だった場合は「DefaultLanguage」の言語か、「Text」列の言語を表示するようにしていました。
ですが、それだと翻訳データが未設定の場合のエラーチェックなどに問題があるため、以下のように動作を設定できるようにしました。

Swap Default Language

  従来の動作。
  現在の言語に対応したテキストがない場合はText列か「DefaultLanguage」の言語を表示します。
  逆に言うと、一部の翻訳テキストが抜けていてもエラーは出ないので注意してください。
  Textセルと各言語セルは1対1で対応していて、ページ数を言語によって変えることはできません。
  

No Blank Text

  「Text Column Languages」で対応する言語を設定する必要があります。
  現在の言語が「Text Column Languages」にない言語の場合は、Text列か「DefaultLanguage」の言語を表示します。
  「Text Column Languages」で設定してある言語のテキストは必ずある前提で動作します。
  対応言語の翻訳テキストがない場合はインポート時にエラーが出力されます。
  Textセルと各言語セルは1対1で対応しているのが基本ですが、skip_pageタグを使うことで言語によってページを数を変えることができます。

Allow Blank Text(非推奨)

  言語によって表示するページを変えるための機能でしたが、NoBlankTextでskip_pageタグを使うほうがエラーチェックがしやすいのでそちらを推奨します。
  「Text Column Languages」で対応する言語を設定する必要があります。
  現在の言語が「Text Column Languages」にない言語の場合は、Text列か「DefaultLanguage」の言語を表示します。
  「Text Column Languages」で設定してある言語のテキストがない場合はそのページはスキップされます。
  Textセルと各言語セルは1対1で対応していなくてもよく、「英語だけ2ページ目をつくる」といった挙動が許されます。  
  逆に言うと、意図的に空白テキストにしてスキップ可能なページにしているのか、翻訳データが抜けているかのチェックができないため注意してください。

skip_pageタグ

<skip_page>とだけ入力したページは表示されずに即座にスキップ可能になります。
「英語は2ページ表示して、日本語は1ページだけにする」など言語によって表示するページ数を変えたい場合に使用してください。

skip_textタグ

<skip_text>と入力したテキスト行は表示されずに、PageCtrlを無視して即座に次のコマンドを実行します。(ただし、ページ最終となる場合はテキストを表示せずに改ページ待ちを行います)
これはPageCtrlを使用して1ページ内に複数のテキストコマンドがある場合に、「英語は1行づつInput待ちして5行表示するが、日本語は3行だけ表示する」など言語によって使用するテキストコマンドの数を変えたい場合に使用してください。

インポート時の文字数チェックを全ての言語で行う

宴3.8.2から、シナリオインポート時の文字数チェックを全ての言語で行えるようにしました。
Scenario Data Builderで「Check Text Count All Language」のチェックをオンにすることで、テキストがメッセージウィンドウからあふれていないかのチェックを言語ごとに行えるようになります。
「No Blank Text」を設定していた場合は、ローカライズ用のテキストデータが未設定な場合にエラーが出力されます。

特殊なテキストのローカライズ

シナリオラベルにおけるセーブのタイトルのローカライズ

シナリオラベルのArg2を使ってセーブデータのタイトルテキストを指定している場合、
言語列を追加することで、ローカライズができます。

シーンギャラリー、サウンドルームのタイトルのローカライズ

テキスト列以外にも、シーンギャラリーのタイトルでも、言語列を追加することで、ローカライズができます。

Vers3.12.8以降から、サウンドルームのタイトルも同様にローカライズ可能です。

ボイスをローカライズする

LanguageManageの「Igonore Localize Voice」のチェックをオフにして、
VoiceLanguagees以下に対応する言語名を設定してください。

Soundリソースフォルダ以下に、「Voice+対応言語名」のフォルダを作って、全ボイスファイルを作成してください。

通常、ボイスまでローカライズするのは困難な場合も多いため、「Igonore Localize Voice」でボイスのローカライズをするかどうかを切り替えられるようにしてあります。
また、ボイスのみ個別に言語に設定することも可能です。後述

ローカライズシート

詳細は、ローカライズシートも参照してください。

キャラクターの名前

キャラクターの名前のテキストは、ローカライズしたいNameTextをキーにして、言語ごとのテキストを追加します。

ギャラリーのカテゴリ名

Vers3.12.8以降から、ギャラリーのカテゴリ名も、キャラクターの名前と同様にローカライズシートで対応可能です。
カテゴリ名をキーにして、言語ごとのテキストを設定してください。

UIやエラーメッセージ等をローカライズする

LanguageManageの「Igonore Localize UI Text」のチェックをオフにして、

[ローカライズシート]にUIのテキストのキーと、対応言語のテキストを記述します。

ローカライズしたいUIのテキストには、UguiLocalizeコンポーネントを追加し、対応するキーを設定してください。

初期状態の全てのUIには、すでにUguiLocalizeコンポーネントが設定済みです。
 初期状態では、殆どのUIには既にUguiLocalizeコンポーネントが設定済みですが、メッセージウィンドウ下部のボタンなど、一部のUIはローカライズ非対応です。

・UIのテキストを変えている場合は、ローカライズシートにキーとテキストを追加し、UguiLocalizeコンポーネントにキーを設定。
という作業をしてください。
・新しく自作したUIはUguiLocalizeコンポーネントを追加して、対応するキーを設定してください。

デフォルトのローカライズデータ

これは主にエラーメッセージや、UIボタンのローカライズデータが初期設定されています。
ローカライズシートで上書きできるので、基本的には初期設定のままで構いません。
ただ、上書きにはできますが、すでにある項目を削除はできません。
デフォルトに日本語と英語が設定されていますので、これらの言語のローカライズデータを削除したい場合は、
LaguageDataからこれらのファイルを削除するか、ファイルをコピーして使用する言語のみ設定するように編集したものに差し替えてください。
形式はTSV(タブ区切りのCSV)です。

プログラムからローカライズしたテキストを呼び出す

プログラムから、ローカライズしたテキストを呼び出すには以下のように、ローカライズシートのキーを指定して行います。

public class SampleLocalize : MonoBehaviour
{
    public Text text;
    void Localize()
    {
        string key = "Yes";
        text.text = LanguageManager.Instance.LocalizeText(key);
    }
}

フォントのサイズや、UIの位置や大きさをローカライズする 

言語によって必要となる文字数に大きな差があるため、「指定の領域に文字が収まるようにする」のが難しい場合もあります。
その対策として、フォントのサイズや、UI位置や大きさを変えることもできます。

フォントの種類やサイズを変える

メッセージウィンドウやバックログなどのテキスト表示オブジェクトにコンポーネントを追加します。
ただし、フォントアセット直接参照しているため、シーン起動時に設定していあるすべてのフォントアセットがロードされオンメモリになります。
設定しているフォントアセットの数が多く、一つ一つのサイズも大きい場合はメモリ使用量が肥大化しすぎる可能性があります。
また、ローカライズ対象となるすべてのテキストコンポーネントに設定する必要もあるため、作業が大変かもしれません。
TextMeshProの場合、フォントアセットのローカライズをするのであればフォールバックのローカライズの方が作業も手軽で負荷も低いです。

TextMeshPro

TextMeshProの場合はUguiLocalizeTextSettingTMP設定してください。

名前 内容
SettingList 設定データリスト。対応言語ぶん追加する
Language 言語名
Font この言語で使用するフォント。
未設定の場合はフォントは変えない
Font Material この言語で使用するフォントマテリアル。
TMPの場合マテリアルはフォントアセットごとに違うため、一緒に変更する必要がある。
未設定の場合は変えない
FontSize フォントのサイズ
LineSpacing 行間の設定

LegacyText

LegacyTextの場合は、UguiLocalizeTextSettingコンポーネントを追加してください

名前 内容
SettingList 設定データリスト。対応言語ぶん追加する
Language 言語名
Font この言語で使用するフォント。未設定の場合は、フォントは変えない
Setting この言語で使用する禁則処理などの設定。下記詳細
FontSize フォントのサイズ
LineSpacing 行間の設定

改行処理のローカライズ(LegacyText)

UguiLocalizeTextSettingの「Setting」で、言語ごとのTextSettingsを設定可能です。
TextSettingsは、禁則処理などの改行処理の設定が含まれます。
日本語以外の場合は「Force Ignore Japanese Kinsoku」をオンにしたオブジェクトを設定すると、日本語用の特殊な改行処理を行わなくなります。
特に、標準的なアルファベット以外の言語を使う場合は、オンにしたものを設定することを推奨します。

UIの位置や大きさを変える

位置・大きさを変えたいUIにUguiLocalizeRectTransformをAddComponentしてください。

名前 内容
SettingList 設定データリスト。対応言語ぶん追加する
Language 言語名
Anchored Position 位置
Size 大きさ

Strechは未対応

UguiLocalizeRectTransformで設定する位置、大きさはアンカーは適用されますが、Strech(親オブジェクトの大きさによってサイズを変える機能)は適用されない状態のものになります。
MessesageWindowなどStrechが設定されているオブジェクトの場合は、数値の設定がしづらくなると思いますので、下図のようにStrechを解除してみてください。

言語名をシステムセーブデータ内のパラメーターに設定する

宴3.8.0から、言語名をシステムセーブデータ内のパラメーターに自動で保存できるようにしました。

設定方法

Paramシートに、「言語名のパラメーター」を追加します。
「language」などのキー(ラベル名)をつけて、Typeを「String」、FileTypeを「System」としてください。

AdvEngineの「Language Key Of Param」に先ほど作成した「言語名のパラメーター」のキー(ラベル名)を設定します。

これを設定しおくと、プログラムから言語を切り替えた場合、自動的にシステムセーブデータのパラメーターに言語名を保存するようになり、
次回以降の宴の起動時に、前回設定した言語名に自動で切り替わるようになります。

また、パラメーターとして言語名が使えるようになるので、Jumpコマンドの条件文などにすることで言語によってシナリオを分岐するなども可能になります。

表示する画像を言語によって切り替える

CharacterシートやTextureシートのConditionalに言語名による条件文を設定することで、表示する画像を言語によって自動的に切り替えることが可能になります。

Conditionalは条件の成否にかかわらず画像を全てロードしてしまうので、
言語ごとにたくさんの画像が必要な場合はDicingなどを使ってサイズを削減するなどしてください。
また、Conditionalは表示した後でパラメーターが変更されてもその影響は受けません。
つまり画像を表示中に言語を切り替えても、その画像は変更されません。
その点が気になるのであれば、ゲームの起動前のタイトル画面などで言語設定するようにして、ゲームのプレイ中には切り替えをしないようにするなどしてください。

プログラムから言語を切り替える

プログラムから言語を切り替えるサンプルは、
Utage\Sample\Scripts\SampleLanguage.cs にあります。

    public class SampleLanguage : MonoBehaviour
    {
        //指定の言語に切り替え
        public void ChangeLanguage(string language)
        {
            LanguageManagerBase langManager = LanguageManagerBase.Instance;
            if (langManager == null) return;
            if (langManager.Languages.Count < 1) return;

            langManager.CurrentLanguage = language;
        }
    }

タイトル画面に言語設定UIなどを追加したい場合は、こちらのプログラムを参考に言語切りかえのUIを作成してください。
また、言語設定を保存したい場合は、上記の「言語名をシステムセーブデータ内のパラメーターに設定する」と合わせてご利用ください。

ボイスのみ言語を別に設定する

通常はテキストとボイスの言語設定は同じ言語になりますが、
「ボイスは日本語、テキストは英語」といったように、ボイスのみの別の言語に設定することも可能です。

プログラムからボイス言語を設定する

デフォルトではボイス言語は未設定なので、プログラムから設定する必要があります。

        //ボイスのみ言語切り替え
        public void ChangeVoiceLanguage(string language)
        {
            LanguageManagerBase langManager = LanguageManagerBase.Instance;
            if (langManager == null) return;

            langManager.VoiceLanguage = language;
        }

        //ボイスのみの言語切り替えを元に戻す
        public void ResetVoiceLanguage()
        {
            LanguageManagerBase langManager = LanguageManagerBase.Instance;
            if (langManager == null) return;

            langManager.VoiceLanguage = "";
        }

ボイス言語のパラメーターへの設定方法

ボイス言語は次の手順で宴のパラーメーターに自動保存することが可能です。
Paramシートに、「ボイス言語名のパラメーター」を追加します。
「voice_language」などのキー(ラベル名)をつけて、Typeを「String」、FileTypeを「System」としてください。

AdvEngineの「Voice Language Key Of Param」に先ほど作成した「ボイス言語名のパラメーター」のキー(ラベル名)を設定します。

TextMeshProのフォントをローカライズする

以下は、宴4で追加されたTextMeshProに特化したローカライズ機能です。
TextMeshProは用意された文字しか表示できないのですが、CJK文字(繁体字、簡体字、日本語文字、ハングル文字)の場合、同じユニコードでも違うグリフデータ(見た目)が必要になるため、言語ごとに対応フォントを入れ替える必要があります。
TextMeshProでこれを行う方法は大まかに二つあります
・その1 言語によってフォールバックの設定を入れ替える
・その2 各テキストコンポーネントに設定しているフォントアセットを入れ替える
以下はその手順の説明です。

言語によってフォールバックの設定を入れ替える

以下は、デフォルトフォントを使っている場合のフォールバックのローカライズ対応です。
自作フォントを使う場合も同じ要領で設定可能です。
宴のデフォルトのフォントアセットのように、メインにアルファベット系のフォント、フォールバックに切り替えたい言語別のフォント(日中台韓のフォントなど)を設定する形にしてください。

1.Resourcesフォルダ以下に「Fonts & Materials」フォルダを移動する

扱う文字が多いため、全てのフォントをあらかじめロードしておくと非常に負荷が大きくなるため、ファイルパスやアセット名を指定して動的にロードする設計になっています。
動的にロードするために、Resourcesフォルダ以下にフォントを移動してください。
フォントを変更している場合は、新しいフォントアセットを「Resources/Fonts & Materials/」以下においてください。

2.LanguageManagerのChangeEventsを設定

LanguageManagerのChangeEventsに、「(プロジェクト名)Font Fallback Settings Rutime」アセットを設定します。

「Font Fallback Settings Rutime」は、ランタイムでフォールバックを再設定するためのフォント名と言語の対応です。
フォントを変更していない場合は、特に何も変更する必要はないです。
フォントを変更している場合は、新しいフォント名と利用言語に合わせて設定を変えてください。

言語によってフォントアセットを入れ替える

ローカライズ対象のすべてのテキストコンポーネントに
UguiLocalizeTextSettingTMPを使うことで、フォントアセットの入れ替えが可能です。
仕組みは単純なのですが、メモリ負荷が高い、マテリアルも対応させないといけない、テキストコンポーネント全てに設定するのが大変、などデメリットも多いです。

注意点

ローカライズは、タイトル画面などシナリオを再生する前に行うようにしてください。
シナリオ実行中に言語切り替えをすると、既に表示済みのもの(選択肢やキャラクター表示など)は変更後の言語に切り替えることができません。
デバッグ機能ではシナリオ実行中にも言語を切り替えられるようにしていますが、その場合でも同じ制約がかかります。