跳转至

UE 设置本地化多语言

记录如何在 UE 中实现本地化多语言

如果不熟悉 UE 扩展菜单,建议先简单看下:UE 扩展编辑器菜单ue-使用路径形式扩展菜单

本文代码基于插件:UE.EditorPlus

功能介绍

UE 自带工具可以实现本地化多语言,譬如我们可以为编辑器菜单实现本地化:

中文菜单:

英文菜单:

代码声明

为了实现菜单本地化,我们需要在代码中明确声明需要 UE 处理的字符串,使用 UE 定义好的宏 LOCTEXTNSLOCTEXT

  • 文件全局定义方式,先开始定义一个叫做 LOCTEXT_NAMESPACE 的宏,内容是当前多语言文本所在的名字空间,之后文件中的文本就可以用 LOCTEXT 来定义,文件最后取消宏 LOCTEXT_NAMESPACE
// #define LOCTEXT(InKey, InTextLiteral)

#define LOCTEXT_NAMESPACE "EditorPlusTools"
LOCTEXT("Key", "Content");
#undef LOCTEXT_NAMESPACE
  • 局部定义方式,使用 NSLOCTEXT,定义文本的时候带上名字空间参数:
// #define NSLOCTEXT(InNamespace, InKey, InTextLiteral)

NSLOCTEXT("EditorPlusTools", "Key", "Content");

UE 工具通过查找宏 LOCTEXTNSLOCTEXT 的出现来收集出所有需要翻译的文本。

使用工具翻译文本

假设我们有如下代码定义文本:

#define LOCTEXT_NAMESPACE "EditorPlusTools"
// register path node loctext
FEditorPlusPath::GetNodeByPath("/MenuTest")->SetFriendlyName(LOCTEXT("MenuTest", "MenuTest"))->SetFriendlyTips(LOCTEXT("MenuTestTips", "MenuTestTips"));
FEditorPlusPath::GetNodeByPath("/MenuTest/<SubMenu>SubMenu1")->SetFriendlyName(LOCTEXT("SubMenu1", "SubMenu1"))->SetFriendlyTips(LOCTEXT("SubMenu1Tips", "SubMenu1Tips"));
FEditorPlusPath::GetNodeByPath("/MenuTest/<SubMenu>SubMenu1/<SubMenu>SubMenu1")->SetFriendlyName(LOCTEXT("SubMenu1", "SubMenu1"))->SetFriendlyTips(LOCTEXT("SubMenu1Tips", "SubMenu1Tips"));
FEditorPlusPath::GetNodeByPath("/<Hook>Help/<MenuBar>MenuTest/<SubMenu>SubMenu1/<Section>Section1")->SetFriendlyName(LOCTEXT("Section1", "Section1"))->SetFriendlyTips(LOCTEXT("Section1Tips", "Section1Tips"));
#undef LOCTEXT_NAMESPACE

首先开启翻译工具,打开编辑器设置 编辑 - 编辑器偏好设置,勾选 通用 - 试验性功能 - Tools - 翻译选取器

然后打开翻译工具 工具 - 本地化控制板

新建一个目标(在默认的 Game 下面也行,新建一个是为了方便管理和移动这些翻译文本)

配置目标的参数,我这里名字改为 EditorPlusTools,加载政策是 编辑器,从文本收集,并加上插件目录,目标依赖性是 Engine, Editor,其他配置保持不变:

添加语系,保证有中文(简体)和英文两个语系,确认鼠标放在语言名字上分别显示 zh-Hansen,并选中英语(因为我们代码里面是用英文定义的文本,我们这里需要收集这些英语文本):

点击收集文本:

会弹出收集进度框,等待收集成功,会显示绿色对钩:

关掉收集进度框,回到翻译工具可以看到英文一行有显示收集到的数量,本身英文的我们不需要翻译,点开中文一行的翻译按钮:

打开后我们可以看到未翻译一栏有内容,在英文文本的右边一栏输入翻译后的内容,翻译内容都完成之后,保存退出窗口:

点击统计字数,结束后能看到中文一栏显示了翻译的数量:

最后编译文本:

翻译的数据会放在 Content\Localization\EditorPlusTools 里面,每种语言一个文件夹,在 zh-Hans 里面能看到两个文件,.archive 是收集和翻译的文本,.locres 则是编译之后的数据:

翻译好的文本放入插件目录中

我们上面给插件生成的翻译文本放在了项目目录下面,我们需要把这些文本移动到插件里面,方便随着插件一起发布。

Content\Localization\EditorPlusTools 目录移动到插件目录 Content 下面,我这里是 Plugins\UE.EditorPlus\Content\Localization\EditorPlusTools

修改项目的配置文件 DefaultEditor.ini,加上新路径:

[Internationalization]
+LocalizationPaths=%GAMEDIR%Plugins/UE.EditorPlus/Content/Localization/EditorPlusTools

这样,其他项目拿到插件后,只要修改 DefaultEditor.ini 则可以直接使用翻译文本,不需要重新配置翻译。

注意事项

在生成翻译数据的过程中,遇到过一些问题,以下总结出来注意的事项:

  • 代码里面定义文本必须要用宏 LOCTEXTNSLOCTEXT,文本需要是字符串常量,这样 UE 才是收集出来。
  • 翻译目标名字不能带有符号 .Content\Localiztion\ 下的目录名字不能带有 .,UE 只会截取 . 前面的名字。会导致 UE 在读取翻译文本的时候,由于名字错误,读取失败。
  • 对于编辑器插件,需要判断如果是命令行模式 IsRunningCommandlet() 则不生成菜单和 SlateUI ,因为命令行模式下没有 Slate 模块,会导致收集文本的时候报错 Assertion failed: CurrentApplication.IsValid()。如果你也遇到类似的报错,可以尝试加上这个判断。具体报错信息:

    Assertion failed: CurrentApplication.IsValid() [File:E:\UE\ue5.3_git\Engine\Source\Runtime\Slate\Public\Framework\Application\SlateApplication.h] [Line: 255]

原文地址:https://wiki.disenone.site

本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。