[js] 简单 AI 翻译,思源也有沉浸式翻译了

简单 AI 翻译(仿浏览器沉浸式翻译插件),自带 ai 引擎,也支持直接调用思源配置里的 ai,可自定义提示词。

三大功能

  1. 自带 ai 引擎,直接使用,无需任何配置,完全免费,适合小白
  2. 通过思源 ai 配置,配置完后,参数 aiEngine 设置为 siyuan 即可,适合有 ai api 的用户
  3. 选中块,仅对选中的块进行翻译,适合临时对部分文本翻译

shift + 点击或按 F5 取消翻译。

两大模式

  1. 普通模式,适用于小白用户,满足基本的翻译需求,每个块发送一次请求,响应速度更快。(但一般 api 有速率和单位时间 tokens 限制,建议选择少量段落后多次翻译)
  2. 专家模式,适用于资深玩家,对翻译效果有更高要求,一次性发送多个块数据,模型会根据上下文综合翻译,可能翻译效果更好,但心理等待时间可能更久。(同样,api 一般有超时和单位时间 tokens 限制,建议选择部分多次翻译,如果是 siyuan 引擎,需要在设置/ai/超时时间中设置一个较大的超时时间)

如果你没理解,一点没有影响,这仅仅是个概念,对正常使用没有任何影响。但如果你是高级玩家,可以通过查看源码了解这两大模式的实际区别。

使用演示

r136.gif

参数配置

更多参数配置如下

注意,这里的提示词仅供参考,由于提示词一直在不断优化,后续修改了提示词不再更新帖子,请以源码为准!

