// ==UserScript== // @name 在线翻译 Online translate // @namespace online translate by liangguohuan // @author liangguohuan // @email liangguohuan@gmail.com // @description 在线快速翻译 translate online quickly .... // @mod_date 2012-01-12 // @version 2.4 // @include http://* // @include https://* // @require http://code.jquery.com/jquery-latest.js // @resource icon http://translate.google.cn/favicon.ico // @resource extlink http://ubuntuone.com/4Z98bz0c6spVD4yLtBRMKN // @resource load http://ubuntuone.com/6ztD7bMU7z4dOJKfHs8XtD // @updateURL http://userscripts.org/scripts/source/119420.meta.js // ==/UserScript== /** * 2012-01-12 bug fix: baiduEle is empty when baidu request first; editor normal, don't apply this ... * 2012-01-11 new opt: remove single word, add query input when translatedivcontainer on dbclick ...; notice: if query input is exit, translatedivcontainer can not be hide when keypress 'G'; remove copyToClipboard listener ... * 2012-01-11 new opt: add single word to show when request word is like end with 's', 'es', 'ed' ... * 2012-01-08 bug fix: keypress 'G' for hiding translatedivcontainer, set default if keyForTransShow when trigger left click * 2012-01-07 bug fix: set default when trigger mouse right click; selected text can be draged; optimize simpleDraggable plugin * 2012-01-06 new opt: make it can be used in iframe, like gmail; additional setting keyForTransShow * 2012-01-04 buf fix: when keypress 'y' will trigger copyToClipboard() even translatedivcontainer is display none in gmail * 2012-01-03 buf fix: GM_openInTab for word link and some css change, make better for dbclick and three sequence click * 2012-01-03 new opt: if is a word, then request word info from baidu * 2012-01-02 bug fix: fix translate button position right at the first time * 2012-01-01 new opt: keypress 'y' for paste when translate text is show * 2011-12-31 bug fix: fix the setting bug occur from 2011-12-30 * 2011-12-30 bug fix: some website can't be bind for more times on the same event, and it will load twice occur the created elements twice. * 2011-12-26 bug fix: $(window.parent.document) occur permission sometime,so instead of window.top * 2011-12-20 bug fix: let the iframe and editor are normal when use then function 'append()' * 2011-12-01 bug fix: translate button and conten position */ /** * Like gTranslate, ImTranslator, Quick Translator plugs, they are can't work when my firefox update, so i handle it myself ... * language default: from=>Auto, to=>Chinese, Set the right for myself * Settings: GreaseMonkey => UserScript Command => 翻译 Settings * Lanuage translate Swap Quickly: Ctrl + Alt + Shift + Z, require: the from must not be 'Auto' * The plug-in colorpicker code is from baidumonkey ... */ /** * Jquery ui can't work, so custom a simpleDraggable addition */ (function ($) { $.fn.simpleDraggable = function(options){ var defaults = { handle: null, notHandle: null, }; var opts = $.extend(defaults, options); var self = $(this); var x,y,top,left,clix,cliy,pd,fx,fy; var bMouseIn = false; $(this).hover( function() { bMouseIn = true; }, function() { bMouseIn = false; } ); $(document).bind('mousedown', function(event){ if(!event) event = window.event; if(!handleCheck(event)) return ; if(!bMouseIn) return ; pd = true; fx = event.clientX; fy = event.clientY; top = self.offset().top; left = self.offset().left; }); $(document).bind('mousemove', function(event){ if(!event) event = window.event; clix = event.clientX; cliy = event.clientY; if(pd == true){ self.css({'top':top+(cliy-fy),'left':left+(clix-fx)}); } }); $(document).bind('mouseup', function(){ pd = false; }); function handleCheck(event) { if (opts.handle) { return _getHandle(event); } else { return _getNotHandle(event); } } function _getHandle(event) { var handle = false; if (opts.handle !== null) { $.each(self.find(opts.handle), function(){ if(event.target == this) { handle = true; return handle; } }); } return handle; } function _getNotHandle(event) { var handle = true; if (opts.notHandle !== null) { $.each(self.find(opts.notHandle), function(){ if(event.target == this) { handle = false; return handle; } }); } return handle; } } })(jQuery); /** * start */ var arrLanDefault = ['Auto', 'Chinese']; var lanShortStr = 'auto,af,sq,ar,hy,az,eu,be,bn,bg,ca,zh-CN,hr,cs,da,nl,en,et,tl,fi,fr,gl,ka,de,el,gu,ht,iw,hi,hu,is,id,ga,it,ja,kn,ko,la,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,ta,te,th,tr,uk,ur,vi,cy,yi'; var lanLongStr = 'Auto,Afrikaans,Albanian,Arabic,Armenian,Azerbaijani,Basque,Belarusian,Bengali,Bulgarian,Catalan,Chinese,Croatian,Czech,Danish,Dutch,English,Estonian,Filipino,Finnish,French,Galician,Georgian,German,Greek,Gujarati,HaitianCreole,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Irish,Italian,Japanese,Kannada,Korean,Latin,Latvian,Lithuanian,Macedonian,Malay,Maltese,Norwegian,Persian,Polish,Portuguese,Romanian,Russian,Serbian,Slovak,Slovenian,Spanish,Swahili,Swedish,Tamil,Telugu,Thai,Turkish,Ukrainian,Urdu,Vietnamese,Welsh,Yiddish'; var arrLanShort = lanShortStr.split(','); var arrLanLong = lanLongStr.split(','); var arrLanMap = []; $.each(arrLanShort, function(i, val){ var key = arrLanLong[i]; arrLanMap[key] = val; }); /** * Settings show hidden */ var translatesettingskey = 'translatesettings2011'; GM_registerMenuCommand ('翻译 Settings' , translateSettingShow); function translateSettingShow() { settingDataInit(); $('#translateSettings').css({ left: ($(document.body).width() - 600)/2 + 'px', top: ($(window).scrollTop() - 1000) + 'px', }); $('#translateSettings').show(); $('#translateSettings').stop(); $('#translateSettings').animate( { top: ($(window).scrollTop() + 50) + 'px', }, 50 ); } function translateSettingHide() { $('#translateSettings').stop(); $('#translateSettings').animate( { top: '-1000px', }, 300 ); //$('#translateSettings').hide(); } /** * setting recover */ function getSettingsByName(name) { var translatesettingsval = GM_getValue(translatesettingskey, ''); var recoverStyle = ''; var arrLanFromTo = arrLanDefault; var keyForTransShow = false; var arrTemp = []; if (translatesettingsval !== '') { arrTemp = translatesettingsval.split('@'); } if (name == 'css') { if(arrTemp[0]) { recoverStyle = arrTemp[0]; } return recoverStyle; } else if (name == 'fromto'){ if(arrTemp[1]) arrLanFromTo = arrTemp[1].split(':'); return arrLanFromTo; } else if (name == 'keyForTransShow') { if(arrTemp[2] == 'true') keyForTransShow = true; return keyForTransShow; } } function settingDataInit() { recoverStyleTrigger(); settingFromToInit(); settingkeyForTransShowInit(); settingSelCssInit(); } function recoverStyleTrigger() { if (documentCheckEditable()) return ; var cssStr = getSettingsByName('css'); cssStr = cssStr.replace(/;/, ' !important;'); $('style#recoverStyle').remove(); var css = '#translatedivcontainer{ ' + cssStr + ' }'; css += '.demoshow{ ' + cssStr + ' }'; $('.demoshow').attr('style', ''); //GM_addStyle(css); var style = document.createElement('style'); style.type = 'text/css'; style.id = 'recoverStyle' style.innerHTML = css; $('head:eq(0)').append(style); } function settingFromToTrigger() { var arrLanFromTo = getSettingsByName('fromto'); var list = $('#translateSettings div.fromto').find('input.selcss'); for(var i=0; i 0) { return ; } var type = $(item).attr('csstype'); if($(item).hasClass('readonly')) { $(item).bind('focus', function(){ $(this).trigger('blur'); }); } if (type == 'color') { var span = $('').bind('click', function(){ allSelectPopuDivHidden(); addColorPicker(this); var colorpicker = $(this).find('div:eq(0)'); $(colorpicker).css({ position:'absolute', left:$(item).position().left + 'px', top:($(item).position().top + $(item).outerHeight()) + 'px', margin:'0px', display:'block', }); } ); $(span).insertAfter(item); } else { var span = $('').bind('click', function(){ if ($(select).css('display') !== 'none') { $(this).next('div.selectcss:eq(0)').hide(); } else { allSelectPopuDivHidden(); if($(item).val() !== '') { //$(select).removeClass(); $.each($(select).find('span'), function(i, option){ if ($(option).text() == $(item).val()) { $(option).addClass('selected'); } }); } var minHeight = parseInt($(this).next('div.selectcss:eq(0)').css('min-height')); var maxHeight = minHeight*10; if ($(item).attr('lineShow') !== '' && $(item).attr('lineShow') !== undefined) { maxHeight = minHeight * $(item).attr('lineShow'); } $(this).next('div.selectcss:eq(0)').css('max-height', maxHeight + 'px'); //console.log(maxHeight); $(this).next('div.selectcss:eq(0)').css({ left:$(item).position().left + 'px', top:($(item).position().top + $(item).outerHeight()) + 'px', width:($(item).outerWidth() + $(this).outerWidth()) + 'px', display:'block', }); } } ); var select = $('
'); $(span).insertAfter(item); $(select).insertAfter(span); try{ var dataStr = ''; if ($(item).attr('data') == '' || $(item).attr('data') == undefined) { eval('dataStr = cssType.' + type); } else { dataStr = $(item).attr('data'); } var arrData = dataStr.split(','); } catch(e) { var arrData = ['error']; } $.each(arrData, function(i, val) { var option = $('' + val + '').bind('click', function(){ try{ $(item).val($(this).text()); $(select).find('span').removeClass(); $(this).addClass('selected'); $(select).hide(); //notice the input has change $(item).change(); } catch(e){} }); $(option).hover( function(){ if ($(this).hasClass('selected')) return false; $(this).removeClass('out'); $(this).addClass('over'); }, function(){ if ($(this).hasClass('selected')) return false; $(this).removeClass('over'); $(this).addClass('out'); } ); $(select).append(option); }); } }); function allSelectPopuDivHidden() { try{ $('.selectcss,#colorpicker').hide(); }catch(e){} } } function getColor(ev){ var x = ev.layerX - 10, y= ev.layerY - 10; var Rmx = 0, Gmx = 0, Bmx = 0; if (y <= 32) { Rmx = 255; Gmx = (y / 32) * 255; Bmx = 0; } else if (y <= 64) { y = y - 32; Rmx = 255 - (y / 32) * 255; Gmx = 255; Bmx = 0; } else if (y <= 96) { y = y - 64; Rmx = 0; Gmx = 255; Bmx = (y / 32) * 255; } else if (y <= 128) { y = y - 96; Rmx = 0; Gmx = 255 - (y / 32) * 255; Bmx = 255; } else if (y <= 160) { y = y - 128; Rmx = (y / 32) * 255; Gmx = 0; Bmx = 255; } else { y = y - 160; Rmx = 255; Gmx = 0; Bmx = 255 - (y / 32) * 255; }; var r, g, b; if (x <= 50) { r = Math.abs(Math.floor(Rmx * x / 50)); g = Math.abs(Math.floor(Gmx * x / 50)); b = Math.abs(Math.floor(Bmx * x / 50)); } else { x -= 50; r = Math.abs(Math.floor(Rmx + (x / 50) * (255 - Rmx))); g = Math.abs(Math.floor(Gmx + (x / 50) * (255 - Gmx))); b = Math.abs(Math.floor(Bmx + (x / 50) * (255 - Bmx))); }; r = r>255?255:r; g = g>255?255:g; b = b>255?255:b; var c = "#"; c += Math.floor(r / 16).toString(16); c += (r % 16).toString(16); c += Math.floor(g / 16).toString(16); c += (g % 16).toString(16); c += Math.floor(b / 16).toString(16); c += (b % 16).toString(16); return c.toUpperCase(); }; function addColorPicker(target){ var cp = document.getElementById("colorpicker"); if (cp) { cp.parentNode.removeChild(cp); return; } cp = document.createElement("div"); cp.id = "colorpicker"; cp.style.display = 'none'; cp.style.zIndex = 10001; var input; input = target.previousSibling; var pre = document.createElement("span"); var img = document.createElement("img"); with (img) { src = "data:image/png;base64,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"; addEventListener("mousemove", function(ev){ var c = getColor(ev); pre.style.width = '24px'; pre.style.height = '24px'; pre.style.display = 'inline-block'; pre.style.background = c; }, false); addEventListener("click", function(ev){ try{ var c = getColor(ev); input.value = c; img.blur(); //notice the input has change $(input).change(); }catch(e){} }, false); addEventListener("mouseout", function(ev){ cp.parentNode.removeChild(cp); }, false); } cp.appendChild(img); cp.appendChild(pre); target.appendChild(cp); return false; }; function createElement() { var css = <>; var settingsDiv = <>

