编辑器和文档的本地化

Godot 的目标是将游戏开发提供给每一个人,包括那些可能不知道或不习惯英语的人。因此,多亏了社区的翻译工作,我们尽最大努力使最重要的资源以多种语言提供。

这些资源包括:

  1. Godot 编辑器界面(约 15,000 个字)。

  2. 在线文档(编辑器手册和教程,约 30 万字)。

  3. 类参考手册,可在线和编辑器中查看(约 200000 单词)。

为了管理翻译,我们使用 GNU gettext 文件格式(PO 文件)和基于 Web 的开源本地化平台的 Weblate,能够让贡献者们轻松协作,完成各种组件的翻译,并使其保持最新。单击上面粗体的链接访问 Weblate 上的每个资源。

本页概述了 Weblate 上的一般翻译工作流程,以及一些特定于资源的说明,例如如何处理某些关键字或图像的本地化。

小技巧

翻译所有的官方 Godot 内容是一项艰巨的任务,因此我们建议优先考虑上面列出的资源:首先是编辑器界面,然后是在线文档,如果有足够的翻译人员跟上更新,最后是类参考。

使用 Weblate 进行翻译

虽然我们的翻译最终驻留在 Godot 引擎及其文档的 Git 仓库中,但所有翻译更新都是通过 Weblate 处理的,因此不接受对 Git 仓库的直接拉取请求。维护人员在 Weblate 和 Godot 仓库之间手动同步翻译。

因此,你应该在 Weblate 上注册,来为 Godot 的翻译贡献力量。

登录后,浏览到你要参与的 Godot 资源(在本页中,我们将使用编辑器翻译为例)要查找所有语言的列表:

../../_images/l10n_01_language_list.png

参见

更多细节请随意查阅 Weblate 自己的翻译工作流程文档

增加新的语言

如果你的语言已经列出,请单击其名称以访问概述,然后跳过本节的其余部分。

如果你的语言未列出,请滚动到语言列表的底部,单击“开始新翻译”按钮,然后选择要翻译的语言:

../../_images/l10n_02_new_translation.png

重要

如果你的语言在多个国家使用,但地区差异有限,请考虑将其添加为通用变体(如 fr 表示法语)而不是区域变体(如 fr_FR 表示法语(法国)、fr_CA 表示法语(加拿大)、fr_DZ 表示法语(阿尔及利亚))。

Godot 有大量的内容需要翻译,因此只有在语言差异足够显著的情况下,才应该复制区域变体的工作。此外,如果对区域变体进行了翻译,则该翻译将仅对位于该区域的用户(或为该区域配置了系统语言)自动可用。

当地区差异大到需要单独翻译时,如果可能的话,我们建议先集中精力完成一个通用的变体,然后将完全完成的翻译复制到地区变体中,并进行相关的编辑。这通常是一个很好的策略,例如西班牙语(先完成 es ,然后必要时复制到 es_ARes_ESes_MX 等)或葡萄牙语( pt_BRpt_PT )。

翻译界面

一旦选择了一种语言,你将看到翻译状态的概述,包括还有多少字符串需要翻译或审阅。每个项目都可以单击并用于浏览相应的列表。你还可以点击“翻译”按钮开始操作字符串列表。

../../_images/l10n_03_translation_overview.png

选择“翻译”列表后,你将看到所有工作发生的主要翻译界面:

../../_images/l10n_04_translation_interface.png

那个页面上包含有:

  • 一个工具栏,可以让你在当前列表的字符串中循环,切换到其他预定义的列表或进行自定义搜索等。还有一个提供简化界面的“禅”编辑模式。

  • 在“翻译”面板中处理的实际字符串。默认情况下,应该有英语源字符串和你的语言的编辑框。如果你熟悉其他语言,可以将其添加到用户设置中,以提供更多翻译上下文。编辑完当前字符串后,按“保存”确认更改并移到下一个条目。或者使用“跳过”按钮跳过它。“需要编辑”复选框意味着原始字符串已更新,因此需要检查翻译以考虑这些更改(在 PO 术语中,这些是所谓的“模糊”字符串)。在修复之前,这些字符串不会在翻译中使用。

  • 底部面板有各种工具可以帮助翻译工作,例如来自附近字符串的上下文(通常来自同一编辑器工具或文档页,因此它们可能使用类似的术语),来自其他翻译人员的注释、机器翻译以及该字符串的所有其他现有翻译的列表。

  • 在右上角,术语表显示了先前添加了条目的术语,以及当前字符串中包含的术语。例如,如果你与其他翻译人员一起决定对 Godot 中的“node”术语使用特定的翻译,你可以将其添加到词汇表中,以确保其他翻译人员使用相同的约定。

  • 右下面板包含有关源字符串的信息。最相关的项目是“源字符串位置”,它将你链接到 GitHub 上的原始字符串。你可能需要在页面中搜索字符串来定位它及其周围的上下文。

定位原始内容

PO 文件是源字符串(msgid)及其翻译(msgstr)的有序列表。默认情况下,Weblate 将按该顺序显示字符串。因此,了解 PO 文件中内容的组织方式非常有用,可以帮助你定位原始内容,并在翻译时将其用作参考。

