// ==UserScript== // @name Translate // @namespace http://tampermonkey.net/ // @version 1.5 // @description 划词翻译调用“必应翻译(必应词典)、谷歌翻译、有道词典(有道翻译)、必应在线翻译、百度翻译、Oxford Advanced Learner's Dictionary”网页翻译 // @author barrer // @match http://*/* // @include https://*/* // @include file:///* // @run-at document-end // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== (function () { 'use strict'; // Your code here... var baiduValue = GM_getValue('barrer-Translate-baidu'), bingValue = GM_getValue('barrer-Translate-bing'), bingTranslatorValue = GM_getValue('barrer-Translate-bingTranslator'), googleValue = GM_getValue('barrer-Translate-google'), oaldValue = GM_getValue('barrer-Translate-oald'), youdaoValue = GM_getValue('barrer-Translate-youdao'); if (baiduValue && window.location.href.startsWith('https://fanyi.baidu.com')) { GM_setValue('barrer-Translate-baidu', ''); document.querySelector('#baidu_translate_input').value = baiduValue; document.querySelector('#translate-button').click(); } if (bingValue && window.location.href.startsWith('https://cn.bing.com/dict/search')) { GM_setValue('barrer-Translate-bing', ''); } if (bingTranslatorValue && window.location.href.startsWith('https://www.bing.com/translator')) { GM_setValue('barrer-Translate-bingTranslator', ''); document.querySelector('#srcText').value = bingTranslatorValue; document.querySelector('#TranslateButton').click(); } if (googleValue && window.location.href.startsWith('https://translate.google.com')) { GM_setValue('barrer-Translate-google', ''); document.querySelector('#source').value = googleValue; document.querySelector('#gt-submit').click(); } if (oaldValue && window.location.href.startsWith('https://www.oxfordlearnersdictionaries.com/definition/english')) { GM_setValue('barrer-Translate-oald', ''); document.querySelector('.searchfield_input').value = oaldValue; document.querySelector('#search-btn input').click(); } if (youdaoValue && window.location.href.startsWith('https://dict.youdao.com/w')) { GM_setValue('barrer-Translate-youdao', ''); } if (window.location.href.startsWith('https://fanyi.baidu.com') || window.location.href.startsWith('https://cn.bing.com/dict/search') || window.location.href.startsWith('https://www.bing.com/translator') || window.location.href.startsWith('https://translate.google.com') || window.location.href.startsWith('https://www.oxfordlearnersdictionaries.com/definition/english') || window.location.href.startsWith('https://dict.youdao.com/w') ) document.onkeydown = escExit; /**Esc键关闭窗口*/ function escExit(e) { e = e || window.event; var isEscape = false; if ("key" in e) isEscape = (e.key == "Escape" || e.key == "Esc"); else isEscape = (e.keyCode == 27); if (isEscape) window.close(); } /**弹出居中窗口*/ function popupCenter(url, title, w, h) { var x = screen.width / 2 - w / 2; var y = screen.height / 2 - h / 2; var win = window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + y + ', left=' + x); if (window.focus) { win.focus(); } return win; } /**日志输出*/ function log() { var debug = false; if (!debug) return; if (arguments) { for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } } log('url:' + window.location.href); // 翻译图标 var icon = document.createElement('div'), style = '' + 'font-family:Arial,sans-serif!important;' + 'font-weight:normal!important;' + 'background:#f60!important;' + 'color:#fff!important;' + 'border-radius:3px!important;' + 'font-size:13px!important;' + 'line-height:100%!important;' + 'padding:2px 4px!important;' + 'margin:0 4px!important;' + 'display:inline-block!important;' + 'text-decoration:none!important;' + ''; icon.innerHTML = '' + '必应' + '谷歌' + '有道' + '必译' + '百度' + 'OALD' + ''; icon.setAttribute('style', '' + 'display:none!important;' + 'position:absolute!important;' + 'font-size:13px!important;' + 'text-align:left!important;' + 'z-index:2147483647!important;' + ''); // 添加翻译图标到 DOM document.documentElement.appendChild(icon); // 鼠标事件:防止选中的文本消失 document.addEventListener('mousedown', function (e) { if (e.target == icon || (e.target.parentNode && e.target.parentNode == icon)) {// 点击了翻译图标 e.preventDefault(); } }); // 选中变化事件:当点击已经选中的文本的时候,隐藏翻译图标和翻译面板(此时浏览器动作是:选中的文本已经取消选中了) document.addEventListener("selectionchange", function () { log('selectionchange:' + window.getSelection().toString()); if (!window.getSelection().toString().trim()) { icon.style.display = 'none'; } }); // 鼠标事件:防止选中的文本消失;显示、隐藏翻译图标 document.addEventListener('mouseup', function (e) { if (e.target == icon || (e.target.parentNode && e.target.parentNode == icon)) {// 点击了翻译图标 e.preventDefault(); return; } var text = window.getSelection().toString().trim(); log('click text:' + text); if (text && icon.style.display == 'none') { log('show icon'); log(text + '|' + e.pageX + '|' + e.pageY); icon.style.top = e.pageY + 10 + 'px'; icon.style.left = e.pageX + 10 + 'px'; icon.style.display = 'block'; } else if (!text) { log('hide icon'); icon.style.display = 'none'; } }); // 翻译图标点击事件 icon.addEventListener('click', function (e) { var text = window.getSelection().toString().trim(); if (text) { log('text:' + text); var engine = e.target.hasAttribute('type') ? e.target.getAttribute('type') : ''; log('engine:' + engine); if (server[engine]) server[engine](text); } }); // 翻译server var server = { baidu: function (text) { GM_setValue('barrer-Translate-baidu', text); popupCenter('https://fanyi.baidu.com', null, 1024, 600); }, bing: function (text) { GM_setValue('barrer-Translate-bing', text); popupCenter('https://cn.bing.com/dict/search?q=' + encodeURIComponent(text), null, 800, 600); }, bingTranslator: function (text) { GM_setValue('barrer-Translate-bingTranslator', text); popupCenter('https://www.bing.com/translator', null, 800, 600); }, google: function (text) { GM_setValue('barrer-Translate-google', text); popupCenter('https://translate.google.com', null, 800, 600); }, oald: function (text) { GM_setValue('barrer-Translate-oald', text); popupCenter('https://www.oxfordlearnersdictionaries.com/definition/english', null, 800, 600); }, youdao: function (text) { GM_setValue('barrer-Translate-youdao', text); popupCenter('https://dict.youdao.com/w/eng/' + encodeURIComponent(text), null, 800, 600); } };// 翻译server结束 })();