一个用于 X(Twitter)和 Discord 的轻量级自动翻译 Userscript。
脚本会监听页面中的动态内容,并将符合条件的消息自动翻译为简体中文,译文直接显示在原文下方,无需手动点击翻译按钮,也无需配置 API Key。
在:
x.comtwitter.com
自动检测推文文本。
仅当消息被识别为英文时显示简体中文译文。
对于中文、日文、韩文、俄文、阿拉伯文等明显非英文内容,不会显示额外译文。
在:
discord.com
自动检测聊天消息。
当消息被识别为非中文语言时,在原消息下方显示简体中文译文。
中文消息不会重复显示翻译结果。
- 自动翻译,无需手动点击
- 目标语言固定为简体中文
- X 仅翻译英文内容
- Discord 翻译非中文内容
- 支持 X 和 Discord 的动态页面加载
- 译文直接显示在原文下方
- 不修改原始消息
- 无需 Google API Key
- 自动识别源语言
- 自动过滤纯链接、纯符号、@ 提及等无意义内容
- 尝试识别并跳过纯代码内容
- 翻译结果缓存,减少重复请求
- 相同内容的并发请求自动合并
- 限制翻译并发数量
- 请求失败自动进行有限重试
- 长文本自动分块翻译
需要先安装支持 Userscript 的浏览器扩展,例如:
- Tampermonkey
- Violentmonkey
然后创建一个新的 Userscript,将:
LoopNull Translate.user.js
中的完整代码粘贴进去并保存。
启用脚本后访问 X 或 Discord 即可自动运行。
脚本会监听页面 DOM 的变化,并自动查找新出现的:
X:
div[data-testid="tweetText"]
Discord:
div[id^="message-content"]
找到新的文本内容后,脚本首先进行基础文本过滤,然后调用 Google Translate 进行语言检测和翻译。
处理流程:
发现推文
↓
过滤无意义文本和疑似纯代码
↓
初步判断是否可能为英文
↓
Google Translate 自动检测语言
↓
检测结果为英文
↓
显示简体中文译文
处理流程:
发现消息
↓
过滤无意义文本和疑似纯代码
↓
Google Translate 自动检测语言并翻译
↓
检测结果不是中文
↓
显示简体中文译文
当前使用:
https://translate.googleapis.com/translate_a/single
请求使用自动语言识别:
sl=auto
目标语言:
tl=zh-CN
因此不需要用户配置 Google Cloud API Key。
本脚本不包含自己的服务器,也不会将消息发送给 LoopNull 或其他自建服务。
但是,为完成语言检测和翻译,文本内容会被发送至 Google Translate 服务。
需要特别注意:
脚本会首先在本地进行英文候选判断。
只有符合英文候选条件的文本才会进一步提交给 Google Translate。
Discord 的处理方式不同。
为了判断消息具体属于哪种语言,符合基础文本过滤条件的消息可能首先被发送至 Google Translate,由 Google 返回语言检测结果。
随后脚本才决定:
- 中文:不显示译文
- 非中文:显示简体中文译文
因此,在私人 Discord 服务器、私聊或包含敏感内容的频道中使用本脚本前,请自行考虑第三方翻译服务带来的隐私影响。
脚本使用以下 Userscript 权限:
@grant GM_xmlhttpRequest
用于向 Google Translate 发起跨域翻译请求。
允许连接:
@connect translate.googleapis.com
脚本匹配以下网站:
https://x.com/*
https://twitter.com/*
https://discord.com/*
为了避免在滚动 X 时间线或 Discord 聊天时产生过多翻译请求,脚本包含若干限制机制。
默认最大并发翻译请求:
4
请求超时:
7000 ms
失败重试:
1 次
翻译缓存:
400 条
单个翻译分块最大长度:
1600 字符
DOM 更新扫描还使用了防抖处理,以减少 X 和 Discord 高频页面更新造成的重复扫描。
本项目使用的是 Google Translate 的 Web 翻译接口,而不是 Google Cloud Translation 官方付费 API。
因此:
- 不保证接口长期保持不变
- Google 可能修改接口行为
- Google 可能实施访问频率限制
- 某些网络环境可能无法访问该服务
- 接口变化可能导致脚本暂时失效
X 和 Discord 都可能修改自己的网页结构。
当前脚本依赖部分 DOM 选择器识别消息区域,因此如果网站未来修改页面结构,可能需要同步更新脚本。
语言检测由 Google Translate 完成。
非常短的文本、网络缩写、人名、混合语言文本等内容可能出现识别错误。
X 还包含一层本地英文候选判断,因此某些大量混合其他文字的英文内容可能不会触发翻译。
脚本会尝试识别明显的代码内容并跳过翻译,但这属于启发式判断,并不能保证识别所有编程语言或所有代码格式。
主要配置位于脚本顶部:
const CONFIG = Object.freeze({
targetLanguage: 'zh-CN',
maxConcurrent: 4,
timeout: 7000,
retryDelay: 1000,
maxRetries: 1,
cacheSize: 400,
mutationDebounce: 80,
maxChunkChars: 1600,
minNaturalLetters: 2,
debug: false
});其中:
targetLanguage:目标翻译语言maxConcurrent:最大并发翻译请求timeout:单次请求超时时间retryDelay:失败后的重试等待时间maxRetries:最大重试次数cacheSize:翻译缓存数量mutationDebounce:DOM 更新扫描防抖时间maxChunkChars:长文本单块最大字符数minNaturalLetters:文本至少需要包含的自然语言字符数debug:是否输出调试信息
普通用户通常无需修改这些配置。
LoopNull-Translate/
├─ LoopNull Translate.user.js
├─ README.md
└─ LICENSE
本项目建议采用 GNU General Public License v3.0(GPL-3.0)。
你可以使用、修改和重新发布本项目,但衍生作品需要继续按照 GPL-3.0 开源,并保留原项目的版权和许可声明。
详细内容请参阅 LICENSE。
LoopNull
GitHub:
https://github.com/loopnull-com
如果你在使用过程中发现 X / Discord 页面更新后翻译失效、语言判断异常或其他问题,可以通过 GitHub Issues 反馈。