NarraLeaf

ローカライズ

ゲームのプレイヤー向け言語を読み取り、切り替え、名前付きテキストキーを解決する

この 6 つのノードは、ゲームが自分の言語を切り替える手段です:設定画面がプロジェクトのロケール一覧を表示し、プレイヤーが 1 つを選ぶと、その選択が記憶されます。言語、翻訳テーブル、名前付きキーは Localization で設定します——ノードは、すでにそこにあるものを読み取るだけです。

規約

  • 6 つすべてが latent で、pure なものはありません。 どれもホストに到達して非同期に結果を返すため、function グラフには現れず、Blueprint Value を支えることもできません。6 つすべてが eventmacro を宣言します。
  • これはゲームの言語であり、エディターの言語ではありません。 Studio 自体のインターフェース言語は別の設定で、ここのどのノードもそれを読み書きしません。両者は自由に異なってよく、通常は実際に異なります——あなたは自分の言語で制作し、ゲームはプレイヤーの言語で動きます。
  • この選択がどこに保存されるか。 Set Language は、ホストの永続ストアのキー nls.locale の下に、プロジェクトごとに 1 レコードとして書き込みます。永続変数と同じチャンネルを使います。ゲームを終了しても残り、セーブファイルの一部ではありません。そのため、セーブをロードしても言語が変わることはありません。初回起動時、有効な値が何も保存されていない場合は、プレイヤーのシステム言語が設定済みのロケールと照合され、保存されます。以降は保存された選択が優先されます。
  • 検索はフォールバックチェーンをたどります。 テキストはまず現在のロケールで検索され、次にそのロケールに設定されたフォールバックで検索され、以下同様に続きます——ソース言語の手前で止まります。ソース言語のテキストはテーブルの項目ではなく、コンパイルされたデフォルト値だからです。チェーンの末尾まで行き着くと、ソーステキストが描画されます。
  • 音声の言語は別です。 吹き替え言語と字幕言語は意図的に別の設定になっています。ここにあるものは音声トラックには一切触れません。
  • エディターのキャンバスではこれらを実行できません。 制作時のキャンバスにはホストが存在しないため、6 つすべてがそこでは Host API unavailable (use Dev Mode) で失敗し、キャンバスは仕様どおりソース言語のテキストを描画します。

Get Current Language

blueprint.localization.getCurrentLanguage · Latent

ゲームが現在実行されているロケールコードです:プレイヤーの保存済みの選択がプロジェクトのロケールのいずれかである間はそれが使われ、そうでなければプロジェクトのソース言語になります。ローカライズが設定されていないプロジェクトでは空文字列が読み取られます。

ピン方向備考
inin · exec
nextout · exec
valueout · datastringLanguage というラベルが付きます。

Set Language

blueprint.localization.setLanguage · Latent

ゲームの言語を切り替え、その選択を記憶します。

ピン方向備考
inin · exec
nextout · exec
languagein · datastringプロジェクトに設定されたロケールの中のロケールコード。

このコードは、何かが書き込まれる前に設定済みのロケールと照合されます。そのため、入力ミスがプレイヤーを存在しない言語に閉じ込めることはありません:未知のコードや空のコードは実行エラーになり、言語が一切設定されていないプロジェクトでこのノードを実行するのも同様に実行エラーになります。

この切り替えが及ぶ範囲と、及ばない範囲は次のとおりです。

  • ウィジェット上のテキスト——Text の内容、Button のラベル、Text Input のプレースホルダー——はただちに再解決され、再描画されます。何かを再マウントする必要はありません。
  • 翻訳を持つストーリーの行は、レンダリングのたびに再解決される値としてコンパイルされるため、再コンパイルや再起動なしに新しい言語が適用されます。
  • 話者のネームタグは、その行がダイアログ状態に入った瞬間に解決されます。そのため、行の途中で行われた切り替えは、次の行から反映されます。
  • グラフがすでに生成した文字列——どこかに書き出された Get Text の結果など——は、その時点でただの文字列です。再解決はされません。グラフをもう一度実行してください。

Get Available Languages

blueprint.localization.getAvailableLanguages · Latent

プロジェクトに設定されているすべてのロケールを、プロジェクトが並べている順序で返します。

ピン方向備考
inin · exec
nextout · exec
valueout · dataanyLanguages というラベルが付きます。プロジェクトにローカライズがない場合は空です。

各エントリーは codedisplayNameisSource を持ちます。displayName は作者が入力した自称——「Japanese」ではなく「日本語」——であり、これが言語ピッカーがプレイヤーに表示するものです。codeSet Language に渡し返す値です。このピンが any 型なのは、値がスカラーなブループリント型の 1 つではなく、オブジェクトのリストだからです。

Get Text

blueprint.localization.getText · Latent

名前付きキーを 1 つ、現在の言語のテキストへと解決します。名前付きキーは、プロジェクトで開発者が書いた文字列です:ストーリーの行でも、ウィジェットのカードに直接入力された文字列でもないものを指します。

ピン方向備考
inin · exec
nextout · exec
keyin · datastring接続されている場合はカード上のフィールドを上書きします。
valueout · datastringText というラベルが付きます。

カード上のフィールド

フィールド内容
Keyプロジェクトのレジストリから選ぶ名前付きキー。各選択肢はソーステキストの後にキー名を表示するため、その文字列の内容で選べます。

解決の順序は、まず現在のロケールの翻訳(フォールバックチェーンをたどる)、次にそのキー自身のソーステキスト、そしてキーがレジストリにまったく存在しない場合はキー名そのもの、という順です——そのため、削除したり打ち間違えたりしたキーは、実行中のゲームで空白として描画される代わりに、そのまま表示されます。

ウィジェットのカードに直接入力したテキストには、このノードは不要です:テキストを持つウィジェットは、自分の表示テキストを現在のロケールに対して自ら解決します。Get Text を使うのは、その文字列をグラフ側で決める場合です。

Has Text

blueprint.localization.hasText · Latent

名前付きキーがプロジェクトに存在するかどうかです。

ピン方向備考
inin · exec
nextout · exec
keyin · datastring接続されている場合はカード上のフィールドを上書きします。空のキーは失敗ではなく false として読み取られます。
valueout · databooleanExists というラベルが付きます。

カード上のフィールド

フィールド内容
Keyプロジェクトのレジストリから選ぶ名前付きキー。

これが答えるのはそのキーが定義されているかであり、翻訳されているかではありません。現在のロケール向けの翻訳がないキーでも true を返します。描画されるのはそのソーステキストになるからです。翻訳のカバー率は、実行中のゲームではなくローカライズエディターで確認すべき問題です。

Format Text

blueprint.localization.formatText · Latent

テンプレートの {0}{1}、……というプレースホルダーを、位置に基づいて値で埋めます。

ピン方向備考
inin · exec
nextout · exec
textin · datastringテンプレート。通常は Get Text の結果です。
valuesin · datalistインデックスによって代入されます。
valueout · datastringResult というラベルが付きます。

プレースホルダーの形式は翻訳者が目にするものであるため、翻訳はプレースホルダーをその言語が必要とする位置へ自由に移動できます。連結ではなくフォーマットを使うべき理由はそこにあります:連結は、最初に書いた言語の語順を固定してしまいます。

対応する値がないプレースホルダーは空文字列として描画され、余った値は無視されます。values に渡された入力がリストでない場合は単一の値として扱われ、空の場合は値なしとして扱われます。

このページの目次