重要

翻译时以原文语境为参照是最原始的,因为许多词根据语境有几种可能的翻译。使用错误的翻译实际上会对用户造成伤害,并且会比使用英语更难理解。使用上下文也使翻译工作更容易和更愉快,因为你可以直接看到你写的翻译是否在上下文中有意义。

  • 编辑器接口的翻译模板是通过按照字母顺序解析所有 C++ 源代码生成的,所以在给定文件中定义的所有字符串将被分组在一起。例如,如果“源字符串位置”指示 editor/code_editor.cpp,则当前字符串(以及附近的字符串)在 editor/code_editor.cpp 代码文件,因此与 Godot(GDScript、着色器)中的代码编辑器相关。

  • 在线文档的翻译模板是按照目录中所示的相同顺序从源 RST 文件生成的,因此,举例而言,前几个字符串都来自文档的首页。所以推荐的工作流程是找到与要翻译的页面相对应的唯一字符串,然后翻译具有相同源字符串位置的所有字符串,同时与该页面的英文联机版本进行比较。源字符串位置的示例可以是 getting_started/step_by_step/nodes_and_scenes.rst 对于页面 节点与场景

  • 类引用的翻译模板是按照字母顺序从源 XML 文件中生成的,这与联机版本的目录顺序相同。因此,你可以定位与给定类的简要描述相对应的源字符串,以找到要翻译的第一个字符串,并且该类中的所有其他描述都应位于 Weblate 上的后续字符串中。例如 Node2D 类的描述将具有源字符串位置 doc/classes/Node2D.xml

定位特定页面和类的一个方便工具是使用 Weblate 的高级搜索功能,尤其是“位置字符串”查询(也可以通过 location: 标记使用,例如 location:nodes_and_scenes.rst):

../../_images/l10n_05_search_location.png ../../_images/l10n_06_browse_by_location.png

备注

当一个给定的源字符串被用于多个源位置时,它们都将被串联成一个。例如,上面的 location:nodes_and_scenes.rst 查询将首先落在“Introduction”源字符串上,它被用于几十个页面,包括模板中 nodes_and_scenes.rst 之前的一些。然后点击下一步按钮,我们就会看到上面显示的场景和节点标题字符串。因此,可能会发生这样的情况:当阅读一个页面的在线版本时,某个段落或章节的标题不在你期望的位置。

遵守标记语法

每个翻译资源源于不同的源代码格式,对每个资源使用的标记语言有一些概念对于避免在翻译中产生语法错误非常重要。

编辑器界面(C++)

编辑器的翻译源于 C++ 字符串,可能使用:

  • C 格式说明符,如 %s(字符串)或 %d(数字)。这些说明符在运行时会被替换为具体的内容,并且应该在必要时保留并放置在翻译中,以便在替换后有意义。你可能需要参考源字符串的位置,以了解如果句子中不清楚将替换什么类型的内容。示例(%s 将被替换为文件名或路径):

    1. # PO file:
    2. "There is no '%s' file."
    3. # Weblate:
    4. There is no '%s' file.
  • C 转义字符,如 \n(换行符)或 \t(制表符)。在 Weblate 编辑器中,\n 字符由 替换,\t 替换。制表符的使用并不多,但你应该确保使用与原始英文字符串相同的换行符(如果不使用,Weblate 将发出警告)。换行符有时可能用于垂直间距,或手动换行,否则会太长(特别是在编辑器翻译中)。例子:

    1. # PO file:
    2. "Scene '%s' is currently being edited.\n"
    3. "Changes will only take effect when reloaded."
    4. # Weblate:
    5. Scene '%s' is currently being edited.↵
    6. Changes will only take effect when reloaded.

备注

只考虑字符的逻辑顺序,在从右到左的文本中,格式字符串会被显示为 s%

在线文档(RST)

文档翻译源于 reStructuredText(RST)文件,这些文件还使用自己的标记语法来设置文本样式,创建内部和外部链接等。以下是一些示例:

  1. # "development" is styled bold.
  2. # "Have a look here" is a link pointing to https://docs.godotengine.org/en/latest.
  3. # You should translate "Have a look here", but not the URL, unless there is
  4. # a matching URL for the same content in your language.
  5. # Note: The `, <, >, and _ characters all have a meaning in the hyperlink
  6. # syntax and should be preserved.
  7. Looking for the documentation of the current **development** branch?
  8. `Have a look here <https://docs.godotengine.org/en/latest>`_.
  9. # "|supported|" is an inline reference to an image and should stay unchanged.
  10. # "master" uses the markup for inline code, and will be styled as such.
  11. # Note: Inline code in RST uses 2 backticks on each side, unlike Markdown.
  12. # Single backticks are used for hyperlinks.
  13. |supported| Backwards-compatible new features (backported from the ``master``
  14. branch) as well as bug, security, and platform support fixes.
  15. # The :ref: Sphinx "role" is used for internal references to other pages of
  16. # the documentation.
  17. # It can be used with only the reference name of a page (which should not be
  18. # changed), in which case the title of that page will be displayed:
  19. See :ref:`doc_ways_to_contribute`.
  20. # Or it can be used with an optional custom title, which should thus be translated:
  21. See :ref:`how to contribute <doc_ways_to_contribute>`.
  22. # You may encounter other Sphinx roles, such as :kbd: used for shortcut keys.
  23. # You can translate the content between backticks to match the usual key names,
  24. # if it's different from the English one.
  25. Save the scene. Click Scene -> Save, or press :kbd:`Ctrl + S` on Windows/Linux
  26. or :kbd:`Cmd + S` on macOS.

