テキスト ローカライゼーション

このページでは、テキスト リテラル、テキスト フォーマット、テキスト生成、文字列テーブル、その他のトピックを含む、テキストのローカライズに関する必要な情報をまとめています。

Text (テキスト) は、Unreal Engine (UE) のローカライゼーションにおける主要なコンポーネントです。これは C++ では、[`FText`] 型で表される特別な文字列です。これは、ユーザー向けにテキストをローカライズする必要があるときに使用します。

内部的には、FTextTSharedRef として ITextData に実装されています。 これにより非常に低コストでコピーが可能となり、FTextSnapshot ユーティリティを使用して、キャッシュされた FText 値が実際に変更されたかどうかを効率的に検出することができます。

FText インスタンス内に保持されているデータは、FText の作成方法によって異なります。この違いは、内部の「テキスト履歴」(FTextHistory) で処理されます。テキスト履歴は、カルチャに合ったテキストの再ビルドをサポートし、以下の主要なコンポーネントで構成されます。

  • カルチャのライブへの切り替え。

  • ネットワークを介した FText の転送。

  • カルチャ関連のソース作成。

FText から FString への変換は、テキスト履歴を失うため、通常は損失の多い操作となります。これは、ローカライゼーション データが不要になった場合にのみ実行してください。たとえば、文字列を処理する低レベルの API がある場合、テキストの変更を監視する高レベルの API (StxtBlock など) によって管理されます。この変換は、文字列のみを受け入れる外部 API にデータを渡すときにも使用できます。

