dsh-translate
把整个界面翻成你的语言——用你自己的 DSH 模型,代码、路径、命令和专名一个都不动。
DeepSeek Harness 的整页翻译插件:浏览器半边遍历当前页面上的文字,把需要保留的片段(代码块与行内代码、文件路径、shell 命令、URL、标识符、版本号、哈希、数字、产品名)先遮成 ⟦n⟧ 占位符,再把剩下的散文交给宿主半边;宿主用你当前会话已经配置好的模型路由翻译,把结果交回浏览器,浏览器把占位符还原后写回原来的文本节点。原文一直留在内存里,点一下「原文」就整体还原。
只改显示层:不写会话日志、不改工作区文件、不把译文落盘。会话记录里永远是模型真正说过的话。
0.3.0 起,
dsh-translate是整页翻译插件。 原来的「厂商参数映射 + 确定性 JSON 修复」已改名为dsh-param-repair(1.0.0)。如果你是从 0.2.x 升上来的, 要保留原功能请安装dsh-param-repair并移除本行;旧配置键(repair.*、rosettaDataPath)在新插件里会被忽略, 不会导致 profile 加载失败。
English · 简体中文 · Español · Português · हिन्दी
翻什么,不翻什么
| 会翻译 | 原样保留 |
|---|---|
| 助手回复、推理摘要、工具输出里的散文 | 代码块与行内代码(code / pre) |
| Markdown 标题、列表、表格、链接文字 | 文件路径、glob、命令与参数、URL、邮箱 |
| 按钮、标签、设置项等界面文案 | JSON 键、环境变量、dsh-* / snake_case / camelCase 标识符 |
| 页面里其它插件的文字(含隐藏弹窗) | 版本号、哈希、纯数字、⟦n⟧ 占位符本身 |
| —— | 词表里的产品名:DeepSeek Harness、Cordis、npm、GitHub、Gitee、GitCode、Phocinae、PerryLink 等 |
判定规则:一个文本节点里如果没有任何可翻译的散文(例如整段都是路径或代码),直接跳过;如果模型丢掉、改了或新增了占位符,这一段就放弃翻译、保留原文,而不是把半个占位符写进页面。
安装
dsh plugin --profile <name> add dsh-translate
装好后重载 Web GUI,页面右下角会出现「译」按钮:点一次开始整页翻译(按钮变成「原文」),再点一次还原。
运行前提
翻译走你自己的模型,插件不内置 key、不内置 provider:
- 当前 profile 里要有
llm服务和一个可用的 provider(正常对话能跑就满足); - 路由默认取最近一条
request/header——也就是说,先在任意会话里发过一条消息最稳;也可以在配置里显式写死provider/model。
没路由时按钮会显示原因(例如 no model route: ...),页面不会被改动。
配置
cordis.patch.yml 里的每一格都是 Schemastery 字段,写错会在 profile 加载时直接报错:
| 键 | 默认 | 含义 |
|---|---|---|
enabled |
true |
总开关;false 时宿主不挂载任何东西 |
targetLang |
'' |
目标语言;空 = 跟随 Web GUI 当前语言(英文界面时跟随浏览器语言) |
provider / model |
'' |
可选显式路由,要么都填要么都空;空 = 用最近会话的路由 |
maxSegments |
40 |
单次模型调用的段数上限(1–200) |
maxChars |
6000 |
单次模型调用的字符上限(200–40000) |
timeoutMs |
60000 |
单次调用超时(1000–600000) |
reasoningEffort |
off |
单次调用的思考强度:off、low、high、max;off 关闭思考,翻译批次不再为思维链付费 |
glossary |
[] |
额外要求原样保留的词(产品名、内部系统名等) |
例:强制翻成日文,并把内部系统名加进词表:
- id: dsh-translate
name: dsh-translate
config:
enabled: true
targetLang: ja
glossary: [Acme Ledger, 内部工单系统]
成本与隐私
- 只翻页面上的文字(隐藏弹窗也会提前翻好),按需触发:默认不会在后台自动跑;点按钮才开始,关掉就停。
- 结果缓存:同一段原文(同一目标语言)只翻一次,缓存在浏览器
localStorage(上限 600 条),清掉站点数据即消失。 - 出网内容:只有被遮掉受保护片段之后的散文会发给你配置的模型 provider;路径、代码、命令、密钥形态的标识符不会作为可翻译文本发出。
- 不落盘:译文只存在于当前页面的 DOM 和浏览器缓存;会话日志、工作区、DSH 配置都不写。
- 不碰凭据:插件不读也不保存任何 API key;鉴权完全走宿主已有的 provider 配置。
已知限制
- 翻译发生在渲染层:React 重新渲染某个节点时会把原文写回,插件的 MutationObserver 会用缓存把译文再贴回去(不会重复调用模型);极端情况下会看到一次极短的闪动。
- 流式输出期间文字一直在变,插件等一小段安静期(350ms)再翻;正在生成的长回复可能延迟出现译文。
- 图片里的文字、Canvas、PDF 预览不做 OCR。
- 隐藏元素(
display:none的弹窗等)也会被遍历——弹窗打开时已是译文,不需要再请求模型。 - 界面本身已有 8 种内置语言(en / zh / ja / es / fr / de / ru / pt);本插件翻的是内容和第三方插件的英文文案,不替代内置 locale。
开发
pnpm install
pnpm test # 21 个用例:遮罩/还原、占位符校验、批处理、路由解析、jsdom DOM 行为、两端 descriptor 一致性
pnpm run lint
结构:
index.mjs— 宿主插件入口(Config + 挂载服务)lib/service.mjs—translatePageTypert 服务(status / translate)lib/engine.mjs— 提示词、批处理、解析、占位符校验(无 cordis / 无 DOM,可单测)lib/wire.mjs— 两端共享的调用描述符typert.host.mjs— 宿主 Typert 清单client/index.js— 手写客户端包:DOM 遍历、遮罩、缓存、浮动按钮
License
Apache-2.0。社区插件,与 DeepSeek 官方无关。
No comments yet. Be the first to write one.