有道翻译Tampermonkey教程

有道翻译 使用教程 3

手把手教你用Tampermonkey给有道翻译加“外挂”,效率直接翻倍

你是否也受够了在浏览器和翻译网页之间反复切换? 每次查个专业术语,都要先复制原文,再切到有道翻译标签页,粘贴,等待结果,最后再切回来,如果每天重复几十次,这时间损耗其实相当惊人,我们不聊虚的,直接上一套Tampermonkey(油猴)脚本实战教程,让你彻底摆脱这种繁琐操作,把有道翻译直接“嵌”进你正在浏览的任何网页里。

有道翻译Tampermonkey教程-第1张图片-有道翻译 - 网易有道在线翻译・电脑手机同步使用|立即下载

为什么非要折腾Tampermonkey?直接开两个窗口不香吗?

说实话,如果不是重度用户,确实没必要折腾,但如果你是一个需要频繁阅读外文资料、处理多语言邮件,或者经常逛GitHub、Stack Overflow的开发者/研究员,你会发现传统的“复制-粘贴-翻译”流程有个致命痛点:上下文割裂

你看到一段代码注释,复制到翻译框里,翻译结果出来后,你还得对着原文逐句对照,而通过Tampermonkey脚本,我们能在任意网页上,通过简单的鼠标划词或快捷键,即时呼出有道翻译的浮动窗口,甚至直接显示译文注释,这感觉,就像给你的浏览器装了一个“翻译副脑”,效率提升50%以上完全不是空话

准备工作:安装你的“脚本运行器”

在开始写脚本之前,你需要一个能运行用户脚本的容器,这就是 Tampermonkey(油猴) ,它就像一个插件管理器,能帮你运行各种自定义的JavaScript代码。

  1. 安装Tampermonkey:去你浏览器的应用商店(如Chrome网上应用店、Edge加载项)搜索“Tampermonkey”,安装官方版本即可。
  2. 设置Dashboard:安装后,浏览器工具栏会出现一个黑色图标(方形带两个圆点),点击它,选择“管理面板”(Dashboard),这就是你的脚本大本营。

核心实战:编写你的第一个“有道翻译集成”脚本

我们不写那种复杂的翻译整个页面的脚本(那样容易触发跨域问题且卡顿),而是写一个简洁、稳定、够用的“划词翻译”脚本,核心逻辑就是:监听鼠标选中事件,弹出有道翻译的迷你窗口

第一步:新建脚本

在Tampermonkey Dashboard里,点击“添加新脚本”,默认会生成一个模板,我们把它替换成以下代码结构(注意看注释):

// ==UserScript==
// @name         有道划词翻译助手
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  选中文本后,悬浮显示有道翻译结果,支持快捷键
// @author       YourName
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @connect      fanyi.youdao.com
// @connect      dict.youdao.com
// ==/UserScript==
(function() {
    'use strict';
    let translateBox = null;
    let selectedText = '';
    // 创建固定定位的翻译结果容器(样式已优化,不遮挡阅读)
    function createBox() {
        let box = document.createElement('div');
        box.id = 'yd-translate-helper';
        box.style.cssText = 'position:fixed; bottom:20px; right:20px; width:320px; min-height:100px; z-index:99999; background:rgba(255,255,255,0.98); border:1px solid #ddd; border-radius:8px; box-shadow:0 8px 25px rgba(0,0,0,0.15); padding:15px; font-size:14px; color:#333; display:none; backdrop-filter: blur(5px);';
        box.innerHTML = '<span style="color:#ff8200; font-weight:bold;">有道翻译</span><div id="yd-result-content" style="margin-top:10px; line-height:1.5;">加载中...</div><div style="margin-top:10px; text-align:right;"><button id="yd-close-btn" style="border:none; background:#f5f5f5; border-radius:4px; padding:4px 10px; cursor:pointer;">关闭</button></div>';
        document.body.appendChild(box);
        // 关闭按钮逻辑
        box.querySelector('#yd-close-btn').addEventListener('click', function(e) {
            e.stopPropagation();
            box.style.display = 'none';
        });
        return box;
    }
    // 调用有道翻译API(注意:这里用的免费的web接口,仅供学习)
    function fetchTranslate(text, lang) {
        // 对API端点进行编码
        let apiUrl = 'https://fanyi.youdao.com/translate?&doctype=json&type=' + lang + '&i=' + encodeURIComponent(text);
        GM_xmlhttpRequest({
            method: 'GET',
            url: apiUrl,
            onload: function(response) {
                let resultDiv = document.getElementById('yd-result-content');
                if (resultDiv && response.status === 200) {
                    try {
                        let json = JSON.parse(response.responseText);
                        if (json.translateResult && json.translateResult[0]) {
                            let translatedText = json.translateResult[0].map(item => item.tgt).join('');
                            resultDiv.innerHTML = translatedText;
                        } else {
                            resultDiv.innerHTML = '未找到翻译结果,请检查语法。';
                        }
                    } catch (e) {
                        resultDiv.innerHTML = '解析失败:' + e.message;
                    }
                } else if (resultDiv) {
                    resultDiv.innerHTML = '翻译服务请求超时,请稍后再试。';
                }
            },
            onerror: function(err) {
                console.error('翻译请求出错', err);
                let resultDiv = document.getElementById('yd-result-content');
                if (resultDiv) {
                    resultDiv.innerHTML = '网络请求失败,可能是接口变动。';
                }
            }
        });
    }
    // 核心监听函数:判断所选文本
    function handleSelection() {
        // 移除旧监听,避免冲突(只是优化操作)
        let selection = window.getSelection().toString().trim();
        if (selection && selection !== selectedText) {
            selectedText = selection;
            if (selectedText.length > 0 && selectedText.length < 500) {
                // 此时应该把翻译框移动至鼠标附近(为了优雅性,这里固定右下角)
                if (!translateBox) {
                    translateBox = createBox();
                }
                translateBox.style.display = 'block';
                // 简单语言检测,中译英,英译中
                let lang = /[\u4e00-\u9fa5]/.test(selectedText) ? 'zh-CHS2EN' : 'EN2zh-CHS';
                let resultDiv = document.getElementById('yd-result-content');
                if (resultDiv) resultDiv.innerHTML = '翻译中...';
                fetchTranslate(selectedText, lang);
            }
        }
    }
    // 监听鼠标松开事件(当用户划词时)
    document.addEventListener('mouseup', function(e) {
        // 点击翻译框内部不触发关闭
        if (translateBox && translateBox.contains(e.target)) return;
        setTimeout(handleSelection, 100); // 稍作延迟,确保选中状态已稳定
    });
    // 点击空白处隐藏翻译框(增加用户体验)
    document.addEventListener('mousedown', function(e) {
        if (translateBox && !translateBox.contains(e.target)) {
            // 延缓关闭,防止影响选中复制
            setTimeout(() => {
                translateBox.style.display = 'none';
                selectedText = ''; // 重置
            }, 200);
        }
    });
    // 初始化:注入样式不干扰原页面
    console.log('有道划词翻译助手已启动!');
})();

