Repository navigation
Releases: mj8724/CMO_CN
Release list
v4.2.5 — 界面频闪根治与燃油面板显示修复(R65/R68/R69/R70)
适配游戏内部版本:1900.23(游戏标题里的 Build 号)
v4.2.5 — 界面频闪根治与燃油面板显示修复(R65/R68/R69/R70)
适配游戏内部版本:1900.23(游戏构建未变)。
修复
- 武器行不再闪回英文:根因不是“补扫不够”,而是新武器行元素先被送入有界翻译队列,
翻译落在首个绘制帧之后,英文必然上屏一帧(实测事件顺序loaded → render → text)。
现在单位武器子树的新元素在Loaded内同步翻译,首帧即中文;其余元素仍走有界队列,
不做全树同步(避免淹没 UI 线程)。 - 撤除三轮无效的绘制前补救:
SweepRootsBeforePaint/RegisterSweepRoot/
OnLayout的TranslateDirtyInline/ 队列DirtyRewritten优先级升级全部移除——
它们是为“队列来不及”设计的补偿,首帧改为同步后前提消失,保留只会增加每帧开销。 - 武器行绑定投影(R68):武器行文本由
MultiBinding(Qty, Name, StringFormat)求值产出,
且游戏会持续重建整行元素(实测ItemsControlid 恒为 5,每行Runid 每次都变)。
因此把翻译投影挂到稳定的ItemsControl容器上,行重建后立即重新投影;
验收为真实推演中 60 秒 / 964 帧像素零变化、属性层 230 个样本全中文。 - 燃油面板整数值补位(R69):游戏对重量用「有小数才显示小数」的格式,
5870.0显示成"5870",比"5870.3"窄两个字符,该行宽度随刷新跳动、
折行位置跟着左移(用户截图「预留备用油量」行)。现在只把「整数 + 空格 + kg」
补成x.0 kg,不改数值,宽度恒定。 - 诊断探针截断放宽(R70):
FLICKER_PROBE原本只记录前 60 字符,
燃油面板整块约 180 字符、消耗率在第 3 行,导致该行从未进入采样结果,
排查时多次得到「无变化」的假结论。现放宽到 400 字符。 - 被证伪的假设不再实施:“聚合 Text 改写会破坏武器链接”(显式 Inlines 时
TextBlock.Text为空,该分支不触发)与“双渲染器/GDI 叠加”(无证据)。
门禁
WpfSafetyTests weapons-binding-projection(8 项):绑定求值直接产出中文、Qty更新不出英文、
不写回业务源、链接结构不变、重复投影不叠加。WpfSafetyTests weapons-first-frame-order:武器子树首帧中文,且同一忙祖先队列下的
普通子树仍为英文作为探针负向对照——若该对照也变中文,说明探针失效,不得判通过。weapons-diagnostic(19 项):只读诊断覆盖绑定元数据、Inline 图、源 setter/转换器零调用、
空/错目标、节点与字节超限、零帧拒绝。- 回归:wpf 8/8、queue 7/7、idle 5/5。
同批修复 — 单位状态面板「两种译法互相覆盖」频闪(R62/R63/R64)
适配游戏内部版本:1900.23(游戏构建未变)。
修复
- 机型行不再来回跳:
F-16I 战隼 [Sufa]与F-16I 战隼 [苏法/风暴]逐拍交替的根因是
两条写路径译出两种说法——词典整串命中给前者,军名兜底规则又把[Sufa]改成
[苏法/风暴]。现在兜底规则只处理纯英文军名,含中文的串一律原样保留,
词典成为唯一事实源(R64)。 - 面板文本不再被旧快照截断:所有 WPF 文本写入前复核「当前值仍是本次读到的值」,
过期译文直接丢弃,避免把游戏刚重建的多行块写回成前缀(R63)。 - 半译串可整条译出:
挂载方案: A/A: …这类「值里还带子键」的串不再被冒号规则挡下(R63)。 - 诊断/自动化命令全量加固:引擎内 13 处直接遍历 WinForms 活集合窗体列表的写法
统一改为先取快照,窗体切换瞬间不再抛「集合被修改」(R62)。
门禁
IdempotencyTests新增 R64 三断言(兜底不动已译串 / 兜底仍处理纯英文 / 两路译名一致)。L-panel-flicker判据升级:除「中英翻转」外,同一元素出现两种不同译文并回摆
(A→B→A ≥2 次)也判失败;同时用「必须变回旧值」区分正常递增(航向、计时、燃油)。
安装方式
- 一键安装器(推荐):运行
CMO_Chinese_Setup_v4.2.5.exe。 - 绿色包:把
CMO_Chinese_Pack_4.2.5.zip解压到独立临时目录,先退出游戏,执行包内同版本安装器CMO_Chinese_Setup_v4.2.5.exe --install "<游戏根目录>" --silent,完成首次配置合并与部署;不要直接覆盖官方 config 或任何旧备份。 - 安装器会保留官方 runtime/bindingRedirects、首次备份与玩家设置并写入安装状态;
--adopt仅登记已有完整载荷,不代替首次 apply。详见包内汉化说明.md。
v4.2.4 — 诊断命令可靠性(窗体集合快照)
适配游戏内部版本:1900.23(游戏标题里的 Build 号)
v4.2.4 — 诊断命令可靠性(窗体集合快照)
适配游戏内部版本:1900.23(游戏构建未变)。
修复
- 诊断命令不再偶发「集合被修改」:
DUMP_OPEN_FORMS/CLICK_BUTTON/CLOSE_FORM/
DUMP_FORM_BUTTONS/WPF_DUMP的 ElementHost 导出在遍历前先复制 WinForms 窗体集合,
游戏同时开关窗口时不再让整次观测失败(R59)。 - 自动化入口更稳:战役卡片按
Tag定位(卡片Tag被截断时按路径末段前缀匹配),
并在窗体切换瞬间对观测做有限重试。
门禁
- 新增
R61-static-forms-snapshot:在持续开关窗体的压力下断言快照遍历零异常,
并保留「直接 foreach 会抛错」的负向对照,证明该用例真的能红。
安装方式
- 一键安装器(推荐):运行
CMO_Chinese_Setup_v4.2.4.exe。 - 绿色包:把
CMO_Chinese_Pack_4.2.4.zip解压到独立临时目录,先退出游戏,执行包内同版本安装器CMO_Chinese_Setup_v4.2.4.exe --install "<游戏根目录>" --silent,完成首次配置合并与部署;不要直接覆盖官方 config 或任何旧备份。 - 安装器会保留官方 runtime/bindingRedirects、首次备份与玩家设置并写入安装状态;
--adopt仅登记已有完整载荷,不代替首次 apply。详见包内汉化说明.md。
v4.2.3 — 大想定卡顿修复、地图中文恢复、发布链路加固
适配游戏内部版本:1900.23(游戏标题里的 Build 号)
v4.2.3 — 大想定卡顿修复、地图中文恢复、发布链路加固
适配游戏内部版本:1900.23(游戏构建未变)。
用户可见修复
- 大想定不再卡到电脑不能动:补扫不再挂在渲染帧上;改由所属界面线程的有界队列分片执行,
每切片 4ms/96 步,节点用稳定同级游标续扫(写入文本不会再打断续扫)。
实测战争黎明(Blue Dawn,506 活跃单位)连续 20 分钟推演:扫描 0.67 次/秒、单次切片稳定,
视觉树 1951 节点全程不增长,内存 2120→2232MB。 - 地图中文恢复:部署脚本现在会重绘已有标签缓存(保留原英文
.orig备份),
以前只更新地名源和引擎时,地图会一直显示旧的英文瓦片。 未选择单位等状态栏文本恢复中文:绑定型文本块此前被两条路径同时跳过。- 战役/想定入口可自动定位:新增按控件树与卡片
Tag定位的语义点击命令,
不再依赖固定屏幕坐标,也不会误点到相邻战役。 - 安装器不会再把旁边旧文件当成新版本:默认只部署自带的引擎/词库,并在登记前核对包内哈希。
- 更新助手回退不会再把自己杀掉:结束进程时排除调用者自身,回退后仍能校验并登记。
- 缺少 SHA256 摘要时拒绝自动安装:不再“先跑了再说”。
- 绿色包首次启用说明:随包附同版本安装器,解压后执行一次
--install才会真正启用汉化。
工程加固
- 新增真实执行计量(投递/开始/完成/待执行/排队/超帧分离),性能探针改为失败关闭
(超时、零工作、未推进、样本为空都判失败),并支持 20 分钟浸泡。 - 新增门禁:
R54-static-wpf-scheduling、R55-static-ui-perf、R56-static-perf-probe、
R57-static-release-contract、R58-static-dictionary-source。 - 回归报告升级为分层结构(static/installer/live 各自绑定输入指纹与时间),中途异常会覆盖旧绿报告。
- 词库构建不再读取旧产物作底座;旧产物独有译文一次性迁移到显式源,两次完整重建字节一致。
- 发布前强制四资产+SHA256+分层报告校验;拒绝覆盖已发布资产,
--verify-only纯只读。
安装方式
- 一键安装器(推荐):运行
CMO_Chinese_Setup_v4.2.3.exe。 - 绿色包:把
CMO_Chinese_Pack_4.2.3.zip解压到独立临时目录,先退出游戏,执行包内同版本安装器CMO_Chinese_Setup_v4.2.3.exe --install "<游戏根目录>" --silent,完成首次配置合并与部署;不要直接覆盖官方 config 或任何旧备份。 - 安装器会保留官方 runtime/bindingRedirects、首次备份与玩家设置并写入安装状态;
--adopt仅登记已有完整载荷,不代替首次 apply。详见包内汉化说明.md。
v4.2.2 — 界面显示稳定性:修复中英频闪、地图无文字、条令中英混排
适配游戏内部版本:1900.23(游戏标题里的 Build 号;不一致说明游戏已更新,请等对应版本的补丁)
v4.2.2 — 界面显示稳定性:修复中英频闪、地图无文字、条令中英混排
适配游戏内部版本:1900.23(游戏构建未变)。本版重点是界面显示稳定性:修复单位状态面板中英频闪、地图文字消失、条令值中英混排、装备名半英半中,并加固地图标签服务(合并外部贡献 PR#1)。
用户可见修复
- 中文地名标签不再因下载繁忙而停滞:此前地图瓦片下载繁忙时,本地中文标签请求会被排在同一个线程池里迟迟不执行,表现为标签不出现。现在标签服务使用自己的专用线程,不再和游戏抢公共池。
- 不再反向拖慢游戏自身:旧实现下,少量半开/空闲连接就能占住游戏进程的线程池(实测 96 个空闲连接占掉 96 个 worker),可能连带影响游戏流畅度;现在并发有上限、超时即关闭。
- 地图文字全没了的问题已修复:上一版把「Stamen 瓦片图层名」这类引擎内部标识符也拿去翻译了,
而游戏正是用这些名字去查找标签图层——名字被改掉,标签就整片消失(表现为地图上完全没有地名)。
本版把这类标识符列入「只翻译界面、绝不注入」的白名单,国名/城市名/海域名恢复显示。 - 条令/任务编辑器不再出现
Inherited, 持续制导至命中这种中英混排:游戏把英文前缀
Inherited,与已汉化的值拼在一起,旧逻辑对「整串含中文」直接跳过,前缀永远是英文。
本版在跳过之前先修前缀,统一显示为继承自上级,…。 - 单位状态面板不再中英频闪(本轮主要修复):进入想定并开始推演后,右侧「单位状态」
会在中文与英文之间反复跳,跳一阵后干脆永久停在英文。根因有两层:①本地化层的补扫
依赖 WPF 的每帧渲染事件,而该事件在侧边栏静止时从不触发(整场会话 0 次),等于这块
修复从未生效;②回写不判断当前值,会反复重绘静止面板。本版改为独立定时补扫 + 值相同就不写,
并按屏幕像素验收(300 帧 / 18 秒零变化)。 - 文本不再「越翻越长」:
主动 (Active)这类带英文提示的写法会被反复再翻一次,
变成主动 (主动 (Active)),每次刷新都多裹一层(肉眼就是字在闪)。本版让翻译严格幂等。 - 装备/设施名不再半英半中:
AvGas (200k Liter 地下 Tank)这类名字以前每种容量组合都要
人工写一条,没覆盖到的就留英文。本版改为「结构规则 + 术语表」自动组合
(航空汽油(200k 升地下油罐)、加固机堡(6 个中型飞机)、151 英尺),
新增装备只要由已有词组成就自动成中文;遇到不认识的词宁可保留英文,也不产夹生串。 - 打开任务编辑器后不再明显卡顿:上一版为消除频闪加入了高频文本补扫,但它按「窗体数量」
重复投递,打开任务编辑器后补扫频率被放大到 67 次/秒(设计 25 次/秒),每次都要遍历整棵界面树。
本版改为单次投递 + 空闲自动退避(无变化时降到 200ms),编辑器开关两种状态下都稳定在约 222ms 一次。 状态: Unassigned这类“中文标签 + 英文值”已补全:以前只要整串里有中文就跳过,
导致标签汉化、值仍是英文。现在右值会单独翻译(状态:未分配任务、所属阵营:以色列)。
工程加固
- 脱离宿主共用线程池:1 个专用接受线程 + 4 个专用工作线程 + 最多 64 项有界队列(旧实现:
ThreadPool.QueueUserWorkItem)。 - 请求首行总预算 1500ms:从接受连接时刻起算、包含排队时间;零散发送字节无法刷新预算;首行上限 1024 字符;响应写入 1500ms 超时。
- 严格请求校验:只接受
GET /MapTiles/Labels/z/x/y.png HTTP/1.x(z≤22、x/y 越界拒绝),非法请求返回 400;请求/拒绝/错误共采样前 16 条诊断日志,便于以后饬定位。 - 新增硬门禁:
R34-static-tile-contract(并发契约断言)+R34-static-tile-harness(独立编译后真跑 starvation/protocol/idle/batch/multi-idle/trickle/pressure 七模式并发回归,宿主src/tests/MapTileServerTests.cs反射启动真实引擎,不加载游戏)。 - 可观测性:诊断日志会写清每个瓦片的 z/x/y、候选地名数、实际绘制数与耗时,后续定位地图问题不必再猜。
- 游戏运行中安装不再报莫名错误:此前在游戏运行时安装(尤其是从下载目录双击、安装包旁边没有
CMOLocalizer.dll时),会报「安装包内未找到 CMOLocalizer.dll 资源文件」——真实原因是目标文件被运行中的游戏占用(已加载映像无法被任何文件操作替换)。现在:安装失败会如实说明「写入哪个文件失败、为什么」;写入改为「临时文件 + 原子替换」(不再受杀软/占用中间态影响);GUI 安装失败且检测到游戏在运行时,会询问是否关闭游戏并自动重试(绝不静默杀进程)。 - 游戏目录不可写时给出明确指引(管理权限):Steam 默认把游戏装在
C:\Program Files下,未提权时建不了文件——旧实现在这种情况下同样只会报「资源未找到」,跟真实原因毫无关系。现在安装器先探测目标目录可写性,不可写时直接说明原因并提供「以管理员身份重新启动」的选项。 - 安装日志落盘:日志除界面外会写进
%LOCALAPPDATA%\CMOChinese\installer.log(含版本号、游戏目录、失败原因),报障时直接发这个文件即可。 - 自绘面板的库值/枚举值汉化(目标状态等):
WRA: Aircraft - High manouverability fighter (…)、
Multirole (Fighter/Attack)这类值以前一直英文——它们的界面(目标状态/探测接触)是自绘面板,
只从游戏字符串池取串,不走控件通道。本版把「池里已有译文」的显示串补进池级注入(3,522 → 8,735 条),
面板上的库值/枚举值随之为中文;同时新增形状安全判定,避免把 SQL 片段/格式串/控件名注入进游戏内部。 - 条令下拉框不再出现
Inherited, 始终开火这种中英拼接:游戏会把英文前缀与已汉化的值拼成一句,
引擎现在只把前缀换成中文(继承自上级,始终开火),不再因为「整串含中文」整体跳过。 - 数据库查看器恢复正常(类型可切换、筛选可用、列表有数据):上一版为自绘面板扩大池级注入时,
误把, Hypothetical/, Deprecated/Name LIKE '%这类底层 SQL 片段也注入进游戏内存,
数据库查询被拼成不可执行的语句(no such column),列表与筛选框全部空白。本版把 SQL 投影列、
LIKE条件、AS别名、比较符结尾一律挡在注入之外,并修复两处界面改写的递归守卫未配对问题。 - 地图文字恢复显示:同一批注入还误把地图瓦片图层的引擎标识符(
Stamen Terrain - Labels、
Stamen Labels等层名/缓存目录查找键)当显示串翻译,导致标签图层解析失败、整张地图没有任何地名。
本版把这类标识符列入「只翻译界面、绝不注入内存」的白名单,地图国名/城市名/海域名恢复正常。 - 修掉「补扫根本没跑」导致的持续频闪:本地化层原来靠 WPF 的每帧渲染事件做文本补扫,
而该事件在侧边栏静止时永不触发(实测整场会话 0 次),等于这块修复从未生效;
同时回写不判断当前值,会反复重绘静止面板。本版改为独立定时补扫 + 值相同就不写,
并按屏幕像素验收(300 帧/18 秒零变化)。 - 修复文本「越翻越长」导致的频闪:
主动 (Active)这类带英文提示的写法会被反复再翻一次,
变成主动 (主动 (Active)),每次界面刷新都多裹一层(肉眼就是字在闪)。本版让翻译严格幂等,
并补上「中文标签 + 英文值」整条汉化(状态: Unassigned→状态:未分配任务、
所属阵营: Israel→所属阵营:以色列)。 - 单位状态面板不再中英频闪:进入想定并开始推演后,右侧「单位状态」会在中文与英文之间反复跳,
跳一阵后干脆永久停在英文(状态: Unassigned、Air Base)。原因是游戏自己每个脉冲把英文写回面板,
而本地化层的「防拉锯熔断」把这种正常刷新误判成拉锯并永久放弃该控件。本版改为限速+自动恢复,
并在每帧绘制前补扫侧边栏,实测运行中连续采样零翻转。 - 装备/设施名不再半英半中(如
AvGas (200k Liter 地下 Tank)):过去每种容量/数量组合都要人工
写一条中文,没覆盖到的就留英文。本版改为「结构规则 + 术语表」组合生成(航空汽油(200k 升地下油罐)、
加固机堡(6 个中型飞机)、151 英尺),新增装备只要由已有词组成就自动成中文;遇到不认识的词
宁可保留英文,也不产出夹生串。 - 条令值不再出现
Inherited, 持续制导至命中这种中英混排:游戏把英文前缀Inherited,与
已经汉化的值拼在一起,而旧逻辑对「整串含中文」直接跳过,于是前缀永远是英文(而且词库翻译得越多,
这种混排越多)。本版在「含中文就跳过」之前先修前缀,条令窗口与任务编辑器的下拉项统一显示为
继承自上级,…。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.2.2.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.2.2.zip,解压后覆盖到游戏根目录即可。
v4.2.1 — 数据库全量补齐 + 挂载武器汉化 + 复合字段规则解析
适配游戏内部版本:1900.23(游戏标题里的 Build 号;不一致说明游戏已更新,请等对应版本的补丁)
v4.2.1 — 数据库全量补齐 + 挂载武器汉化 + 复合字段规则解析
适配游戏内部版本:1900.23(游戏内部构建未变,本版本为数据库与航空作业专项汉化补全包)。
为什么必须升级
用户反馈数据库查看器与航空作业窗口中,存在大量残留英文(涵盖常规数据复合项、飞行剖面航程、武器与挂载名、ATO 计划按钮及悬停帮助)。本版彻底根除“按截图零敲碎打”的旧模式,建立全量数据库盘点体系并修复管道静默丢弃缺陷,词库从 4.6 万条大幅扩充至 5.7 万条。
用户可见修复
- 数据库查看器复合字段完全中文化:
- 型号分类:
Unmanned Aerial Vehicle (UAV) (WRA: Aircraft - Unspecified)→「无人机 (UAV) (WRA: 飞机 - 未指定)」等; - 自主等级:
0 (Autonomy Level: ChangeableMission)→「0 (自主控制等级: 可变更任务)」等; - 座舱世代:
Undefined (Use Below) (ex: )→「未定义 (使用下方项) (示例: )」等。
- 型号分类:
- 航程与飞行剖面无条件翻译:
2200 nm Recon radius. Cruise at optimum altitude and speed. No form-up time. 10% reserves.→「2200 海里侦察作战半径。按最佳高度与速度巡航。无编队集结时间。10% 备份油量。」 - 航空作业武器物资与挂载方案名:
- 挂载方案:
Comms Monitor and Jammer→「通信监听与干扰」等; - 挂载物资:
1x Generic Comms Jammer Pod [Advanced]→「1x 通用通信干扰吊舱 [先进型]」等; - 涵盖近万条副油箱、通用炸弹、破甲弹、高爆弹、集束炸弹、机枪火炮、侦察干扰吊舱名称。
- 挂载方案:
- 界面文本与悬停帮助长句补齐:
- 空中出动计划 (ATO) 按钮
Create Flight/Delete Flight→「创建飞行编队」/「删除飞行编队」; - 弹窗正文
select a Mission and create at least one flight→「请选择一个任务并创建至少一个飞行编队」; - 任务作战阶段悬停帮助段落(
Waiting for trigger.../Satisfied.../Triggered...)全面汉化; - 机堡设施
A/C Hardened Aircraft Shelter (1x Large Aircraft)→「加固机堡 (1x 大型飞机)」等。
- 空中出动计划 (ATO) 按钮
工程加固
- 修复管道丢弃缺陷:修复
build_dict.py:sanitize()因全角括号微失衡静默删除 64 条有效译文的严重缺陷,使dict/src/db_descriptions.json16,328 条 100% 进入最终词库。 - 建立三层数据库词库体系:
- 描述正文(
dict/src/db_descriptions.json,16,328 条,排除参考文献与鸣谢后正文 100% 覆盖); - 扩展枚举(
dict/src/db_enums_extra.json,769 条); - 记录名词库(
dict/src/db_record_names.json,9,904 条)。
- 描述正文(
- 新增回归硬门禁:
R33-static-db-records硬断言三表规模、代表串存在性及引擎 4 条复合规则。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.2.1.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.2.1.zip,解压后覆盖到游戏根目录即可。
v4.2.0 — 适配游戏 Build 1900.23 + 界面与消息日志补全
适配游戏内部版本:1900.23(游戏标题里的 Build 号;不一致说明游戏已更新,请等对应版本的补丁)
v4.2.0 — 适配游戏 Build 1900.23 + 界面与消息日志补全
适配游戏内部版本:1900.23(游戏标题里的
Command: Modern Operations v1.10 - Build 1900.23)。上一版 v4.1.8 适配的是 1900.20。
为什么必须升级
2026-10-17 20:46 Steam 把游戏更新到 Build 1900.23(BuildID 25673213→25865381,2971 个文件,两个 depot 清单号都变了)。
新版把游戏内部混淆成员名整体重命名:旧引擎按名字反射定位字符串池会静默失败,状态栏/HUD/标尺等
3500 余条显示层文本会退回英文(实测现象就是突然到处是英文)。本版按结构特征重新定位注入点,
每次失败都明确写日志(不再静默),并新增构建号哨兵:启动时比对游戏实际构建号与安装清单,
不一致就写告警——以后游戏再更新,日志里能一眼看到。
用户可见修复
- 状态栏/HUD/标尺恢复中文:
Time: … - Zulu: … - Local: …→时间: … - 标准时: … - 当地: …,以及视高:、显卡:、想定时间:等。 - 主标题不再写死版本号,显示「现代行动:指挥 v1.10 - 内部版本 1900.23」。
- 条令 / 交战规则窗口的下拉值补齐:
Inherited, Always Fire / Ignore / Bingo / 5% / 100%→「继承自上级,始终开火 / 忽略 / 返航油量 (Bingo) / 5% / 100%」等。 - 航空作业「快速周转」:
2 Sorties (Maximum)→「2 架次(最大)」。 - 编队燃料:
AvGas (200k Liter Underground Tank)→「航空汽油(200k 升 地下油罐)」。 - 消息日志:终局报告(命中/脱靶)、新空中/水面/潜艇/地面/武器接触、平台已分类、目标消失、诱饵欺骗或失败、单位被摧毁、
New contact! Designated … [Sensors: …] at 264deg等整段英文 → 中文框架(武器与单位型号名保留原文)。 - EMCON 页签「告警ALERT:」标签改为「告警:」——原先词条里保留了英文
ALERT,标签比原文宽约 67%,尾部被右侧下拉框盖住(用户报的「字被挡住了」)。 - 频闪:注入失效期间出现的中英频闪随之消失(根因是引擎重译与游戏回写互搏,注入修好后游戏自己的文本已是中文)。
工程加固
- 注入点定位:名字优先 + 结构特征兜底(静态
List<string>+List<int>+byte[],缓冲取最长),所有失败分支必写日志。 - 新增只读探针
POOL_DUMP(导出「偏移→当前字符串」全表)与version门禁的构建号一致性校验。 - 词典构建新增硬阻断:编译进游戏的源码字面量(如
, 'Aircraft', ')不再进入偏移注入表。 - 版本双号:本补丁版本与「适配的游戏内部版本」同时写入安装器、更新助手、发版说明与 README。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.2.0.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.2.0.zip,解压后覆盖到游戏根目录即可。
v4.1.8 — 引擎性能与门禁加固
v4.1.8 — 引擎性能与门禁加固
-
又一批界面英文清掉了:推演选项的「频率」「虚影显示」「样式化/方向化样式」「在光标处显示」「选择…」、条令的交战警戒等级(蓝/黄/橙/红,其中「绿」与其它三色拉齐)、损伤等级「轻微/较严重」、四条「重置受影响单位/任务(继承上方 EMCON/WRA)」,以及两处动态文案(「每 N 秒」「武器:<单位>」)。
扫描方法也升级了:现在会逐个打开下拉框检查全部选项(以前只看界面上显示的当前值,所以「打开下拉才看得到的英文」一直漏着)。 -
修掉两处“看起来像英文/叠字”的界面问题(界面扫描收尾):
① 推演选项的Tacview页签以前会叠成「三维态势联动(三维态势联动 (Tacview))」(词条非幂等,被二次翻译时又套一层),现在稳定显示「三维态势联动」;
② 「想定特性与设置」窗口里有 4 条特性一直是英文——Allow instant loading for landing planner、Point To Point Unit Communication、Realistic Order Chain、Variable burnout speed on boost-coast weapons。
我们先怀疑是「列表要滚动到位才翻译」,实机查证后否决了:这个窗口 17 条特性同屏全部可见、根本不滚动,就是这 4 条当时没进词典;现已补齐(着陆规划器即时装载 / 点对点单位通信 / 真实指挥链 / 助推-滑翔武器的燃尽速度可变),复验 17/17 全中文。
顺带把「推演选项」的 7 个页签(含每个下拉框的全部选项)都扫了一遍,没有发现其它英文。 -
条令/交战规则窗口下拉项不再中英混杂:
Inherited, …那批选项值补齐了术语(现为「继承自上级,…」)。
同时修掉一个我们自己引入的缺陷:防「写拉锯」的熔断机制被误触发——只要组合框被反复访问、哪怕一次都没写入,也会被永久静音(游戏日志里累计 269~311 次假熔断),这是下拉项大面积显示英文的元凶之一。
现在只有真正与游戏来回改写(真拉锯)才会熔断。实机验证:该窗口 12/12 选项全中文、纯英文 0 条,熔断零新增。 -
补齐几处你一眼能看到的英文:天气编辑器里的
Calm/Hurricane(现为「无风」「飓风」)与
页签Level 0(现为「层级 0」)、快捷键窗口的标题Own Units(现为「己方单位」)、
Lua 脚本控制台的按钮Insert/RUN(现为「插入」「运行」)。这几条以前根本不在词典里,
所以同一屏里其它标签是中文、它们却是英文。
说明:快捷键窗口的正文是富文本(整窗的快捷键说明),修它会丢排版且会碰到刚加固的输入保护,
本次有意不动,作为已知限制记录在台账 R27。
新增实机用例L-ui-residuals会抽查多个窗口,保证「词典里有译文的界面文本不会还显示英文」。 -
修复一个可能泄露你 API 令牌的隐患:工作区里曾留下一个 Python 字节码缓存文件
(scripts/__pycache__/translate_worker.cpython-312.pyc),里面有明文的sk-网关令牌。
它没被提交,却躺在.gitignore忽略的目录里,于是「只检查已入库文件」的密钥门禁根本看不到它——
任何一次打包 / 压缩 / 共享整个工作目录,都可能把令牌带出去。现在:删除该文件,
并把密钥门禁的扫描范围从「只看已入库文件」扩成三层(已入库 + 未入库 + 危险的忽略项:
__pycache__/*.pyc、.env*、*.pem/*.key/*.pfx、*.log等),跳过哪些文件、为什么跳过也必须打印出来。
⚠ 已经泄露出去的那枚令牌必须在服务商(网关)侧吊销并重新生成,本机无法代劳。 -
修复「重建词典会静默回退已修好的工坊 / 战役标签」这个陷阱:以前任何人重跑一次词典构建脚本,
产出的词典就和仓库里那份不一样——① 工坊页签的译名被一道旧批次的非幂等值覆盖回去
(R20 修好的「创意工坊 (创意工坊 (Steam Workshop))」叠译会复活);② 「系列战役」窗口的长标签
被误当成脚本内容丢掉;③ Steam Workshop 页签所在的字符串池条目(偏移 7916)被过滤静默跳过;
④ 整个文件从 LF 被改写成 CRLF,凭空多出 4.9 万行换行差异。现在重建与已提交词典字节完全一致,
不会再静默回退任何已修好的显示串。 -
页面翻译不再卡顿:内嵌浏览器(想定简报 / 数据库详情)翻页时,引擎要拿整本 4.6 万条词典
去扫整页文字,页面越大越慢——实测同一个页面要 0.67 秒,100KB 的页面要 2.08 秒(页面一大会像卡死)。
现在加了页面级预筛(只有确实出现在页面里的词条才会被逐个尝试):同一个页面 0.67s → 0.135s,
100KB 页面 2.08s → 0.39s(约 5 倍),翻译内容与之前逐字节完全相同。 -
安装器不再能被构造的压缩包写到游戏目录之外:安装器解压菜单图 / 想定 HTML 时没有校验压缩包里的
条目路径,一个精心构造的压缩包可以用..\..\或绝对路径把文件写到游戏目录外面——而安装器是
管理员权限运行的(.orig备份还会再生成第二个越界文件,失败也不留任何日志)。现在每个条目
落盘前都必须通过「路径必须留在目标目录内」的校验,越界条目被拒绝并在日志里写明;
真实安装实测不受影响(Symbols\Menu下 237 个文件正常落地,无一误拦)。 -
门禁不再会「空转假绿」:两条硬门禁其实一直是坏的——① 简报翻译门禁在找不到任何目标文件时判定是
0 >= 0,永远通过(现在目标为空直接判 FAIL);② 历史密钥扫描用的git log -G写法受 git 自己的
正则方言限制,对「确实存在过凭据改动」的仓库一次都命中不了(现在改为按内容对象去重后逐个扫描,
实测扫描 560 个对象 / 79MB,覆盖率与跳过原因全部打印出来)。门禁现在都能被证伪,不再是摆设。
说明:本节已完成入库改动与 R29 界面修复的收尾;五处版本号(
VERSION、安装器常量、安装器窗口标题、助手常量、
词典_meta.version)已在本轮打包候选时统一提升为 4.1.8(尚未发布)。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.1.8.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.1.8.zip,解压后覆盖到游戏根目录即可。
v4.1.7 — — 输入闪退修复 / 战役内剧本名补齐 / 发版入库检查
v4.1.7 — 输入闪退修复 / 战役内剧本名补齐 / 发版入库检查
- 修复「创建任务、搜索剧本时输入一个字符就闪退」(用户实测:任务名框、搜索想定框输入 m 即闪退):
引擎把 DarkUI 自定义输入框(不继承 TextBoxBase)当普通标签翻译,词典里又有m → 米这样的单位换算词条,
于是你输入的 m 被引擎改写成「米」,游戏又写回 m,引擎再写——日志里
UI Controls Translated count … (Sample: m -> 米)每 2.5 秒涨 50,直至进程以 0xc00000fd(栈溢出)消失。
现在:输入控件(含 DarkUI 输入框)正文一律不改写(只翻水印);控件聚焦/下拉展开时不改条目;
同一控件被反复写同一个值即熔断放弃;事件回调里任何异常一律内部消化并记录。 - 新增崩溃取证:万一仍有未处理异常,游戏目录会生成
CMOLocalizer_Crash.log(完整异常与堆栈),
只有堆栈含本引擎时才吞掉异常——不会再把我们的缺陷变成你的闪退。 - 修复「战役里有些剧本名仍是英文」:战役定义(
*.campaign)里的剧本名有 25 条从未入词典
(沉默的部队整个战役 16 条全缺:三角洲部队、航母杀手、孤狼……),现已补齐 19 条并在门禁里加上
「战役剧本名必须全覆盖」;想定浏览器标题行的[NOT LICENSED] 剧本名, 年份也按前缀/标题/年份拆开翻译。 - 修复「系列战役」窗口标签仍是英文:
从存档继续、删除选中的存档、
「选择一个战役开始新推演,或从存档继续已有战役。」;并修掉工坊页签被叠译成
「创意工坊 (创意工坊 (Steam Workshop))」的问题。 - 新增发版打包清单与统一入库检查(
docs/RELEASE_MANIFEST.md+python scripts/release_check.py):
一条命令把要发的东西全过一遍(版本五处一致、词库/菜单/想定与战役名/简报/地名集/DB 模板、
密钥、工作区、必需源与资产、static+installer 回归、发版报告、产物哈希、绿色包内容与禁入项)。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.1.7.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.1.7.zip,解压后覆盖到游戏根目录即可。
v4.1.5 — — 修复数据库查看器不显示数据
v4.1.5 — 修复数据库查看器不显示数据
- 修复数据库查看器不显示数据(用户反馈「数据库不显示数据了」+「点一下装备中文就闪一下变英文」):
根因是 v4.1.3 的「下拉框全量汉化」把汉化扩到了通用路径(TranslateControlTree→LocalizeComboBoxSafe
→TranslateComboItems→TranslateDBComboItem),而InternalDBViewer的对象类型下拉框
CB_ObjectType是游戏内部按文本分派的控件:游戏用switch (CB_ObjectType.Text)决定调用哪张表
(异常栈实证DarkListView.OnMouseDown → DisplaySelection → DisplayInfoInDetailsPanel(…, _SelectedObjectType))。
选项被改写成「飞机 / 航空器 (Aircraft)」后所有分支全部落空 → 详情面板(WebView2)永远不生成 HTML
(RenderedHTMLString长度 0,面板一片死灰),且每次巡检重译还会造成中英闪烁。
原来只在专用路径LocalizeDBViewerComboBox上有的保护,现在抽成IsProtectedDBViewerCombo()
在通用路径同样生效,该控件固定保留游戏原生 token(Aircraft/Ship/Submarine/…)——
即【数据库查看器】左上角「类型」框显示英文Aircraft/Ship属正常现象,换得详情面板与筛选全部可用。
同时为DB_INSPECT/DB_HTML_DUMP/DB_DOM_DUMP/DB_CTRL_TREE/DB_SET_FILTER/DB_SELECT_ROW
补EnumWindows+Control.FromHandle回退解析(该窗口在辅助 UI 线程创建,Application.OpenForms看不到),
诊断命令恢复可用。
实机验证:8 类装备详情页全部渲染(RenderedHTMLString34 874 / 59 030 字节,含「常规数据/装备大类/固定翼飞机」等中文),
类型/子类型/国家阵营/假想四类筛选联动正常,间隔 2.5s 两帧截图 md5 一致(无频闪),异常日志零新增。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.1.5.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.1.5.zip,解压后覆盖到游戏根目录即可。
v4.1.4 — 数据库全量百科正文深度汉化与筛选下拉框彻底加固
v4.1.4 — 自动升级(开机自检 + 每 6 小时检查 + 托盘常驻)
- 新增更新助手
CMO_Updater.exe(约 36 KB,与安装器同工具链、无需额外依赖):
托盘常驻,右键菜单提供「立即检查更新 / 打开更新设置 / 打开游戏目录 / 查看日志 / 退出助手」。 - 检查时机:随 Windows 启动(
HKCU\...\Run)后延迟 60 秒自动检查一次(笔记本电池模式延迟 5 分钟),
之后每 6 小时检查一次(可在设置中改为 1/3/6/12/24 小时或仅开机检查);休眠唤醒后按上次检查时间补查;
手动检查随时可用。网络失败静默退避(1h→2h→6h),不弹窗打扰。 - 更新源与安全:GitHub Releases API 比对版本 → 直连下载,失败自动切换国内镜像(默认 ghproxy,可改);
发布资产新增.sha256摘要,下载后强制校验 SHA256,不匹配立即删除且不执行安装;仅允许 https。 - 升级流程:下载
CMO_Chinese_Setup_v<ver>.exe→ 校验 → 游戏运行中先提示退出游戏 →
以--install <游戏目录> --silent --wait-pid静默安装(安装器等待旧助手退出后再写文件,避免文件占用)→
安装完成后自动重启助手。安装失败自动保留原文件,不会出现半汉化状态。 - 提醒与免打扰:「不再提醒」= 关闭自动检查并记住该版本,按钮变为「开启提醒」可一键恢复;
提醒方式可选弹窗 / 仅托盘气泡(默认,不打断全屏游戏)/ 静默。 - 安装器界面新增「版本更新」分组:更新状态行(当前版本 / 上次检查 / 下次自动检查)、
「立即升级」「检查升级」「不再提醒」三个按钮,以及「随 Windows 启动自动检查更新(每 6 小时)」开关。 - 卸载一致性:还原原版英文时同时结束更新助手进程、删除开机启动项、
注册表设置与助手本体,系统不留后台残留。 - 修复地图仍为英文(用户反馈):安装器从未分发汉化后的 World Wind 地名集,
用户装包后WW\PlacenameSets\{Synoptic,Cities}\0000_0000.wwp仍是英文,
地图上的国名/城市名以及 Stamen 标签瓦片重绘的数据源都是它。现已在安装器中内嵌并部署
两地名集(Synoptic 321 条、Cities 4287 条,带.orig备份,卸载可还原),
并保证先部署地名集再重绘标签瓦片;绿色包同步携带WW/PlacenameSets/目录。
实测:把游戏地名集恢复为英文(模拟全新用户)后运行安装器 → 地名全部变中文,
游戏世界视图园国名/海名/城市名均为中文(evidence/live/v413/v414/map_labels_world.png)。 - 修复复合串里的英文括号片段(用户截图反馈):任务编辑器「可用」列表的行文本是
「苏法/风暴 #1 (Air Superiority BVR) (拉马特戴维)」这类中文+英文混排串,
整串查表落空、按标点切分又因含中文被跳过,导致括号里的载荷名永远是英文。
引擎新增按()/[]拆出纯英文片段单独翻译再拼回(支持A/A:类前缀与逗号分片),
并补译[UNAVAILABLE]→[不可用]、A/A:→空空:、Light 202→轻载 202、Radar→雷达。 - 彻底根治中英频闪(用户反馈:单位状态面板「一会中文一会英文」):
根因是引擎此前只有一个 UI 轮询线程在补翻译(首 40 轮 600ms、之后 1500ms),
游戏每次把实时文本(单位状态面板的 航速/深度/阵营、消息日志、状态栏)刷回英文后,
要等下一轮才变中文,中间那段英文就是可见的频闪;经CTRL_TREE确认
单位状态面板是 WPF 控件(ElementHost_Right),数据绑定会持续回推英文。
修复:记录「确实需要翻译」的实时 WPF 元素,并挂CompositionTarget.Rendering
(每帧绘制前触发)把被刷回英文的文本立刻改回中文——英文不再有机会被画到屏幕上;
另每 8 帧(约 130ms)全量补扫一次,保证切换单位时新建的元素也在首帧内变中文;
仍用SetCurrentValue保留数据绑定。
(注:曾尝试挂 WPF 依赖属性变更回调,实测会导致游戏无法启动,已弃用该方案。) - 新增引擎诊断命令
CTRL_TREE(控件树导出)与WPF_TEXTLOG(WPF 翻译写入日志),
用于定位自绘/绑定界面的文本来源与频闪。 - 打包完整性审计(用户要求:打包时必须带上所有汉化):逐项核对游戏目录里被汉化的资产,
发现两组从未随包分发——Symbols\Menu的 28 张中文菜单按钮图(引擎启动时预加载)与
Launcher\Localization\stringsChinese.resx(启动器中文文案)。现已:
① 收录到assets/symbols_menu/(与Menu_Backup逐字节比对,只收真正改过的 28 张)与assets/launcher/;
② 安装器新增DeploySymbolsAndLauncher/RestoreSymbolsAndLauncher(覆盖前写.orig备份、卸载还原);
③ 绿色包同步携带Symbols/Menu与Launcher/Localization;
④package.sh增加汉化资产覆盖率断言:任一组资产(词典/引擎/助手/config 补丁/说明/
DB 模板/Scenarios HTML/地名集/符号图/启动器资源)缺失即构建失败。
当前绿色包 690 个条目、含 Scenarios HTML 323 + 备份 323、DB 模板 8、地名集 2、符号图 28、启动器资源 1。 - 安装器与绿色包同步包含更新助手;绿色包解压后同样具备自动升级能力。
安装方式
- 一键安装器(推荐):下载并运行
CMO_Chinese_Setup_v4.1.4.exe,自动识别 Steam 游戏目录并一键完成汉化。 - 绿色免安装包:下载
CMO_Chinese_Pack_4.1.4.zip,解压后覆盖到游戏根目录即可。