不使用XML文件自动生成程序进行模组翻译

0 点赞
环世界
转载

本指南将帮助你手动为《环世界》的模组创建翻译,这需要你具备XML文件结构的相关知识以及对其工作逻辑的了解。本指南面向那些希望理解翻译原理,而非依赖自动生成工具的用户。按照这些说明操作,你将能够创建出可在游戏中正常运行的高质量翻译。### 引言 在 Steam 上查阅俄语指南后,我发现目前缺乏一份全面的手动翻译模组流程指南。现有的指南,例如 Azzkal 或 Pashka 发布的教程,均使用专用程序进行自动翻译生成。尽管这些方法有其存在的合理性,也可能对部分用户有所帮助,但对我个人而言,这些方式显得复杂且繁琐。不过,我决定编写一份自己的指南,在其中展示如何完全手动进行翻译,不使用自动生成XML文件的工具。这不仅是一项有用的技能,也是理解游戏工作原理的重要一步。弄明白这一点后,你就能轻松翻译任何模组了。我将以我的模组“+medical supplies..”为例进行说明。适用于1.版本。6 所需工具 接下来要介绍的是能帮助你完成这项艰巨任务的程序。 1. Notepad++[notepad-plus-plus.org] — 这是我们的主要工具。你可以把它想象成记事本,但具备强大的附加功能。下载时需要使用互联网加速服务。我最近查看相关说明发现,在俄罗斯不使用这些服务的话,直接链接根本无法正常工作。可以推荐 Sota [t.me]。我一直在用它,目前没有出现问题。它是付费的,但有一个仅需10卢布的试用期。 2. 《环世界》——为了方便找到模组文件夹。 还需要注意的是,你需要掌握目标翻译语言。使用翻译工具可能会导致翻译错误。不过,如果没有其他办法,也可以使用翻译工具,尽管这不是最准确的方法。 如何找到所需的模组文件夹?启动《环世界》,点击“模组”

在列表中找到所需的模组,或通过搜索查找

点击所需的模组

点击“高级设置...”

点击“打开文件夹”

打开了模组文件夹

由于我的模组位于游戏文件夹中,所以我的模组路径相当简单。但如果您是通过Steam创意工坊下载的模组,由于其存储结构的原因,在资源管理器中手动找到它可能会有些困难。例如,Rimefeller模组的路径如下: C: SteamLibrary steamapps workshop content 294100 1321849735。 模组标识符是路径末尾的数字值,这增加了查找难度。正是因此,我上述所描述的方法是处理模组时最便捷且最优化的方式。 一些关于结构的理论 《环世界》的所有翻译均通过XML文件实现。模组翻译的结构由以下关键元素组成。翻译文件夹(Languages/YourLanguage)中包含以下文件夹: DefInjected — 用于存放与游戏对象、动作、事件及其他通过Def类定义的元素相关的翻译。DefInjected中的文件用于翻译特定字段,例如物品、生物、技能的名称和描述等。Keyed——用于存储与游戏内具体对象(如物品或角色)无直接关联的字符串翻译。相反,它包含通用的界面文本元素、消息、系统通知以及描述,这些内容会在游戏的不同位置或程序集(Assemblies)中使用。这些字符串通常带有程序调用以显示文本的键值。Strings(若使用)——用于游戏中的各种字符串,包括步兵、动物、世界等的名称。实际上,这是一个庞大的数组,包含可用于生成角色、地点名称和句子的字符串集…… 如何创建翻译结构? 创建名为“Languages”的文件夹

在文件资源管理器的空白处右键点击(Windows 10系统),或点击“新建”按钮(Windows 11系统)。然后选择“文件夹”,并将其命名为“Languages”。正确命名所有文件夹至关重要——即使名称中存在微小错误,游戏也将无法找到您的翻译文件,从而导致错误和翻译缺失。 打开名为“Languages”的文件夹,然后创建一个名为“Russian”的文件夹。

