
Godot 多语言本地化实操用 PO 文件让你的游戏开口说玩家的语言【免费下载链接】godotGodot Engine – Multi-platform 2D and 3D game engine项目地址: https://gitcode.com/GitHub_Trending/go/godot你把游戏在 Godot Engine 里做到收尾发给海外测试玩家试玩对方回传一张截图满屏的英文按钮、菜单和对话框玩家一脸茫然地退出了。想让界面文本随玩家系统语言自动切换靠的就是 Godot 的本地化Localization系统——它用一种叫 PO 的文件当中间货币把你游戏里的每一句文字都登记在案。整条链路从core/string/目录下的翻译类开始到编辑器里的本地化面板收尾下面按你动手的顺序讲。先把 PO 文件挂到项目上别急着学格式先跑通最小闭环。准备一个 PO 文件后面教你怎么生成随便写一条翻译打开Project Settings Internationalization Locale Translations把文件路径加进去同一个面板下的Locale里设成目标语言比如zh_CN运行项目看文本有没有变。变了吗恭喜本地化管线通了。⚠️ 两个最常见的没反应就藏在这一步PO 文件必须是UTF-8编码Windows 记事本默认另存为 ANSI直接导致中文乱码或整份文件被跳过另外文件路径要写对资源没加载进去时控制台通常连报错都懒得给。PO 文件到底长什么样一句话它就是一张原文 → 译文的对照表。每条记录三行要素msgid Welcome to the Game! msgstr 欢迎来到游戏msgid原文保持英文别动它是全局唯一的身份证号msgstr译文行首带#的是注释给译者看上下文用的。Godot 用Translation类在运行时把整张表装进内存按 msgid 查词这个逻辑在core/string/translation.cpp里想深挖解析细节翻这个文件就行。导出你的第一份翻译模板你不可能手动把几百句文本抄进 PO 文件。Godot 编辑器内置了文本提取器选中场景里需要翻译的节点用本地化面板的导出功能生成一份POT 模板——里面列全了所有待翻译的 msgid译文栏留空。生成模板的逻辑在editor/translations/template_generator.cpp里属于编辑器扩展你平时不用碰它。模板生成后交给译者或者你自己用Poedit这类工具打开支持语法高亮和翻译记忆效率比裸改文本高得多。人多的团队可以上Weblate这类协作平台PO 文件是 gettext 生态的标准格式天然兼容。翻译时顺手处理的三件事占位符必须原样保留。原文里的%d、%s是运行时填数字、填名字的口子漏掉一个游戏里就会打印出裸%d。label.text tr(Start) label.text tr_n(You have 1 apple, You have %d apples, count)同一个词两种意思用上下文区分。Start 在主菜单是开始游戏在暂停菜单是继续不加分的话后者会覆盖前者msgctxt Main Menu msgid Start msgstr 开始游戏 msgctxt Pause Menu msgid Start msgstr 继续内部实现里 msgid 和 msgctxt 一起构成查表的键translation.h里的MessageKey所以上下文不是可有可无的装饰。复数形式单独写。英文有复数波兰语甚至有三种各语言规则不同。PO 文件用msgid_plural声明复数原文msgid You have 1 apple msgid_plural You have %d apples msgstr[0] 你有1个苹果 msgstr[1] 你有%d个苹果tr_n()会根据数值挑对应的msgstr[n]判断依据是core/string/plural_rules.cpp里内置的各语言复数规则表——中文zh属于只有一种形式的语言所以msgstr[1]其实填什么都不影响显示别被误导。翻译没生效按顺序翻这四个地方编码file 你的.po看一眼不是 UTF-8 就转有没有挂上回 Project Settings 确认路径还在、文件没被挪走当前语言对不对脚本里打印OS.get_locale()它受玩家系统语言影响你以为切到中文了实际可能还是en重复 msgid同一个 msgid 出现两次后者吃前者去模板里查重。还有一个骚操作TranslationServer 内置了伪本地化开关core/string/translation_server.h里的set_pseudolocalization_enabled开启后所有文本会变成加长变形的占位符能提前暴露德语比英文长 30%按钮撑爆了这类布局事故不用等真译文到位。让翻译更快更稳几条我踩过坑之后养成的习惯文本集中管理界面上能走tr()的别硬编码字符串硬编码的句子提取器看不见模板里永远不会出现UI 留余量Label 开自动换行autowrap 模式控件宽度按最长目标语言预留 15%~30%PO 文件进版本库和代码一起提交diff 就是翻译更新清单谁改了哪句一目了然语言清单早定第一天就确定支持哪几门临时加一门语言意味着全量返工模板。接下来你可以拿一个 10 句话的小场景试水导出模板 → Poedit 翻成中文 → 挂到项目设置里跑一遍。跑通之后再决定是手动维护还是接协作平台。想继续深入的话editor/translations/目录里的本地化面板源码值得逛一圈编辑器里那些按钮背后都是它。【免费下载链接】godotGodot Engine – Multi-platform 2D and 3D game engine项目地址: https://gitcode.com/GitHub_Trending/go/godot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考