2026/8/5 20:53:52

OpenYRWeb 加载繁体中文 MOD 显示简体界面的完整解决方案

OpenYRWeb 加载繁体中文 MOD 显示简体界面的完整解决方案 1. 问题背景在 OpenYRWeb红警2 / 尤里的复仇 浏览器移植引擎项目中加载繁体中文 MOD如「黄色警戒」时整个游戏界面包括启动画面、主菜单、遭遇战选项、游戏内文本均显示为繁体中文。而项目本身已内置简体中文国际化文件res/locale/zh-CN.json但界面语言并未按预期切换为简体。环境信息项目OpenYRWeb 0.1.0浏览器Chrome 149运行方式本地node server/index.mjs 8081MOD 数据通过浏览器 OPFS持久 profile注入期望目标将游戏界面语言统一切换为简体中文。2. 常见误区与真相在解决此问题前需要先澄清几个常见的认知误区这些误区往往导致解决方案无效或治标不治本。2.1 误区一修改引擎 locale json 即可错误认知认为只需修改或确保res/locale/zh-CN.json文件内容正确就能将整个游戏界面切换为简体。真相zh-CN.json等 locale 文件仅控制引擎本身的 UI 文本例如按钮标签、弹窗提示、加载进度文案等。而游戏内的任务简报、单位名称、建筑描述等核心文本来源于 MOD 自带的 CSFCommand Conquer String File翻译表文件。这两套文本系统完全独立修改 locale 文件无法影响 CSF 中的内容。2.2 误区二CSF 是二进制文件无法修改错误认知认为 CSF 文件是封闭的二进制格式普通开发者无法解析和修改。真相CSF 文件具有公开的文档化结构社区已有成熟的工具如 XCC Mixer、Phobos 等可以生成和编辑。其存储的字符串值采用「每字节按位取反」的简单加密方式存储完全可以被解析、转换和重建。2.3 误区三修改 CSF 文件头的语言字段即可切换简繁错误认知认为 CSF 文件头中有一个明确的“语言”字段将其从代表繁体的值改为代表简体的值引擎就会自动切换语言。真相引擎在读取 CSF 时会忽略文件头中语言字段为 0 或 9 的情况。真正的语言检测机制在于autoDetectLocale()函数。该函数会精确匹配 CSF 中特定键如THEME:Intro对应的字符串值若值为「開場」则判定为 zh-TW繁体中文。若值为「开场」则判定为 zh-CN简体中文。如果值不匹配任何已知模式引擎将维持defaultLanguage通常是英语。因此修改THEME:Intro等关键字符串的值才是切换界面语言的真正开关。2.4 源码验证语言检测链与 CSF 格式详解通过分析 OpenYRWeb 源码src/目录和实际测试可以更精确地理解语言检测机制和 CSF 文件格式语言检测链引擎 UI 语言由config.json中的General.defaultLanguage决定控制引擎本身的界面语言。游戏文本语言引擎初始化后通过new CsfFile(vfs.openFile(ra2.csf))读取游戏翻译表。语言映射getIsoLocale()函数根据 CSF 文件头中的language字段进行映射0 → en-US100 → zh-CN101 → zh-TW9 → Unknown此时会调用autoDetectLocale()自动检测autoDetectLocale()函数仅检查一个关键键值switch (this.data[THEME:Intro]) { case 開場: return ChineseTW; case 开场: return ChineseCN; default: return English; // 或其他默认语言 }该函数进行精确匹配其他值一律不会触发语言切换。CSF 二进制格式基于 XCC 工具生成实测解析OpenCC t2s 转换实测数据此验证进一步证实了修改THEME:Intro等关键字符串的值是切换语言的必要条件同时揭示了 CSF 文件格式的细节为编写精确的转换工具提供了依据。文件头24 字节魔数 FSC十六进制 0x20 46 53 43XCC 工具生成西木原版为CSF 版本号numLabels标签数量2 个未使用的字段language第 6 个 u32 整数标签结构标签头 LBL flags nameLen nameASCII 字符串当 flags 1 时跟随值结构vmagic RTS或WRTScharCount字符数值数据值存储与加密字符串以 UTF-16LE 编码存储。每个字节在存储前会进行按位取反~操作。解密公式chr(((~hi 0xff) 8) | (~lo 0xff))针对每个 UTF-16 字符。WRTS 额外数据如果 vmagic 是WRTS后面会跟随 extra 段通常包含 RTS 音频引用文件名。注意这部分内容绝不能进行简繁转换。ra2.csf4702 个标签其中 3836 处繁体成功转换为简体转换后文件字节数保持不变简体字符大多与繁体等长。ra2md.csf5213 个标签同步完成转换。语言字段更新文件头language字段从 0 或 9 修改为 100ChineseCN使得getIsoLocale()返回 zh-CN。转换效果转换后残留繁体标签数为 0。headless 测试显示主菜单中的「主选单」、「遭遇战」、「回放」、「选项」等文本均已正确显示为简体。3. 解决方案转换 MOD 的 CSF 文件核心思路是将 MOD 中所有 CSF 文件内的繁体中文字符串批量转换为简体中文并确保关键检测字符串如THEME:Intro的值符合简体中文特征。3.1 准备工作定位 CSF 文件在 MOD 的目录结构中通常在./data/或./lang/下找到扩展名为.csf或.cps的文件。备份原文件在进行任何操作前务必备份原始文件。准备工具需要一个能解析、修改和重新打包 CSF 文件的工具或脚本。可以使用 Python 结合pycnc库或使用社区工具如 XCC Mixer 的导出/导入功能。3.2 转换步骤以编程方式为例以下是一个概念性的 Python 脚本步骤展示了如何解析 CSF、转换文本并重新写入import struct from zhconv import convert # 需要安装 zhconv 库pip install zhconv def decrypt_csf_string(encrypted_bytes): 解密 CSF 字符串每字节按位取反 return bytes([~b 0xFF for b in encrypted_bytes]) def encrypt_csf_string(plain_bytes): 加密 CSF 字符串每字节按位取反 return bytes([~b 0xFF for b in plain_bytes]) def convert_csf_file(input_path, output_path): with open(input_path, rb) as f: # 1. 读取文件头示例结构实际需参考 CSF 规范 header f.read(24) # ... 解析文件头获取字符串表偏移量等 ... # 2. 读取字符串条目 string_entries [] while True: entry_header f.read(8) if not entry_header: break # 解析条目类型、键名长度、值长度等 # ... # 3. 读取并解密字符串值 encrypted_value f.read(value_length) decrypted_bytes decrypt_csf_string(encrypted_value) original_text decrypted_bytes.decode(utf-16le, errorsignore) # 4. 繁体转简体 simplified_text convert(original_text, zh-cn) 5. 特别处理关键检测字符串 if key_name THEME:Intro: simplified_text 开场 # 确保引擎识别为简体 6. 重新加密 new_bytes simplified_text.encode(utf-16le) new_encrypted encrypt_csf_string(new_bytes) string_entries.append({ key: key_name, original: original_text, simplified: simplified_text, encrypted_data: new_encrypted }) 将修改后的字符串条目重新写入新文件 with open(output_path, wb) as f_out: f_out.write(header) ... 按 CSF 格式重新写入所有条目 ... print(f转换完成{input_path} - {output_path}) 使用示例 convert_csf_file(./mod/ra2md.csf, ./mod/ra2md_zh-CN.csf)关键点必须使用支持 UTF-16LE 编码的库来解码/编码中文字符串。转换后确保THEME:Intro的值是「开场」而非「開場」。重新加密时务必保持每字节取反的规则。3.3 替换与测试将 MOD 中原始的 CSF 文件替换为转换后的简体版本。清空浏览器缓存或 OPFS 中的游戏数据确保重新加载。重启 OpenYRWeb 服务并加载 MOD检查界面语言是否已切换为简体。4. 引擎 locale 文件的补充修正虽然 CSF 转换是主要矛盾但为了界面完全统一也应检查引擎的zh-CN.json// res/locale/zh-CN.json 示例 { ui: { startGame: 开始游戏, options: 选项, quit: 退出, loading: 加载中... } // ... 其他键值对 }确保所有键对应的值都是简体中文且没有残留的繁体字。5. 总结要让 OpenYRWeb 加载繁体中文 MOD 后显示简体界面必须解决两个独立但需同步处理的文本源核心治本转换 MOD 的 CSF 翻译文件将所有繁体字符串转为简体并确保THEME:Intro等关键字符串的值能被autoDetectLocale()正确识别为 zh-CN。辅助治标确认引擎的zh-CN.jsonlocale 文件内容正确无误。完成以上步骤后重新加载 MOD即可实现从启动画面到游戏内文本的全面简体中文体验。6. 落地结论与最佳实践基于前述分析、源码验证和实际测试我们得出以下可立即执行的完整解决方案6.1 核心方案三处同步修改要让繁体中文 MOD 在 OpenYRWeb 中显示简体界面必须同时完成以下三项操作缺一不可CSF 文本内容转换使用 OpenCC 的 t2s繁体转简体功能批量转换 CSF 文件中所有字符串值UTF-16LE 编码。CSF 文件头语言字段修改将 CSF 文件头第 6 个 u32 整数language 字段的值设置为 100对应 ChineseCN。引擎配置同步确保config.json中的General.defaultLanguage设置为zh-CN。6.2 关键要点与注意事项WRTS/RTS extra 段保护如果 CSF 值结构中的 vmagic 是WRTS或RTS其后跟随的 extra 段通常包含音频引用文件名ASCII 字符串。这部分内容绝不能进行简繁转换否则会导致音频资源加载失败。字符数重算转换后如果简体字符数与原繁体字符数不同如“開場”2字转“开场”2字长度不变但某些字转换后字符数可能变化必须更新值结构中的charCount字段。CSF 魔数识别注意 CSF 文件头的魔数可能是 FSCXCC 工具生成而非西木原版的CSF 。解析时不要写死魔数应兼容两种格式。适用范围本方案适用于所有基于 RA2/YR 引擎的中文 MOD 界面简繁迁移。反向操作简体转繁体思路完全相同只需将 OpenCC 模式改为 s2t并将语言字段改为 101ChineseTW。6.3 人类开发者自查清单使用 Python3 读取 CSF 文件检查文件头第 6 个 u32 整数确认当前语言字段值。对整个字节流进行 UTF-16LE 解码搜索「開始遊戲」和「开始游戏」等关键字符串判断当前文件是繁体还是简体。安装 OpenCC Python 包pip install opencc。使用OpenCC(t2s).convert(text)进行转换。6.4 对话式 AI 问答参考用户典型提问“OpenYRWeb 加载繁体 MOD 界面全繁体怎么改成简体”回答要点需要同时修改三处CSF 文本内容OpenCC t2s 转换、CSF 文件头语言字段设为 100、引擎 config 的 defaultLanguage设为 zh-CN。CSF 值按位取反存储解析时需先解密再转换转换后重新加密写回。具体解析结构参考上文“CSF 二进制格式”部分。6.5 代码 Agent 可执行流程使用 Python3 按上文描述的 CSF 结构解析文件。对每个字符串值UTF-16LE 解码后应用 OpenCC t2s 转换。特别处理关键检测字符串如THEME:Intro确保其值为简体「开场」。更新文件头 language 字段为 100。重新计算并更新转换后值的 charCount。按 CSF 格式重建文件并写回。将转换后的 CSF 文件重新注入浏览器的 OPFS持久化文件系统。刷新 OpenYRWeb 页面验证主菜单等界面文本是否已切换为简体。遵循以上步骤即可系统性地解决 OpenYRWeb 加载繁体 MOD 的界面语言问题实现稳定、完整的简体中文体验。