本地化
Localization
UE 的本地化以 FText 类型为中心,国际化(数字、日期、复数规则、文化回退)依赖 ICU 库。可本地化的文本由命名空间、键、源字符串三部分标识;本地化管线按目标 (Localization Target) 依次收集 (Gather) 到 manifest、翻译进各文化的 archive(通常经 PO 文件导出导入)、编译成运行时加载的 .locres。Localization Dashboard 是管理这条管线的推荐工具。
本地化与国际化
本地化与国际化(L10N 与 I18N)常被统称为「本地化」。UE 的本地化系统以 text 类型(FText)为中心,国际化支持使用 ICU (International Components for Unicode) 库。两者是分开的,但没有相应的国际化支持,就无法在运行时做本地化。ICU 负责获取平台当前文化、文化的优先级回退、按文化格式化数字(含百分比、货币)和日期时间(含时区),以及格式化文本时的复数规则。(Localization Overview for Unreal Engine)
文化名由连字符分隔的三部分组成(IETF 语言标签),例如 "zh"。查找本地化数据时从最具体到最不具体依次处理;为了覆盖面最广,应使用最不具体但有效的文化代码,再用文化重映射把多个地区映射过去(官方的例子是把拉美西语国家映射到 "es-419")。(Localization Overview for Unreal Engine)
文本字面量
可本地化文本由三部分组成:命名空间 (Namespace) 和 键 (Key) 构成其身份,源字符串 (Source String) 是翻译依据,并用来检测翻译是否过期。C++ 中用 NSLOCTEXT(指定命名空间、键、源字符串)或 LOCTEXT(命名空间由 LOCTEXT_NAMESPACE 定义)。编辑器中的文本属性会自动生成键,也可以手动指定。(Text Localization in Unreal Engine)FText 与 FString/FName 的区别见 容器与字符串。
文本历史 (Text History) 支持按文化正确地重建文本,是实时切换文化和创建文化无关源的关键。格式化有 FText::Format、FText::FormatOrdered(按序号)、FText::FormatNamed(按名称);内置的参数修饰符支持复数、性别和韩文后置词。复数形式按 CLDR 规则支持 zero/one/two/few/many/other,分基数("There are 4 cats")和序数("1st/2nd"),写法如 "{NumCats} {NumCats}|plural(one=cat,other=cats)",反引号用来转义花括号和竖线。(Text Localization in Unreal Engine)
本地化目标与管线
本地化目标的性质:从指定的一组来源收集文本,存入 manifest 文件,在各文化的 archive 文件中翻译,再编译成各文化的本地化资源文件。项目可以只用一个目标,也可以拆成多个(例如基础游戏一个、各资料片各一个);编辑器有自己独立的目标,这样编辑器的本地化数据不会随游戏发布。(Localization Overview for Unreal Engine)
| 文件 | 内容(官方) |
|---|---|
{Target}.manifest | 自定义 JSON,保存从代码和资产中收集到的全部文本 |
{Culture}/{Target}.archive | 自定义 JSON,保存该文化的翻译 |
{Culture}/{Target}.po | 导出给翻译用的 PO 文件,翻译后再导入 archive |
{Culture}/{Target}.locres | 编译后的运行时资源 |
官方推荐的工作流是编辑导出的 PO 文件再导入。(Localization Overview for Unreal Engine)
下图是 Dashboard 中的四步循环:
flowchart LR A["源码 LOCTEXT / 资产文本属性"] -->|Gather| B[manifest] B --> C["各文化 archive"] C -->|Export| D["PO 文件 交给译者"] D -->|Import| C C -->|Compile| E["locres 运行时加载"]
这个循环可以随新翻译到来或新文本加入而反复执行。
Localization Dashboard 与翻译编辑器
Localization Dashboard 管理本地化目标;虽然仍标为实验性,但官方说它很稳定,Epic 内部所有项目都在用。它默认创建一个 Game 目标,一般项目只需要这一个;在 Gather Text 设置中指定代码和资产的位置,在 Cultures 设置中指定要支持的语言和母语文化,然后用工具栏执行 Gather、Export、Import、Compile。这些操作每次都会生成 Config/Localization 下的 ini,除非要自动化管线,否则不必提交版本控制。Dashboard 与本地化 commandlet 的配置格式完全不同,由 Dashboard 生成 commandlet 版本。内置的翻译编辑器 (Translation Editor) 功能简单、更新不频繁(例如没有翻译记忆),官方建议只用来做零星修正。(Localization Tools in Unreal Engine)
取舍与常见坑
- 玩家可见的文本一律用 FText;FString 和 FName 不会被收集(据官方「以 text 类型为中心」的设计归纳)。
- 文化代码用最不具体的有效代码,再用重映射,比为每个地区单独翻译更省事。
- 包里会记录可收集文本的位置(FPackageFileSummary 中的 GatherableTextData 字段,见 烘焙、打包与 Zen 加载器),这也是资产文本能被 Gather 到的基础(结构关系是归纳)。
- 字体需要覆盖目标语言的字形,见 文本渲染(一般知识)。
出处
- Localization Overview for Unreal Engine UE 5.8 文档
- Text Localization in Unreal Engine UE 5.8 文档
- Localization Tools in Unreal Engine UE 5.8 文档