翻译设置 Settings

Language Select
from:   <=> to:  
CSS 样式
font-size line-height
-moz-border-radius opacity
border-width border-color
min-width max-width
color background-color
padding font-weight
text-shadow
我们都是这样走过来的,find what you love to do!
Additional setting
选择文本后,按下'G'键才触发翻译:
]]>; GM_addStyle(css.toString()); $(document.body).append(settingsDiv.toString()); $(document.body).append('
'); $(document.body).append('
'); $('#translatedivcontainer').simpleDraggable(); $('#translateSettings').simpleDraggable({notHandle:'.selectcss,input,#colorpicker'}); } function elementBindEvent() { $('#translatedivcontainer').hover( function(){ bContainerShow = true; }, function(){ bContainerShow = false; } ); $('#translatedivcontainer').bind('dblclick', function(){ if ($(this).find('input.q').size() == 0) { var input = ''; $(this).prepend(input); var text = $.trim(getSelectedText()); if (/^[a-zA-Z]+$/.test(text) == false) text = ''; // filter long text $('#translatedivcontainer').find('input.q').trigger('focus').val(text); } }); } function getTranslateText() { bMouseupAttact = false; var arrLanFromTo = getSettingsByName('fromto'); var text = arguments.length > 0 ? arguments[0] : getSelectedText(); if (text == '') { translatedivbuttonhide(); return; } getVoiceFromBaidu(arrLanFromTo, text); text = encodeURIComponent(text); var len = text.length; var method = len > 1500 ? 'POST' : 'GET'; var url = 'http://translate.google.cn/translate_a/t'; var data = 'client=t&text=' + text + '&hl=en&sl=' + arrLanMap[arrLanFromTo[0]] + '&tl=' + arrLanMap[arrLanFromTo[1]]; if (method == 'GET'){ url += '?' + data; data = null; } var option = { method: method, url: url, data:data, headers: { "Content-Type": "application/x-www-form-urlencoded" }, onload: function(data){ eval('var arr=' + data.responseText); var str = ''; $.each(arr[0], function(i, item){ str += item[0]; }); str = str.replace(/\n/g, '
'); str = str.replace(/
$/, ''); $('#translatedivcontainer').html(str); translatedivbuttonhide(); if (getSelectedText() !== '') translatedivcontainershow(); // if is input query trigger addVoiceToTranslateDiv(); }, onerror: function(response) { console.log(response.responseText); } } GM_xmlhttpRequest(option); } // 为了让请求同步进行,额外添加函数addVoiceToTranslateDiv()做特别处理,翻译完成和百度请求完成都触发一次addVoiceToTranslateDiv() function getVoiceFromBaidu(arrLanFromTo, text) { text = $.trim(text); if (/^[a-zA-Z]+$/.test(text) && arrLanMap[arrLanFromTo[0]] == 'en' && arrLanMap[arrLanFromTo[1]] == 'zh-CN') { var option = { method: 'GET', url: 'http://fanyi.baidu.com/transcontent?ie=utf-8&source=txt&query=' + encodeURIComponent(text) + '&from=en&to=zh', onload: function(data){ ele = $.parseJSON(data.responseText).result; //if (ele == null) addSingleWords(text); $(window).data('baiduEle', ele); addVoiceToTranslateDiv(); }, onerror: function(response) { console.log(response.responseText); } } GM_xmlhttpRequest(option); } } function addSingleWords(text) { if ($('#translatedivcontainer').find('.singleWord').size() == 0) { var arrCharEnd = ['s', 'es', 'ed', 'ing']; $.each(arrCharEnd, function(i, item) { var reg = new RegExp(item + '$', 'i'); if (reg.test(text)) { var textNew = text.replace(reg, ''); var ele = $('' + textNew + '').bind('click', {text:textNew}, function(event){ $(this).append(''); translatedivcontainerhide(); getTranslateText(event.data.text); }); $('#translatedivcontainer').append(ele); } }); } } function addVoiceToTranslateDiv() { var ele = $(window).data('baiduEle'); if (ele == null) return ; if ($('#translatedivcontainer').css('display') !== 'none' && $('#translatedivcontainer').find('#dict-content-head').size() == 0) { var voice = $(ele).find('#dict-content-head'); if (voice.size() > 0) { var detail = $(ele).find('#dict-content-main'); $('#translatedivcontainer').prepend(voice); //添加详细解释 /*var spanInfo = $('').toggle( function(){ $('#dict-content-main').show(); }, function(){ $('#dict-content-main').hide(); } ); $('#translatedivcontainer').append(spanInfo);*/ $('#translatedivcontainer').append(detail); $('#dict-content-main').find('h4').remove(); //删除重复显示的单词 //由于只是监听 click 事件,iframe下点击不会返回 false,所以做个间接替换 $.each($('#dict-content-main').find('a'), function(){ $(this).attr('link', $(this).attr('href')); $(this).attr('href', 'javascript:void(0);'); $(this).attr('target', '_self'); $(this).attr('style', 'margin-left:5px;'); $(this).bind('click', function(){ GM_openInTab($(this).attr('link')); return false; }); }); if (getSelectedText() !== '') translatedivcontainershow(); //由于显示层插入新内容,所以重置一次位置 // if is input query trigger } $(window).data('baiduEle', ''); //清空预存变量 } } function translatedivcontainershow() { //iframe and top document style recover recoverStyleTrigger(); $('#translatedivcontainer').show(); var wc = $('#translatedivcontainer').outerWidth() < 800 ? 'auto' : 800 + 'px'; var lc = eex < esx ? eex : esx; var tc = eey > esy ? eey : esy; var ah = selTextHeight > 14 ? selTextHeight : 14; if (tc + $('#translatedivcontainer').outerHeight() > $(window).scrollTop() + $(window).height() ) { tc -= (tc + $('#translatedivcontainer').outerHeight() - $(window).scrollTop() - $(window).height() + ah + 10 ); } else { tc += ah; } $('#translatedivcontainer').css({ left: lc + 'px', top: tc + 'px', width: wc, }); bMouseupAttact = false; } function translatedivcontainerhide() { if (bContainerShow) return ; $('#translatedivcontainer').hide(); $('#translatedivcontainer').css({width:'auto'}); bMouseupAttact = true; } function translatedivbuttonshow() { $('.translatedivbutton').html(''); $('.translatedivbutton').show(); var oH = $('.translatedivbutton').outerHeight(); //console.log(oH); oH = oH < 24 ? 24 : oH; var lb = eex; var tb = eey - oH - 12; if (tb < $(window).scrollTop()) { tb = eey + oH; } $('.translatedivbutton').css({ left: lb + 'px', top: tb + 'px', }); bButtonShow = false; } function translatedivbuttonhide() { $('.translatedivbutton').css({opacity:1}); $('.translatedivbutton').hide(); bButtonShow = true; } function clearTimerButton() { clearTimeout(timerButton); timerButton = null; } /** * main code */ var bMouseupAttact = true; // let the translate div can be selected and don't trigger listener of the document mouseup event var esx = ''; // record the event x when start select text var esy = ''; // record the event y when start select text var eex = ''; // record the event x when end select text var eey = ''; // record the event y when end select text var selTextHeight = ''; // the document select text var bContainerShow = false; // make sure the translate div is showing ... var bButtonShow = true; // make sure the translate button is showing ... var timerButton = null; // translatedivbutton animate timer record var selTextMouseDown = ''; // record window.getSelection() when mousedown var selTextMouseUp = ''; // record window.getSelection() when mouseup cellectionInit(); function cellectionInit() { if($('.translatedivbutton').size() < 1 && !documentCheckEditable()) { createElement(); elementBindEvent(); settingDataInit(); selectElementsModify(); settingElementsListener(); } } function documentCheckEditable() { return (document.designMode == 'on' || document.body.contentEditable == 'true') ? true : false; } function getSelectedText() { return window.getSelection().toString(); } function emptySelectedText() { if (!bContainerShow && !getSettingsByName('keyForTransShow')) { document.getSelection().removeAllRanges(); } } $(document).bind('mousedown', function(event){ if (event.button == 2) return ; selTextMouseDown = getSelectedText(); if (bMouseupAttact) { esx = event.clientX + $(window).scrollLeft(); esy = event.clientY + $(window).scrollTop(); } //emptySelectedText(); translatedivbuttonhide(); translatedivcontainerhide(); }); $(document).bind('mouseup', function(event){ selTextMouseUp = getSelectedText(); if (selTextMouseDown == selTextMouseUp) return ; // if (bMouseupAttact) { eex = event.clientX + $(window).scrollLeft(); eey = event.clientY + $(window).scrollTop(); } selTextHeight = parseInt($(event.target).css('line-height')); cellectionInit(); // if (getSettingsByName('keyForTransShow')) return ; mouseupTrigger(); }); function mouseupTrigger() { clearTimerButton(); if (!bMouseupAttact) return false; if (getSelectedText() !== '') { $('.translatedivbutton').css({ width:'auto', }); $('#translatedivcontainerhide').css({ display:'none', }); translatedivbuttonshow(); $('.translatedivbutton').stop(); $('.translatedivbutton').animate( {opacity:1}, 800); timerButton = setTimeout(translatedivbuttonhide, 1800); $('.translatedivbutton').hover( function(){ clearTimeout(timerButton); timerButton = null; $('.translatedivbutton').stop(); $('.translatedivbutton').css('opacity', 1); $('.translatedivbutton img').attr('src', GM_getResourceURL('load')); if (bMouseupAttact) getTranslateText(); }, function(){ if (!bMouseupAttact) return; clearTimerButton(); $('.translatedivbutton').stop(); timerButton = setTimeout(translatedivbuttonhide, 800); } ); } } /** * keyboard listen * Ctrl + Alt + Shift + Z */ $(document).bind('keypress', function(e) { if (e.ctrlKey && e.altKey && e.shiftKey && (e.which == 90 || e.which == 122)) { $('#translateSettings .lanSwapBtn:eq(0)').trigger('click'); } // y key occur copy event else if ((e.which == 89 || e.which == 121) && $('#translatedivcontainer').size() > 0 && $('#translatedivcontainer').css('display') !== 'none') { //copyToClipboard($('#translatedivcontainer').text()); } // esc key press else if (e.keyCode == 27) { $('#translatedivcontainer').trigger('mouseout'); $(document).trigger('mousedown'); } // g key press else if ((e.which == 71 || e.which == 103) && $('#translatedivcontainer').css('display') !== 'none' && $('#translatedivcontainer').find('input.q').size() == 0) { $('#translatedivcontainer').trigger('mouseout'); $(document).trigger('mousedown'); } // g key press else if ((e.which == 71 || e.which == 103) && getSelectedText() !== '') { mouseupTrigger(); $('.translatedivbutton').trigger('mouseover'); } // enter key press else if (e.which == 13 && $('#translatedivcontainer').css('display') !== 'none' && $('#translatedivcontainer').find('input.q').size() > 0) { $('#translatedivcontainer').css('width', 'auto'); var text = $('#translatedivcontainer').find('input.q').val(); getTranslateText(text); } });