// default 默认引擎,即本代码自带引擎,完全免费,无需配置 // siyuan 思源ai引擎,即思源ai配置中设定的ai引擎 let aiEngine = 'default'; // 翻译成什么语言 // zh-cn 简体中文 zh-hk 港式繁体 zh-tw 台湾繁体 // us-en 英语 ja-jp 日语 ko-kr 韩语 ru-ru 俄语 de-de 德语 let transTo = 'zh-cn'; // 是否开启专家模式 // 专家模式将会把所有块一起发送给ai翻译,结果更准确,性能更好,但心理等待时间更久 let expertMode = false; // ai提示词 const aiPromptCommon = ` 你是一名专业的翻译人员,母语为 {{to}}。你的任务是将输入文本翻译成标准的、地道的 {{to}}。但在执行前,请先判断输入文本的语言。 翻译规则: 1. 如果文本中包含{{to}}的句子或段落,仅{{to}}这部分文本原样输出(包括但不限于标点符号、空白符等),不要进行任何翻译、润色或改写。其他非{{to}}部分,请翻译成自然流畅、符合使用习惯的 {{to}}。 2. 再次解释说明,多种语言混合的段落,不要仅部分翻译,也不要不同的语言分开翻译,而是把所有文本看做一个整体,仅其中包含{{to}}的那部分或者说那些句子原样保留,剩余的非{{to}}要继续翻译。 3. 返回的译文必须严格保留原文本的段落数量、空格(包括行首空格)、空白符、缩进、换行符、标点符号等格式,必须与原文格式完全保持一致,不得更改。 4. 如果文本包含 HTML 标签,请合理保留标签结构并保证语义通顺。 5. 对于不应翻译的内容(如专有名词、代码等),请保留原内容不翻译。 输出说明: 1. 不要输出任何说明,解释或注释等,例如“翻译如下:”,“根据规则1,我应当xxxx”,“此处用xxxx翻译更合适”,“(注:xxx)”,“[注:xxx]”等这些解释不允许出现。 2. 不要输出JSON格式,直接返回译文文本即可,比如{"id":"译文"}错误,直接返回译文文本即可。 3. 保留所有原始格式:包括行首空格、换行、标点符号等。若某行原文以空格开头,请确保译文也以相同数量的空格开头;若原文行首无空格,则译文也不得添加空格。不得对空白符进行任何改动。比如“  hello word!”,输出“  你好世界!”,正确,而输出“你好世界!”,错误。 4. 换行符的格式必须与原文一致,不得自行添加或减少换行,标点符号和空白符也要与原文一致。 5. 不要参考历史对话内容,仅严格按照上述规则执行。 现在,请翻译以下内容: {{text}} `; // 专家模式 // 专家模式将会把所有块一起发送给ai翻译,结果更准确,性能更好,但心理等待时间更久 const aiPromptExpert = ` 你是一名专业的翻译人员,母语为 {{to}}。你将接收一个 JSON 格式的输入,任务是将其中的值翻译成自然流畅、符合 {{to}} 语言表达习惯的内容。 **输入格式说明:** JSON 结构如下所示: {"id1": "文本内容1", "id2": "文本内容2", ...} - 每个键(如 "id1")是文本 ID,请严格保留,不做任何更改; - 每个值是需要翻译的文本内容,只翻译 **值部分**; - 输入内容可能是段落、句子、HTML结构等,请根据内容类型合理处理。 **翻译规则如下:** 1. **语言检测优先级最高**:请在翻译前判断每段文本中是否包含 {{to}} 的句子或段落。如果文本中包含{{to}}的句子或段落,仅{{to}}这部分文本原样输出(包括但不限于标点符号、空白符等),不要进行任何翻译、润色或改写。其他非{{to}}部分,请翻译成自然、流畅、地道的 {{to}},符合目标语言表达习惯。 2. 再次解释说明,多种语言混合的段落,不要仅部分翻译,也不要不同的语言分开翻译,而是把所有文本看做一个整体,仅其中包含{{to}}的那部分或者说那些句子原样保留,剩余的非{{to}}要继续翻译。 3. 保持原有的段落数量、空格(包括行首空格)、空白符、缩进、换行符、标点符号等格式完全一致。再次强调,必须与原文格式完全保持一致,不得更改。 4. 正确处理 HTML 标签:翻译文本内容的同时,合理保留并安置 HTML 标签,使译文语义通顺、结构正确。 5. **绝对不要翻译任何已为 {{to}} 的文本内容**,无论是什么类型的文本——这项规则必须严格执行,任何违背都会导致输出错误。 6. 不要翻译专有名词、代码或任何明确不需要翻译的内容。 **输出格式说明:** 1. 直接输出 JSON 结果,不要输出任何说明,解释或注释等,例如“翻译如下:”,“根据规则1,我应当xxxx”,“此处用xxxx翻译更合适”等内容。 2. 格式要与输入格式严格保持一致。换行符的格式也必须与原文一致,不得自行添加或减少换行,标点符号和空白符也要与原文一致。 3. 输出必须是纯粹的 JSON 文本,**不要添加任何字符在JSON的首尾,比如 {"id":"文本"}✅正确,\`\`\`json\n{"id":"文本"}\n\`\`\`❌错误**。 4. 输出必须为标准合法的 JSON 格式(键值使用双引号,必要时转义特殊字符)。 **上下文说明:** 1. 该 JSON 中的内容可能来自一篇有上下文有关联的文章,可参考上下文以提高翻译准确度,请综合判断。 2. 不要参考历史对话内容,仅严格按照上述说明执行。 现在,请翻译以下内容: {{text}} `;

使用技巧

  1. 英翻中推荐 deepseek 或 chatgpt,信达雅方面感觉更给力。如果想白嫖可参考下面免费大模型方案。

  2. 诗歌等上下文关联紧密的,最好一次性请求,这样翻译效果最好,参见参数配置中的专家模式。

  3. 写到一个段落中可一次性发送,如果不方便写一个段落且要求准确度高的建议直接用专家模式。

  4. 自定义 prompt 可以参考上述参数配置。

  5. 保存译文后,如果想把译文和原文分开两个段落,只需要在译文的开头回车即可。

  6. 注意,停止翻译,当请求已响应,正在下载中时无法停止,但结果不会输出。

  7. shift + 点击或按 F5 取消翻译。

  8. 其他快捷键

    image.png

免费大模型

推荐 硅基流动大模型列表

https://openrouter.ai/models (国内网络有时不稳定)

更多免费大模型参见 https://getquicker.net/Sharedaction?code=f1743555-674d-4729-2552-08dd3978d697&fromMyShare=true

