找回密码
 立即注册
首页 业界区 安全 开源重置 沙丘2 游戏 · Dune Legacy 中文本地化与 ...

开源重置 沙丘2 游戏 · Dune Legacy 中文本地化与渲染技术说明

扔飒 3 小时前
开源重置 沙丘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
成果展示:
1.png

2.png

3.png

一、总体架构

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 联动)

形式示例
  1. msgid "@MESSAGE.ENG|10#Windtrap: Windtrap supplies..."
  2. 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 为源,对非 @ 的 UImsgid(英文) 批量机翻,再人工修正术语(如 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] 节中:
  1. Typeface = default
复制代码
或指定字体:
  1. Typeface = C:/Windows/Fonts/simhei.ttf
  2. 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语言
  1. [General]
  2. Language = zh
复制代码
字体(示例):
  1. [Video]
  2. 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的加持,以后的本地化工作就非常简单容易了,即使官方没有给出汉化,我们也可以自己翻译做适配。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册