v1.1.3 — 配置不再丢 / 老配置真的会升级 / 接口文本一律清洗
这一版不加功能、不改翻译行为,专修「模组会悄悄弄丢你的东西」和「模组会悄悄不干活」这两类问题。
改动来自一轮核心链路审计(两轮只读代码审计 + 可复现的行为实验),不是玩家截图反馈的。
配置结构没有变化:configVersion仍是 6,升级后设置、术语表、忽略规则原样保留。
升级后你要做什么
什么都不用做。装上就能用;如果你是从 v1.0.0 直接升上来的,这一版会自动把配置文件里
停在旧版的内容补成新版(见下第 2 条)——以前这个升级根本没执行。
修了什么
1. 手改配置漏一个逗号,设置就永久没了(数据丢失)
以前配置解析失败只写一行日志、不备份,之后随便按一下 F6(或 /hxtranslate on|key|debug)
就会把这份文件整份覆盖成默认值 —— Key、术语表、忽略规则永久消失。
现在:解析失败先把原文件另存为 hxtranslate.json.broken-<时间戳>,再按默认值运行,
并在聊天栏告诉你原因和备份名(修好改名回来、/hxtranslate reload 即可恢复)。
顺带把写入改成原子写(先写 .tmp 再改名,写到一半崩溃不会留下半个 json),
保存时也不再抹掉模组「不认识的字段」(你自己加的备注、新版模组写过的字段都能留住)。
2. 从 v1.0.0 一路升上来的用户,模型名永远停在已下线的 deepseek-chat
v1.0.0 的配置里没有 configVersion 这个字段,Gson 会给它填上「当前版本号」,
于是迁移逻辑判定「已经是最新版」直接跳过:model 停在已下线的 deepseek-chat
(每条请求都是 400),术语表、横幅规则、提示词也全停在 v1.0.0,而且旧版还会把
「已是最新」写回文件,此后永远不会修。现在会把「没有版本号」当成 v1 执行迁移,
你自己写的内容(API Key 等)不受影响。
3. 接口返回的内容没有长度上限,可以被直接打爆内存
用户自己配的第三方中转站只要返回一个几百 MB 的正文,就会 OutOfMemoryError,
而那条出站消息连「未能翻译」都不会计数,直接静默消失。现在限长读取
(成功 1 MiB / 错误 64 KiB),超限判失败并说明原因。
4. 译文和模型名没做清洗
接口返回的文本里如果有换行,会被原版聊天栏拆成多条独立聊天行([译] 前缀丢掉,
看起来像服务器自己说的话);§ 则会被渲染成颜色代码。v1.0.8 给错误正文加过这道清洗,
但只接在错误分支上。现在接口返回的文本(译文、模型名、错误正文)统一收口清洗。
5. To view your stats, type: /stats 这类服务器提示永不翻译
判断「是不是自己发的私聊」以前只看「以 To 开头且任意位置有 ": "」,于是这种提示
被整条当成自己的消息静默跳过。现在收紧为 To <玩家名>: ,真回显照旧识别。
6. 发送失败仍被统计成「已发出」,还会在聊天栏打一条并不存在的回显
现在只有真的发出去了才计数、才打回显。
7. 升级时会覆盖用户自己写的提示词
v3→v4 迁移的判据是「提示词里没有 Examples: 就整段换成默认值」,手写提示词本来就可能没有这一段。
现在只认「老版默认值的识别标记」,该升级的一条不漏,手写的一字不动。
其它小口径修正:maxOutgoingChars 上限夹紧到 256(调大不是能发更长,是可能被服务器踢);
cacheSize 最小 16 写进文档并显式化;/hxtranslate outgoing off 的提示与实际行为对齐;
debug 文本截断不再劈开 emoji。
测试
离线断言 315 → 365 项,新增覆盖此前完全没覆盖的配置文件读写路径(临时目录里真跑 load()/save())、
接口文本清洗的「接线」、思考模式、缓存按方向分开、To 前缀判定、手写提示词保护;
横幅用例改为调用生产代码同一个函数(此前自检自己抄了一份实现,改掉被测语义仍会全绿)。
反向验证:把修复中和掉后 —— 配置层 5 处 → 15 项转红;客户端层 6 处 → 10 项转红;
缓存方向维度单独中和 → 2 项转红。构建因此会红,门禁有效。
本轮核实后没有改动的(附理由)
- 中英混发的顺序:先发中文再紧接英文时,英文会立刻发出、译文后到,顺序会颠倒。
把英文也排进队列意味着每条英文都要等前面的翻译(最多几秒),代价更大;
v1.0.5 承诺的「按输入先后发出」本来就只针对两条待翻译的消息。已写进 README 的 FAQ。 /nick(显示名≠账号名)的玩家:自己消息的回显认不出主人,会被翻回中文。
要修得先从服务端回显里学到显示名,风险大于收益,等真有人反馈再动。warnThrottled单槽位、finish_reason=length的截断译文、接口基址大小写/查询串:
可达性或收益不明确,先记录在 CHANGELOG 的「未改动」清单里,下一轮再说。
完整说明见仓库的 CHANGELOG.md。
安装
下载下面的 hx-chat-translator-1.1.3+mc26.2-fabric.jar 放进 mods 文件夹(需要 Fabric API 0.160.0+26.2 与 Java 25)。