ローカライズができないテキスト (たとえば、外部 API のプレーヤ名を UI に表示できる形式に変換したテキストなど) が必要な場合は、FText::AsCultureInvariant を使用して、ローカライゼーション データを含まない (そして、ローカライズができない) [ インスタンスを作成します。INVTEXT マクロで文字列リテラルに対して同様の操作を実行することができます。

テキスト リテラル

ローカライズ可能なテキストは、名前空間キー (これは、そのアイデンティティを形成します)、そして**ソース文字列** (これが翻訳された内容をもとに、「古い」翻訳の検証として機能します) の 3 つのコンポーネントから構成されています。UE4 でローカライズ可能なテキストを作成する最も一般的な方法は、テキスト リテラルを使用することです。

C++ でテキスト リテラルを作成する

LOCTEXT ファミリーのマクロを使用すると、 C++ でテキスト リテラルを作成できます。

テキスト リテラル マクロ

マクロ

説明

NSLOCTEXT

名前空間、キー、およびソース文字列を定義して、ローカライズされたテキストを作成します。

LOCTEXT

キーとソース文字列を定義してローカライズされたテキストを作成し、LOCTEXT_NAMESPACE を使用して名前空間を定義します。

例:

    // LOCTEXT を使って使用する名前空間を定義します
    // これは1つのファイル内でのみ有効であり、ファイル終了の前は未定義でなければなりません
    #define LOCTEXT_NAMESPACE "MyNamespace"
    // テキスト リテラルを作成します
    constFTextHelloWorld= NSLOCTEXT("MyOtherNamespace","HelloWorld","Hello World!")
    constFTextGoodbyeWorld= LOCTEXT("GoodbyeWorld","Goodbye World!")
    // ファイル終了の前の名前区間を未定義にします
    #undef LOCTEXT_NAMESPACE

INI ファイルでテキスト リテラルを作成する

NSLOCTEXT マクロを使用すると、 INI ファイルでテキスト リテラルを作成できます。

アセットでテキスト リテラルを作成する

`FText`プロパティを使用して、 テキスト リテラルを作成できます。 キーは自動的に生成されますが、テキスト フィールドの横にある詳細コンボボックスを使用して、テキストのカスタム名前空間またはキーを定義できます。デフォルトの名前空間またはキーを使用することもできます。

テキスト フォーマット

テキスト フォーマットは、実際のテキストを挿入してフォーマット プレース ホルダを置き換えるローカライズ可能なフォーマット パターンを使用してテキストを組み合わせることで、ローカライズを容易にします。

フォーマット プレース ホルダは一対の中括弧で囲まれ、数字 (インデックス ベースのフォーマットの場合) または文字列 (名前ベースのフォーマットの場合) を指定できます。例:

"You have {0} health left." "You have {CurrentHealth} health left."

フォーマット プレース ホルダは、引数データに対して実行する関数 (「引数修飾子」と呼ばれています) を指定することもできます。これらは、パイプの後に関数名と引数が続く形で指定されます。例:

"{NumCats} {NumCats}|plural(one=cat,other=cats)"

バックティック (`) 文字は、フォーマッティング マークアップとして処理されることを避けるために丸括弧とパイプをエスケープします。また、リテラル ` 文字を生成することをエスケープするために使用することもできます。

例: 以下の表は Res の値が 10 の整数であることを前提としています。

Input

Formatted Text Result

    Result `{ {Res} }
Result { 10 }
    Result \`\`{Res}\`\`  
    Result \`10\`

C++ によるテキスト フォーマット化

C++ によるテキストフォーマット化は、 FText::Format ファミリーの関数によって処理されます。各関数は、FText インスタンスから暗黙的に構成された FTextFormat パターンを受け取り、以下の表で定義されます。

引数

フォーマット タイプ

説明

FText::Format

一般的なテキスト フォーマット化です。

インデックス ベースの引数 (FFormatOrderedArguments または、可変引数を使用) または、名前ベースの引数 (FFormatNamedArguments を用いて) を使用できます。

FText::FormatOrdered

可変長インデックス ベースのフォーマット化です。

FFormatArgumentValue が構成できるすべての引数を受け取ります。

FText::FormatNamed

可変長名前ベースのフォーマット化です。

連続した名前 (FString の作成に使用できる任意の名前) を受け取り、引数の値 (FFormatArgumentValue の作成に使用できる任意の名前) を割り当てます。

頻繁に使用するフォーマット パターンを FTextFormat にプリコンパイルしておけば、フォーマット化のパフォーマンスが向上します。アクティブなカルチャが変更されると、コンパイルされたパターンは自動的に再コンパイルされます。

ブループリントによるテキスト フォーマット化

ブループリントによるテキスト フォーマット化は、Format Text ノードによって処理されます。このノードは、リテラル フォーマット パターンや、別のテキスト ピンに接続されたパターンを使用することもできます。

  • リテラル フォーマット パターンを指定すると、Format 引数のピンが自動的に生成されます。 TextFormat-Blueprints-01.png

  • フォーマット パターンが別のテキスト ピンに接続されている場合、ノードの [Details (詳細)] パネルを使用してフォーマットの引数を手動で指定する必要があります。 TextFormat-Blueprints-02.png

引数修飾子

引数修飾子を使用すると、フォーマット化された文字列に引数が追加される前に、引数を前処理できます。引数修飾子は拡張可能です。引数修飾子を作成するには、ITextFormatArgumentModifier インターフェースを実装し、特定のキーワード (FTextFormatter::RegisterTextArgumentModifier を参照してください) に対してファクトリ関数を登録します。

UE4 には、デフォルトでいくつかの引数修飾子が用意されており、複数形、性別、ハングルの助詞に対応した修飾子があります。

複数用フォーム

複数形では、テキスト フォーマットに指定された数値変数に基づいて異なるテキストを使用できます。複数形は、基数詞 (「4 匹の猫がいます」や「猫が 1 匹います」など) または序数詞 (「2 位でしたね!」や「1 着でした!」など) でも使用できます。複数形は、キーと値のペアとして指定され、0、1、2、少数、多数、その他のいずれかの (カルチャ用に CLDR データに定義されている) キーワードをサポートします。値は、オプションで引用符で囲まれた文字列で、フォーマット マーカーを含めることもできます。

基数詞フォーマットの例:

    "There {NumCats}|plural(one=is,other=are) {NumCats} {NumCats}|plural(one=cat,other=cats)"

序数詞フォーマットの例:

    "You came {Place}{Place}|ordinal(one=st,two=nd,few=rd,other=th)!"

性別用フォーマット

性別フォーマットでは、テキスト フォーマットに指定された ETextGender や「La guerrière est fort」などの値に基づいて異なるテキストを使用できます。性別フォーマットでは、[男性、女性、中性]の順序で値のリストとして指定します。ここで、中性はオプションです。 値は、オプションの引用符付き文字列で、フォーマット マーカーを含めることもできます。値は、オプションの引用符付き文字列で、フォーマット マーカーを含めることもできます。

フォーマットの例:

    "{Gender}|gender(Le,La) {Gender}|gender(guerrier,guerrière) est {Gender}|gender(fort,forte)"

ハングル文字の助詞用フォーム:

ハングルの助詞を使用すると、韓国語の文法ルールに従い、挿入される値の終わりが子音か母音かに基づいて適切な文字が挿入されます。 例えば、 "사람은" や "사자는" となります。ハングルの助詞は、[子音、母音]の順序で値のリストとして指定されます。値は、オプションの引用符付き文字列です。

フォーマットの例:

    "{Arg}|hpp(은,는)"

テキスト フォーマット化のベスト プラクティス

  • 文に影響を与える数値を入力するときは、コードを分岐させるより、複数形引数修飾子を使ってこれらの差異を処理してください。複数形を使用した場合、ソース言語の複数形の規則が同じでない言語でも正しく翻訳することができます。

  • 人称名詞を挿入するときは、その人の性別を示す引数を必ず含めてください。 これは、文法上の規則で性別が指定されている言語を使用するときに、翻訳者が性別に基づいて翻訳を切り替えることができるようになるため重要です ([「Gender Forms」[を参照してください)。

  • オブジェクト (たとえば、「テーブル」、「ドア」、「椅子」など) に名詞を挿入することは避けるか、ローカライズが可能な名前にする必要があります。これらの名詞は、ある言語では 1 つの性別を持ち、別の言語では別の性別を持つ場合があります。そのため、カルチャごとのメタデータがなければ、フォーマット パターン ストリングを正確にローカライズすることはできません。理想的には、名詞だけではなく全文を含める必要があります。これにより、正確な翻訳が保証されます。

    UE4 の将来のリリースには、メタデータを使用して名詞を表すテキストにタグを付け、フォーマット パターンに分岐して正確な翻訳を生成できる機能が含まれる予定です。

  • 部分的な文の結合は避ける必要があります。これにより、各句または部分が正しく変換されても、全体が正しく変換されない可能性があるため、問題が発生することがあります。正確な翻訳ができるように、テキストを完全な文に書き換えることをお勧めします。

テキスト生成

テキスト生成は、国際化データを使用してローカライズに直接依存しないカルチャに合ったテキストを生成します。テキスト生成には、数値、時系列、およびトランスフォーマティブの 3 種類があります。

数字からのテキストの生成

数値生成は、数値型を人間が読みやすいテキスト表現に変換するために使用します。この変換はカルチャ固有の規則に基づいていますが、特定の制御が必要なときには、世代ごとに調整することもできます。

たとえば、デフォルトの生成規則において、浮動小数点数「1234.5」は、英語の場合 「1,234.5」、フランス語では「1 234,5」、そしてアラビア語では 「١٬٢٣٤٫٥」として生成されます。

C++ による数字からのテキストの生成

C++ による数値生成は、以下の関数によって処理されます。

関数

説明

FText::AsNumber

UE でサポートされている任意の数値型を使いやすいテキスト表現に変換します (「1234.5」は、「1,234.5」になります)。

FText::AsPercent

float または double をパーセント テキスト表現に変換します (「0.2」は、20%になります)。

FText::AsMemory

値 (バイト単位) を使いやすいメモリ表現 (「1234」は、「1.2 KiB」になります) に変換します。

FText::AsCurrencyBase

通貨の基本表示の値を、使いやすい通貨表現 (「米ドル」の「1234.50」は、「$1,234.50」になります) に変換します。

表中のほとんどの関数は、出力を制御するためにオプションの [FNumberFormattingOptions](https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FNumberFormattingOptions/index.html) とカルチャ (デフォルトはアクティブなロケールです) を使用します。

ブループリントによる数値生成

ブループリントによる数値生成は、以下の関数によって処理されます。

ノード

説明

ToText (byte), ToText (integer), ToText (float)

サポートされている任意の数値型を使いやすいテキスト表現に変換します (「1234.5」は、「1,234.5」になります)。

AsPercent

float または double をパーセント テキスト表現に変換します (「0.2」は、20%になります)。

AsCurrency

通貨の基本表示の値を、使いやすい通貨表現 (「米ドル」の「1234.50」は、「$1,234.50」になります) に変換します。

テーブル内のほとんどのノードは、拡張パラメータを使用して出力を制御します。

日時からのテキストの生成

時系列生成は、日時型を人間が読みやすいテキスト表現に変換するために使用されます。この変換はカルチャ固有の規則に基づいていますが、特定の制御が必要なときには、生成ごとに日付 / 時間のスタイルを調整することもできます。

デフォルトの生成規則では、1998年の 5 番目の月の 22日を表す日付は、英語 (米国) の場合は「May 22, 1998」、英語 (イギリス) の場合は「22 May 1998」、フランス語の場合は「22 mai 1998」、アラビア語の場合は「٢٢‏/٠٥‏/١٩٩٨」を生成します。

C++ による日時からのテキストの生成

C++ による字形レス生成は、以下の関数によって処理されます。

関数

説明

FText::AsDate

FDateTime 値を使いやすい日付表現に変換します。

FText::AsTime

FDateTime 値を使いやすい時間表現に変換します。

FText::AsDateTime

FDateTime 値を使いやすい日時表現に変換します。

FText::AsTimespan

FTimespan 値を使いやすいデルタタイム表現 (時間、分、秒) に変換します。

上記のほとんどは、EDateTimeStyle を使って出力を制御しています (デフォルトではアクティブなロケールから取得されますが、「short」、「medium」、「long」、または、「full」に設定できます)。

時間生成は、デフォルトで UTC ベースの時間が与えられることを想定しています (ローカル タイムゾーンに変換されます)。与えられた時間が UTC ベースではない (たとえば、ローカル時間を使用している場合) 場合は、タイムゾーン引数として [FText::GetInvariantTimeZone](https://api.unrealengine.com/INT/API/Runtime/Core/Internationalization/FText/GetInvariantTimeZone/index.html) を渡す必要があります。

ブループリントによる日時からのテキストの生成

ブループリントによる時系列生成は、以下のノードによって処理されます。

ノード

説明

AsDate

UTC をベースとしない「日時」値を、使いやすい日付表現 (ローカル タイムゾーンに調整することなく) に変換します。

AsDate (from UTC)

UTC ベースの「日時」値を、使いやすい日付表現 (ローカル タイムゾーンに調整して) に変換します。

AsTime

UTC をベースとしない「日時」値を、使いやすい時刻表現 (ローカル タイムゾーンに調整することなく) に変換します。

AsTime (from UTC)

UTC ベースの「日時」値を、使いやすい時刻表現 (ローカル タイムゾーンに調整して) に変換します。

AsDateTime

UTC をベースとしない「日時」値を、使いやすい日時表現 (ローカル タイムゾーンに調整することなく) に変換します。

AsDateTime (from UTC)

UTC ベースの「日時」値を、使いやすい日時表現 (ローカル タイムゾーンに調整して) に変換します。

AsTimespan

「タイムスパン」値を使いやすいデルタタイム表現 (時間、分、秒) に変換します。

派生テキスト生成

派生テキスト生成は、テキストを他の表現に変換するために使用します。たとえば、小文字のテキストを大文字のテキストに変換したり、大文字のテキストを小文字のテキストに変換することができます。

C++ による派生テキスト生成

C++ による派生テキスト生成は、以下の関数によって処理されます。

関数

説明

FText::ToLower

'FText' インスタンスを Unicode に準拠した方法で小文字に変換します。

FText::ToUpper

'FText' インスタンスを Unicode に準拠した方法で大文字に変換します。

ブループリントによる派生テキスト生成

ブループリントによる派生テキスト生成は、以下のノードによって処理されます。

ノード

説明

Text to Lower

「Text (テキスト)」インスタンスを Unicode に準拠した方法で小文字に変換します。

Text to Upper

「Text (テキスト)」インスタンスを Unicode に準拠した方法で大文字に変換します。

文字列テーブル

文字列テーブル は、ローカライズしたテキストをひとつ (または複数) の決まった場所にまとめます。次に他のアセットまたはコードから文字列テーブル内のエントリを参照し、ローカライズしたテキストを簡単に再利用できるようにします。

文字列テーブルは C++ で定義し、CSV ファイルで読み込むか、アセットとして作成します。詳細は、「文字列テーブル」を参照してください。

テキスト値のマーシャリング

テキスト値は、文字列として可逆的にマーシャリングできます (FTextStringHelper、または ImportTextExportTextUTextProperty 関数を使用します)。

サポートされているフォーマットは、以下の通りです。

テキスト リテラル

説明

NSLOCTEXT

名前空間、キー、およびソース文字列を指定するテキスト リテラルです。

LOCTEXT

キーとソース文字列を指定するテキスト リテラルです。

LOCTABLE

文字列テーブルのリファレンスです。

INVTEXT

カルチャごとに不変のテキスト (FText::AsCultureInvariant を参照してください) です。

LOCGEN_NUMBER

数値から生成されたテキストです (FText::AsNumber を参照してください)。

LOCGEN_NUMBER_GROUPED

グループ化が有効になっている数値から生成されたテキスト (FText::AsNumberFNumberFormattingOptions::DefaultWithGrouping を参照してください) です。

LOCGEN_NUMBER_UNGROUPED

グループ化が無効になっている数値から生成されたテキスト (FText::AsNumberFNumberFormattingOptions::DefaultNoGrouping を参照してください) です。

LOCGEN_NUMBER_CUSTOM

カスタム フォーマット設定オプションを使用して数値から生成されたテキスト (FText::AsNumber」 と FNumberFormattingOptions を参照してください) です。

LOCGEN_PERCENT

数値からパーセンテージとして生成されたテキスト (FText::AsPercent を参照してください) です。

LOCGEN_PERCENT_GROUPED

グループ化が有効になっている数値からパーセンテージとして生成されたテキスト (FText::AsPercent、と FNumberFormattingOptions::DefaultWithGrouping を参照してください) です。

LOCGEN_PERCENT_UNGROUPED

グループ化が無効になっている数値からパーセンテージとして生成されたテキスト (FText::AsPercent、と FNumberFormattingOptions::DefaultNoGrouping を参照してください) です。

LOCGEN_PERCENT_CUSTOM

カスタム フォーマット設定オプションを使用して数値からパーセンテージとして生成されたテキスト (FText::AsPercentFNumberFormattingOptions を参照してください) です。

LOCGEN_CURRENCY

数値から通貨として生成されたテキスト (FText::AsCurrencyBase を参照してください) です。

LOCGEN_DATE_UTC

UTC 日付から生成されたテキストで、指定されたタイムゾーンまたはローカル タイムゾーンに調整されたものです (FText::AsDate を参照してください)。

LOCGEN_DATE_LOCAL

非 UTC 日付からタイムゾーンの調整なしで生成されたテキストです (FText::AsDate を参照してください)。

LOCGEN_TIME_UTC

UTC 日付から生成されたテキストで、指定されたタイムゾーンまたはローカル タイムゾーンに調整されたものです (FText::AsTime を参照してください)。

LOCGEN_TIME_LOCAL

非 UTC 時刻からタイムゾーンの調整なしで生成されたテキストです (FText::AsTime を参照してください)。

LOCGEN_DATETIME_UTC

UTC 日時から生成されたテキストで、指定されたタイムゾーンまたはローカル タイムゾーンに調整されたものです (FText::AsDateTime を参照してください)。

LOCGEN_DATETIME_LOCAL

非 UTC 日時からタイムゾーンの調整なしで生成されたテキストです (FText::AsDateTime を参照してください)。

LOCGEN_TOLOWER

Unicode に準拠した方法で小文字に変換されたテキストです (FText::ToLower を参照してください)。

LOCGEN_TOUPPER

Unicode に準拠した方法で大文字に変換されたテキストです (FText::ToUpper を参照してください)。

LOCGEN_FORMAT_ORDERED

フォーマット化パターンからインデックス ベースの引数 (FText::FormatOrdered を参照してください。) を使用して生成されたテキストです。

LOCGEN_FORMAT_NAMED

フォーマット化パターンから名前ベースの引数 (FText::FormatNamed) を使用して生成されたテキストです。

「Raw」ストリングをインポートすることもできますが、インポートするたびに新しいキーが生成されます。これにより、ローカライゼーション キーが不安定になります。

データ テーブル

ローカライゼーション キーが不安定になる一般的な原因の 1 つは、CSV ファイルから データ テーブル に Raw 文字列を繰り返しインポートすることで、インポートのたびに新しいキーが生成されることです。 この問題を解決するには、行構造体の OnPostDataImport 関数をオーバーライドし、FText::ChangeKey を呼び出して新しいキーを割り当てることによって、インポートされたテキストにインポート後の確定キーを割り当てます。

通常、データ テーブル名を名前空間として使用し、行名とプロパティ名の組み合わせをキーとして使用します。例:

    voidFMyTableRow::OnPostDataImport(constUDataTable*InDataTable,constFNameInRowName,TArray&OutCollectedImportProblems)
    {
    #if WITH_EDITOR
        MyTextProperty = FText::ChangeKey(
        InDataTable->GetName(),
        FString::Printf(TEXT("%s_%s"),*InRowName.ToString(), GET_MEMBER_NAME_STRING_CHECKED(FMyTableRow,MyTextProperty)),
        MyTextProperty
        );
    #endif// WITH_EDITOR
    }

4.22 リリースの時点で、決定性キーはデータ テーブルにインポートされた Raw 文字列にすでに適用されていますが、カスタムのキーイング動作が必要な場合は、OnPostDataImport をオーバーライドすることができます。

多言語データ

多言語データを使用すると、実行時に新しいローカライゼーション データを追加して、外部システムとのインターフェースになり、新しい LocRes ファイルをビルドせずにホット フィックス ローカライズを行うことができます。

多言語データは、名前空間とキー (自身のアイデンティティ)、ネイティブ文字列、多言語データを使用するタイミングをコントロールするテキストのカテゴリ (ゲーム、エンジン、エディタなど)、オプションの固有のカルチャ (設定されていない場合は、カテゴリのネイティブ カルチャにフォールバックします)、カルチャごとの一連の翻訳で構成されます。

多言語データを使用して既存の変換をオーバーライドする場合は、多言語データの名前空間、キー、ネイティブ文字列が、置き換えるソース テキストの名前空間、キー、ネイティブ文字列と一致していることを確認する必要があります。

C++ の多言語データ

C++ を用いた多言語データは FPolyglotTextData 型によって表され、(FPolyglotTextData::GetText を使用して多言語データをテキスト インスタンスとして解釈して) 直接の使用や FTextLocalizationManager::RegisterPolyglotTextData に転送 (既存のテキスト エントリをパッチ処理するため) することも可能です。

ブループリントの多言語データ

ブループリントの多言語データは、Polyglot Text データ型で表され、Polyglot Data to Text 関数とともに使用して、多言語データをテキスト インスタンスとして解釈することができます。

ローカライズされたテキスト ソース

ローカライズされたテキスト ソースは、UE4 テキスト ローカライゼーション マネージャがローカライズされたテキスト データを検索して処理する主要な方法です。UE4 には、デフォルトで FLocalizationResourceTextSource (LocRes がサポートするホスト) と FPolyglotTextSource (多言語データ サポートのホスト) の 2 つが用意されています。

ローカライズされたテキスト ソースは、外部システムとのインターフェースを提供でき、ILocalizedTextSource から派生した型を作成して登録することで、プロジェクトごとに追加できます。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル