news 2026/9/12 16:26:13

Cataclysm-DDA 翻译实战:一行游戏文案如何从 C++ 源码走到你的屏幕上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cataclysm-DDA 翻译实战:一行游戏文案如何从 C++ 源码走到你的屏幕上

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_CN

msgfmt 被调用后,会在lang/mo/zh_CN/LC_MESSAGES/下生成cataclysm-dda.mo——这就是游戏实际读取的翻译文件,PO 只是它的源码形态。lang/merge_po.sh 则负责另一件事:把 lang/incoming/ 里新收的译文和最新 POT 对齐,清掉过时条目。你翻译已有语言时直接改 PO 文件即可,合并脚本主要服务"外部交稿"场景。

跑起游戏验证效果

编译完直接运行游戏,系统语言匹配时翻译立即生效。想在中文系统上看别的语言效果,把生成目录lang/mo/zh_CN临时改名为你的系统语言目录即可——这是构建产物,不是仓库内容,官方文档也推荐这么做。进游戏看一眼角色创建界面和物品描述,占位符有没有显示成乱码数字、换行有没有挤在一起,当场就能验证。

🚀 提交第一个 PR:检查清单与常见拒收原因

  1. 分支里git diff --stat只显示你负责的那个lang/po/xx.po,模板.pot文件由每周自动任务重新生成,手改会被覆盖;
  2. 自查占位符:msgfmt --check-format lang/po/xx.po,有报错先修再提;
  3. 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 16:24:20

ESP32与HC-SR501人体感应模块零基础实战:从原理到感应灯

如果你第一次接触 ESP32&#xff0c;又恰好想做个“人一来就有反应”的装置——比如进门自动亮灯、感应报警器、或者统计房间里有没有人——那你大概率会搜到一块叫HC-SR501的小板子。它非常便宜&#xff0c;几块钱一块&#xff0c;圆形白色透镜&#xff0c;翠绿色的电路板&…

作者头像 李华
网站建设 2026/9/12 16:22:46

AI辅助学术写作:2025届毕业生的高效工具链

1. 2025届学术写作的AI革命2025届毕业生正面临学术写作范式的重大变革。我最近指导了几位本科生使用AI工具完成毕业论文&#xff0c;从开题到答辩仅用传统方法1/3的时间就达到了优秀水平。这并非个例——根据Nature最新调研&#xff0c;85%的顶尖高校教授已接受AI辅助的学术论文…

作者头像 李华