// ==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);