您可以为您的翻译创建任何文件夹,例如“French”(法语)或“Czech”(捷克语),具体取决于您要翻译的语言。文件夹名称必须与翻译语言相对应,以便游戏能够正确识别。 打开名为“Russian”(俄语)的文件夹,并创建两个名为“DefInjected”和“Keyed”的文件夹。

在我的模组中,不存在与具体游戏对象无直接关联的文本。不过,为了全面阐述翻译相关主题,我还是会举一个例子。这样能更好地理解如何处理这类文本以及它们在何时可能会用到(或许之后会补充)。 如何判断需要翻译的内容? 我们需要回到模组的根目录。

打开名为“1.5”的文件夹

文件夹名称可能因游戏版本而异,但这不应导致显著变化。在卡片上可以看到名为“1.5”和“1.4”的文件夹。就我而言,它们之间没有区别,因为我没有使用最新更新中的新方法或功能。翻译可以基于“1.”文件夹创建。4",但仍建议使用与游戏当前版本对应的文件夹以确保最大兼容性。 打开名为“Defs”的文件夹

(说明)“Defs”文件夹包含描述各种游戏对象、机制……的配置文件。这些文件以XML语言编写,用于定义游戏中的所有内容。 打开名为“Items”的文件夹

在这个阶段,文件夹和文件的结构可能与示例有所不同,但本质保持不变。正如我已经提到的,“Defs”文件夹中存放着配置文件。在我的情况中,那里有两个文件夹——“Items”和“SoundDef”,但在其他模组中可能会有完全不同的文件夹,或者有我这里没有的额外文件夹。无论如何,你的任务是找到包含待翻译文本行的XML文件。 打开名为“Drugs”的文件夹。

双击“Item_Psychotrope.xml”

该文件应使用您电脑上安装的标准XML文件处理应用程序打开。在我这边是Microsoft Edge,但您可能会有其他应用程序。作为示例,我选择了“Item_Psychotrope.xml”,因为其中包含足够多的待翻译行。您应该会看到类似的内容。

原则上,所有与物品、服装或事件的工作逻辑无关的内容都可以进行翻译。不过,您可能一下子难以理解,因为这是您第一次接触。我会尽量详细地解释所有内容,以便每个人都能弄明白。 说明:例如,我们可以看这样一行代码:<ThingDef ParentName="MakeableDrugPillBase">。无法翻译此内容,因为该语句用于在游戏的XML文件中基于现有基类的属性继承来定义新对象。在这种情况下,MakeableDrugPillBase是一个基类,包含可制作药片类药物的通用参数和行为。由此可知,该语句与游戏逻辑相关,因此不可翻译。现在我们来看看<标签>Psychotrope</标签>。它用于为游戏内对象指定名称或显示名称。标签内的值,在本例中为“Psychotrope”,将在界面中向用户显示,而非对象的技术名称。这一行已经可以进行翻译,因为它不影响游戏逻辑,仅用于在界面中显示信息。还有一行代码<defName>Psychotrope</defName>,这一行不能翻译。它定义了对象的唯一内部名称,游戏用它来识别该元素。它是一个技术标识符,不会直接显示给玩家,但会在代码中用于引用、设置和游戏进程逻辑。修改或删除defName可能会破坏该对象与游戏其他元素的关联。总结:仅可翻译游戏内直接显示的内容,负责内部运行和逻辑的部分无需修改。 终于到翻译环节了 恭喜您已进入翻译阶段!但首先需要确认您已准备好所有必要的工具。您需要打开计划进行翻译的物品的XML文件,建议使用Notepad++进行操作,我们将使用该编辑器进行工作。 进入“DefInjected”文件夹,该文件夹已创建,路径为:C: ... Languages Russian DefInjected。 创建“ThingDef”文件夹。

