執筆バージョン: Unreal Engine 5.3
|
こんにちは。今回はテキストローカライズの機能の一つであるTextFormatterの引数修飾子についてご紹介させていただきます。
公式ドキュメントはこちら
テキストのローカライズで日本語から英語に対応するとした際に、単数/複数形、性別等、内容によって日本語だと1つのテキストで収まっていたものが文法の違いによって分岐するテキストが出てきます。
「アイテムを〇個入手した」
というテキストを例に出した場合〇個の部分にはどんな数字が来ても日本語の文法的に問題はないですが、英語になると単数/複数形にする必要があるため、
“Obtained 1 item.”
“Obtained 2 items.”
と二つのテキストが必要になってしまいます。
ただ、これらを新たにテキストを追加してしまっては管理も大変になりますし、このテキストを表示するために処理を実装する必要が出てきてしまうため、純粋にテキストを追加するという手法は取りたくありません。
〇引数修飾子の使用
そこで使用するのがTextFormatterの「引数修飾子」です。
与えた引数の値によってテキスト内の記述から分岐させることが可能で、テキスト自体は1つに収めることが可能になります。
先ほどのテキストも以下のように記述することで対応が可能です。
“Obtained {Num} {Num}|plural(one=item, other=items).”

Num=1だったら”item”、それ以外だったら”items”にするという内容です。
“{Num}|plural(one=item, other=items)“ が引数修飾子の部分になっております。
{Num} |
引数。この値を使用して処理を行う |
plural |
適用する引数修飾子 |
(one=item, other=items) |
引数修飾子の内容。引数修飾子によって指定する文字列が変化する |
〇標準で用意されている引数修飾子
引数修飾子は標準で4つ用意されています。
■基数詞&助数詞フォーマット
引数修飾子 |
plural, ordinal |
キー |
zero(0), one(1), two(2), few(少数), many(多数), other(その他) |
引数の値 |
数字 |
例文:
“Obtained {Num} {Num}|plural(one=item, other=items).”

“You are {Num}{Num}|ordinal(one=st, two=nd, few=rd, other=th) place.”

■性別用フォーマット
引数修飾子 |
gender |
値 |
(男性、女性、中性)の順序で指定する |
引数の値 |
ETextGender |
例文:
“{Gender}|gender(He, She) is genius.”

■ハングル文字の助詞用フォーマット
引数修飾子 |
hpp |
値 |
(子音、母音)の順序で指定する |
引数の値 |
文字列 |
例文:
{Arg}|hpp(은, 는)

〇C++で独自の引数修飾子を実装
C++から独自の引数修飾子を実装することが可能です。
以下が関連ソースコードになります。
FTextFormatter |
\Engine\Source\Runtime\Core\Public\Internationalization\TextFormatter.h
\Engine\Source\Runtime\Core\Private\Internationalization\TextFormatter.cpp
|
Textの諸々の処理をしているクラス
このクラスのRegisterTextArgumentModifier()で実装したModifierを登録する
|
ITextFormatArgumentModifier |
\Engine\Source\Runtime\Core\Public\Internationalization\ITextFormatArgumentModifier.h |
Modifierのインターフェース
このインターフェースを継承してModifierを実装する
|
標準で実装されているModifier各種 |
\Engine\Source\Runtime\Core\Private\Internationalization\TextFormatArgumentModifier.h
\Engine\Source\Runtime\Core\Private\Internationalization\TextFormatArgumentModifier.cpp
|
標準で実装されているModifierが記述されている |
実装したModifierの登録方法
|
#include "Internationalization/TextFormatter.h" #include "MyTextFormatArgumentModifier.h" AMyClass::AMyClass() { FTextFormatter::Get().RegisterTextArgumentModifier( FTextFormatString::MakeReference(TEXT("MyModifier")), [](const FTextFormatString& InArgsString, const FTextFormatPatternDefinitionConstRef& InPatternDef) { return MyTextFormatArgumentModifier::Create(InArgsString, InPatternDef); } ); } |
Modifierの実装に関してはすでに実装されているModifierを参考にしてみてください。
この機能自体を使用しない場合でも、ローカライズ対応するうえでこのような機能は必要になるかと思いますので、その場合の参考にも良いかと思います。