Cataclysm-DDA 翻译实战:一行游戏文案如何从 C++ 源码走到你的屏幕上
【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA
Cataclysm-DDA 是一款开源的末日生存回合制游戏,全部界面、物品描述、NPC 对话都写死在 C++ 代码和上万个 JSON 数据文件里,可翻译文本超过 5 万条。如果你想在开源游戏汉化圈里迈出第一步,这里不用读一行 C++,只要看懂 gettext 工具链的四个环节,就能独立提交第一条翻译。下面直接以你的第一个 PR 为终点,倒推整条路线。
一次典型的 CDDA 战斗场景——屏幕上这些英文文本,正是译者要逐条替换的对象
🗺️ 翻译链路全景:一行英文去了哪
先建立地图再动手。假设游戏里有一条%s 被僵尸咬伤了的来源文案 "%s is bitten by a zombie",它从源码到你眼睛要经过四个站点:
- 标记:C++ 源码里用
_()这类函数把字符串包起来,等于在代码上贴了张"此句可翻译"的便签; - 提取:工具扫描全部源码和 JSON,把贴了便签的句子收拢进一个翻译模板文件(POT),一句一个条目;
- 翻译:你把模板对应的语言 PO 文件("原文+译文"对照表格,gettext 生态的标准格式)填上译文,写进 msgstr;
- 运行时查表:PO 文件编译成二进制 MO 文件后,游戏启动时按 msgid 查表,把你的译文替换上屏。
整条链路你只需要亲手跑前三站,第四站是编译器自动完成的。
⚡ 5 分钟搭好 gettext 环境,提取全部原文
装齐三件套工具
gettext 是开源世界最通用的翻译工具链,你常用到的是 xgettext(提取)、msgmerge(合并)、msgfmt(编译)三个命令:
sudo apt install gettext python3一条命令生成翻译模板
git clone https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA进仓库根目录后运行:
./lang/update_pot.sh它内部做两件事:xgettext 扫src/下的 C++ 代码,接着 lang/extract_json_strings.py 处理data/下所有 JSON,最后合并出 lang/po/cataclysm-dda.pot 并跑一遍 Unicode 校验。脚本末尾打印 "ALL DONE!" 就说明模板已就绪,后面所有翻译都基于它。
📝 PO 文件里那堆 msgid 到底怎么填
msgid 是原文,msgstr 是你的译文
条目长这样,注释行还标了原文出处,猜不出词义时它就是最佳线索:
#: action.cpp:421 msgid "Construct Terrain" msgstr "建造地形"用 Poedit 这类编辑器打开,会把它渲染成左右两列的表格,你只管往右边填。那为什么一个条目有时会出现四条译文?多数字语言有复数变化,俄文要四个形态,中文一个就够——填几条msgstr[n]看模板里预留的位数即可。
占位符、标签、换行:三类别动的字符
新手被拒的 PR,八成不是词不达意,而是动了这三样东西:
%s、%d这类占位符:运行时被替换成角色名、数字。全部保留;如果译文语序颠倒了,必须改成带编号的%1$s、%2$s,例如 "%s shoots %s" 译成"%1$s 向 %2$s 开火";<name>这类标签:是游戏识别人名的记号,原样保留;\n换行:保留换行的语义位置。
细节坑位都写在 lang/notes/ 的译者须知里,含每种语言的文件头格式和复数规则,动手前先翻一遍能省掉一轮返工。
🔧 游戏怎么认出你的翻译:从 .po 到 .mo
编译与合并,最后两条命令
./lang/compile_mo.sh zh_CNmsgfmt 被调用后,会在lang/mo/zh_CN/LC_MESSAGES/下生成cataclysm-dda.mo——这就是游戏实际读取的翻译文件,PO 只是它的源码形态。lang/merge_po.sh 则负责另一件事:把 lang/incoming/ 里新收的译文和最新 POT 对齐,清掉过时条目。你翻译已有语言时直接改 PO 文件即可,合并脚本主要服务"外部交稿"场景。
跑起游戏验证效果
编译完直接运行游戏,系统语言匹配时翻译立即生效。想在中文系统上看别的语言效果,把生成目录lang/mo/zh_CN临时改名为你的系统语言目录即可——这是构建产物,不是仓库内容,官方文档也推荐这么做。进游戏看一眼角色创建界面和物品描述,占位符有没有显示成乱码数字、换行有没有挤在一起,当场就能验证。
🚀 提交第一个 PR:检查清单与常见拒收原因
- 分支里
git diff --stat只显示你负责的那个lang/po/xx.po,模板.pot文件由每周自动任务重新生成,手改会被覆盖; - 自查占位符:
msgfmt --check-format lang/po/xx.po,有报错先修再提; - PR 描述写清语言代码、本次翻译条目数、是否遵循了 lang/notes/ 里的该语言约定。
记住一条铁律:msgid 是翻译系统的"主键",改一个字符对应译文就失效,所以 PO 文件里你唯一有权限写的就是 msgstr。把第一个 PR 提上去吧——下次再看到屏幕上的英文漏网文案,你会比谁都清楚它卡在了链路的哪一站。
【免费下载链接】Cataclysm-DDACataclysm - Dark Days Ahead. A turn-based survival game set in a post-apocalyptic world.项目地址: https://gitcode.com/GitHub_Trending/ca/Cataclysm-DDA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考