创建XML文件“Item_Psychotrope.xml”:在文件资源管理器的空白处右键点击(Windows 10系统),或点击“新建”按钮(Windows 11系统)。然后选择“文本文档”并将其命名为“Item_Psychotrope.xml”。可能会出现无法更改文件类型的问题,解决方法很简单:打开文件资源管理器并导航到包含目标文件的文件夹,点击顶部菜单栏的“查看”选项卡(Windows 10系统)或“参数”(Windows 11系统中为三个点图标)。勾选“文件扩展名”选项——现在将显示包含扩展名的完整文件名。右键点击.txt文件并选择“重命名”。将文件扩展名从.txt更改为.xml(例如,将file.txt改为file.xml)。如果出现文件可能损坏的警告,请确认更改。现在文件将为XML格式。

右键点击“Item_Psychotrope.xml”,然后点击“用Notepad++编辑”。该文件应为空文件。

我的照片卡上有文字。如果你担心自己没有类似的东西,别担心——本来就应该是这样的。我正在用一个现成的例子来展示所有内容。 我们来写<LanguageData>和</LanguageData>

在《环世界》中,标签<LanguageData>和</LanguageData>用于在本地化文件中标记语言数据块的开始和结束。它们构成了XML结构,其中包含翻译字符串。所有翻译和文本元素都必须位于这些标签内,游戏才能正确识别并在界面中显示它们。关于标签的一些理论 注释在代码中起着重要作用,尽管它们与标签没有直接关系。从上面的示例可以看出,注释用绿色字符突出显示——这种颜色在不同的编程语言中经常用于注释。注释对程序的执行或文档的标记没有任何影响,您可以在其中记录任何信息。它们能帮助其他开发者无需仔细研究代码就能更快理解您的代码逻辑。良好的风格是使用便于翻译的注释格式:<!-- EN (原始语言): Psychotrope (原文) -->。 翻译系统通过标签实现,无需修改游戏源代码即可对文本字符串进行本地化。这些标签是每个可翻译文本元素的唯一标识符。标签采用层级结构构建:首先是对象(如物品或物质等)的唯一标识符,接着是同一层级的标签,然后是下一级嵌套标签,以此类推,直至达到用于翻译文本的最终标签。它们之间用点分隔。.\n带标签的示例

我们拥有一个独特的对象标识符(<defName>Psychotrope</defName>),并且需要翻译其名称(<label>Psychotrope</label>)。为此,需要按以下方式记录:<Psychotrope.label>致幻剂</Psychotrope.label>。标签结构采用以下形式:<唯一标识符.label>您的文本</唯一标识符.label>。就是这样。 另一个带标签的示例

现在需要翻译ingestCommandString。运用章节中关于标签的理论来进行翻译。注意,标签&lt;ingestCommandString&gt;Take {0}&lt;/ingestCommandString&gt;嵌套在&lt;ingestible&gt;&lt;/ingestible&gt;标签内。应在翻译标签结构中指明这一点。最终翻译标签将如下所示:&lt;Psychotrope.ingestible.ingestCommandString&gt;服用 {0}&lt;/Psychotrope.ingestible.ingestCommandString&gt;。为了便于理解,可以这样设想:在创建用于翻译的标签时,我们会指明目标标签的路径,并将其添加到末尾。 再举一个关于标签的例子。

有时需要翻译疾病阶段或类似位于stages中的结构,而阶段本身位于<li></li>标签内。合理推测,翻译标签应如下所示:<PsychotropeWithdrawal.stages.li.withdrawal.label>精神药物戒断</PsychotropeWithdrawal.stages.li.withdrawal.label>。但这不会生效。正确的格式为:<PsychotropeWithdrawal.stages.Psychotrope_withdrawal.label>精神药物戒断</PsychotropeWithdrawal.stages.Psychotrope_withdrawal.label>。

从这个例子可以看出,如果名称中出现空格,需要将其替换为“_”。还有另一种编写标签的方式,这种方式稍微简短一些,但如果其他人想理解你所写的内容,就会难以理解你的标签。

