虚幻引擎4中的游戏本地化

为本地化准备游戏是游戏开发的重要组成部分。

我们正在虚幻引擎4中开发“ 猫电影! ”游戏这是一种经济策略,其中包含大量文本,我们计划将其翻译成各种语言。 与许多其他工具一样(但这并不准确,我希望不是这样),我们决定将建立本地化的阶段推迟到以后的开发迭代中,结果是徒劳的。

UE4中的本地化已很好地实现,并且如果您记得所有要翻译的文本足以存储在Ftext(Blueprint'ah中的文本)字段中,那么通常来说,从游戏中获取文本是没有问题的。 打开“本地化仪表板”,按几个按钮,然后瞧,就足够了。

而且,尽管此操作很简单,但是我们仍然遇到许多问题,因此我们不得不挖掘部分代码。

于10.16.19更新:文本格式。

如何储存文字


Epic Games的人员最大程度地简化了文本的组装,将所有内容简化为一键式翻译。

一切都非常简单-对于本地化,使用FText数据类型(蓝图中的Text),将文本保存到其中,然后由本地化系统进一步收集该文本并提供翻译。

如何运作?

FText不是在其自身中存储数据的标准数据类型。 当然,它本身存储数据,而不存储我们期望的数据。

FText是一个指针。 它指示文本存储在哪个表中。 也就是说,当我们将任何文本分配给这种类型的变量时,文本将存储在虚拟表中,并且变量本身现在将存储表名和用于在此表中查找文本的键。

因此,事实证明,文本本身存储在其他位置(由于我们对此并不特别感兴趣,因此我们不会考虑实现它的精妙之处),并且在将本地化切换到所需地址时,将替换文本(嗯,或者我想是这样。

图片

开始收集文本时,本地化系统将从所有蓝图,小部件和表格中收集所有Text-变量,并推出一个庞大的文本列表,可以将其导出到* .po并进行翻译。

我们的游戏有大量的小部件,玩家可以通过这些小部件控制几乎所有的游戏过程。 我们有很多名称(例如,部门或制作电影的阶段或一些技能,奖金等)在彼此完全不相关的各种小部件中使用。 有一些对象的描述(例如,奖金的描述),并且在各种不相关的小部件中也多次使用了它。

困难就从这里开始。 如果我们在每个小部件中重新编写部门名称,则在某个小部件中的某个位置,部门名称将被拼写错误。 由于很难跟踪包含大量字符的“描述”本身(例如,部门的描述),因此每个地方都一样(自然,我们没有这样做),这使事情变得复杂。 更为有趣的是,我们将大多数小部件用作模板,各种来源的数据飞入该小部件中,并且根据其来源,代码内的名称和文本也会更改。

通过创建数据表使我们的任务更加容易,在该表中我们开始存储特定类型的数据。 例如,一个部门表包含名称,描述,最高级别,每个级别的员工人数等。 等
似乎可以对此进行详细说明,但是存在以下困难:表中的数据不断更改,某些内容被重写,随着代码的增长而被删除,并且有时候整个表崩溃了,我们不得不回滚,拉出数据,返回到当前状态,然后将丢失的数据重新插入。

当我决定进入本地化并最终尝试并尝试了解我们是否都做得对时,一切都变得更加糟糕。

我从游戏中提取了所有文本,并意识到在代码中,尽管我们尽力避免重复,但文本中仍有大量重复元素。

翻译是人类的事情。 如果有机会犯错,人们必定会犯错。 为了避免这种情况或至少将其最小化,您需要将所有文本缩减为一个模板。 也就是说,将输出放在一个地方的某个地方,从那里将在代码的所有部分提取文本。 并且仅翻译一次,以最大程度地减少错误的风险。 似乎可以使用DataTable,但那里存在许多问题-仅保存某些名称,我们需要创建将存储这些名称的整个表。

在浏览了Epic Games文档之后,我将注意力转向了字符串表 (以下称为“字符串表”)。 事实证明,这是一个理想的选择-将文本存储在专用于文本的单独表中,该表是为了与FText连接而创建的-变量。 也就是说,我们可以创建一个表,该表将自身存储文本。 我们可以将此文本连接到任何变量-无论是数据表中的变量,小部件中的变量还是代码中的变量-所有这些都归结为文本存储的位置。

字符串表使您可以避免在项目中重复文本而不是完全重复几次,从而避免错误。

字符串表在引擎中创建,其他部分的数据表也是如此:

图片

填写非常容易-每个新行必须有一个自己发明的唯一密钥。 文本本身可以是任何文本。 另外,您可以在表中为文本空间指定与表名不同的名称,但是根据我们的经验,这不是必需的。

创建字符串表之后,现在可以将文本连接到FText变量:

图片

图片

因此,我们将文本简化为一个单行表,可以很容易地将其从中取出。 要获得此文本设置菜单,只需单击文本变量旁边的向下箭头。

本地化


现在,我们只需要收集所有文本并开始使用它即可。 为此,我们需要启动“本地化仪表板”并启动本地化设置。 您可以通过菜单窗口->本地化仪表板运行该表。

在打开类似此窗口的内容之前:

图片

在此窗口中,您必须指定将从中提取文本的目标(模块)。 在我们的例子中,这是一个游戏-游戏。

接下来,您需要指定文本在模块中确切的位置。 就我们而言,这些只是钝器,因为我们不在课程中存储文本。 因此,我们仅需要指定“从软件包中收集”,并指出为了搜索文本需要考虑的文件夹和文件。

我们还需要指出哪些语言将用于翻译,以及哪种语言将是母语(主要语言)。 如果您会说俄语,我强烈建议您-使用俄语(或您的其他主要语言)。 这是由于以下事实:如果您不太懂英语,然后将其表示为主要英语,则您会将您的翻译从“英语”复杂化为英语。 因此,最好事先指定您的语言为主要语言,并用您自己的语言编写所有文本,以便以后您可以为自己和他人进行翻译。

同样在UE4中,有很大的机会直接在引擎中创建翻译,而无需导出第三方程序的文本。 为此,您需要单击按钮1来收集游戏中的所有相关文本。 然后运行编辑器(2号按钮):

图片

将打开一个将翻译编辑为所需语言的窗口。

组装方式


组装项目时,必须指定该程序集中应包含的语言,以及项目应支持的语言集。

图片

在我们的情况下,国际化支持设置为全部。 也就是说,我们的项目将支持从复杂的象形文字到简单的英文字母的所有类型的语言。 通常,有5个软件包:

  • 英语(纯英语)。
  • EFIGS(英语,法语,意大利语,德语和西班牙语)
  • EFIGSCJK(同上+中文,日文和韩文)
  • CJK(中文,日文和韩文)。
  • 全部(所有语言)。

但是,在项目中的每个字节都很重要的情况下(“全部”包的重量为15 MB,而“ EFIGS”包的大小为2 MB),您应该更加注意需要选择的包。

本地化切换


文本切换发生在运行时中,也就是说,您无需重新启动游戏,您无需担心切换优化-一切都可以通过``SetCurrentCulture ''方法轻松,简单地完成,您需要在文本中指示您想要切换到哪种语言。

图片

这里有一些障碍。 事实是,不同的国家/地区拥有自己的语言分支,例如,主要的俄语是(ru),但是白俄罗斯语(ru-BY),哈萨克语(ru-KZ),摩尔达维亚(ru-MD),乌克兰语(ru -UA)属于俄语分支的语言。 因此,当选择一种不是主要语言时,您需要考虑并指出正确的语言。 如果仅选择主菜单,则在切换时只需指定“ ru”。

图片

将其他数据添加到蓝图中的文本。


如果大括号显示在文本本身中,并且数据名称也显示在文本中,那么将来,您可以在文本中使用这些相同的数据替换。
例如: “您想学习{Tech_Name}技术吗?”
并且,此外,在BP中,您可以使用“格式文本”节点,该节点将考虑文本本身以及在那里指示的参数,并创建用于连接此数据的其他引脚:
图片

现在,其他信息将被嵌入文本中,而无需更正文本本身就可以对其进行更正。 例如,您可以输入部门或技术的名称,可以指定级别或其他名称。

结论


在将所有这些信息收集在一起之后,我意识到从一开始我们就没有正确地处理游戏中文本的创建,并且做了很多不必要的工作。 当然,我们几个月都没有重新编写代码,但是最多花了1.5个小时,但是很高兴提前知道UE4中的本地化原理,并在构建项目的体系结构时将它们考虑在内。

游戏中的保存和加载也是如此。 事实证明,在一项策略中,每件小事都应该固定在其所处/所在/具有的特定状态,这并不是一件容易的事。 但是,我将在其他时间写到。 现在您可以继续在我们的小组中观看我们的比赛=)

Source: https://habr.com/ru/post/zh-CN470205/


All Articles