# FText

此文为FText (opens new window)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解。

UE4中处理文本本地化的主要组件就是FText类。所有面向用户的文本都应该使用这个类,因为它提供如下特性支持本地化:

  • 逐字地创建本地文本
  • 格式化文本(从一个占位符模式生成文本)
  • 从数字生成文本
  • 从日期和时间生成文本
  • 生成其他格式的文本,比如大写或小写

FText有跟AsCultureInvariant函数(或者INVTEXT宏)一样的特性,能创建非本地化,或者"保持相应语言"的文本。这有时是很有用的,比如将玩家名字从一个外部API弄成你想在你用户界面处显示的一些东西。

你可以使用FText::GetEmpty()或FText()来创建一个空的FText。

# 转换

FText可以由FString转换过来,也可以转换成FString。然而,因为FText包含涉及本地化数据的字符字符串,尽管FString只包含一个字符字符串,这些方法会有潜在的损耗,然后丢失(或无法创建)本地化数据。作为替代的方法,Text Value Marshalling (opens new window)可以提供无损转换,尽管这个方法产生的数据更适合内部整理,而不是供人查看。

下面的转换函数生成FText字符串,但没有本地化数据:

FText函数 描述
AsCultureInvariant 从一个已存在的FString创建非本地化和保持相应语言的FText实例。
FromString 从一个已存在的FString创建一个非本地化的FText实例。
FromName 从一个已存在的FName创建一个非本地化FText实例。这等同调用FName的ToString函数返回结果的FromString方法。

使用FromString时要注意,在非编辑器构建时,它等同于AsCultureInvariant,在编辑器构建时,这个函数并不会将文本标记为语言不变,这意味着如果将它赋值给一个在被保存的Asset的FText属性中,它仍可被本地化。

为了将FText转换成FString,使用ToString函数,得到的FString会包含FText的字符串数据,但不包括本地化数据。

# 比较

因为FText的数据比简单的字符串更复杂,它并不支持重载操作符的比较。相应地它提供了几个函数来执行对它所包含细小数据的比较,下面就是这些可用比较函数:

FText函数 描述
EqualTo 这个函数使用一个ETextComparisonLevel值来决定使用什么比较规则。它会返回一个布尔值,这个值表明该FText与比较值在比较规则下是否相等。
EqualToCaseIgnored 这个函数包裹了EqualTo,增加一个ETextComparisonLevel作为第二个参数。但它返回的值是直接来自EqualTo的。
CompareTo 这个函数使用一个ETextComparisonLevel值来决定使用什么比较规则。它像大部分字符串或内存比较函数一样返回一个int32值,0意味着相等,负值或正值意味着和参数相比较的小或大。
CompareToCaseIgnored 这个函数包裹了CompareTo,增加了一个ETextComparisonLevel作为第二个参数,它的返回值是直接从CompareTo返回的。

# 在用户界面使用FText

# Slate/UMG

Slate和UMG使用FText属性或参数来为任何内置窗体组件展示或管理面向用户的文本,我们建议你对任何定制创建的窗体组件使用FText。

# HUD/Canvas

为了通过带Canvas的HUD系统显示FText,创建一个新的FCanvasTextItem然后将它的Text变量设置为你想要显示的文本,就像下面的例子:

// Create a new FCanvasTextItem instance to contain the text.
FCanvasTextItem TextItem(FVector2D::ZeroVector, TestHUDText, BigFont, FLinearColor::Black);
// Add the text into the FCanvasTextItem.
TextItem.Text = FText::Format(LOCTEXT("ExampleFText", "You currently have {0} health left."), CurrentHealth);
// Draw the text to the screen with FCanvas::DrawItem.
Canvas->DrawItem(TextItem, 10.0f, 10.0f);
1
2
3
4
5
6

注意如果在HUD中使用Canvas,你必须在DrawHUD函数中或者在以DrawHUD开始的函数链中调用DrawItem。