似水流年小小 发表于 2023-12-8 07:48

油猴脚本实现谷歌翻译接口划词翻译【接口来着论坛其他大佬】

本帖最后由 似水流年小小 于 2024-1-19 11:04 编辑

免费的小红心点起来{:1_929:}本脚本集成了【zhurui】大佬提供的谷歌翻译接口,感谢大佬。如大佬接口不能使用,那本脚本也随之失效。
Tips: 接口大佬很坚挺,仍然稳如狗
附大佬链接:https://www.52pojie.cn/thread-1863856-1-1.html

直接上代码:
// ==UserScript==
// @name         文本翻译脚本
// @namespace    https://example.com
// @version      1.0
// @description鼠标左键选中文本后,自动请求翻译并显示结果
// @match      *://*/*
// @grant      GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';

    // 创建气泡样式
    const tooltipStyle = `
      position: absolute;
      z-index: 9999;
      background-color: #333;
      color: #fff;
      padding: 5px;
      font-size: 14px;
      border-radius: 3px;
      max-width: 450px;
      text-align: left;
      white-space: normal;
      word-wrap: break-word;
      pointer-events: none;
    `;

    // 创建气泡元素
    function createTooltip() {
      const tooltip = document.createElement('div');
      tooltip.id = 'translation-tooltip';
      tooltip.style.cssText = tooltipStyle;
      return tooltip;
    }

    // 显示气泡
    function showTooltip(text, x, y) {
      let tooltip = document.getElementById('translation-tooltip');
      if (!tooltip) {
            tooltip = createTooltip();
            document.body.appendChild(tooltip);
      }
      tooltip.textContent = text;

      // 调整气泡位置
      const tooltipWidth = tooltip.offsetWidth;
      const tooltipHeight = tooltip.offsetHeight;
      const windowWidth = window.innerWidth;
      const windowHeight = window.innerHeight;
      const tooltipX = Math.max(0, Math.min(x - tooltipWidth / 2, windowWidth - tooltipWidth));
      const tooltipY = Math.max(0, y - tooltipHeight - 10);

      tooltip.style.left = tooltipX + 'px';
      tooltip.style.top = tooltipY + 'px';
    }

    // 隐藏气泡
    function hideTooltip() {
      const tooltip = document.getElementById('translation-tooltip');
      if (tooltip) {
            tooltip.remove();
      }
    }

    // 发送翻译请求
    function translateText(text) {
      const url = 'https://findmyip.net/api/translate.php?text=' + encodeURIComponent(text);
      GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function(response) {
                const Jresponse = JSON.parse(response.responseText);
                var translation = '内部接口错误,请联系开发者'
                if(Jresponse.code==400){
                  translation = Jresponse.error;
                }else{
                  translation = Jresponse.data.translate_result;
                }
                const selection = window.getSelection();
                if (selection.rangeCount > 0) {
                  const range = selection.getRangeAt(0);
                  const rect = range.getBoundingClientRect();
                  const x = rect.left + window.pageXOffset + rect.width / 2;
                  const y = rect.top + window.pageYOffset;
                  showTooltip(translation, x, y);
                }
            },
            onerror: function(error) {
                console.error('翻译请求发生错误:', error);
            }
      });
    }

    // 监听鼠标释放事件
    window.addEventListener('mouseup', function(event) {
      if (event.button === 0) { // 鼠标左键
            const selection = window.getSelection();
            const selectedText = selection.toString().trim();
            if (selectedText !== '') {
                translateText(selectedText);
            } else {
                hideTooltip();
            }
      }
    });

    // 初始化气泡元素
    window.addEventListener('DOMContentLoaded', function() {
      createTooltip();
    });
})();


PS:代码粘过来被强行变化了,我把代码打包上来。请下载附件

使用方法:直接复制本脚本代码,打开油猴脚本管理界面,点击新建脚本,把复制的代码粘贴进去,保存即可。
实际截图如下(代码开头被改变了,参照图片上改一下,或者直接下载附件):


hsx778899 发表于 2023-12-8 09:07

本帖最后由 hsx778899 于 2023-12-8 10:01 编辑

