使游戏国际化

前言

Sería excelente que el mundo hablara solo un idioma(如果全世界都讲同一种语言就太好了)。不幸的是对于我们的开发人员来说,情况并非如此。虽然独立或投机游戏通常不需要本地化,但瞄准更大市场的游戏通常需要本地化。Godot 提供了许多工具来使这个过程更加简单,因此本教程更像一个妙招和技巧的合集。

本地化通常是通过雇佣特定的工作室来完成的,尽管有大量的软件和文件格式可供使用,但迄今为止进行本地化最常见的方式仍然是使用电子表格。创建电子表格并导入电子表格的过程已经在 导入翻译 教程中介绍过了,所以这个教程更像是对那个教程的后续。

备注

我们将使用官方演示作为示例,您可以从素材库下载

配置导入的译文

翻译可以在更改时得到更新和重新导入,但仍必须添加到项目中。可通过项目 → 项目设置 → 本地化来完成:

../../_images/localization_dialog.png

上述对话框用于添加或删除项目范围内的翻译。

资源的本地化

根据当前语言,还可以指示 Godot 使用替代版本的素材(资源)。重定向选项卡可用于此:

../../_images/localization_remaps.png

选择需要重定向的资源,并指定它在其他语言地区的替代方案。

将键转换为文本

一些控件,例如 ButtonLabel,如果它们的文本与一个翻译键值相匹配,将自动获取翻译内容。例如,如果一个标签的文本是“MAIN_SCREEN_GREETING1”并且该键值存在于当前的翻译中,那么该文本将被自动翻译。

这种自动翻译行为在某些情况下可能是不可取的。例如,当使用 Label 来显示玩家的名字时,如果玩家的名字与翻译键相匹配,你很可能不希望它被翻译。要禁用特定节点的自动翻译,请使用 Object.set_message_translation 并发送 Object.notification 来更新翻译:

func _ready():
    # This assumes you have a node called "Label" as a child of the node
    # that has the script attached.
    var label = get_node("Label")
    label.set_message_translation(false)
    label.notification(NOTIFICATION_TRANSLATION_CHANGED)

对于 OptionButton 等更复杂的 UI 节点,你可能要用这个代替:

func _ready():
    var option_button = get_node("OptionButton")
    option_button.set_message_translation(false)
    option_button.notification(NOTIFICATION_TRANSLATION_CHANGED)
    option_button.get_popup().set_message_translation(false)
    option_button.get_popup().notification(NOTIFICATION_TRANSLATION_CHANGED)

在代码中, 可以使用 Object.tr() 函数. 这将只是在翻译中查找文本, 如果找到的话就进行转换:

level.set_text(tr("LEVEL_5_NAME"))
status.set_text(tr("GAME_STATUS_" + str(status_index)))

使控件的大小可调

不同语言的相同文本的长度差异很大。为此,请务必阅读教程 大小和锚点,因为动态调整控件大小可能有所帮助。Container 可能很有用,Label 的文本换行选项应该也能帮上忙。

TranslationServer

Godot 有一个进行底层翻译管理的服务器,名为 TranslationServer。可以在运行时添加或删除翻译;当前语言也可以在运行时更改。

Testing translations

You may want to test a project's translation before releasing it. Godot provides two ways to do this.

First, in the Project Settings, under Input Devices > Locale, there is a Test property. Set this property to the locale code of the language you want to test. Godot will run the project with that locale when the project is run (either from the editor or when exported).

..image:: img/locale_test.png

Keep in mind that since this is a project setting, it will show up in version control when it is set to a non-empty value. Therefore, it should be set back to an empty value before committing changes to version control.

Translations can also be tested when running Godot from the command line. For example, to test a game in French, the following argument can be supplied:

godot --language fr

翻译项目名称

导出到不同的操作系统和平台时,项目名称将成为应用程序名称。要以多种语言指定项目名称,请在项目设置中创建一个新设置 application/name,并将区域标识符附加到其中。例如,对于西班牙语,这将是 application/name_es

../../_images/localized_name.png

如果您不确定要使用的语言代码,请参阅区域代码列表