参见

参见 Sphinx 的 reStructured Text 入门 有关标记语言的快速概述, 请参阅源字符串。你可能会特别遇到内联标记(粗体,斜体,内联代码)以及内部和外部超链接标记。

类参考(BBCode)

类引用使用 XML 文件记录在 Godot 主仓库库中,并使用类似 BBCode 的标记进行样式设置和内部引用。

使用的一些标记来自原始 BBCode(例如 [b]Bold[/b][i]Italics[/i])而其他标记是 Godot 特定的,用于高级功能,例如内联代码(例如 [code]true[/code]),链接到另一个类(例如 [Node2D]),或链接到给定类中的属性(例如 [member Node2D.position]),或用于多行代码块。例子:

  1. Returns a color according to the standardized [code]name[/code] with [code]alpha[/code] ranging from 0 to 1.
  2. [codeblock]
  3. red = ColorN("red", 1)
  4. [/codeblock]
  5. Supported color names are the same as the constants defined in [Color].

在上面的例子中,不应被翻译 [code]name[/code][code]alpha[/code][Color],因为它们分别指的是参数名和 Godot API 的一个类。同样,[codeblock] 的内容也不应该翻译,因为 ColorN 是 Godot API 的一个函数,而 "red" 是它支持的一个命名颜色。你最多可以翻译持有结果的变量名称(red = ...)。

另请注意,在 XML 中,每一行都是一个段落,因此如果换行符不是原始翻译的一部分,则不应添加换行符。

参见

See our documentation for class reference writers for the list of BBCode-like tags which are used throughout the class reference.

离线翻译和测试

虽然我们建议使用 Weblate 界面来编写翻译,但你也可以在本地下载 PO 文件,用 PoeditLokalize 等你喜欢的 PO 编辑程序进行翻译。

要在本地下载 PO 文件,请浏览到你所用语言的翻译概述,然后选择“文件”菜单中的第一项:

../../_images/l10n_07_download_po_file.png

完成一系列编辑后,使用同一菜单中的“上传翻译”项并选择文件。选择“添加为翻译”作为文件的上传模式。

备注

如果在你下载 PO 文件和上传编辑版本之间经过了相当长的时间,则有可能同时覆盖其他贡献者编写的翻译。这就是为什么我们建议使用在线界面,以便你始终使用最新版本。

如果你想在本地测试更改(特别是编辑器翻译),可以使用下载的 PO 文件并从源码编译 Godot

将编辑器翻译 PO 文件重命名为 <lang>.PO(例如世界语 eo.po),并将其放入 editor/translations/ 文件夹(GitHub)。

你也可以用同样的方法测试类的引用变化,方法是对 PO 文件进行类似的重命名,并将其放入 doc/translations/ 文件夹(GitHub)。

本地化文档图像

在线文档包括许多图像,这些图像可以是Godot编辑器的屏幕截图,定制的图形以及任何其他类型的视觉内容。其中一些包含文本,因此可能与你的语言中的本地化相关。

这部分不通过 Weblate 处理,而是直接在 godot-docs-l10n Git 仓库中处理,文档翻译从 Weblate 同步过来。

备注

工作流不是最简单的, 需要一些Git知识. 我们计划开发一个简化的Web工具, 用它可以方便地管理图像定位, 抽象出这些步骤.

要翻译图像,你应该首先在原始的英文文档中找到它。为此,请浏览文档中的相关页面,例如 初识 Godot 编辑器。单击右上角的“Edit on GitHub”链接:

../../_images/l10n_08_edit_on_github.png

在 GitHub 上,单击要翻译的图像。如果相关,请单击“下载”将其下载到本地,并使用图像编辑工具进行编辑。请注意图像的完整路径,因为它需要进一步向下(这里是 getting_started/step_by_step/img/project_manager_first_open.png)。

../../_images/l10n_09_path_to_image.png

创建图像的本地化版本,或者编辑英文版本,或者用你的语言截取编辑器的屏幕截图(如果是编辑器截图的话)。有些图像还可能有SVG格式的源文件,因此你可以浏览包含它们的 img/ 文件夹以进行检查。

将你的本地化图片名改为原始图片名称, 并在扩展名前加上语言代码, 例如用于法语本地化的 project_manager_first_open.png 将变成 project_manager_first_open.fr.png .

最后,在 godot-docs-l10n 上,在 images 子文件夹中重新创建相同的文件夹结构(GitHub),并将翻译后的图像放在那里。在我们的示例中,最终结果应该是 images/getting_started/step_by_step/img/project_manager_first_open.fr.png

对其他图片重复这些操作,然后提交拉取请求