这里可以看到,最初的标签被记录为<PsychotropeWithdrawal.stages.Psychotrope_withdrawal.label>精神药物戒断</PsychotropeWithdrawal.stages.Psychotrope_withdrawal.label>。为了简化和缩短记录,可以用“1”代替“Psychotrope_withdrawal”。为什么是“1”而不是“2”呢?这是因为在许多编程语言中,数组和列表中元素的计数是从“0”开始的,而不是像日常生活中习惯的那样从“1”开始。因此,第一阶段是“0”,第二阶段是“1”。最终正确的标签如下:<PsychotropeWithdrawal.stages.1.label>精神药物戒断</PsychotropeWithdrawal.stages.1.label>。两个示例均正确,但我建议使用第一个。 依此类推,可翻译所有需要的内容。不过还有一个重要点:n 会将文本换行。翻译测试 首先启用开发者模式——该模式可实现世界的即时加载,并能创建所需的对象、事件、角色及其他多种内容。 进入游戏后,点击“设置”。

点击红色叉号

之后,红色叉号将变为绿色对勾,主菜单顶部会出现六个白色图标。如果您安装了添加额外开发者图标的模组,图标数量可能会有所不同,这是正常现象,无需担心。

恭喜您,现在您已进入开发者模式!接下来请选择您进行翻译的语言,并确保模组已在模组选项卡中激活。 进入设置,打开“通用”选项卡,然后选择您翻译的语言。

在我的情况中是俄语,但您可以选择其他任何语言。选择后需要等待一段时间,以便游戏切换到所选语言。 现在我们来检查翻译。 点击“快速启动”

根据所选语言,主菜单中的文字将会发生变化,请做好相应准备。 点击白色的类似太阳且右侧带有三角形的图标。

找到或点击“生成物品...”(Spawn thing...)

根据您想要检查的内容,需要在列表中找到相应的对象——可能是植物、物品、棋子等。在我的情况下,这是物品。 找到您需要的物品、事件……

完成所有这些操作后,你可以通过鼠标左键生成所选对象。查找所需元素应依据def name——这是物品、事件等的XML文件中指定的唯一名称。

进入物品信息

如果一切看起来正常,可以完成该流程。但如果出现错误,且您不知道问题所在,可以考虑这样的情况。例如,我可能在翻译标签中犯了错误。

如果我将SatiDelay.description写成了SataDelay.description,这可能会导致错误,因为系统无法找到所需的标签。因此,在检查正确性时,物品描述中可能会出现英文字母。要修复此问题,需要返回XML文件并修正标签中的错误,将SataDelay.description替换为正确的SatiDelay.description。

在这种情况下,可以通过逻辑推理找到问题所在。如果描述翻译有误,错误很可能出在标签上。但有时很难弄清楚具体问题出在哪里。让我们来看看在这种情况下可以采取哪些措施。 进入游戏主菜单,点击白色的、类似太阳且右侧有一个三角形的图标。

点击“撰写背景故事翻译...”

点击“保存翻译报告”

之后,您的桌面上会出现一个txt格式的文档。

这看起来很吓人,但不必担心。关键是要注意文件中名为“Def-injected translations load errors”的部分,如图所示。在我的案例中,错误信息是:“Found no Verse.ThingDef named SataDelay to match SataDelay.description (Item_SatiDelay.xml)”。由此可以看出,问题出在Item_SatiDelay.xml文件以及SataDelay.description标签上。现在既然我们知道了错误所在,只需修复它即可。就是这样。如果您创建了独立的模组翻译,整体流程不会有任何变化。之前提到的所有内容同样适用于独立翻译。关键是要在模组选项卡中同时激活您的翻译和模组本身。

如何在Steam中上传翻译? 假设你已完成模组翻译,现在想要将其上传至Steam,但不知道该如何操作。此时你需要再次使用文件管理器,创建另一个XML文件,并在为你的翻译创建预览图时展现一些创意。实际上,这比看起来要简单。 步骤如下: 1. 进入游戏文件夹 标准路径:C: SteamLibrary steamapps common RimWorld 2. 进入“Mods”文件夹

