3
Help us understand the problem. What are the problem?

posted at

updated at

UE4 ローカライゼーションダッシュボードを試してみる

概要

UnrealEngineでのローカライズツールであるローカライゼーションダッシュボードを試したメモです。

更新履歴

日付 内容
2022/04/04 UKismetInternationalizationLibrary について追記

環境

Windows10
Visual Studio 2017
UnrealEngine 4.25, 4.26

参考

UE4公式 : ローカライゼーション
UE4公式 : ローカライゼーションツール
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
ローカライゼーションのCommandlet紹介
[UE4]翻訳テキストデータ(Portable Object)について

実装準備

ストリングテーブルを用意する

新規アセットからストリングテーブルを作成します。
create_stringtable.jpg

ストリングテーブルの キー はローカライズ文字列のID、 ソースストリング は翻訳対象の文字列を指し示すタグとして扱われます。
StringTable.jpg

ローカライゼーションダッシュボードの設定

UEエディタの[ウィンドウ]->[ローカライゼーションダッシュボード]を選択します。

テキストを収集 は先ほどのストリングテーブルが入るように設定します。
LDB_Setting_TextGather.jpg

カルチャはデフォルト言語(ネイティブ)をen-AU(英語-オーストラリア)にし、翻訳言語をen(英語)ja(日本語)de(ドイツ語)とします。
LDB_Setting_Culture.jpg

ここでデフォルト言語(ネイティブ)は使用しない言語にしたほうがいいです。

ローカライゼーションダッシュボードでの作業

テキストを収集する

[カルチャ] -> [テキストを収集する]を押下するとストリングテーブルのデータを収集します。
LDB_TextGather.jpg

ワード数がストリングテーブルの数と一致します。
この状態で英語(オーストラリア)の「このカルチャーの翻訳を編集」でエディタを開くと以下の様に取り込まれているのが確認できます。

LDB_Editor_en-AU.jpg

この時、デフォルト言語以外は未翻訳状態でタグだけ表示されている状態となります。

LDB_Editor_ja.jpg

翻訳作業1(エディタで直接編集)

通常は .poファイルや翻訳サービスから翻訳データをインポートしますが、ここではエディタで直接編集してみます。
各翻訳言語の未翻訳のTranslationを直接編集し、再度エディタで確認するとこのようになります。

LDB_Translation.png

デフォルト言語(en-AU)の Translation が翻訳言語(ja,en,de)の Source になり、各翻訳言語の Translation が実際翻訳された文字列となります。

上記では変えていますが、デフォルト言語のSourceTranslateと翻訳言語のSourceを3つとも同じにしてみて試してみましたが特に問題ありませんでした。途中で翻訳データを一部変更をしない場合(毎回テキスト収集からやる場合)は問題ないと思われます。(検証不十分)

この時点で Content/Localization フォルダに各言語の翻訳データがはいったjson形式のファイル .archive が作成されています。
LocalizationFolder.jpg

中身は以下のような感じになっています。

jp/Game.archive
{
	"FormatVersion": 2,
	"Namespace": "",
	"Subnamespaces": [
		{
			"Namespace": "ST_MessageInfo",
			"Children": [
				{
					"Source":
					{
						"Text": "Str000Tag"
					},
					"Translation":
					{
						"Text": "こんにちは"
					},
					"Key": "Str000"
				},
				{
					"Source":
					{
						"Text": "Str001Tag"
					},
					"Translation":
					{
						"Text": "りんご"
					},
					"Key": "Str001"
				},
				{
					"Source":
					{
						"Text": "Str002Tag"
					},
					"Translation":
					{
						"Text": "いち、に、さん"
					},
					"Key": "Str002"
				},
				{
					"Source":
					{
						"Text": "Str003Tag"
					},
					"Translation":
					{
						"Text": "2020年12月31日"
					},
					"Key": "Str003"
				}
			]
		}
	]
}

翻訳作業2(.poファイルからのインポート)

各言語フォルダ(Localization/Game/ja など) に .poファイルを置いてテキストをインポートすることでも翻訳データを取り込むことができます。

■デフォルト言語(en-AU)のpoファイル

en-AU/Game.po
# Game English (Australia) translation.
# Copyright Epic Games, Inc. All Rights Reserved.
# 
msgid ""
msgstr ""
"Project-Id-Version: Game\n"
"POT-Creation-Date: 2020-12-17 05:59\n"
"PO-Revision-Date: 2020-12-17 05:59\n"
"Language-Team: \n"
"Language: en-AU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. Key:	Str000
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str000"
msgid "Str000Tag"
msgstr "Str000Tag"

#. Key:	Str001
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str001"
msgid "Str001Tag"
msgstr "Str001Tag"

#. Key:	Str002
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str002"
msgid "Str002Tag"
msgstr "Str002Tag"

#. Key:	Str003
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str003"
msgid "Str003Tag"
msgstr "Str003Tag"

■翻訳言語(ja)のpoファイル

ja/Game.po
# Game Japanese translation.
# Copyright Epic Games, Inc. All Rights Reserved.
# 
msgid ""
msgstr ""
"Project-Id-Version: Game\n"
"POT-Creation-Date: 2020-12-17 05:59\n"
"PO-Revision-Date: 2020-12-17 05:59\n"
"Language-Team: \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. Key:	Str000
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str000"
msgid "Str000Tag"
msgstr "こんにちは"