注意,这是早期汇总的,可能某些大模型已经失效。

国外大模型(chatgpt 等)推荐 V3API (收费,但性价比高)

感谢作者

image.png

代码

点这里 👇 打赏后可见!

(为什么要打赏可见,因为我想统计使用人数,感觉这个方法最方便 😄)

打赏 10 积分后可见
10 积分 • 7 打赏
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26093 引用 • 108339 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    191 引用 • 1359 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 文本超出文档了

    image.png

    1 回复
  • wilsons

    感谢反馈!已修复。

    1. 好像不能去掉翻译显示原文?

    2. 偶尔会出现分屏的文档没有按钮的情况(先分屏,然后重新加载界面)

      image.png

    1 回复
  • wilsons

    感谢反馈!已修复。

    好像不能去掉翻译显示原文?

    shift+ 单击或按 f5 刷新即可。

    @JeffreyChen 已改成 shift+ 单击翻译按钮取消翻译了。

    image.png

    2 操作
    wilsons 在 2025-06-01 18:10:48 更新了该回帖
    wilsons 在 2025-06-01 16:40:30 更新了该回帖
  • wilsons

    0.0.8

    增加 alt+ 点击切换 ai 引擎;

    shift+alt 中英切换;

    ctrl+shift+alt 切换专家/普通模式;

    右键复原

    修复专家模式 ai 返回数据格式错误问题

    image.png

    1 操作
    wilsons 在 2025-06-01 22:36:28 更新了该回帖
  • xnyshu via macOS

    译文与原文在一个块,我用回车键将它们分开成两个块时,译文突然消失了。

    1 回复
  • wilsons 1 评论

    哈哈,译文是虚拟的,实际是不存在的。它依附于块,块改变,自然就消失了。

    这样设计的目的是因为一般译文仅仅看一下,并不会持久。

    如果想长期保存,复制下来,放到块下面即可。

    原来如此。那能不能把这个操作简化成一个键鼠配合操作?
    xnyshu
  • wilsons 1 评论

    那能不能把这个操作简化成一个键鼠配合操作?

    @xnyshu 0.0.9 增加 ctrl+shift+ 点击 保存译文

    不知道是否你想要的效果?

    image.png

    1 回复
    感謝!
    xnyshu
  • wilsons

    0.0.10 迎来重大更新!

    1. 支持自动跳过已是目标语言的文本;
    2. ctrl+ 点击停止翻译(在批量翻译或网速较差时可取消翻译请求,注意:已响应,正在下载中的请求无法停止);
    3. 优化提示词;

    image.png

    2 操作
    wilsons 在 2025-06-04 07:21:48 更新了该回帖
    wilsons 在 2025-06-02 21:07:46 更新了该回帖
  • xnyshu via macOS

    这个是对整篇文档操作,能不能实现只对选定块操作呢?

    1 回复
  • wilsons 2 评论

    支持针对选中块操作

    厉害!说明里好像没有,还是我没注意?
    xnyshu
    @xnyshu 文章里只有这句说明,选中块,仅对选中的块进行翻译,适合临时对部分文本翻译。 但其实,所有操作都支持部分选择,不仅仅翻译。 然后,如果想把译文和原文分开两个段落,只需要在译文的开头回车即可。
    wilsons
  • wilsons

    0.0.11.1 改进提示词,兼容更多 ai,提高翻译的稳定性和准确度。

    @participants 提示词彻底优化完毕,现在对各版本 ai 的兼容性和稳定性非常好,建议更新!


    0.0.11 迎来重大版本更新!

    1. 优化提示词,对国内低版本 ai 兼容性更好;
    2. 修复专家模式已是目标语言仍然翻译的问题;
    2 操作
    wilsons 在 2025-06-02 23:09:12 更新了该回帖
    wilsons 在 2025-06-02 21:29:57 更新了该回帖
  • 能整合一下这个浏览器端的脚本吗?
    https://update.greasyfork.org/scripts/480616/Zotero%20GPT%20Connector.user.js

    实现对接 web 方式访问 ai.

    1 回复
  • wilsons

    这个脚本的作用是什么?安装了没反应,可否介绍下怎么使用,有 ui 吗

    1 回复
  • queguaiya via Android

    牛的

  • 这个 zotero 里面一个插件 zotero gpt 作者写的脚本. 目的是 和 zotero 的插件 gpt 通讯 实现开一个 ai chat(比如 chatgpt, kimi, deepseek 等)的网页,然后通过这个脚本转发 请求和响应 .最后呈现到 zotero 的一个聊天框. 实现无需 apikey 就可以无限聊天.
    大致原理是 chrome chat=> zotero gpt connector (js) <=> zotero debug brigde => chat ui
    https://github.com/MuiseDestiny/zotero-gpt

    1 回复
  • wilsons

    这个好复杂,zotero gpt 需要显示打开一个浏览器 ai 页面吗?还是隐藏打开,这个页面对用户不可见的?

    这个 zotero debug brigde 你知道通过什么原理实现的吗?

    思源应该可以通过 electron 打开隐藏页面并注入 js 实现,或者浏览器页面通过 websocket 交互。

    1 回复
  • wilsons

    0.0.12 迎来重大更新!建议升级!

    1. 改进提示词,完美兼容多语言混合段落;
    2. 修复专家模式偶发 ai 返回格式错误问题;
    3. 改善快捷键交互方式,更符合使用习惯;
    4. 提示信息实时显示当前状态,更方便查看当前切换状态。
    5. 修复模式切换后,ai 受历史对话影响造成返回格式错误的问题(0.0.12.1)
    6. 支持行首缩进对齐;优化提示词(0.0.12.2)

    image.png

    @participants

    3 操作
    wilsons 在 2025-06-04 10:48:43 更新了该回帖
    wilsons 在 2025-06-04 10:40:17 更新了该回帖
    wilsons 在 2025-06-04 07:28:14 更新了该回帖
  • 浏览器打开一个 chatgpt, 然后 script 拦截这个页面的通讯和控制页面, 同时脚本通过跟 zotero debug brigde 的端口, 执行对 zotero 某个 chat 页面的注入脚本, 实现同步显示 chatgpt 的内容变化, zotero 中的 chat 页面的聊天消息会通过这个流程反向发送回去, 也可以上传文件到 chatgpt(这个没啥用).

    1 回复
  • wilsons

    明白了,不过思源里用 websocket 交互最方便,最好是用隐藏网页实现,用户无感知。后续空了研究下。

    不过,对于翻译,对普通用户来说,免费的 api 已经足够了。我现在用免费的 deepseek-v3 和本代码自带 ai,感觉翻译的已经非常准确了。

    不过,如果对于聊天来说,还是官方最新版最好,通过 web 版免费且强大。

    不过,这个好像更应该给 F 佬的 ai 插件提出这个方案。

    对翻译来说,感觉有点杀鸡用牛刀了。

    1 回复
  • 跟你提之前我以为只是监听一个端口然后对接一下 http api 就完成了.

    后面吧 zotero-gpt, debug brigde , js script 丢到 trae 分析了一下发现确实很复杂.

    1 回复
  • wilsons

    是的,纯 http 是单向通信,无法交互。只能使用笨拙的轮询和长轮询。

    不过现在有 websocket 和 sse。

  • 膜拜大佬啊

  • wilsons

    0.0.13 迎来重要更新,建议升级!

    1. 解决请求过多,后面请求超时问题(受 api 请求速率和单位时间 tokens 最大限制,建议,部分选择后多次翻译);
    2. 解决 siyuan 引擎专家模式下执行时间过长超时问题(注意,需要在思源设置/ai/超时时间中设置一个合适的超时时间才行,同样受 api 超时和单位时间 tokens 最大限制,建议,部分选择后多次翻译);
    3. 保存译文增加 data-type 属性,方便其他代码调用
    4. 优化提示词
  • 6666,几天没逛论坛,又有给力的片段了

请输入回帖内容 ...
wilsons
正在努力开发 wilsons 工具箱中 🛠️ 目前已正式入驻爱发电啦!💖 想催更、提需求?欢迎访问 👉 https://afdian.com/a/wilsons