破解专用户 发表于 2023-12-8 08:40
我是不是应该回复,大佬挺住,您一定要坚挺啊!!!
--------------------------
同时我又自私的回复楼主 ...
你的建议不错,我试着改了下
// ==UserScript==
// @name         文本翻译脚本
// @namespace    https://example.com
// @version      1.0
// @description鼠标左键选中文本后,自动请求翻译并显示结果
// @match      *://*/*
// @grant      GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';

    // Function to decode HTML entities
    function decodeHtml(html) {
      var txt = document.createElement("textarea");
      txt.innerHTML = html;
      return txt.value;
    }

    // 创建气泡样式
    const tooltipStyle = `
      position: absolute;
      z-index: 9999;
      background-color: #333;
      color: #fff;
      padding: 5px;
      font-size: 14px;
      border-radius: 3px;
      max-width: 450px;
      text-align: left;
      white-space: normal;
      word-wrap: break-word;
      pointer-events: auto;
    `;

    const buttonStyle = `
      background-color: #555;
      color: #fff;
      border: none;
      padding: 5px 10px;
      text-align: center;
      text-decoration: none;
      display: inline-block;
      font-size: 12px;
      margin: 5px 2px;
      cursor: pointer;
      border-radius: 2px;
    `;

    // 创建气泡元素
    function createTooltip() {
      const tooltip = document.createElement('div');
      tooltip.id = 'translation-tooltip';
      tooltip.style.cssText = tooltipStyle;
      return tooltip;
    }

    // 显示气泡
    function showTooltip(text, x, y) {
      let tooltip = document.getElementById('translation-tooltip');
      if (!tooltip) {
            tooltip = createTooltip();
            document.body.appendChild(tooltip);
      }
      tooltip.innerHTML = text;

      // Add copy button
      const copyButton = document.createElement('button');
      copyButton.textContent = '复制';
      copyButton.style.cssText = buttonStyle;
      copyButton.onclick = function() {
            // Decode HTML entities before copying
            const decodedText = decodeHtml(text);
            navigator.clipboard.writeText(decodedText).then(function() {
                // Show success message
                copyButton.textContent = '复制成功';
                setTimeout(function() {
                  copyButton.textContent = '复制';
                }, 2000);
            }, function(err) {
                console.error('复制失败:', err);
            });
      };
      tooltip.appendChild(copyButton);

      // Adjust tooltip position
      const tooltipWidth = tooltip.offsetWidth;
      const tooltipHeight = tooltip.offsetHeight;
      const windowWidth = window.innerWidth;
      const windowHeight = window.innerHeight;
      const tooltipX = Math.max(0, Math.min(x - tooltipWidth / 2, windowWidth - tooltipWidth));
      const tooltipY = Math.max(0, y - tooltipHeight - 10);

      tooltip.style.left = tooltipX + 'px';
      tooltip.style.top = tooltipY + 'px';
    }

    // 隐藏气泡
    function hideTooltip() {
      const tooltip = document.getElementById('translation-tooltip');
      if (tooltip) {
            tooltip.remove();
      }
    }

    // 发送翻译请求
    function translateText(text) {
      const url = 'https://findmyip.net/api/translate.php?text=' + encodeURIComponent(text);
      GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function(response) {
                const Jresponse = JSON.parse(response.responseText);
                var translation = '内部接口错误,请联系开发者'
                if(Jresponse.code==400){
                  translation = Jresponse.error;
                }else{
                  translation = Jresponse.data.translate_result;
                }
                const selection = window.getSelection();
                if (selection.rangeCount > 0) {
                  const range = selection.getRangeAt(0);
                  const rect = range.getBoundingClientRect();
                  const x = rect.left + window.pageXOffset + rect.width / 2;
                  const y = rect.top + window.pageYOffset;
                  showTooltip(translation, x, y);
                }
            },
            onerror: function(error) {
                console.error('翻译请求发生错误:', error);
            }
      });
    }

    // 监听鼠标释放事件
    window.addEventListener('mouseup', function(event) {
      if (event.button === 0) { // 鼠标左键
            const selection = window.getSelection();
            const selectedText = selection.toString().trim();
            if (selectedText !== '') {
                translateText(selectedText);
            } else {
                hideTooltip();
            }
      }
    });

    // 初始化气泡元素
    window.addEventListener('DOMContentLoaded', function() {
      createTooltip();
    });
})();

Harmon666 发表于 2024-3-8 14:31

感谢大佬分享{:1_921:}{:1_919:}

吾爱水货 发表于 2024-3-4 15:24

支持一下

twbly 发表于 2024-3-2 20:47

可用 非常感谢 谷歌翻译不好使就一直没找到好用的

宝宝很腻害 发表于 2024-3-1 21:23

拿了..........

chenCC520 发表于 2024-3-1 14:48

测试了一下,好用,大佬{:1_921:}

街角盒饭 发表于 2024-2-29 17:37

很强啊,收下了!!!!!

qiaoshang 发表于 2024-3-3 15:23

似水流年小小 发表于 2024-2-29 21:14
没遇到过,截图看看

今天试了下,又可以用了,神奇!之前忘记截图了{:301_977:}

wind315_ 发表于 2024-1-24 14:21

似水流年小小 发表于 2024-1-19 10:53
看来大佬能抗住

{:1_921:}{:1_921:}大佬威武:lol:lol

zhangmi008 发表于 2024-1-19 16:09

给大佬点赞

wangdanq 发表于 2023-12-8 08:01

谢谢楼主分享试试

marco527 发表于 2023-12-8 08:02

第二位{:1_918:}一会儿研究研究。

xiaosd 发表于 2023-12-8 08:06

试试翻译效果~~

ccchhhh87665 发表于 2023-12-8 08:07

不错不错,挺精简的

chuanyuehuoxian 发表于 2023-12-8 08:13

感谢楼主分享谢谢

xiaozhuzi 发表于 2023-12-8 08:14

沙发坐下

ssyszbd 发表于 2023-12-8 08:15

棒!棒!棒!棒!棒!

pod2023 发表于 2023-12-8 08:19

感谢分享

darifo 发表于 2023-12-8 08:22

不错不错!{:1_893:}
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 油猴脚本实现谷歌翻译接口划词翻译【接口来着论坛其他大佬】