// ==UserScript== // @name 微软翻译组件 // @description 微软翻译组件 右下角点击翻译 // @include * // @exclude *.jpg // @exclude *.png // @exclude *.jpeg // @exclude *.gif // @exclude *.pdf // @exclude *115.com/* // @require https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.1.3/js.cookie.min.js // @grant aogg // @version 2.3.1 // @namespace https://greasyfork.org/users/25818 // @downloadURL none // ==/UserScript== (function (){ var width = '79', height = '23'; var divId = 'MicrosoftTranslatorWidget', translatorSwitch = function (){}, localStorageLocalsKey = divId + 'localStorageLocals', localStorageAppCloseKey = divId + 'localStorageClose', localStorageAppOneKey = divId + 'localStorageOne'; if ( parent !== parent.parent || document.documentElement.clientWidth <= width * 2 || document.documentElement.clientHeight <= height * 2 || (document.body.childElementCount === 1 && document.body.firstElementChild.nodeName === 'SCRIPT') || // 只有一个script就不显示 localStorage.getItem(localStorageAppCloseKey) ){ // 控制层次,避免无限调用,如:http://www.w3school.com.cn/html/html_entities.asp // 控制宽高小的不显示 return; } // 重置cookie console.log('remove cookie mstto'); Cookies.remove('mstto'); var locals = ''; // zh-chs var source = null; var status = false; // 是否执行了main方法 /** var noTranslator = ['wangpan']; if (self.frameElement && noTranslator.indexOf(self.frameElement.name) !== -1){ return; } */ var scriptNode = document.createElement('script'); scriptNode.innerHTML = "setTimeout(function(){{var s=document.createElement('script');s.type='text/javascript';s.charset='UTF-8';s.src=((location && location.href && location.href.indexOf('https') == 0)?'https://ssl.microsofttranslator.com':'http://www.microsofttranslator.com')+'/ajax/v3/WidgetV3.ashx?siteData=ueOIGRSKkd965FeEGM5JtQ**&ctf=False&ui=false&settings=Manual&from=';var p=document.head[0]||document.documentElement;p.insertBefore(s,p.firstChild); }},0);" document.body.appendChild(scriptNode); var divNode = document.createElement('div'), selectNode = null; divMenu = null; divNode.id = divId; divNode.style.color = 'white'; divNode.style.backgroundColor = '#555555'; divNode.style.position = 'fixed'; divNode.style.right = '0'; divNode.style.bottom = '1px'; divNode.style.zIndex = '9999999'; divNode.style.fontSize = '13px'; divNode.title = '翻译为,或双击隐藏'; divNode.style.width= width + 'px'; divNode.ondblclick = function(){ // 双击隐藏 translatorHide(); }; divNode.oncontextmenu = function (event){ // 设置菜单 event.preventDefault(); var showArr = {'none':'block', 'block':'none'}; if (divMenu){ divMenu.style.display = showArr[divMenu.style.display] ? showArr[divMenu.style.display] : 'none'; } } divMenu = menu(divNode); document.body.appendChild(divNode); document.onreadystatechange = main; setTimeout(main, 500); // 最少500ms内显示 // 隐藏全部 var translatorHide = (function(div){ return function (){ div.style.display = 'none'; } })(divNode) function main(){ if (status || document.readyState !== 'complete'){ return; } status = true; // 多语言翻译 var selectHtml = document.createElement('select'), selected = localStorage.getItem(localStorageAppOneKey) || '', translateFunc = function (locals, setNodeNot){ // var option = selectHtml.selectedOptions; source = selectHtml.getAttribute('data-source') || null; setLocals(locals, setNodeNot); translateStart(); }; selectHtml.style.backgroundColor = 'rgb(178, 178, 178)'; selectHtml.ondblclick = function(){ // 双击隐藏 this.parentNode.style.display = 'none'; }; selectHtml.style.margin = 0; selectHtml.style.padding = 0; selectHtml.style.fontSize = '13.3px'; selectHtml.style.width= width + 'px'; selectHtml.style.height= height + 'px'; selectHtml.onclick = function (event){ // 一键翻译 var selected = localStorage.getItem(localStorageAppOneKey); // 每次重新获取 if (selected){ event.preventDefault(); translateFunc(selected) } }; // Microsoft.Translator.Widget.GetLanguagesForTranslateLocalized()获取所有支持的翻译选项 selectHtml.innerHTML = "\ \ \ \ \ \ \ "; if (selected){ // 修改默认值 for (var i in selectHtml.options){ if (selectHtml.options[i] && selectHtml.options[i].value == selected){ selectHtml.options[i].selected = true; } } // selectHtml.value = selected; 此方法无效 } selectHtml.onchange = function (){ translateFunc(this.value, true); }; var parentDiv = document.body.children.namedItem(divId); // parentDiv.style.display = 'block'; parentDiv.appendChild(selectHtml); selectNode = selectHtml; // 放置到外部变量 translateStart(); } function translateStart(){ if (status && locals && Microsoft){ // null, 'es', onProgress, onError, onComplete, onRestoreOriginal, 2000 Microsoft.Translator.Widget.Translate(source, locals, null, null, onComplete); } } function onComplete(){ var option = selectNode.options; option.namedItem('MicrosoftTranslatorWidget-option-en').innerText = '英文'; option.namedItem('MicrosoftTranslatorWidget-option-select').innerText = '翻译为'; } function addGlobalStyle(css) { var head, style; head = document.getElementsByTagName('head')[0]; if (!head) { return; } style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = css; head.appendChild(style); } console.log('完成'); // 右击层 function menu(parentDiv){ var div = document.createElement('div'); div.id= divId + "-menu"; div.style.display = 'none'; div.oncontextmenu = function (event){ event.preventDefault(); this.style.display = 'none'; } // 当前网站永久隐藏 var divHide = document.createElement('div'); divHide.innerText = '当前网站隐藏'; divHide.height = '20px'; divHide.onclick = function (){ if(window.confirm('确定要当前网站隐藏?')){ localStorage.setItem(localStorageAppCloseKey, 1); translatorHide(); } } div.appendChild(divHide); // 切换为一键翻译样式 var divOne = document.createElement('div'), oneTitleFunc = function (){ return (localStorage.getItem(localStorageAppOneKey)?'取消':'') + '一键翻译' }; divOne.innerText = oneTitleFunc(); divOne.height = '20px'; divOne.onclick = function (){ var localValue = localStorage.getItem(localStorageAppOneKey), val = localValue ? '' : (locals || 'zh-chs'); localStorage.setItem(localStorageAppOneKey, val); divOne.innerText = oneTitleFunc(); } div.appendChild(divOne); parentDiv.appendChild(div);