Skip to content

fix: 修复语言重载与聊天颜色边界#718

Open
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-i18n-chat-boundaries
Open

fix: 修复语言重载与聊天颜色边界#718
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-i18n-chat-boundaries

Conversation

@zhibeigg

@zhibeigg zhibeigg commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

原有问题

语言重载、JSON 语言节点和颜色解析在边界输入下会丢失结构或保留旧状态:

  • TypeJsontranslate: 指令分支不可达,嵌套对象、数组和 hover 列表在转换时可能被扁平化或改变类型。
  • 语言资源匹配不够精确;某个内置资源缺失时可能中断整个重载流程。
  • 重载直接修改旧缓存,已从文件删除的语言键仍可能残留,并发读取时也可能看到更新一半的状态。
  • HEX/RGB 解析对前导零、零值、分量宽度和非法表达式处理不一致,非法文本可能被部分吞掉。

典型触发场景与后果

  • 语言 JSON 使用 translate、嵌套 hover 内容或数组:翻译节点失效,hover 数据类型错误,最终消息缺字段或无法发送。
  • 删除、重命名语言文件或缺少某个内置资源后执行 reload:全部语言重载被中断,或者已删除文本仍继续显示。
  • 玩家读取语言缓存的同时进行 reload:可能短暂读到新旧混合数据。
  • 使用 #000000、带前导零的 RGB、可变宽度分量或非法颜色表达式:黑色被误判、颜色值截断,或原始文本丢失。

本 PR 修改

  • 修复 TypeJsontranslate: 解析顺序,并保留嵌套对象、数组和 hover 列表的原始结构类型。
  • 精确匹配语言资源;缺少单个内置资源时记录告警并跳过,不再中断全部重载。
  • 使用 copy-on-write 快照重建并替换语言缓存,删除的键会消失,并发读取始终看到完整旧快照或完整新快照。
  • 严格校验六位 HEX 和三分量 RGB,正确处理零值、前导零和可变宽度分量;非法表达式完整保留原文。
  • 保持命名颜色和 RESET 的传统颜色码行为。
  • 审计确认 Locale 当前没有 Issue 所述 Unicode/CJK 分类逻辑,因此未新增无调用方 API。

修改目的

保证语言内容在复杂 JSON、连续重载和并发读取场景下保持结构完整与状态一致,同时让颜色边界输入可预测且不会破坏用户原文。

兼容性与行为变化

  • 保持公开语言缓存类型、引用和可变视图兼容。
  • reload 会正确移除源文件中已经删除的语言键。
  • 非法颜色表达式由“可能部分消费”改为“原样保留”。

验证

  • ./gradlew :module:minecraft:minecraft-chat:test :module:minecraft:minecraft-i18n:test --rerun-tasks --no-parallel
  • ./gradlew :module:minecraft:minecraft-chat:build :module:minecraft:minecraft-i18n:build --rerun-tasks --no-parallel
  • git diff --check(仅 Windows LF→CRLF 提示)
  • 独立最终复审:无 P1/P2

Refs #703

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant