Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

LoopNull Translate

一个用于 X(Twitter)和 Discord 的轻量级自动翻译 Userscript。

脚本会监听页面中的动态内容,并将符合条件的消息自动翻译为简体中文,译文直接显示在原文下方,无需手动点击翻译按钮,也无需配置 API Key。

功能

X / Twitter

在:

  • x.com
  • twitter.com

自动检测推文文本。

仅当消息被识别为英文时显示简体中文译文。

对于中文、日文、韩文、俄文、阿拉伯文等明显非英文内容,不会显示额外译文。

Discord

在:

  • 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 进行语言检测和翻译。

X

处理流程:

发现推文
↓
过滤无意义文本和疑似纯代码
↓
初步判断是否可能为英文
↓
Google Translate 自动检测语言
↓
检测结果为英文
↓
显示简体中文译文

Discord

处理流程:

发现消息
↓
过滤无意义文本和疑似纯代码
↓
Google Translate 自动检测语言并翻译
↓
检测结果不是中文
↓
显示简体中文译文

翻译服务

当前使用:

https://translate.googleapis.com/translate_a/single

请求使用自动语言识别:

sl=auto

目标语言:

tl=zh-CN

因此不需要用户配置 Google Cloud API Key。

隐私说明

本脚本不包含自己的服务器,也不会将消息发送给 LoopNull 或其他自建服务。

但是,为完成语言检测和翻译,文本内容会被发送至 Google Translate 服务。

需要特别注意:

X

脚本会首先在本地进行英文候选判断。

只有符合英文候选条件的文本才会进一步提交给 Google Translate。

Discord

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 接口

本项目使用的是 Google Translate 的 Web 翻译接口,而不是 Google Cloud Translation 官方付费 API。

因此:

  • 不保证接口长期保持不变
  • Google 可能修改接口行为
  • Google 可能实施访问频率限制
  • 某些网络环境可能无法访问该服务
  • 接口变化可能导致脚本暂时失效

网站 DOM 变化

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

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 反馈。

About

Lightweight userscript that automatically translates English posts on X and non-Chinese messages on Discord into Simplified Chinese.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages