使游戏国际化

前言

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。可以在运行时添加或删除翻译;当前语言也可以在运行时更改。

命令行

从命令行运行 Godot 时可以测试语言。例如,要使用法语测试游戏,可以提供以下参数:

godot --language fr

翻译项目名称

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

../../_images/localized_name.png

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