使游戏国际化¶
前言¶
Sería excelente que el mundo hablara solo un idioma(如果全世界都讲同一种语言就太好了)。不幸的是对于我们的开发人员来说,情况并非如此。虽然独立或投机游戏通常不需要本地化,但瞄准更大市场的游戏通常需要本地化。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)))
TranslationServer¶
Godot 有一个进行底层翻译管理的服务器,名为 TranslationServer。可以在运行时添加或删除翻译;当前语言也可以在运行时更改。