ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何快速上手 Godot 多语言本地化:tr() 函数与 PO 翻译文件完整指南

如何快速上手 Godot 多语言本地化:tr() 函数与 PO 翻译文件完整指南 如何快速上手 Godot 多语言本地化tr() 函数与 PO 翻译文件完整指南【免费下载链接】godotGodot Engine – Multi-platform 2D and 3D game engine项目地址: https://gitcode.com/GitHub_Trending/go/godot游戏出海后差评里出现没有中文的玩家很常见。Godot 多语言本地化是引擎内置能力用 tr() 包裹可翻译文本用标准 PO 翻译文件管理各语言运行时一行代码切换语言。本文从跑通第一条翻译讲起一路到动态语言切换菜单。① 概念速览翻译系统就两个角色Godot 的国际化方案只有两个核心角色。第一个是翻译文件采用 gettext 行业标准PO 格式每对msgid原文与msgstr译文构成一条键值对每种语言一个.po文件。第二个是TranslationServer引擎的单例服务记录当前语言环境为tr()查询和set_locale()切换提供统一入口。两者关系很直白运行时tr()拿原文去问 TranslationServer按当前语言查表命中返回译文未命中回退原文。② 最小可行示例三行代码跑通第一条翻译先不碰编辑器把最小链路跑通。第一步把原文写进代码并用 tr() 标记$Label.text tr(Hello, world)第二步创建翻译文件res://translations/zh_CN.po填一条记录msgid Hello, world msgstr 你好世界第三步加载翻译并切换语言var zh: Translation load(res://translations/zh_CN.po) TranslationServer.add_translation(zh) TranslationServer.set_locale(zh_CN)运行项目Label 显示你好世界。三行代码已经构成多语言本地化的闭环标记、加载、切换。后面讲的所有编辑器功能都是在这个闭环上做的工程化便利。③ 原理解密tr() 一次调用如何找到正确文本tr(Hello, world)执行时经过三跳TranslationServer 的translate()方法、转发给主翻译域TranslationDomain、在 PO 文件加载出的内存表中查表。查询键是原文与 locale 码的组合单次查找是常数时间。技术原理核心逻辑位于core/string/translation_server.cpp。set_locale()先对语言码做规范化再向主循环发出NOTIFICATION_TRANSLATION_CHANGED通知让各节点感知语言已变更。PO 文件由core/io/translation_loader_po.cpp模块解析复数形式则按core/string/plural_rules.cpp中的 CLDR 规则表匹配——这正是英文只需两种形式、波兰语需要三种形式的原因。④ 场景化实战真实项目里的三个高频场景批量导出模板让翻译流程转起来上百条文本不可能手写 PO 文件。在编辑器里打开Project Settings → Internationalization → Translations页面列出已加载的语言包并提供Export按钮可扫描整个项目生成.pot模板包含代码中 tr() 标记的文本和场景节点属性上勾选了地球图标标记的文本。把.pot发给翻译组译成对应.po后拖回编辑器即可。该功能实现在editor/translations/template_generator.cpp引擎自身的编辑器翻译同样用这套流程维护语言包存放在editor/translations/目录共 90 余种语言可直接参考其 PO 结构。在设置菜单里加切换语言设置菜单加一个下拉框选中后只需一行func on_language_selected(code: String): TranslationServer.set_locale(code)同时接上刷新信号动态语言切换才算闭环func _ready(): TranslationServer.connect(translation_changed, _refresh_ui)_refresh_ui里重设所有依赖 tr() 的文本即可。复数处理1 个苹果和%d 个苹果复数文本用tr_n()。PO 侧写法msgid You have one apple msgid_plural You have %d apples msgstr[0] 你有 1 个苹果 msgstr[1] 你有 %d 个苹果脚本侧一行调用$Label.text tr_n(You have one apple, You have %d apples, count) % count前两个参数是单复数原文第三个是数量引擎按当前语言的复数规则自动选对 msgstr 形式。⑤ 避坑与调优这三个坑几乎人人会踩坑一切换语言后旧文本纹丝不动现象调用了 set_locale()界面文字不变。原因TranslationServer 只更新查表结果不会自动改写已实例化节点上已赋值的文本。解法监听translation_changed信号或在切换后手动重设文本属性上文已给代码。坑二tr(中文) 永远不被翻译现象中文串包了 tr() 却原样显示。原因msgid 约定以**基础语言通常英文**书写把中文直接写进 tr() 等于用中文当原文zh_CN 翻译文件里自然查无此条。正确做法tr(Hello)译文你好写在 zh_CN.po 的 msgstr 里。坑三语言码填错切换静默失效现象set_locale(zh)似乎没生效。TranslationServer 内部会做规范化处理但最稳妥的写法是完整码zh_CN。设完用get_locale()回读确认再用has_message(zh_CN, Hello)验证词条——返回 false 说明翻译文件没加载或 msgid 对不上。⑥ 延伸与生态掌握基础后还能看什么协作工具链gettext 生态成熟译者用 Poedit 编辑.po团队可用 Weblate 集中管理只要遵循 PO 标准即可接入。编辑器自身多语言Godot 编辑器自带本地化Editor Settings 里即可切换界面语言语言包结构可作范本。读源码看机制翻译对象核心类在core/string/translation.cpp全局服务在core/string/translation_server.cpp。可克隆仓库https://gitcode.com/GitHub_Trending/go/godot搜索set_locale直接跳到实现。结语现在就去 Project Settings 挂上第一个语言文件跑通比读完更重要。之后建议先把导出模板 → 翻译 → 拖回导入的完整流程走一遍把协作节奏跑熟再考虑动态切换这类进阶需求。【免费下载链接】godotGodot Engine – Multi-platform 2D and 3D game engine项目地址: https://gitcode.com/GitHub_Trending/go/godot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表