第二步:理解核心逻辑(为什么这样写不易失效)

  • *`@match ://`**:表示在所有网页上运行,这是为了保证在知乎、GitHub、PDF阅读器(浏览器内置)上都能用。
  • GM_xmlhttpRequest:这是Tampermonkey提供的跨域请求API,比直接用fetch稳定,可以避免CORS(跨域资源共享)错误,这是很多初级脚本失效的根源,用这个API能绕开大部分跨域限制。
  • 固定右下角弹窗:我特意没有做跟随鼠标的浮动弹窗,因为跟手弹窗容易在鼠标移动时误触关闭,或者遮挡要阅读的文字,固定在右下角,作为“临时草稿区”,阅读完毕视线略微下移即可看到结果,更符合人体工学。

第三步:调试与安装

点击编辑器上方的“文件”->“保存”(Ctrl+S),然后随便打开一个英文网页(比如BBC News),选中一个英文单词,松开鼠标后,右下角应该会弹出“有道翻译”字样的小卡片,显示翻译结果。

注意: 如果没反应,打开浏览器控制台(F12),查看是否有红色报错,大多数情况是接口变动了,这时候,你可以去搜索“有道翻译API 免费接口”,替换上述代码中的apiUrl地址。

避坑指南:为什么你复制的别人的脚本不能用?

  1. 接口失效:很多公开的免费翻译接口都有频率限制或签名认证,我这个示例用的是fanyi.youdao.com的网页版接口,虽然免费,但随时可能更新参数,如果失效,请去GitHub搜索“youdao translate api 2024”等关键词找找替代方案。
  2. 权限不足:确保Tampermonkey处于“启用”状态,并且浏览器没有禁用扩展程序。
  3. 脚本冲突:如果你同时装了其他翻译脚本(如“沉浸式翻译”),可能会冲突,建议只启用我这一个,或者把匹配域名改小一些,比如@match *://*.github.com/*,减少影响面。

进阶思路:怎向上扩展,让这个脚本值回票价?

如果你觉得划词翻译还不够爽,可以尝试在脚本中加入以下逻辑:

  • 双击调起大窗口:监听dblclick事件,调用window.open打开有道的页面版翻译,直接对比中英原文。
  • 保存生词本:结合localStorage,将翻译过的生词存到本地,定期复习,这已经偏向背单词工具了。

工具始终服务于人

Tampermonkey之所以强大,不是因为它能破解什么,而是因为它给了你对自己浏览器的“绝对控制权”。 当你学会看控制台报错,学会改API地址,你就从一个“使用者”变成了“定义者”。

最后提醒一句:任何自动化工具都会存在失效的风险,保持学习,定期检查脚本更新,你才能真正成为效率达人,如果你在调试中遇到任何报错,欢迎在评论区留言你的报错信息,我们大家一起想办法“拆弹”。

关掉这篇教程,去有道翻译官网找个词汇试试吧?别忘了回来点个赞再走。

标签: 脚本教程

抱歉,评论功能暂时关闭!