别再乱放文件了!RimWorld Mod汉化保姆级指南:DefInjected与Keyed文件夹到底怎么用?
RimWorld Mod汉化完全指南:DefInjected与Keyed文件夹的终极解析
刚接触RimWorld Mod汉化的玩家,往往会在Language文件夹前陷入选择困难——DefInjected和Keyed这两个文件夹看起来都能放翻译文件,但实际效果却天差地别。我曾见过不少新手将Keyed格式的文本误放入DefInjected,结果游戏里死活不显示中文;也遇到过资深玩家因为不理解加载优先级,导致精心制作的翻译被其他Mod覆盖。本文将彻底拆解这两个核心文件夹的运作机制,让你从文件结构层面掌握汉化的正确姿势。
1. 汉化文件基础架构:认识Language文件夹
任何RimWorld Mod的汉化工作都始于Language文件夹的正确配置。这个文件夹是游戏识别和加载翻译文本的唯一入口,其结构直接决定了你的汉化能否生效。
典型的Language文件夹结构如下:
ModName/ └── Languages/ ├── ChineseSimplified/ │ ├── DefInjected/ │ └── Keyed/ ├── English/ │ ├── DefInjected/ │ └── Keyed/ └── Japanese/ ├── DefInjected/ └── Keyed/关键点解析:
- 语言文件夹必须使用游戏预设的名称(如ChineseSimplified),大小写敏感
- 每种语言目录下必须包含DefInjected和Keyed两个子文件夹,缺一不可
- 游戏会按照Mod加载顺序依次读取所有启用Mod的对应语言文件夹
注意:如果ChineseSimplified文件夹缺失,游戏会回退到English文件夹读取内容,这就是为什么有些Mod在未汉化情况下仍显示英文而非原始代码
2. DefInjected:处理XML定义的文本翻译
DefInjected文件夹专门用于翻译Mod中通过XML定义的文本内容。这类文本通常包括物品名称、描述、研究项目说明等静态内容。
2.1 典型DefInjected文件结构
以翻译一个名为"MedievalMod"的Mod为例,其武器定义如下:
<!-- 原始Def文件 --> <ThingDef> <defName>MM_Claymore</defName> <label>Claymore Sword</label> <description>A two-handed Scottish sword.</description> </ThingDef>对应的中文翻译文件应放置在:
MedievalMod/ └── Languages/ └── ChineseSimplified/ └── DefInjected/ └── ThingDef/ └── Weapons_MM.xml文件内容为:
<Languages> <MM_Claymore.label>克莱莫双手剑</MM_Claymore.label> <MM_Claymore.description>一种苏格兰传统的双手剑。</MM_Claymore.description> </Languages>2.2 DefInjected的路径映射规则
DefInjected的独特之处在于其文件夹结构必须与原始Def类型严格对应:
| Def类型 | 存放路径 | 示例文件 |
|---|---|---|
| ThingDef | DefInjected/ThingDef/ | Weapons_General.xml |
| ResearchDef | DefInjected/ResearchDef/ | Technologies_MM.xml |
| HediffDef | DefInjected/HediffDef/ | Diseases_Base.xml |
常见错误处理:
- 文件放错类型文件夹:将WeaponDef翻译放在HediffDef文件夹会导致完全不加载
- 路径层级错误:
<MM_Claymore..label>多一个点号会使整个标签失效 - defName拼写错误:大小写必须完全匹配原Def
3. Keyed:动态文本与代码内字符串的翻译方案
Keyed系统用于处理那些无法通过XML定义的文本,主要包括:
- C#代码中硬编码的字符串
- 动态生成的文本(如事件描述)
- 多Mod共享的通用文本
3.1 Keyed文件的标准格式
Keyed翻译采用严格的键值对形式,每个条目必须包含完整的命名空间:
<!-- 正确格式 --> <Keys> <MedievalMod.WeaponTips.Claymore>这种剑适合对付重甲单位</MedievalMod.WeaponTips.Claymore> </Keys>对比DefInjected,Keyed有几个显著区别:
| 特性 | DefInjected | Keyed |
|---|---|---|
| 格式 | defName.属性路径 | 完整命名空间键 |
| 文件位置 | 类型子文件夹 | 直接放在Keyed文件夹 |
| 重复处理 | 同defName会合并 | 严格覆盖(后加载者优先) |
| 动态文本 | 不支持 | 专门支持 |
3.2 Keyed的命名冲突解决方案
由于Keyed系统采用全局命名空间,冲突问题尤为突出。假设两个Mod都定义了:
<General.Tips.Combat>战斗提示</General.Tips.Combat>游戏只会显示最后加载的那个Mod的文本。解决方法有:
- 使用唯一前缀:
<YourModName_General.Tips.Combat> - 细分命名空间:
<YourModName.General.Tips.Combat> - 在Mod设置中添加开关:通过代码动态选择Key
专业建议:在大型Mod中建立专门的Key命名规范文档,比如"[Mod缩写][模块][功能]_[版本]"格式
4. 混合使用场景与加载优先级
实际汉化工作中,经常需要同时使用两种翻译方式。理解它们的加载顺序至关重要。
4.1 完整加载流程
- 游戏初始化时扫描所有激活Mod的Language文件夹
- 优先加载DefInjected内容,建立基础文本映射
- 然后加载Keyed内容,覆盖可能存在的冲突Key
- 最后处理特殊语法(如字符串格式化标记)
典型问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Def文本显示英文 | DefInjected文件路径错误 | 检查Def类型文件夹 |
| Keyed文本完全不显示 | 命名空间冲突 | 添加Mod特有前缀 |
| 部分变量显示{0} | 翻译遗漏格式化标记 | 保留原文中的{0}/{1}等 |
| 随机显示其他Mod的翻译 | Key重复且当前Mod加载较晚 | 修改Key或调整Mod加载顺序 |
4.2 高级调试技巧
- 启用开发模式日志:
# 在启动参数中添加 -log -loglevel=verbose - 使用RuntimeGC工具:查看实际加载的翻译条目
- 手动检查加载顺序:在游戏主菜单的Mod配置界面拖动Mod排序
5. 实战案例:修复常见汉化问题
通过几个真实案例演示如何应用上述知识。
5.1 案例一:Def翻译不生效
现象:武器名称仍显示英文"Claymore Sword"
排查步骤:
- 确认ChineseSimplified文件夹存在
- 检查DefInjected/ThingDef/下是否有对应xml文件
- 验证defName是否完全匹配(包括大小写)
- 检查XML文件编码是否为UTF-8无BOM
最终发现:文件编码为UTF-8-BOM,导致游戏无法解析
5.2 案例二:动态事件描述未翻译
现象:随机事件描述显示为"EVENT_RAID_WARNING"
解决方案:
- 在Keyed文件夹创建Events.xml
- 添加完整Key路径:
<RimWorld.Events.EVENT_RAID_WARNING>袭击警告!发现敌对势力接近!</RimWorld.Events.EVENT_RAID_WARNING> - 确保Mod加载顺序晚于核心游戏
5.3 案例三:格式化字符串异常
原始文本:
string.Format("Damage: {0}%", damagePercent);错误翻译:
<Combat.Damage>伤害:百分比</Combat.Damage>正确翻译:
<Combat.Damage>伤害:{0}%</Combat.Damage>掌握DefInjected和Keyed的正确使用方式后,可以解决RimWorld Mod汉化中90%以上的基础问题。对于更复杂的多语言项目,建议建立规范的文件夹结构和命名约定,这能让后续维护工作轻松许多。
