// ==UserScript== // @name 无需梯子 谷歌划词翻译 translate.googleapis.com // @namespace https://violentmonkey.github.io // @version 1.1 // @description 基于 translate.googleapis.com,中译英,英译中 // @license https://www.apache.org/licenses/LICENSE-2.0 // @author zkrisj // @include * // @exclude https://juejin.cn/editor/drafts/* // @connect translate.googleapis.com // @grant GM_xmlhttpRequest // @downloadURL https://update.greasyfork.icu/scripts/451371/%E6%97%A0%E9%9C%80%E6%A2%AF%E5%AD%90%20%E8%B0%B7%E6%AD%8C%E5%88%92%E8%AF%8D%E7%BF%BB%E8%AF%91%20translategoogleapiscom.user.js // @updateURL https://update.greasyfork.icu/scripts/451371/%E6%97%A0%E9%9C%80%E6%A2%AF%E5%AD%90%20%E8%B0%B7%E6%AD%8C%E5%88%92%E8%AF%8D%E7%BF%BB%E8%AF%91%20translategoogleapiscom.meta.js // ==/UserScript== (function() { 'use strict'; var googleUrl = 'https://translate.googleapis.com/translate_a/single?client=gtx&hl=zh-CN&dt=t&dt=bd&dj=1&source=icon&tk=33858.33858'; var word = ''; var icon = document.createElement('div'); icon.innerHTML = '' + ''; icon.setAttribute('style', 'width:32px;' + 'height:32px;' + 'display:none;' + 'background:#fff;' + 'border-radius:16px;' + 'box-shadow:4px 4px 8px #888;' + 'position:absolute;' + 'z-index:2147483647;'); // 添加翻译图标到 DOM document.documentElement.appendChild(icon); document.addEventListener('mousedown', function(e) { if (e.target == icon || (e.target.parentNode && e.target.parentNode == icon) || (e.target.parentNode.parentNode && e.target .parentNode.parentNode == icon)) { // 点击翻译图标时阻止选中的文本消失 e.preventDefault(); } }); // 选中变化事件 document.addEventListener("selectionchange", function() { if (!window.getSelection().toString().trim()) { icon.style.display = 'none'; // server.containerDestroy(); } }); // 显示、隐藏翻译图标 document.addEventListener('mouseup', function(e) { if (e.target == icon || (e.target.parentNode && e.target.parentNode == icon) || (e.target.parentNode.parentNode && e.target .parentNode.parentNode == icon)) { // 点击了翻译图标 e.preventDefault(); return; } var text = window.getSelection().toString().trim(); if (text && text.length < 800 && icon.style.display == 'none') { icon.style.top = e.pageY + 12 + 'px'; icon.style.left = e.pageX + 'px'; icon.style.display = 'block'; } else if (!text) { icon.style.display = 'none'; for (var i = 0; i < server.rendered.length; i++) { // 点击了翻译内容面板 if (e.target == server.rendered[i]) return; // 不再创建翻译图标 } server.containerDestroy(); // 销毁翻译内容面板 } }); // 翻译图标点击事件 icon.addEventListener('click', function(e) { var text = window.getSelection().toString().trim(); if (text) { icon.style.display = 'none'; server.containerDestroy(); // 销毁翻译内容面板 // 新建翻译内容面板 var container = server.container(); container.style.top = e.pageY + 'px'; if (e.pageX + 350 <= document.body.clientWidth) // container 面板css最大宽度为250px container.style.left = e.pageX + 'px'; else container.style.left = document.body.clientWidth - 350 + 'px'; document.body.appendChild(container); server.rendered.push(container); if (isChina(text)) { ajax(googleUrl + '&sl=zh-CN&tl=en&q=' + encodeURIComponent(text), container); } else { word = text; ajax(googleUrl + '&sl=en&tl=zh-CN&q=' + encodeURIComponent(text), container); } } }); function isChina(str) { var reg = /^[\u4e00-\u9fa5]/; return reg.test(str); } function ajax(url, element, method, data, headers) { if (!method) method = 'GET'; if (!headers) headers = { "content-type": "application/x-www-form-urlencoded;charset=UTF-8", }; GM_xmlhttpRequest({ method: method, url: url, headers: headers, data: data, onload: function(res) { res = JSON.parse(res.response); console.log(res); if (res.sentences.length > 1) { displaycontainer(res.sentences.map(function(v) { return v.trans; }).join(''), element); } else { var trans = res.sentences[0].trans; if (trans === word && res.dict && res.dict[0] && res.dict[0].terms && res.dict[0].terms[0]) trans = res.dict[0] .terms[0]; displaycontainer(trans, element); } }, onerror: function(res) { displaycontainer("连接失败", element); } }); } function displaycontainer(text, element) { element.textContent = text; element.style.display = 'block'; } var server = { // 存放已经生成的翻译内容面板(销毁的时候用) rendered: [], // 销毁已经生成的翻译内容面板 containerDestroy: function() { for (var i = this.rendered.length - 1; i >= 0; i--) { if (this.rendered[i] && this.rendered[i].parentNode) { this.rendered[i].parentNode.removeChild(this.rendered[i]); } } }, // 生成翻译结果面板 DOM (此时还未添加到页面) container: function() { var div = document.createElement('div'); div.setAttribute('style', 'display:none;' + 'position:absolute;' + 'font-size:13px;' + 'overflow:auto;' + 'background:#fff;' + 'font-family:sans-serif,Arial;' + 'font-weight:normal;' + 'text-align:left;' + 'color:#000;' + 'padding:0.5em 1em;' + 'line-height:1.5em;' + 'border-radius:5px;' + 'border:1px solid #ccc;' + 'box-shadow:4px 4px 8px #888;' + 'max-width:350px;' + 'max-height:216px;' + 'z-index:2147483647;'); return div; } }; })();