开源重置 沙丘2 游戏 · Dune Legacy 中文本地化与渲染技术说明
搜索开源游戏源码学习,无意间找到了这个项目---- Dune Legacy[An open-source remake of Dune II · 沙丘2的开源重置版],但是没有中文本地化。本文档说明在本项目(及官方 Dune Legacy 同源架构)下,如何将界面与文本翻译为简体中文 ,以及中文能否正确显示 所依赖的引擎机制、配置文件与常见排错步骤。适用于维护 locale/Chinese.zh.po、配置游戏与理解源码行为。注意,本文涉及到的内容借助了AI生成和汇总。
游戏介绍和下载地址:https://dunelegacy.com/
仓库地址:https://github.com/henricj/dunelegacy
游戏下载(已集成中文汉化): https://wwasp.lanzn.com/iDIeJ3mnks1i
成果展示:
一、总体架构
Dune Legacy 使用 GNU gettext 风格的 .po 文件 存储可翻译字符串,运行时通过类似 _() 的宏将 msgid(通常为英文) 映射为 msgstr(目标语言) 。
渲染使用 SDL_ttf ,对 UTF-8 字符串调用 TTF_RenderUTF8_Blended 等 API,因此编码层面支持中文 ;限制主要来自 字体文件是否包含汉字字形 ,而非“引擎不支持 Unicode”。
流程图(Mermaid):
graph LR Config[用户配置 Language zh] -->|读取| TextManager[TextManager 加载 zh po] TextManager -->|查表| Lookup[根据 msgid 获取 msgstr] Lookup -->|索引字符串| Post[postProcessString 读取 PAK 文本] Lookup -->|普通 UTF8 字符串| Direct[直接使用 msgstr] Post --> Font[FontManager 与 TTFFont] Direct --> Font Font -->|UTF8 渲染| Screen[屏幕显示]二、翻译文件:.po 格式与命名
2.1 文件位置与命名
语言文件放在游戏数据目录下的 locale/ 中(与 LEGACY.PAK 等资源同级或可搜索路径内)。
命名需与 语言代码 一致:配置里 General.Language = zh 时,引擎按 *.zh.po 匹配(例如 Chinese.zh.po)。
模板/汇总文件常见名:dunelegacy.pot(仅 msgid,供生成各语言 po)。
2.2 文件头(Header)
.po 头部 msgid "" 的 msgstr 中含元数据,对中文建议至少包含:
Language: zh_CN (或 zh)
Content-Type: text/plain; charset=UTF-8
Plural-Forms: nplurals=1; plural=0; (简体中文通常无复数形态区分)
2.3 与原版 Dune II 数据的关系:LanguageFileExtension 与 LanguagePakFiles
每个 .po 中通常包含两条特殊条目(与 English.en.po / German.de.po 等一致):
msgid英语示例含义LanguageFileExtensionENG / GER / FRE决定从 PAK 里读 TEXTH.*、TEXTA.*、MESSAGE.* 等文件时使用的语言后缀 LanguagePakFilesENGLISH.PAK,... 或 GERMAN.PAK需要加载的语言相关 PAK 列表
德语/法语 :有官方 GERMAN.PAK / FRENCH.PAK ,简报等可从 PAK 中取对应语言。
简体中文 :不存在 官方中文 PAK。实践中 LanguageFileExtension 仍设为 ENG ,LanguagePakFiles 与英语一致,战役与 Mentat 等仍从英文资源索引 ;若要在界面显示中文,需在 .po 里把对应条目的 msgstr 写成完整中文 ,且不要 以 @ 引用英文索引(见下文 @ 机制)。
三、翻译策略:两类字符串
3.1 普通 UI 字符串
形式 :msgid "Upgrade" → msgstr "升级"
特点 :无 @ 前缀,msgstr 即为最终显示文本。菜单、按钮、选项、部分提示等多属此类。
3.2 带 @ 的“索引字符串”(与 PAK 联动)
形式示例 :msgid "@MESSAGE.ENG|10#Windtrap: Windtrap supplies..." msgstr "@MESSAGE.ENG|10" 复制代码 引擎逻辑(概念上):
先得到本地化后的字符串(此处仍为 @MESSAGE.ENG|10)。
若以 @ 开头,则 postProcessString 解析 文件名|索引|可选替换规则#注释,从已加载的 索引文本 (来自 MESSAGE.ENG 等)中取出英文正文 显示;# 后多为开发用注释。
因此:
msgstr "@MESSAGE.ENG|10" → 实际显示的是 ENGLISH.PAK 里 MESSAGE 第 10 条英文 ,不是 msgid 里 # 后面的说明文字。
要显示中文 :应把 msgstr 改为不含 @ 开头的纯中文 ,例如:
msgstr "捕风站:为基地供电。没有电力时建筑会随时间损坏。"
这样不会走 PAK 索引,直接显示中文。
法语/德语 常见写法是 msgstr "@TEXTH.FRE|4",从 FRENCH.PAK 取法文;中文无中文 PAK 时,不能照搬 @TEXTH.CHN|…,除非自制 PAK(一般不现实)。
3.3 战役简报(TEXTH / TEXTA / TEXTO)
大量条目的 msgid 仅为占位,如 Description of Atreides mission 1,真正长文存在 PAK 的 TEXTH/TEXTA/TEXTO 英文表中 。
若 msgstr 仍为 @TEXTA.ENG|4 等,游戏中简报仍为英文 。
全文中文化 :需为每条任务撰写中文 msgstr(纯文本),工作量很大,通常按战役分批 完成。
3.4 机器翻译 + 人工校对(本仓库采用过)
可用 German.de.po 或 dunelegacy.pot 为源,对非 @ 的 UI 按 msgid(英文) 批量机翻,再人工修正术语(如 Carryall→运载机、Harvester→采集车)。
@ 类条目 :机翻 msgid 无效;要么保持 @…ENG… 继续英文,要么改为手写中文 msgstr 。
四、中文渲染:字体与配置(核心)
4.1 引擎侧(源码层面)
字体由 FontManager 加载,实际实现为 TTFFont ,使用 SDL_ttf :
TTF_RenderUTF8_Blended
TTF_SizeUTF8
结论 :字符串为 UTF-8 即可;缺字 是因为 TTF 文件不包含 CJK 字形 ,常见表现为空白、方框或完全不画字 。
4.2 默认字体
发行版数据里默认常使用 Philosopher-Bold.ttf (西文标题向),不含中文 。仅当 msgstr 为拉丁字母时仍能显示;中文需要换成含简中的 TTF/OTC/TTC 。
4.3 配置项:Video.Typeface
在 Dune Legacy.ini 的 [Video] 节中:或指定字体:Typeface = C:/Windows/Fonts/simhei.ttf Typeface = C:/Windows/Fonts/msyh.ttc 复制代码 行为要点(与常见开源分支一致):
default 或空 :使用内置默认(多为 Philosopher-Bold.ttf)。
绝对路径 :FileManager: penFile 对 绝对路径 直接用 SDL_RWFromFile 打开,可指向系统字体 。
相对文件名 :在游戏数据搜索路径下查找同名文件。
注意 :
.ttc(字体集合) 在部分 SDL_ttf/FreeType 组合下可能出现兼容问题;若异常可换 单面 .ttf (如 simhei.ttf)。
INI 解析若对路径中字符敏感,可尝试 正斜杠 C:/Windows/...。
4.4 用户目录覆盖同名字体(高级)
搜索路径通常包含:
游戏安装数据目录
用户配置目录下的 data/ (如 %AppData%\Roaming\dunelegacy\data\)
若某分支实现为:同名文件先被安装目录占用 ,则仅把字体放在用户 data 可能无法 覆盖;若安装目录没有 散文件 Philosopher-Bold.ttf(只在 PAK 内),则用户 data\Philosopher-Bold.ttf 可能 被优先命中——视具体版本 CaseInsensitiveFilesystemCache 合并顺序 而定。
最稳妥 仍是使用 Typeface 绝对路径 指向中文字体。
4.5 源码级自动选择 CJK 字体(可选开发项)
若在自编译分支的 main.cpp 中实现:当 Language 以 zh 开头且 Typeface 为 default 时,依次尝试:
数据目录下的 NotoSansSC-Regular.otf 等;
Windows:C:\Windows\Fonts\msyh.ttc、simhei.ttf 等;
Linux/macOS:常见 Noto CJK / 系统黑体路径;
找不到则回退默认西文字体并打日志警告。这样可减少用户手改 ini。
五、配置与文件路径(Windows 示例)
用途路径用户主配置%AppData%\Roaming\dunelegacy\Dune Legacy.ini用户数据(可放字体覆盖等)%AppData%\Roaming\dunelegacy\data\安装目录模板配置\config\Dune Legacy.ini语言 :字体 (示例):[Video] Typeface = C:/Windows/Fonts/simhei.ttf 复制代码 修改后需重启游戏 ;若从安装目录复制 config 模板,注意实际生效的是用户目录下的 ini (若已生成)。
六、主菜单“只有英文有字、中文空白”的现象
早期曾将主菜单 msgstr 译为中文,但默认字体无汉字 → 按钮看似空白 。
仅 MODS 等仍为英文 msgid 时可能仍可见。
解决 :
先配置 含中文的 Typeface (或覆盖/替换字体方案);
再使用中文 msgstr;或暂时保留主菜单英文以保证可点选。
七、检查清单(落地步骤)
locale/Chinese.zh.po :UTF-8,头部 Language、Plural-Forms 正确。
LanguageFileExtension = ENG ,LanguagePakFiles 与英语一致(无中文 PAK 时)。
需要中文显示的条目:msgstr 不要用仅 @…ENG… (除非接受英文);建筑说明等应改为纯中文 。
Dune Legacy.ini :Language = zh,Typeface 指向中文字体或使用支持中文的默认逻辑。
将 Chinese.zh.po 放到游戏实际读取的 locale 目录。
重启游戏验证;若仍缺字,换字体或检查路径/.ttc 兼容性。
八、参考:引擎内关键符号(便于对照源码)
概念说明_() / getLocalized()查 .po 映射getLocalized 见 @ 开头进入 postProcessString,从 PAK 索引取字TTFFont::createTextSurfaceTTF_RenderUTF8_BlendedFontManager从 Typeface 指定或默认 TTF 加载FileManager: penFile支持绝对路径打开字体文件(具体类名、函数名以你所使用的源码分支为准,如 henricj/dunelegacy 等。)
九、总结
目前的 AI 已经完全能胜任翻译的工作,进行本地化适配任务。这次我用了Cursor IDE 配合 Auto 智能模式 做了本次翻译适配尝试。它主动提出要查看英文、德文等其他语言的原文本进行参考再结合故事设定,综合翻译出最适合的文本。其实AI还提供了另外的解决方案,有一种是直接改动源码,修改渲染底层。
有了AI的加持,以后的本地化工作就非常简单容易了,即使官方没有给出汉化,我们也可以自己翻译做适配。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
相关推荐