「ゲームをはじめる」を「Start Game」に変えたい。ボタンが1つなら書き換えれば済みますが、会話やアイテム説明まで増えると、言語ごとに画面を作り直すのは大変です。
UE5では、同じTextに言語ごとの訳を用意し、選んだ言語で表示 できます。その準備をする道具がLocalization Dashboardです。文字を集める作業はUEに任せ、訳文は別の一覧で入力します。
この記事でわかること
- 翻訳する表示文字をText型で用意する
- 日本語の原文を収集し、英訳をゲームが読める形にする
- 選択欄で言語を切り替え、次の起動にも設定を残す
- 文字化けや翻訳漏れを、パッケージ版まで確かめる
題材は、開始ボタンと言語選択がある小さなメニューです。BlueprintとUMGの基本操作を使います。ローカライズ は、言語や地域に合わせてゲームの表示などを整えること。今回は、その入口として日本語と英語のテキストを扱います。
TextとString:訳を持たせる文字を分ける
Blueprintで文字を扱うときは、TextとStringの使い分けが大切です。
| 型 | 今回の使い道 |
|---|---|
| Text(C++ではFText) | 「ゲームをはじめる」のように、言語に合わせて変える表示 |
| String(C++ではFString) | 言語コードのen・jaなど、処理に渡す文字 |
Textには、どの原文に対する訳なのかを結び付ける情報 を持たせられます。UMGのText Blockへ原文を入力し、そのTextを翻訳対象として収集するのが、今回の作り方です。

Textにしただけで英訳が生まれるわけではありません。後で原文を収集し、「ゲームをはじめる」に「Start Game」という訳を入力します。Textにも翻訳しない設定があるため、Text型で持つことと、訳が用意されていることは別 です。
一方、実行時にStringで「所持金:」と数値をつなぎ、最後にTextへ変換しても、翻訳との対応は自動では作られません。数値を含む文は、後半のFormat Textで組み立てます。プレイヤー名など、翻訳せずそのまま見せたい文字にはStringからの変換を使えます。
準備:翻訳するメニューを作る
Third PersonのBlueprintプロジェクトを使います。コンテンツブラウザのContent直下に UI フォルダを作り、その中へ「User Interface → Widget Blueprint」で WBP_LanguageMenu を作ります。親はUser Widgetです。
DesignerでCanvas Panelをルートに置き、その子にVertical Boxを置きます。Vertical BoxのCanvasスロットは中央アンカー、Alignment=(0.5, 0.5)、Position=(0, 0)、Size=(480, 260)を目安にします。
Vertical Boxの中へ、上から次の3つを並べます。各スロットのPaddingを8程度にすると、文字の間に余白ができます。
| 部品 | 名前 | 設定 |
|---|---|---|
| Text Block | Text_MenuTitle | Textに「メニュー」、Font Size=32 |
| Button、その子にText Block | Button_Start、Text_Start | Textに「ゲームをはじめる」、Font Size=28 |
| Combo Box (String) | Combo_Language | Is Variableを有効。Default Optionsに「日本語」と「English」。Font Size=24 |

Text BlockのText欄へ直接入力し、Textの詳細を開ける場合は「Localizable」を有効にします。今回はText Bindingを作りません。Combo_LanguageのSelected Optionは空欄にし、後で現在の言語から設定します。
言語選択だけがStringなのは、「日本語」「English」を、どの言語でもこのまま表示する ためです。英語表示の画面でも、自分の読める言語名から戻せます。開始ボタンの文字は翻訳しますが、この2項目は翻訳しません。
WidgetのClass DefaultsでIs Focusableを有効にします。これは、後で入力の受け取り先としてこのWidgetを指定するための設定です。コンパイル・保存したら、現在のレベルも L_LanguageTest という名前で保存します。Level Blueprintに次を作ります。
- Event BeginPlayからCreate Widget(Class=WBP_LanguageMenu)へつなぐ。Owning PlayerにはGet Player Controller(Player Index=0)を渡す。
- Create WidgetのReturn ValueをAdd to ViewportのTargetへ渡し、白い線もつなぐ。
- 続けてSet Input Mode UI Onlyを呼ぶ。Player Controllerは同じGet Player Controller、In Widget to FocusはCreate WidgetのReturn Value。
- 同じPlayer ControllerをTargetに、Set Show Mouse Cursorをtrueにする。

表示のあと、入力の向き先も切り替えます。

