编辑器和文档本地化
Godot的目标是让游戏开发提供给每个人,包括那些可能不知道或不习惯英语的人.因此,多亏了社区的翻译工作,我们尽最大努力使最重要的资源以多种语言提供.
这些资源包括:
Godot编辑界面 (约15,000个字).
online documentation <https://hosted.weblate.org/projects/godot-engine/godot-docs/> __(编辑器手册和教程,约30万字).
`类引用<https://hosted.weblate.org/projects/godot-engine/godot-class-reference/>`__ ,可在网上和编辑(约200000字).
为了管理翻译,我们使用gnugetext文件格式( PO
文件)和开源的 `Weblate<https://weblate.org>`__ 基于web的本地化平台,允许许多贡献者轻松协作来完成各种组件的翻译,并使其保持最新.单击上面粗体的链接访问Weblate上的每个资源.
本页概述了Weblate上的一般翻译工作流程,以及一些特定于资源的说明,例如如何处理某些关键字或图像的本地化.
小技巧
翻译所有的官方Godot内容是一项艰巨的任务,因此我们建议优先考虑上面列出的资源:首先是编辑器界面,然后是在线文档,如果有足够的翻译人员跟上更新,最后是类参考.
使用Weblate进行翻译
虽然我们的翻译最终驻留在Godot引擎及其文档的Git存储库中,但所有翻译更新都是通过Weblate处理的,因此不接受对Git存储库的直接pull请求.维护人员在Weblate和Godot存储库之间手动同步翻译.
因此,您应该 `在Weblate上注册<https://hosted.weblate.org/accounts/register/>`__ 为戈多的翻译贡献力量.
登录后,浏览到您要参与的Godot资源(在本页中,我们将使用 `编辑器翻译<https://hosted.weblate.org/projects/godot-engine/godot/>`__ 例如)要查找所有语言的列表:
参见
请随意查阅Weblate自己的 `翻译工作流程文档<https://docs.weblate.org/en/latest/user/translating.html>`__ 更多细节.
增加一种新的语言
如果您的语言已经列出,请单击其名称以访问概述,然后跳过本节的其余部分.
如果您的语言未列出,请滚动到语言列表的底部,单击”开始新翻译”按钮,然后选择要翻译的语言:
重要
如果您的语言在多个国家使用,但地区差异有限,请考虑将其添加为通用变体(如”fr”表示法语),而不是区域变体(如”fru fr”表示法语(法国),”fru CA”表示法语(加拿大),或”fru DZ”表示法语(阿尔及利亚)).
Godot有大量的内容需要翻译,因此只有在语言差异足够显著的情况下,才应该复制区域变体的工作.此外,如果对区域变体进行了翻译,则该翻译将仅对位于该区域的用户(或为该区域配置了系统语言)自动可用.
当地区差异大到需要单独翻译时,如果可能的话,我们建议先集中精力完成一个通用的变体,然后将完全完成的翻译复制到地区变体中,并进行相关的编辑。这通常是一个很好的策略,例如西班牙语(先完成 es
,然后必要时复制到 es_AR
,es_ES
,es_MX
等)或葡萄牙语( pt_BR
与 pt_PT
)。
翻译接口
一旦选择了一种语言,您将看到翻译状态的概述,包括还有多少字符串需要翻译或审阅.每个项目都可以单击并用于浏览相应的列表.您还可以单击”Translate”按钮开始操作字符串列表.
选择”翻译”列表后,您将看到所有工作发生的主要翻译界面:
在那一页,你有:
一个工具栏,可以让你在当前列表的字符串中循环,切换到另一个预定义的列表或进行自定义搜索等.还有一个”禅”编辑模式和一个简化的界面.
在”翻译”面板中处理的实际字符串.默认情况下,应该有英语源字符串和您的语言的编辑框.如果您熟悉其他语言,可以将其添加到用户设置中,以提供更多翻译上下文.编辑完当前字符串后,按”保存”确认更改并移到下一个条目.或者,使用”跳过”按钮跳过它.”需要编辑”复选框意味着原始字符串已更新,因此需要检查翻译以考虑这些更改(在PO术语中,这些是所谓的”模糊”字符串).在修复之前,这些字符串不会在翻译中使用.
底部面板有各种工具可以帮助翻译工作,例如来自附近字符串的上下文(通常来自同一编辑器工具或文档页,因此它们可能使用类似的术语)、来自其他翻译人员的注释、机器翻译以及该字符串的所有其他现有翻译的列表.
在右上角,术语表显示了先前添加了条目的术语,以及当前字符串中包含的术语.例如,如果您与其他翻译人员一起决定对Godot中的”node”术语使用特定的翻译,您可以将其添加到词汇表中,以确保其他翻译人员使用相同的约定.
右下面板包含有关源字符串的信息.最相关的项目是”源字符串位置”,它将您链接到GitHub上的原始字符串.您可能需要在页面中搜索字符串来定位它及其周围的上下文.
查找原始内容
PO文件是源字符串(msgid`)及其翻译(msgstr`)的有序列表,默认情况下,Weblate将按该顺序显示字符串.因此,了解PO文件中内容的组织方式非常有用,可以帮助您定位原始内容,并在翻译时将其用作参考.
重要
翻译时以原文语境为参照是最原始的,因为许多词根据语境有几种可能的翻译.使用错误的翻译实际上会对用户造成伤害,并且会比使用英语更难理解.使用上下文也使翻译工作更容易和更愉快,因为你可以直接看到你写的翻译是否在上下文中有意义.
编辑器接口的翻译模板是通过解析所有C++源代码在 字母顺序 中生成的,所以在给定文件中定义的所有字符串将被分组在一起.例如,如果”源字符串位置”指示
editor/code_编辑器.cpp
,则当前字符串(以及附近的字符串)在编辑器/code中定义_编辑器.cpp
代码文件,因此与Godot(GDScript,shaders)中的代码编辑器相关.在线文档的翻译模板是按照 目录 中所示的相同顺序从源RST文件生成的,因此,例如,第一个字符串来自文档的首页.因此,建议的工作流程是找到与要翻译的页面相对应的唯一字符串,然后翻译具有相同源字符串位置的所有字符串,同时与该页面的英文联机版本进行比较.源字符串位置的示例可以是
getting_started/step_by_step/scenes_and_nodes.rst
对于页面 场景与节点 .类引用的翻译模板是从源XML文件按 字母顺序 生成的,这与联机版本的目录顺序相同.因此,您可以定位与给定类的简要描述相对应的源字符串,以找到要翻译的第一个字符串,并且该类中的所有其他描述都应位于Weblate上的后续字符串中.例如 classu Node2D 类的描述将具有源字符串位置
doc/classes/Node2D.xml
.
定位特定页面/类的一个方便工具是使用Weblate的高级搜索功能,尤其是”Location strings”查询(也可以与``Location:标记一起使用,例如``位置:scenes\u和\u nodes.rst
):
注解
当一个给定的源字符串被用于多个源位置时,它们都将被串联成一个。例如,上面的 location:scenes_and_nodes.rst
查询将首先落在 “Introduction” 源字符串上,它被用于几十个页面,包括模板中 scenes_and_nodes.rst
之前的一些。然后点击下一步按钮,我们就会看到上面显示的场景和节点标题字符串。因此,可能会发生这样的情况:当阅读一个页面的在线版本时,某个段落或章节的标题不在你期望的位置。
遵守标记语法
每个翻译资源源于不同的源代码格式,对每个资源使用的标记语言有一些概念对于避免在翻译中产生语法错误非常重要.
编辑器接口(C++)
编辑部的翻译源于C++字符串,并且可以使用:
C格式说明符,如 %s`(字符串)或 `%d`(数字).这些说明符在运行时被内容替换,并且应该在必要时保留并放置在翻译中,以便在替换后有意义.您可能需要参考源字符串的位置,以了解如果句子中不清楚将替换什么类型的内容.示例( `%s 将替换为文件名或路径):
# PO file:
"There is no '%s' file."
# Weblate:
There is no '%s' file.
C转义字符,如
\n
(换行符)或\t
(制表符).在Weblate编辑器中,\n
字符由↵
替换,``t`` 由 ``↹``替换.制表符的使用并不多,但您应该确保使用与原始英文字符串相同的换行符(如果不使用,Weblate将发出警告).换行符有时可能用于垂直间距,或手动换行,否则会太长(特别是在编辑器翻译中).例子:# PO file:
"Scene '%s' is currently being edited.\n"
"Changes will only take effect when reloaded."
# Weblate:
Scene '%s' is currently being edited.↵
Changes will only take effect when reloaded.
在线文件(RST)
文档翻译源于reStructuredText(RST)文件,这些文件还使用自己的标记语法来设置文本样式、创建内部和外部链接等.以下是一些示例:
# "development" is styled bold.
# "Have a look here" is a link pointing to https://docs.godotengine.org/en/latest.
# You should translate "Have a look here", but not the URL, unless there is
# a matching URL for the same content in your language.
# Note: The `, <, >, and _ characters all have a meaning in the hyperlink
# syntax and should be preserved.
Looking for the documentation of the current **development** branch?
`Have a look here <https://docs.godotengine.org/en/latest>`_.
# "|supported|" is an inline reference to an image and should stay unchanged.
# "master" uses the markup for inline code, and will be styled as such.
# Note: Inline code in RST uses 2 backticks on each side, unlike Markdown.
# Single backticks are used for hyperlinks.
|supported| Backwards-compatible new features (backported from the ``master``
branch) as well as bug, security, and platform support fixes.
# The :ref: Sphinx "role" is used for internal references to other pages of
# the documentation.
# It can be used with only the reference name of a page (which should not be
# changed), in which case the title of that page will be displayed:
See :ref:`doc_ways_to_contribute`.
# Or it can be used with an optional custom title, which should thus be translated:
See :ref:`how to contribute <doc_ways_to_contribute>`.
# You may encounter other Sphinx roles, such as :kbd: used for shortcut keys.
# You can translate the content between backticks to match the usual key names,
# if it's different from the English one.
Save the scene. Click Scene -> Save, or press :kbd:`Ctrl + S` on Windows/Linux
or :kbd:`Cmd + S` on macOS.
参见
参见斯芬克斯的 `重组文本入门<https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`__ 有关标记语言的快速概述,请参阅源字符串.您可能会特别遇到内联标记(粗体、斜体、内联代码)以及内部和外部超链接标记.
类参考 (BBCode)
类引用使用XML文件记录在Godot主存储库中,并使用类似BBCode的标记进行样式设置和内部引用.
使用的一些标记来自原始BBCode(例如,`[b]Bold[/b]``和`[i]Italics[/i]```),而其他标记是Godot特定的,用于高级功能,例如内联代码(例如,`[code]true[/code]``),链接到另一个类(例如,`[Node2D]`),或链接到给定类中的属性(例如,`[member Node2D.position]`),或用于多行代码阻碍.例子:
Returns a color according to the standardized [code]name[/code] with [code]alpha[/code] ranging from 0 to 1.
[codeblock]
red = ColorN("red", 1)
[/codeblock]
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中,每一行都是一个段落,因此如果换行符不是原始翻译的一部分,则不应添加换行符.
参见
请参阅我们的类引用编写器文档以获取 :ref:`list of BBCode like tags<docu updateingu theu classu referenceu BBCode>`这些标记在整个类引用中使用.
离线翻译和测试
虽然我们建议使用Weblate接口来编写翻译,但您也可以在本地下载PO文件,用您喜欢的PO编辑应用程序(如”Poedit”)进行翻译 Poedit 或 Lokalize.
要在本地下载PO文件,请浏览到您所用语言的翻译概述,然后选择”文件”菜单中的第一项:
完成一系列编辑后,使用同一菜单中的”上载翻译”项并选择文件.选择”添加为翻译”作为文件上载模式.
注解
如果在您下载PO文件和上载编辑版本之间经过了相当长的时间,则有可能同时覆盖其他贡献者编写的翻译.这就是为什么我们建议使用在线界面,以便您始终使用最新版本.
如果您想在本地测试更改(特别是编辑器翻译),可以使用下载的PO文件和 compile Godot from source.
将编辑器翻译PO文件重命名为 <lang>.PO``(例如 ``环氧乙烷
,并将其放入 editor/translations/
文件夹(`GitHub<https://github.com/godotengine/godot/tree/master/editor/translations>`__ ).
你也可以用同样的方法测试类的引用变化,方法是对PO文件进行类似的重命名,并将其放在 doc/translations/
文件夹中( GitHub <https://github.com/godotengine/godot/tree/master/doc/translations> __).
本地化文档图像
在线文档包括许多图像,这些图像可以是Godot编辑器的屏幕截图、定制的图形以及任何其他类型的视觉内容.其中一些包含文本,因此可能与您的语言中的本地化相关.
这部分不通过Weblate处理,而是直接在 godot-docs-l10n <https://github.com/godotengine/godot-docs-l10n> _ Git仓库中处理,文档翻译从Weblate同步过来.
注解
工作流不是最简单的,需要一些Git知识.我们计划开发一个简化的Web工具,用它可以方便地管理图像定位,抽象出这些步骤.
要翻译一个图像,你应该首先在原始的英文文档中找到它.为此,请浏览文档中的相关页面,例如 docu introu To u the u editoru interface.单击右上角的”在GitHub上编辑”链接:
在GitHub上,单击要翻译的图像.如果相关,请单击”下载”在本地下载,并使用图像编辑工具进行编辑.请注意图像的完整路径,因为它需要进一步向下(这里是 getting_started/step_by_step/img/project_manager_first_open.png
).
创建图像的本地化版本,或者编辑英文版本,或者用你的语言截取编辑器的屏幕截图(如果是编辑器截图的话).有些图像还可能有SVG格式的源文件,因此您可以浏览包含它们的``img/``文件夹以进行检查.
将本地化图像命名为与原始图像相同的名称,但在扩展名之前添加语言代码,例如”projectu manageru first”_打开.png``会成为”项目经理”_打开.fr.png``为了法国的本地化.
最后,在godot-docs-l10n上,为``images``子文件夹(GitHub)中的原始图像重新创建相同的文件夹结构<https://github.com/godotengine/godot-docs-l10n/tree/master/images>),并将翻译后的图像放在那里.在我们的示例中,最终结果应该是``images/getting_started/step_by_step/img/project_manager_first_open.fr.png`` .
对其他图片重复这样做,然后 发送一个 Pull Request.