使游戏国际化
前言
Sería excelente que el mundo hablara solo un idioma(如果全世界都讲同一种语言就太好了)。不幸的是对于我们的开发人员来说,情况并非如此。虽然独立或投机游戏通常不需要本地化,但瞄准更大市场的游戏通常需要本地化。Godot 提供了许多工具来使这个过程更加简单,因此本教程更像一个妙招和技巧的合集。
本地化通常是通过雇佣特定的工作室来完成的,尽管有大量的软件和文件格式可供使用,但迄今为止进行本地化最常见的方式仍然是使用电子表格。创建电子表格并导入电子表格的过程已经在 导入翻译 教程中介绍过了,所以这个教程更像是对那个教程的后续。
备注
我们将使用官方演示作为示例,您可以从素材库下载。
配置导入的译文
翻译可以在更改时得到更新和重新导入,但仍必须添加到项目中。可通过项目 → 项目设置 → 本地化来完成:
上述对话框用于添加或删除项目范围内的翻译。
资源的本地化
根据当前语言,还可以指示 Godot 使用替代版本的素材(资源)。重定向选项卡可用于此:
选择需要重定向的资源,并指定它在其他语言地区的替代方案。
将键转换为文本
一些控件,例如 Button 和 Label,如果它们的文本与一个翻译键值相匹配,将自动获取翻译内容。例如,如果一个标签的文本是“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 就会使用这个区域设置(无论是从编辑器运行还是导出后运行均如此)。
请记住,因为这是一个项目设置,设为非空时会在版本控制中显示。因此,将修改提交到版本控制之前,应该将其设回空值。
还可以在从命令行运行 Godot 时测试语言。例如,要使用法语测试游戏,可以提供以下参数:
godot --language fr
翻译项目名称
导出到不同的操作系统和平台时,项目名称将成为应用程序名称。要以多种语言指定项目名称,请在项目设置中创建一个新设置 application/name
,并将区域标识符附加到其中。例如,对于西班牙语,这将是 application/name_es
:
如果您不确定要使用的语言代码,请参阅区域代码列表。