创建“Translated”文件夹

实际上,文件夹名称并不重要。当用户下载您的翻译时,它会自动替换为数字标识符。不过,选择一个您自己能理解的名称很重要,这样您就能始终知道这是哪个模组以及它的用途。 创建名为“About”的文件夹,并复制您的翻译包。

此前我们已经创建了翻译文件夹,现在只需将其复制即可。在这一步中,正确命名文件和文件夹尤为重要,这与上一步不同,上一步中命名并没有太大影响。 创建XML文件“About.xml”并制作预览图。

您的预览图应尺寸较小,格式为PNG,且文件名必须为“Preview.png”,否则将无法显示。为何要将其做得小一些?因为您的模组或翻译文件夹的总大小存在限制。如果您创建4K分辨率的图片,可能会超出限制,导致无法上传模组。 示例预览图(720 x 405):

编辑“About.xml”

现在将对每一行进行解释。 <?xml version="1.0" encoding="utf-8"?>——这是XML声明,用于指定XML版本(1.0)和字符编码类型(UTF-8)。它是文件正确处理所必需的。 <ModMetaData>——根元素,包含关于模组的所有元信息。所有其他元素都位于其内部。 <name>+medical supplies Ru</name>——模组名称,将显示在模组列表中。此处指定了我的模组“+medical supplies”的翻译名称。 <author>g15051978</author>——模组或翻译的作者。可以是您的姓名或昵称。 <packageId>g15051978.medical.supplies.ru</packageId>——模组包的唯一标识符。它必须是唯一的,并且符合标准格式:作者名(通常为小写),然后是模组名,用点分隔。此标识符对于加载和兼容性非常重要。<supportedVersions> — 指定模组兼容的《环世界》游戏版本。 <li>1.4</li> — 支持1.4版本。 <li>1.5</li> — 支持1.5版本。每个版本需在单独行中使用<li>元素进行指定。 <url></url> — 指向模组或翻译页面的链接,可在此处下载或查看更多信息。 <loadAfter> — 该部分指定当前模组应在其他模组之后加载。 <li>boeing.medical.supplies</li> — 原始模组包的标识符,该模组必须在此翻译之前加载。请确保此packageId与原始版本完全一致。 <description>模组俄语翻译</description> — 模组描述。 </ModMetaData> — 根元素的结束标签。它结束了About.xml文件的结构。 进入《环世界》,然后进入模组,找到翻译

点击“高级设置...”,然后点击“上传至Steam创意工坊”

勾选“标记为翻译”。然后点击“确认”

稍等几秒钟,然后点击“是”

您是作者吗? 接下来就是魔法时刻了。我们会跳转到我们的翻译页面。

您需要稍等片刻,待我们的作品完成审核与批准。您可以通过刷新页面来查看审核状态:若页面出现橙色标记并提示“作品正在审核中”,则表示审核仍在进行;当橙色标记消失时,说明审核已完成。如果作品未通过审核,Steam会向您发送通知并说明具体原因。 以下是成果链接。无需下载,因为俄语翻译已内置在模组中。 结束 恭喜!现在您无需使用任何程序即可翻译任何模组,并能略微了解游戏的工作原理。程序确实能加速和简化开发过程,但它们无法让人理解机制本身。当然,每个人都能在没有特殊技能的情况下翻译模组是很棒的,但与此同时,我们也失去了一些重要且有趣的东西。想必在童年时期,你一定好奇过玩具的构造,会把它拆开一探究竟。那感觉很刺激,对吧?这里也是一样——你将深入了解游戏的内部运作机制。这就像是探索一个新世界,或是玩《深海迷航》时的体验。希望你明白我在说什么。没错,有时候可能会觉得枯燥,但这仍然非常有趣。感谢阅读我的指南。你一定能成功! 致谢