ローカライズ
ゲームのプレイヤー向け言語を読み取り、切り替え、翻訳キーを読み取る
この 6 つのノードは、ゲームが自分の言語を切り替え、翻訳キーを読み取る手段です:設定画面がプロジェクトのロケール一覧を表示し、プレイヤーが 1 つを選ぶと、その選択が記憶されます。言語、翻訳テーブル、翻訳キーは Localization で設定します——ノードは、すでにそこにあるものを読み取るだけです。7 つ目のノード Format Text はパレットに表示されなくなりましたが、すでにグラフにあるものはそのまま動きます。
規約
- 1 つが pure で、残りは latent です。
Translation Key Textは読み取られた時点で値を計算するため、Blueprint Value と関数で使えます。ほかの 5 つは非同期に結果を返し、イベントグラフとマクログラフでのみ使えます。 - これはゲームの言語であり、エディターの言語ではありません。 Studio 自体のインターフェース言語は別の設定で、ここのどのノードもそれを読み書きしません。両者は自由に異なってよく、通常は実際に異なります——あなたは自分の言語で制作し、ゲームはプレイヤーの言語で動きます。
- この選択がどこに保存されるか。
Set Languageは、ホストの永続ストアのキーnls.localeの下に、プロジェクトごとに 1 レコードとして書き込みます。永続変数と同じチャンネルを使います。ゲームを終了しても残り、セーブファイルの一部ではありません。そのため、セーブをロードしても言語が変わることはありません。初回起動時、有効な値が何も保存されていない場合は、プレイヤーのシステム言語が設定済みのロケールと照合され、保存されます。以降は保存された選択が優先されます。 - 翻訳キーはどこで読んでも同じ答えになります。
Get Text、Translation Key Text、翻訳キーから文字を取るウィジェットは、同じキーに同じ答えを返します。まず現在のロケールの翻訳、次にそのロケールに設定されたフォールバックをチェーンに沿って順にたどった翻訳、次にキーのソーステキスト、そしてプロジェクトにないキーではキー名そのものです——そのため、削除したり打ち間違えたりしたキーは、実行中のゲームで空白として描画される代わりに、そのまま表示されます。キーは、プロジェクトにソース言語があるかどうかに関係なく読み取れます。 - Blueprint Value は言語に追従します。
Translation Key Text、または呼び出す関数の中のGet TextやGet Current Languageでプレイヤーの言語を読む Blueprint Value は、プレイヤーが言語を切り替えると評価し直されます。 - 音声の言語は別です。 吹き替え言語と字幕言語は意図的に別の設定になっています。ここにあるものは音声トラックには一切触れません。
- エディターのキャンバスでは latent のノードを実行できません。 制作時のキャンバスにはホストが存在しないため、
Format Text以外の latent のノードはそこでは This node runs only in a running game. Open Dev Mode to run it.(このノードはゲームの実行中にしか使えない。開発モードで実行する)で失敗し、キャンバスは仕様どおりソース言語のテキストを描画します。
Get Current Language
blueprint.localization.getCurrentLanguage · Latent
ゲームが現在実行されているロケールコードです:プレイヤーの保存済みの選択がプロジェクトのロケールのいずれかである間はそれが使われ、そうでなければプロジェクトのソース言語になります。ローカライズが設定されていないプロジェクトでは空文字列が読み取られます。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
value | out · data | string | Language というラベルが付きます。 |
Set Language
blueprint.localization.setLanguage · Latent
ゲームの言語を切り替え、その選択を記憶します。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
language | in · data | string | プロジェクトに設定されたロケールの中のロケールコード。 |
このコードは、何かが書き込まれる前に設定済みのロケールと照合されます。そのため、入力ミスがプレイヤーを存在しない言語に閉じ込めることはありません:未知のコードや空のコードは実行エラーになり、言語が一切設定されていないプロジェクトでこのノードを実行するのも同様に実行エラーになります。
プレイ中のゲームがないとき(タイトル画面など)は、切り替えはすぐに反映されます。
- ウィジェット上のテキスト——Text の内容、Button のラベル、Text Input のプレースホルダー——はただちに再解決され、再描画されます。何かを再マウントする必要はありません。
- 言語を読む Blueprint Value は評価し直され、新しい言語を表示します。
- グラフがすでに
Set TextやSet Labelで書き込んだ文字は、ページを開き直すまで、すべての言語で書き込んだとおりに表示されます。新しい言語で書き込むには、グラフをもう一度実行してください。
プレイ中に切り替えたときの動作は、プロジェクトごとに Project → Game → Language(プロジェクト → ゲーム → 言語)の Changing language during a game(ゲーム中の言語切り替え)で設定します。
| 選択肢 | プレイヤーに起こること |
|---|---|
| Restart and continue where they were(再起動して元の位置に戻す) | 既定値です。ゲームが再起動し、プレイヤーがいた行に戻ります。すべてが新しい言語になります。 |
| Restart without keeping the playthrough(再起動する。進行中のプレイは残さない) | ゲームは通常の起動と同じように再起動し、タイトル画面から始まります。進行中のプレイは残りませんが、プレイヤーのセーブは残ります。 |
| Apply the next time the game is started(次回の起動時に反映する) | 現在のセッションは、インターフェースのテキストも含めて何も変わりません。次にゲームを起動したときに新しい言語になります。 |
Get Available Languages
blueprint.localization.getAvailableLanguages · Latent
プロジェクトに設定されているすべてのロケールを、プロジェクトが並べている順序で返します。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
value | out · data | array<struct:nl.language> | Languages というラベルが付いた Language list(言語のリスト)です。プロジェクトにローカライズがない場合は空です。 |
各エントリーは code、displayName、isSource を持ちます。displayName は作者が入力した自称——「Japanese」ではなく「日本語」——であり、これが言語ピッカーがプレイヤーに表示するものです。code は Set Language に渡し返す値です。フィールドは Get Field で読み取ります。
Translation Key Text
blueprint.localization.keyText · Pure
翻訳キーの、プレイヤーの現在の言語での文字です。Get Text と同じ答えを返しますが、実行ピンがないため、Blueprint Value や関数でも翻訳した文字を表示できます。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
key | in · data | string | 接続されている場合はカード上のフィールドを上書きします。 |
value | out · data | string | Text というラベルが付きます。キーが選ばれていない場合は空文字列です。 |
カード上のフィールド
| フィールド | 内容 |
|---|---|
Key | プロジェクトの翻訳キーから選ぶ翻訳キー。 |
これを表示する Blueprint Value は、翻訳キーから文字を取るウィジェットと同じフレームで新しい言語に切り替わります。
翻訳した文字に値を差し込むには、Format の template に配線します。キー settings.seconds のソーステキストが {0} s、中国語の翻訳が {0} 秒 なら、Translation Key Text を template に、3 を入れた Make Array を values に配線すると、英語では 3 s、中国語では 3 秒 と表示されます。
Get Text
blueprint.localization.getText · Latent
翻訳キーを 1 つ、現在の言語の文字へと解決します。翻訳キーは、それを指定するすべてのウィジェットとグラフが共有する文字で、翻訳は 1 回で済みます。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
key | in · data | string | 接続されている場合はカード上のフィールドを上書きします。空のキーは実行エラーになります。 |
value | out · data | string | Text というラベルが付きます。 |
カード上のフィールド
| フィールド | 内容 |
|---|---|
Key | プロジェクトの翻訳キーから選ぶ翻訳キー。各選択肢はソーステキストの後にキー名を表示するため、その文字列の内容で選べます。 |
答えは規約にある順序で決まります。フォールバックチェーンに沿った翻訳、次にキーのソーステキスト、プロジェクトにないキーではキー名です。
ウィジェット上の文字には、このノードは不要です:直接入力の文字も翻訳キーの文字も、ウィジェットがプレイヤーの言語で表示します。Get Text を使うのは、文字をグラフ側で決める場合で、Blueprint Value の中では Translation Key Text を使います。
Has Text
blueprint.localization.hasText · Latent
翻訳キーがプロジェクトに存在するかどうかです。プロジェクトにソース言語があるかどうかには関係しません。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
key | in · data | string | 接続されている場合はカード上のフィールドを上書きします。空のキーは失敗ではなく false として読み取られます。 |
value | out · data | boolean | Exists というラベルが付きます。 |
カード上のフィールド
| フィールド | 内容 |
|---|---|
Key | プロジェクトの翻訳キーから選ぶ翻訳キー。 |
これが答えるのはそのキーが定義されているかであり、翻訳されているかではありません。現在のロケール向けの翻訳がないキーでも true を返します。描画されるのはそのソーステキストになるからです。翻訳のカバー率は、実行中のゲームではなくローカライズエディターで確認すべき問題です。
Format Text
blueprint.localization.formatText · Latent
パレットには表示されません。すでにグラフにあるものは、これまでどおり動きます。代わりに Format を使ってください:同じ {0}、{1}、……のプレースホルダーを配列から埋め、オブジェクトから {name} も埋められ、Blueprint Value と関数でも使えます。
テンプレートの {0}、{1}、……というプレースホルダーを、位置に基づいて値で埋めます。
| ピン | 方向 | 型 | 備考 |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
text | in · data | string | テンプレート。通常は Get Text の結果です。 |
values | in · data | list | インデックスによって代入されます。 |
value | out · data | string | Result というラベルが付きます。 |
プレースホルダーの形式は翻訳者が目にするものであるため、翻訳はプレースホルダーをその言語が必要とする位置へ自由に移動できます。連結ではなくフォーマットを使うべき理由はそこにあります:連結は、最初に書いた言語の語順を固定してしまいます。
対応する値がないプレースホルダーは空文字列として描画され、余った値は無視されます。values に渡された入力がリストでない場合は単一の値として扱われ、空の場合は値なしとして扱われます。