図のAは、前の図から続く白い線の目印です。ノードとして作る必要はありません。Get Player Controllerを複数置く場合も、Player Index=0で同じプレイヤーを指定します。
これでメニューをクリックできます。開始ボタンからゲームを始める処理は、この実践には追加しません。画面の出し方を詳しく確認したい場合は、UMGの記事も参照してください。
Dashboard:集めて、訳して、使える形にする
「Tools → Localization Dashboard」を開きます。翻訳は次の3段階で用意します。

| 操作 | 何をするか |
|---|---|
| Gather:収集 | 指定したアセットから、翻訳する原文を集める |
| Translate:翻訳 | 原文に対応する訳文を入力する |
| Compile:変換 | 入力した訳を、ゲームが読み込む.locresファイルにする |
1. Gameターゲットと言語 を設定する
左側のGameターゲットを選びます。ない場合はGame Targetを追加し、名前を Game にします。ターゲット は、まとめて収集・翻訳する文章のグループです。今回は、この1つへメニューの文章を集めます。
| 項目 | 今回の設定 |
|---|---|
| Loading Policy | Game |
| Cultures | Japanese(ja)とEnglish(en)を追加 |
| Native Culture | Japanese(ja)を選ぶ |
Culture(カルチャー) は、言語や地域を表す設定です。今回はjaが日本語、enが英語。Native Cultureは「原文を書く言語」なので、日本語で作ったこのメニューではjaにします。Loading PolicyのGameは、ゲーム実行時にこの翻訳を読み込む指定です。
2. 収集する場所を決める
Gather Textの設定で「Gather from Packages」を有効にします。ここでいうPackagesは、Widgetなどのアセットファイルです。配布用のexeを探す設定ではありません。
- Include Path Wildcardsへ
Content/UI/*を追加する。 - File ExtensionsにWidgetの
.uassetが対象として含まれることを確認する。既定の.umapも残して構いません。 - Exclude Path Wildcardsで、Content/UIが除外されていないことを確認する。

Content/UI/* は、プロジェクトのContent/UI以下を探す指定 です。末尾の * は、その場所にあるファイル名などをまとめて対象にする印です。Widgetを別のフォルダへ置いた場合は、そちらも含めます。会話のData Tableなどへ広げるときも、原文を置いた場所を追加します。
3. 2つの原文を集め、英訳を入力する
WidgetとレベルをSave Allしてから「Gather Text」を実行し、処理が成功したことを確認します。Englishの行の鉛筆アイコンなど、「Edit Translations」を開きます。
翻訳エディタのUntranslatedなどの一覧で原文を探し、次の訳を入力して保存します。
| 日本語の原文 | Englishの訳 |
|---|---|
| メニュー | Menu |
| ゲームをはじめる | Start Game |
ここで、この2文が一覧にあることを確かめてください。 見つからなければ翻訳の前に、Widgetの保存先・収集範囲・TextのLocalizableを見直します。単語数の合計はプロジェクトによって変わるので、件数より実際の原文で確認します。
Dashboardへ戻り「Compile Text」を実行します。ここまで済むと、ゲームが使う英訳が用意できました。新しい文章を足したら保存→Gather→訳の入力→Compileを繰り返します。訳だけを直した場合も、保存後のCompileが必要です。
実践:選んだ言語へ切り替える
Englishを選ぶと、同じメニューの「 ゲームをはじめる」が「Start Game」へ変わります。別の英語用Widgetを作る必要はありません。

言語を変えるノード
使うのは Set Current Culture です。CultureへStringの en または ja を渡します。言語に加えて数値や日付の表し方も変えるノードですが、このメニューでは日本語と英語の切り替えに使います。
Save to Configをtrueにすると、選択をユーザー設定へ保存できます。ゲームの起動時に読み戻せるため、今回は言語専用のSave Gameを作りません。
Return ValueのBooleanは、設定できたかを表します。trueでも、未入力の英訳が作られるわけではありません。 画面に訳が出るかは別に確かめます。
選択イベントをつなぐ
WBP_LanguageMenuにBooleanの bSyncingSelection を作り、初期値をfalseにします。これは後で選択欄を自動で合わせる間、変更イベントから言語の切り替えへ進ませないための印です。
DesignerでCombo_Languageを選び、DetailsのEventsからOn Selection Changedを追加します。白い出力をBranchへ、ConditionをbSyncingSelectionへつなぎます。Trueは何もせず終了。FalseからSwitch on Stringへ進めます。
SwitchのSelectionへ、イベントのSelected Itemを渡します。Switchを選んだDetailsのPin Namesへ「日本語」「English」を追加し、その名前の白い出力を用意します。Defaultは未接続で構いません。

日本語の出力からSet Current Culture(Culture=ja)、Englishから別のSet Current Culture(Culture=en)へつなぎます。どちらもSave to Config=trueです。入力欄に二重引用符は付けず、jaやenだけを入れます。
それぞれの白い出力からBranchへ進み、ConditionにそのノードのReturn Valueを渡します。Trueは終了。FalseではPrint Stringで「言語設定を確認してください」と表示します。失敗時に選択欄を元へ戻す処理は、次の同期関数を使います。

再起動後も、選択欄を現在の言語に合わせる
英語の設定が保存されているのに、選択欄だけ「日本語」では戸惑います。メニューを開いたときは、現在の言語を読んで選択欄を合わせる ようにします。
WBP_LanguageMenuに関数 SyncLanguageSelection を作ります。入力・出力なし、Pureは無効です。
- 入口からSet bSyncingSelection=trueへつなぐ。
- Get Current LanguageのString出力をStarts WithのSource Stringへ渡す。In Prefixはenにする。
- そのBooleanをSelect StringのPick Aへ渡す。A=English、B=日本語とする。
- 白い線をSet Selected Option(Target=Combo_Language)へ進め、OptionへSelect Stringの出力を渡す。
- 最後にSet bSyncingSelection=falseへつなぐ。

Get Current Language・Starts With・Select Stringは値を返すノードで、白い線はつなぎません。Starts Withは「先頭がその文字か」を調べます。en-USなどの地域付き英語もEnglishへ合わせ、それ以外は今回の原文言語である日本語へ合わせます。この対応は、jaとenだけを用意した実践用です。
WidgetのEvent ConstructからSyncLanguageSelection(Target=Self)を呼びます。Selfは、この処理を書いているWidget自身です。先ほどのSet Current Cultureが失敗した枝でも、Print Stringの後にこの関数を呼びます。
Set Selected Optionによって選択変更イベントが起きても、同期中は最初のBranchで止まります。選択欄を表示に合わせる処理で、保存済みの言語を上書きしない ための仕組みです。
フォントと文字の収まりを確かめる
「Start Game」は読めるのに、日本語が □ になることがあります。これは訳文の有無とは別の問題で、使用しているフォントに必要な グリフ(文字の字形) がない場合に起きます。
UEには、文字に応じて別のフォントを使う仕組みもあります。Robotoという名前だけで必ず日本語が出ないと決めず、実際 に使うFontとその代替設定を確認します。配布するUIでは、日本語を含むFontを明示しておくと確認しやすくなります。

日本語の字形を含み、ゲームで使用できるTTFまたはOTFフォントを用意します。コンテンツブラウザへインポートし、Font FaceとFontを作る確認では作成を選びます。
Font Faceは字形データ、FontはUIに指定するためのアセット です。Text_MenuTitleとText_Startの「Appearance → Font」で作成したFontを選び、Regularなど使用する書体も指定します。Combo_LanguageのFontにも同じものを設定し、「日本語」の項目を読めるようにします。Font Faceしか作っていない場合は、「User Interface → Font」を作り、そのDefault Font FamilyへFont Faceを割り当てます。
英語がボタンからはみ出す場合は、文字を小さくする前に幅やPaddingを見直します。説明文なら、幅を決めたうえでAuto Wrap Textを使うと折り返せます。「英語は必ず長い」と決めず、両言語の実際の文で、欠けや改行を確認 します。
確認:Standaloneからパッケージ版へ
全ア セットをコンパイル・保存し、DashboardのCompile Textも済ませます。Playメニューで Standalone Game を選び、別ウィンドウでメニューを開きます。
エディタ内のPIEには翻訳プレビューがあり、実行時の言語設定と完全には同じではありません。今回の切り替えと保存の確認にはStandaloneを使い、最後に配布用のパッケージでも試します。
| 操作 | 期待する結果 |
|---|---|
| 日本語を選ぶ | メニュー/ゲームをはじめる |
| Englishを選ぶ | Menu/Start Game |
| 日本語へ戻す | 元の日本語が読める。四角や文字欠けがない |
| Englishを選び、終了して再起動 | 英語で開き、選択欄もEnglish |
エディタのPreview Game Languageや起動引数で言語を指定していると、再起動時の結果へ影響します。保存の確認では、テスト用の言語固定を外して起動 してください。
配布物に、翻訳と対応言語のデータを含める
「Project Settings → Packaging」で、次を確認します。検索欄を使うか、詳細項目を展開すると見つけやすくなります。
| 項目 | 今回の設定・役割 |
|---|---|
| Localizations to Package | jaとen。収録する翻訳を選ぶ |
| Internationalization Support | EFIGSCJK。日本語と英語を含む、言語処理用のデータを入れる |
| Build Configuration | Development。確認用のビルド |
翻訳の文章と、言語を扱うためのデータは別 なので、両方を含めます。L_LanguageTestをGame Default Mapに設定し、必要ならパッケージ対象のマップ一覧にも追加します。

パッケージングの記事に沿ってWindows向けにビルドし、できたexeを起動します。先ほどの4項目をもう一度確かめてください。翻訳を修正した後は、Compile Textを済ませてからパッケージも作り直します。
起動する言語だけを指定したい場合は、exeのショートカットのリンク先で、引用符で囲まれたexeのパスの後ろに半角スペースと -culture=en を付けます。日本語なら -culture=ja です。これは起動時の表示を調べるための指定で、保存確認のときは外します。
変わらない場所を順に調べる
| 症状 | 確認するところ |
|---|---|
| 原文が翻訳一覧にない | Save All、Content/UIの収集指定、除外、Localizable |
| 一部だけ日本語 | その原文の英訳、変更後のCompile、Stringから作っていないか |
| 全体が日本語のまま | 選択イベント、Cultureのen、Loading Policy=Game、Compile |
| Set Current Cultureがfalse | コードの誤字、パッケージのInternationalization Support |
| 日本語が四角 | Text BlockとCombo BoxのFont、必要な字形、パッケージへの収録 |
| 再起動すると元へ戻る | Save to Config、起動時の言語固定、別の初期化処理による上書き |
| exeだけ翻訳が出ない | Localizations to Package、翻 訳のCompile、再パッケージ |
おまけ:数値を混ぜた文も翻訳する
「所持金:100」のような表示では、文と数値を Format Text で組み合わせます。{Gold} のような印を、値を入れる場所として残す方法です。この印をプレースホルダーと呼びます。
| 原文のFormat | 英訳のFormat |
|---|---|
所持金:{Gold} | Gold: {Gold} |

WBP_LanguageMenuのVertical BoxへText Blockを足して Text_Gold と名付け、Is Variableを有効にします。先ほどの日本語を描けるFontも指定し、収まらなければVertical Boxの高さを広げます。ConstructでSyncLanguageSelectionを呼んだ後、SetText(Target=Text_Gold)へつなぎます。In TextにはFormat Textの出力を渡します。
Format欄へ 所持金:{Gold} と直接入力するとGoldピンが現れます。Make Literal IntのValueを100にし、その出力をGoldへ渡します。保存→Gatherでこの原文を集め、英訳 Gold: {Gold} を入力し、Compileします。{Gold} は訳さず、同じ名前を残してください。
Standaloneで切り替えると、所持金:100とGold: 100を確認できます。Format Textの結果はTextのままSetTextへ渡し、途中でStringに変換しません。数値がゲーム中に増えたときは、新しい値でFormat Textを作り直してSetTextします。
この形なら、訳文の 中で数値の置き場所が変わっても対応できます。複数形などの言語別ルールもUEで扱えますが、まずはこの1文を切り替え、文章と値を分ける感覚をつかむと進めやすくなります。
翻訳を人へ渡す場合は、DashboardからPOファイルを書き出せます。POは原文と訳文をやり取りする形式 です。訳が戻ったら取り込み、内容を確認してCompileします。原文を後から直した場合も、訳が古い内容のままになっていないか確認してください。
メニューで一周できたら、会話文やアイテム説明へ対象を広げられます。「表示する文章を用意する」「訳を持たせる」「ゲームで確かめる」という手順は同じです。
まとめ
- 訳を持たせる文字はText型、内部で使う文字はStringと分ける
- Dashboardは「集める → 訳す → 使える形にする」の3工程
- 選んだ言語は保存して、次の起動でも合わせる
- 文字化けと収まりは、パッケージ版まで確かめる
書くときの問いかけは、「この文字は画面に出るか」 です。出るならTextにしておきます。
数値を混ぜた文の扱いは本記事のおまけに、設定を残す仕組みは 設定メニュー にあります。
参考:Localization Tools、Text Localization、Cultureとプレビュー、フォントの作成。