Skip to content

fix(input): 输入翻译不看输入长度,一万字照样整段送出 → 超过阅读侧单个翻译单元的上限(MAX_TEXT,3072 字符)时不发请求、不分段,提示删减后再试(#643) - #701

Merged
Teeeeeeeerry merged 2 commits into
mainfrom
fix/643-input-length-limit
Oct 5, 2026
Merged

Teeeeeeeerry merged 2 commits into
mainfrom
fix/643-input-length-limit

Conversation

@Teeeeeeeerry

Copy link
Copy Markdown
Owner

问题

输入翻译不看输入有多长,粘一万字进去点圆点照样整段送出。这既花掉远超正常的配额,又可能撞上引擎的长度限制。阅读侧对单个翻译单元早有上限,输入翻译这一侧没有。

根因

translateInput() 拿到框里的文字后直接走判定链和单文本入口,中间没有任何长度判断。阅读侧的上限 MAX_TEXT(3072 字符)只用在页面分段采集里。

修复

  • 新增纯判定 decideInputLength()(src/ui/input-length.ts)
    • 上限直接引用阅读侧的 MAX_TEXT,计数方式也相同:去掉首尾空白后的长度
    • 超了返回 { ok: false, reason: 'too-long', limit }
  • 内容脚本在送翻之前判定:超长时不发请求、框里不动,提示条报错“这段文字超过 3072 个字符。输入翻译不分段翻译,请删减后再试”
  • 不分段翻译后拼接:发给别人的文字不能有接缝(输入翻译:在输入框里写完一段话,点文字末尾的圆点把它换成对方的语言 #633 不在范围内一节)
  • 三份 messages.json 末尾新增 toastInputTooLong(带 limit 占位符)

验证

  • 单元(纯判定层):新文件 input-length.test.ts,5 条
    • 与 MAX_TEXT 同一个常量
    • 刚好等于上限放行
    • 上限加一拒绝并带上上限
    • 首尾空白不计入
    • 短文字放行
  • 端到端 TC-E2E-133:
    • 3073 个字符:零请求、框里不动,提示文案用 chrome.i18n.getMessage 计算
    • 3072 个字符:照常翻译,整段一次送出
    • 在未修复的代码上跑过,红
  • pnpm test 115 个文件 1417 条全绿;pnpm typecheck 通过;pnpm build 通过
  • pnpm test:e2e:core 89 过、2 跳过、1 不稳定:TC-E2E-105 是 DeepSeek 权限的整页翻译路径,与本票无关
    • 出事那轮整套跑了 3.5 分钟,失败是超时
    • 之后在 main 上连跑 4 次、在本分支上连跑 4 次都过

Closes #643

Teeeeeeeerry and others added 2 commits October 5, 2026 12:20
…发请求、不分段,提示删减后再试(#643)

Co-Authored-By: zhexuancai-uts <261878103+zhexuancai-uts@users.noreply.github.com>
Co-Authored-By: zhexuancai-uts <261878103+zhexuancai-uts@users.noreply.github.com>
@Teeeeeeeerry
Teeeeeeeerry merged commit 6bcb1db into main Oct 5, 2026
6 checks passed
@Teeeeeeeerry
Teeeeeeeerry deleted the fix/643-input-length-limit branch October 5, 2026 01:24
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.

输入翻译:超长输入拒绝并提示,不分段(#633)

1 participant