#. Key:	Str001
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str001"
msgid "Str001Tag"
msgstr "りんご"

#. Key:	Str002
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str002"
msgid "Str002Tag"
msgstr "いち、に、さん"

#. Key:	Str003
#. SourceLocation:	/Game/ST_MessageInfo.ST_MessageInfo
#: /Game/ST_MessageInfo.ST_MessageInfo
msgctxt "ST_MessageInfo,Str003"
msgid "Str003Tag"
msgstr "2020年12月31日"

このpoファイルの作成はPoeditというツールなどで作成することができます。(テキストなので自前で作成も可能です。)

poファイルの取り込みはローカライゼーションダッシュボードにて、[カルチャ] -> [テキストインポート] から行うことができます。(個別の言語で行う場合は右の小さいボタンで)
TextImport.jpg

テキストをコンパイル

ローカライゼーションダッシュボードにて、[カルチャ] -> [テキストをコンパイル] で最終データ(.locres)を出力できます。

翻訳テキストの出力

カルチャの確認

以下のBPで現在のカルチャとネイティブカルチャを確認することができます。
GetCultureBP.jpg

実行結果は以下の様になります。
GetCultureResult.jpg

C++では以下のようになります。

カルチャの確認
#include "Kismet/KismetInternationalizationLibrary.h"

auto _Culture = UKismetInternationalizationLibrary::GetCurrentCulture();
auto _Native = UKismetInternationalizationLibrary::GetNativeCulture(ELocalizedTextSourceCategory::Game);

関連コード

"Engine\Source\Runtime\Engine\Classes\Kismet\KismetInternationalizationLibrary.h"

エディタの言語は
[編集] -> [エディタの環境設定] -> [一般-地域&言語] -> [国際化] -> [ゲームのプレビュー言語] で切り替えることができます。
EditorSetting.jpg

BPでの翻訳テキストの表示

以下BPで翻訳テキストの出力ができます。
PrintTextBP.jpg

実行結果は以下の様になります。
PrintTextResult.jpg

c++での翻訳テキストの表示

マクロ LOCTEXTで、キーとソース文字列を指定します。ネームスペースを含む場合はNSLOCTEXTを使います。
以下サンプルコード

.cpp
#define LOCTEXT_NAMESPACE "ST_MessageInfo"

void Sample()
{
	FText _Text0 = LOCTEXT("Str000", "Str000Tag");
	UE_LOG(LogTemp, Log, TEXT("%s"), *_Text0.ToString() );
			
	FText _Text1 = LOCTEXT("Str001", "Str001Tag");
	UE_LOG(LogTemp, Log, TEXT("%s"), *_Text1.ToString() );
			
	FText _Text2 = LOCTEXT("Str002", "Str002Tag");
	UE_LOG(LogTemp, Log, TEXT("%s"), *_Text2.ToString() );
			
	FText _Text3 = LOCTEXT("Str003", "Str003Tag");
	UE_LOG(LogTemp, Log, TEXT("%s"), *_Text3.ToString() );
}

#undef LOCTEXT_NAMESPACE

実行結果は以下の様になります。

アウトプットログ
LogTemp: こんにちは
LogTemp: りんご
LogTemp: いち、に、さん
LogTemp: 2020年12月31日

パッケージ化設定

パッケージに翻訳データを含む場合は以下の設定に対応言語を設定する必要があります。
[プロジェクト設定] -> [プロジェクト - パッケージ化] -> [パッケージ化するローカライゼーション] 

PackageSetting.jpg

その他

ローカライゼーションダッシュボード用コマンドレットについて

ローカライゼーションダッシュボード用のコマンドレットで、GatherTextCommandlet が用意されています。
"Engine\Source\Editor\UnrealEd\Classes\Commandlets\GatherTextCommandlet.h"

これを使用することでGUIエディタを立ち上げずにコマンドラインで[テキストコンパイル]等ができます。ローカライズ用iniファイルを指定する必要があります。
以下コマンド例:

コマンド実行例
# テキストを収集
>{エンジンパス}\Binaries\Win64\UE4Editor-Cmd.exe {プロジェクトパス}\MyProject.uproject -run=GatherText -config=Config\Localization\Game_Gather.ini

# テキストをインポート
>{エンジンパス}\Binaries\Win64\UE4Editor-Cmd.exe {プロジェクトパス}\MyProject.uproject -run=GatherText -config=Config\Localization\Game_Import.ini

# テキストをコンパイル
>{エンジンパス}\Binaries\Win64\UE4Editor-Cmd.exe {プロジェクトパス}\MyProject.uproject -run=GatherText -config=Config\Localization\Game_Compile.ini

その他、テキスト収集用のコマンドレットが対象別で用意されているようです。GatherTextFromAssetsCommandlet
GatherTextFromMetadataCommandlet
GatherTextFromSourceCommandlet

▼ストリングテーブルをコマンドレットでインポート/エクスポートするには以下を参考に。

まとめ

バージョン4.25.4の時点では実験段階扱いになっていますが、マニュアルでは
「このツールはまだ実験段階のものですが、安定して機能しており、社内のすべてのプロジェクトで使用されています。」
となっています。
翻訳エディタなどはまだ扱いにくい感じですので早く正式リリースになってもらいたいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?