这是一个基于 Tampermonkey 的用户脚本,主要功能是将多个英文 AI 平台和开发工具网站的界面翻译成中文,帮助中文用户更流畅地使用这些工具。
当前仓库包含:
汉化脚本.js:用户脚本主体,负责页面监听、文本匹配与 DOM 翻译translations.json:独立维护的翻译词典,当前已包含 1000+ 条界面文案translate-icon.png:脚本图标资源项目主体逻辑位于 汉化脚本.js,翻译词典位于 translations.json,并通过 @resource 机制在脚本初始化时加载。
https://aistudio.google.com/*https://yupp.ai/*https://arena.ai/*https://plugins.jetbrains.com/*https://openrouter.ai/*https://stackoverflow.com/*https://huggingface.co/*https://github.com/*汉化脚本.js 文件汉化脚本.js 内容translations.json,需要同时修改脚本头部的 @resource translations ... 地址,使其指向你自己的可访问 JSON
资源,再重新安装或更新脚本requestAnimationFrame 把同一帧内产生的多次 DOM 改动合并处理TreeWalker API 配合 NodeFilter 直接裁剪整个不可翻译子树Map(O(1) 哈希查找),统计关键词使用 Set(O(1) 成员检测)isGitHub 等运行时不变量只计算一次,避免高频字符串匹配aria-label、placeholder、title、mattooltip 等属性,并仅对按钮类 input 翻译 valuescript/style/noscript/textarea;GitHub 场景还会额外跳过
README/Markdown 正文、路径面包屑、文件名、搜索构建器与提交信息等结构化内容// 1. 高性能数据结构(Map 哈希查找 + Set 成员检测)
const lowerCaseTranslations = new Map();
const statKeys = new Set(['follower', 'following', 'stars', 'watching', 'forks']);
const skipTags = new Set(['textarea', 'script', 'style', 'noscript']);
// 2. 预编译选择器字符串和正则表达式(避免每次函数调用重建)
const codeSelectorsStr = ['pre', 'code', '.blob-code' /* ... */].join(', ');
const timeRegex = /^(\d+)\s+(year|month|week|day|hour|minute|second)s?\s+ago$/i;
const plClassRegex = /(?:^|\s)pl-[a-z]/;
const zeroWidthRegex = /[\u200B-\u200D\uFEFF]/g;
const whitespaceRegex = /\s+/g;
// 3. 规范化查词(统一空白/大小写/零宽字符)
function normalizeLookupText(text) {
return text.replace(zeroWidthRegex, '').replace(whitespaceRegex, ' ').trim().toLowerCase();
}
// 4. TreeWalker + NodeFilter 高效遍历(直接裁剪不可翻译子树)
const filter = function (node) {
if (node.nodeType === Node.ELEMENT_NODE) {
if (skipTags.has(node.tagName.toLowerCase())) {
return NodeFilter.FILTER_REJECT; // 跳过整个子树
}
}
return NodeFilter.FILTER_ACCEPT;
};
const walker = document.createTreeWalker(rootNode, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, filter);
// 5. MutationObserver + requestAnimationFrame + Set 去重批处理
const observer = new MutationObserver(mutations => {
pendingMutations.push(...mutations);
if (!rafScheduled) {
rafScheduled = true;
requestAnimationFrame(processPendingMutations);
}
});
// processPendingMutations 内部使用 Set 确保同一节点每帧只处理一次
当前词典已包含 1000+ 常用界面短语与术语翻译,包括:
翻译映射表已被提取到独立的 translations.json 文件中,并通过 @resource 机制进行加载。
如需添加或修改翻译词条,可以在 translations.json 文件中进行编辑:
{
"English Text": "中文翻译",
"Another Text": "另一个翻译"
}
维护词典时建议优先补充完整界面短语,并保持英文键按字母顺序排序,减少误翻和无意义 diff。
translations.json 会随脚本版本一起通过 @resource 分发。也就是说:
Q: 为什么有些文本没有被翻译?
A: 可能是该文本不在翻译映射表中,或者该区域属于脚本刻意保护的结构化内容(如代码块、编辑器、GitHub
README、路径面包屑、文件名等)。前者可以通过编辑 translations.json 补充,后者通常不建议直接翻译。
Q: 页面加载时会闪一下吗?
A: 几乎不会。得益于 TreeWalker 子树裁剪和 Map 哈希查找等深度优化,翻译在毫秒级内完成,无需隐藏页面即可实现无感切换。
Q: 会影响页面加载速度吗?
A: 基本不会。脚本利用 TreeWalker API 在底层高效遍历,并通过 requestAnimationFrame 将动态渲染时的海量 DOM
修改进行批处理与去重合并。核心代码预编译了正则,采用了纯净的字典极致查询,大大减轻了重绘压力。
Q: 翻译需要多久完成?
A: 通常都是毫秒级无缝完成。
Q: 支持其他网站吗?
A: 可以。在脚本头部的 @match 部分添加新的网站 URL 即可;如果准备长期维护,也建议同步更新 README 中的支持网站列表。
脚本采用了多项性能优化技术:
requestAnimationFrame 将 MutationObserver 高频触发的 DOM 更新合并到一帧中集中处理processPendingMutations 内使用 Set 确保同一节点在每帧内只处理一次,消除高频交互时的重复翻译Map(O(1) 哈希查找),统计关键词和跳过标签使用 Set(O(1) 成员检测)FILTER_REJECT 直接跳过 script/style/代码块等整个子树,避免遍历成千上万个无用节点isGitHub)等运行时不变量只计算一次,避免逐节点重复字符串匹配closest 预过滤 + 正则精确匹配的两级策略欢迎提交 Issue 和 Pull Request!
本项目采用 Apache-2.0 许可证开源
如有问题或建议,欢迎通过 Issue 反馈