北仑哪里可以网贷不还吗

请完成以下验证码
查看: 1658|回复: 4
QuickTranslate.uc脚本
本帖最后由
16:16 编辑
请教怎么把这个脚本移动到地址栏里面???
[CSS] 纯文本查看 / 双击代码区域 Ctrl+A快速复制// ==UserScript==
QuickTranslate.uc.js
// @description
可移动多功能翻译按钮
// @author
Runningcheese
// @namespace
[url][/url]
// @include
// @license
MIT License
// @compatibility
Firefox 29+
// @charset
// @version
// @version
// @homepage
[url]/firefox-v8[/url]
// ==/UserScript==
//载入脚本
function jsonToDOM(json, doc, nodes) {
var namespaces = {
html: 'http://www.w3.org/1999/xhtml',
xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'
var defaultNamespace = namespaces.
function namespace(name) {
var m = /^(?:(.*):)?(.*)$/.exec(name);
return [namespaces[m[1]], m[2]];
function tag(name, attr) {
if (Array.isArray(name)) {
var frag = doc.createDocumentFragment();
Array.forEach(arguments, function (arg) {
if (!Array.isArray(arg[0]))
frag.appendChild(tag.apply(null, arg));
arg.forEach(function (arg) {
frag.appendChild(tag.apply(null, arg));
var args = Array.slice(arguments, 2);
var vals = namespace(name);
var elem = doc.createElementNS(vals[0] || defaultNamespace, vals[1]);
for (var key in attr) {
var val = attr[key];
if (nodes && key == 'id')
nodes[val] =
vals = namespace(key);
if (typeof val == 'function')
elem.addEventListener(key.replace(/^on/, ''), val, false);
elem.setAttributeNS(vals[0] || '', vals[1], val);
args.forEach(function(e) {
elem.appendChild(
Object.prototype.toString.call(e) == '[object Array]'
tag.apply(null, e)
e instanceof doc.defaultView.Node
doc.createTextNode(e)
} catch (ex) {
elem.appendChild(doc.createTextNode(ex));
return tag.apply(null, json);
//定义按钮
CustomizableUI.createWidget({
id: 'QuickTranslate',
defaultArea: CustomizableUI.AREA_NAVBAR,
label: '翻译',
tooltiptext: '左键:翻译\n右键:翻译选项',
onCreated: function(aNode) {
aNode.setAttribute('oncommand', 'PageTranslationOpenWindowGoogle();');
//定义菜单
var myMenuJson =
['xul:menupopup', {id: 'QuickTranslate_pop'},
['xul:menuitem', {label: '输入文字翻译',oncommand: 'event.stopPropagation(); PageTranslationOpenWindowYoudao();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB/UlEQVQ4jZ2TsWsTURzHv2Q4igcXcj1wKCkF8w9kcQmKODh0FOokGS3tEorQzehQFJRCweGWdMgQCDSLRRA7BRQxSHAQgkTu3utdk1IbYrzcNY0Evw69XNO6tB0evPd77/fh9/297w8A8A1TDyWMuoTev8hyoDcE4osAgCaU+y4MSuiXWi4MNqHlIJGwL5t8CtEPcT4ooFJA/e/xOD55J5AYItRFCZ02YrQRo4BCC6AFUCJBASWKCSi0ERtD+iFAowuDuzOz9MwCvQ2TYvo692/eC5NU9tbW6RfLPHrzjq10Jqwm7oWABC2AnUc5kuTxh8/0i2Xu377Lnw+y7K7mefT2PUkyKG2xfevOWYCAyt2ZWR5XP3FQ/cjuap6jvTZ7z1+ys7xCf7PEoLJNzyxwWKtTQB3L6IcAha10hsNancNanZ5Z4GivzcFOlQfzC/zT+M6gss3e2jr/+sFkH/pRE5sAf796zZEl6W+WTmBfvtIvljmyJH/lX9DbMBmUtujcSFFOTU9KUOgaKQaVbbbSGXaySxzsVNnJLrGzvBIlemaB3cdPeDC/cBYgodFRk3TUZNR110jRRozN8NyaS7M1l6ajJsPytUhC+KcaBZRof+IHNTLRqUfOGcmFfnhVK0vofQjEF682BwYtXHsaTqSWc6A3LjrOEgn7B/RnAPAP4xYp4rHsBjQAAAAASUVORK5CYII='}],
['xul:menuitem', {label: '有道页内翻译',oncommand: 'event.stopPropagation(); PageTranslationYoudao();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAyklEQVQ4jc1QsQ3CMBB0R5seJJ/F2wPQpUtHSwN1RoiYgA0YgVEYIQNQuEFCiS1lhNDg5IE4gQpO+ub0d39/QvwVaujcK9N6ZVoP3dwACCFErWjH+VGTblGZNhhYIOF8VHyd06K/ZOwU/wYnacWingJfSUoD76DPUYPnRSq6bhRte94c4gagNbtUOlBWSUqdpH2fbLn57IXIhGIHcRE043FDaTxVVDwECyTcoIbORwUO+uhA2WOKr6/H/nbQpQWSaQPo5lU4GfvnuAOO7rs1HAnRyQAAAABJRU5ErkJggg=='}],
['xul:menuitem', {label: '谷歌页内翻译',oncommand: 'event.stopPropagation(); PageTranslationGoogleInPage();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACVklEQVQ4jY3TzU4TURwF8PEBeAiew4WBBBQ6lBaQmhhduWKhMUYSIyYqIbadaacWhSA1GgOGREiMVCrqQiUBIVhipnbu5E4/cL6IkrTQe9fHRduRABEXZ/k7/3MXVxhMMPV8gmMgwdGf4OhTOIIKRyDO4Q/vjgI49a8IHjyEe+McPZEKPbHAw4cLYhx+meHG9HZHuVxuPS6EkBahCQ9f741x+GMc8qufcBwXOzs7cF0XjuPAtm3Ytg3TNE0h2IBBhSOUZHB/VTC5vA9/o+BS8jfyeR2u63pxHMcrEgLx+tVAnCPxdh+LG3tQi1X4Yxw9MocoMSx91mAYhgcPrhB6D0zO0ipG5mpYJ1XcnK1BlDlEiWN0xsD6ZhbR1AyWV9aQ1yl0o9AoiNXxtec1lO0KVvNVZGkVmW97ECUOn8Qhjm1jRJnG3fGnuKVM4Wr4MVLz6XpB860La3tQ0vsQZY6gwlCwKriQZPBJHN2RGu5PpbHydQMTs/OYS7+HZVmwLAtCj8whyhyXJxmCCoMo1WdffMQQiDN0Rxm6ogxDDzdxPTyOYXkCRNdRLBZhmiaEJmjG10h39C/uijAMSA6G7im4nXiCPCEoFAoolUoQfFHmoSOwgc9FGM6Ga5jLZDHzegl3kilopL5C6Hqw6x5BDfgXM3SGGcZelkCIjsUPn7wVwulh0tI5QlqPy5krHzvaQhm0hd6hPZTB9Ow6NI2AUgpKab3gpM/S3v+GdgwuIfViFar6A4QQ6LoOSikMw/iPgr6F0alnX7C19R2qqiKXy0HTNBBCkMvltD/vDPwyHNhJmwAAAABJRU5ErkJggg=='}],
['xul:menuseparator', {}],
['xul:menuitem', {label: '谷歌弹窗翻译',oncommand: 'event.stopPropagation(); PageTranslationGoogle();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACVklEQVQ4jY3TzU4TURwF8PEBeAiew4WBBBQ6lBaQmhhduWKhMUYSIyYqIbadaacWhSA1GgOGREiMVCrqQiUBIVhipnbu5E4/cL6IkrTQe9fHRduRABEXZ/k7/3MXVxhMMPV8gmMgwdGf4OhTOIIKRyDO4Q/vjgI49a8IHjyEe+McPZEKPbHAw4cLYhx+meHG9HZHuVxuPS6EkBahCQ9f741x+GMc8qufcBwXOzs7cF0XjuPAtm3Ytg3TNE0h2IBBhSOUZHB/VTC5vA9/o+BS8jfyeR2u63pxHMcrEgLx+tVAnCPxdh+LG3tQi1X4Yxw9MocoMSx91mAYhgcPrhB6D0zO0ipG5mpYJ1XcnK1BlDlEiWN0xsD6ZhbR1AyWV9aQ1yl0o9AoiNXxtec1lO0KVvNVZGkVmW97ECUOn8Qhjm1jRJnG3fGnuKVM4Wr4MVLz6XpB860La3tQ0vsQZY6gwlCwKriQZPBJHN2RGu5PpbHydQMTs/OYS7+HZVmwLAtCj8whyhyXJxmCCoMo1WdffMQQiDN0Rxm6ogxDDzdxPTyOYXkCRNdRLBZhmiaEJmjG10h39C/uijAMSA6G7im4nXiCPCEoFAoolUoQfFHmoSOwgc9FGM6Ga5jLZDHzegl3kilopL5C6Hqw6x5BDfgXM3SGGcZelkCIjsUPn7wVwulh0tI5QlqPy5krHzvaQhm0hd6hPZTB9Ow6NI2AUgpKab3gpM/S3v+GdgwuIfViFar6A4QQ6LoOSikMw/iPgr6F0alnX7C19R2qqiKXy0HTNBBCkMvltD/vDPwyHNhJmwAAAABJRU5ErkJggg=='}],
['xul:menuitem', {label: '必应弹窗翻译',oncommand: 'event.stopPropagation(); PageTranslationBing();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABMUlEQVQ4jY2SsU7DMBCG/TJYYqpEPDojcbq0NGM7sXdnggnigYFOyVDqLLBAkRJLTIwJSwdYw8gj8AQ/Q0kaO6HNSZbPp/P332+ZkJ7hSo2uvNdFV2rwMEOVGw28UVjl5bZZaqi8hA3aqzB/KOBKDVWUrcZ6ir/dgLlSY/HxAx5mmD++d15u7jzMjDNxpcbZyzeE+mz563o4bteaY9nj2bktwP97F7upS72yUgdLfNDIA428g9SD/6APZG84SoDGwoDQeFurly3CEh+OEmBKIFgPcWwBCCHkKPJwt7nA+dvIFBg/C9wUV3VhsbnF4L4NmKYT0Fjg9HVoApgSSL/WBuBkZQKm6QQ08jDLgraF8ZPAdX6JJnCw3AFo5IHGArMs2NVsi44SYIkPlviozraFrvgFK3TyTsPvtF8AAAAASUVORK5CYII='}],
['xul:menuitem', {label: '百度弹窗翻译',oncommand: 'event.stopPropagation(); PageTranslationBaidu();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVQ4jaWSy0sCURjF/XfuRugukha1CzeBCBKIFFFIBEGrCoRwE4EErlskoYW0EFy0iBAkCMFNBCGuKrqjNg6OgzOTjY+5nhbh3ehMrw/O8vud73E8hDL8Rx5CGf5ajoBCsQuvT0IubwIATk51xA/bsPkPAdFtBYQyLIXeUCpbYtybQtcd0Na+LHb2WiCUYTXaRC5vCsBdyXIG3D/0QCjD2qaCl9cB9g9UPFb66OgcuzEVmayBpmKjVLamAxJJTTg9PQ+mHm1+sQ5CGS4ujUlAJmuAUIaZOQkdnaNS7SMYlhGKyKjVh7B6I2EQi6uTAJsDV9fvqFT7YNIQsws10eAPNNDWODa2FHh9Eoq3H85faKk2/IHGRGCWV2RYvZH7Fzo6n9o8VmS9CcPkzoBUWv82umfnhjNgfEg3pdK6M8AwuUihP9DA0bGGRFJDMCyLYLmu8NsSgP/oExgMERjFwInkAAAAAElFTkSuQmCC'}],
['xul:menuseparator', {}],
['xul:menuitem', {label: '沪江划词翻译',oncommand: 'event.stopPropagation(); PageTranslationXiaod();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA/klEQVQ4jaWTrQoCQRSFbxK0GDRosFjF6BvYtmwWfACzUQQfYN9BLD7ANtMW1x88iiKoiCCbRFxcgwYvjGvRgUGU3TV85TDzMXM5l8iiNNlkUJ/MUNhkkEVpel1GJGwy6GUE9QnJURKZceaD2CD2TWIqgvaxDd/3P2DB6Hk9FKaFaII3Zz4jj3wwgXWxoK001Pd1eOzJvHPsBBN0T115sLarydxlN7ygtCgpX0mNUuEExVlREWTH2XCC8rIsc/EQiA/jwQWJYQKma8p8fp0Hm8FN3HC4H8CCledXNpVoPeAHo+E0fhdJX+toOS2FptNEdVtFbpL7UuW/l+nPdX4C2sIzGfYkF+oAAAAASUVORK5CYII='}],
['xul:menuitem', {label: '词霸划词翻译',oncommand: 'event.stopPropagation(); PageTranslationIciba();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABDElEQVQ4jZXSoZKDMBSF4fMYvAKysnYl8kosMrIyNnIlsrYysjK2EllZuxJZ+a8I0LRlp2xmDjGcj5sJUrG8iev1usSb0NblTcCZvM4kr+3AWplLtQ3IZS1lbyL0Z6yLWBfZ1x8QbyIEcY95ZHcciCP0P5nsvsHM/kYeEwgJBuDCAwDoDiMhhHWkBGq7LaV4v9P/ZGwzIIUFGAqktts2wNvzFPPX28PI6XT6DDzuPhTJmDQ9iqS9WAWOO5GU09Q9td0YXpC0z//OE0BoSPMLxT4jcz+XeQeSn4p9D02Ts6tgV70hAEkrR0gv5ywzI23bkiSccxMwfsGlInkRprE/7c65fCsxRpxz/858i78ni99QUhiH/QAAAABJRU5ErkJggg=='}],
['xul:menuitem', {label: '汉典划词翻译',oncommand: 'event.stopPropagation(); PageTranslationHandian();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJElEQVQ4jY2TMWrEMBBFdQYJuU23BsM2gbQBFSl0AEsEs+CzxClETpALpEwbttjGJ9hiwXLh1uf4W81EcpRNBgTfo9HTeDQjlnmCk7q4xrbP1joErEPIfGJsezipsbWPt5eiTo0BJfOqwjJPAAAnNevUorE54Hw6ZoCSzmN2ENFY3jifjlkNurpBNDbTFAcAl/0DRFc3DEhrkeptNgRwUkNQ4H8BTurfAV5V6OoGz4/3nHZXN3BSIxrL+ibgryIWAVQY+r9bOo1nwOvB/6j+Vqc+ryrWwqsdtrbME74+3/l7HUKxkZzUEJf9U+ZMe2Eb7O9UBnJSf/fBMk/cLOntqa1DgJOaZ4NrQJNXSrMEoUszAL01vXc0FusQ+BCNL+1FYzG2Pa51VtKhEx+TOgAAAABJRU5ErkJggg=='}],
['xul:menuseparator', {}],
['xul:menuitem', {label: '繁体转为简体',oncommand: 'event.stopPropagation(); PageTranslationSimpleChinese();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAACVBMVEUAAAAAAADs4udxvSaxAAAAAXRSTlMAQObYZgAAABtJREFUCNdjQADW0BAgycaAi2ANAbEccBMgAABgfgLQN3XpGgAAAABJRU5ErkJggg=='}],
['xul:menuitem', {label: '简体转为繁体',oncommand: 'event.stopPropagation(); PageTranslationTraditionalChinese();',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAACVBMVEUAAAAAAADs4udxvSaxAAAAAXRSTlMAQObYZgAAABtJREFUCNdjQAKsoSFAUoUBK8EaAmI54CHAAACTvgQ4AxXYAgAAAABJRU5ErkJggg=='}],
['xul:menuseparator', {}],
['xul:menuitem', {label: '如何使用?',oncommand: 'event.stopPropagation(); var x = gBrowser.mCurrentTab._tPos + 1; gBrowser.moveTabTo(gBrowser.selectedTab =gBrowser.addTab(&/firefox-guide#translate&), x);',class:'menuitem-iconic', image:'data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEUAAABAQEBERERMTExFRUVOTk5OTk5OTk5PT09LS0tKSkpPT09GRkZISEhJSUlISEhNTU1OTk6jJnUjAAAAEnRSTlMA+umE3Ss4JQuSmRXWvrjIXkG3I7t/AAAAeklEQVQY02VP0RaFIAhjKElp3dv//2wT6ak9eIDB3GSiVAC1SGJTLSZWVLfV4/ATGCYHYqK7nMP6pSK7znsVR2OBTpI61GqVfYeTZUU2cA0+Bg6i5fkkHO9Gxy25sfy0XzqMXwj/x0BL+IjdJZROJZBOM4u/WT5pP3gAao8CUlKco+oAAAAASUVORK5CYII='}]
aNode.appendChild(jsonToDOM(myMenuJson, aNode.ownerDocument, {}));
aNode.setAttribute('contextmenu', 'QuickTranslate_pop');
//定义图标
var cssStr = '@-moz-document url(&chrome://browser/content/browser.xul&){'
+ '#QuickTranslate[cui-areatype=&toolbar&] .toolbarbutton-icon {'
+ 'list-style-image:url(data:image/base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA+UlEQVQ4jbXTrU7EUBAF4M9geAE0DrMOQbIKi22CQuFQ+whVfYAaHA+xYhWiom5FLX5NxSYkuEpEp5u7pbRBcJIrZu78nDN3Lv+AKxRo0MVpkMfdLDIcUWKNJ9T4xCHusrnkFrdhP0bnzSiuxfMU7SNWiS/HdqLROhidycmD9hjvkTDGq35OJzS/BG71UsYY5J3Q4WIisMJ1Yt+E/RY5iwW2emkbvZzh1Piak5DhLrpV2OElmlxG7JmEdIgl9km3+wlmpdEQ02fcJ/5d0E2xitG{过}F{滤}WzksUhV06yj2MEpuLWxjpx9Qodc7aC4trHIqp8BHUqwJ3+Jn+jO+AVv+QUmXPpATAAAAAElFTkSuQmCC)'
+ '#QuickTranslate[cui-areatype=&menu-panel&] .toolbarbutton-icon, toolbarpaletteitem[place=&palette&]& #QuickTranslate .toolbarbutton-icon {'
+ 'list-style-image:url(data:image/base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAdVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5WX1YAAAAJ3RSTlMAGwnubNnx6JN3WRMNrw/+z6bfrCuJJp5/SjIwy72dNQUB0Xk+tFLM+aAtAAABSklEQVQ4y61Ti26DMAxMCEkgCQnvR0tbXt3/f+KAAjZomjRplhCX2Dqw70z+EtTPuHCCZz79KX2PWKVKS2ypKhbdr2kvYKO3orJomRtZ4J3Z40SvoK9l/ZqhTmKK82m4oeChNxSmFPjjPU8lMIfxgYNkR51AxEmwgZvU5KitocDK2wdEPlzmsoeDH32+y3BHPEe9M7rWVQTFgEf0XLkzha7KtEcnlV1JyavF45F8eQmD7ozwthY0Me9CLNARHI/lg1MlhWQi6NzOANFwq1q+CK7tzHf8A0ThHk2/T4WfusiLFRncBZ6DL+uYCz6d5wCTbDgl3d020uBJIi2KTfL2hbTY1bRLwbjq3TCD1MR++HrPT+riCfsBO8rIvE4PenAUeNJ3ux/Bk1AxJJrgtE4Get2L0INTCHuBN+upSkNMqZ4suv22m9Es1T/GN+XUD9hHM1i/AAAAAElFTkSuQmCC)'
var sss = Cc[&@mozilla.org/content/style-sheet-1&].getService(Ci.nsIStyleSheetService);
var ios = Cc[&@mozilla.org/network/io-1&].getService(Ci.nsIIOService);
sss.loadAndRegisterSheet(ios.newURI(&data:text/base64,& + btoa(cssStr), null, null), sss.USER_SHEET);
//定义函数
function PageTranslationYoudao() { gBrowser.loadURI(&javascript:%20void((function()%20{var%20element%20=%20document.createElement('script');element.id%20=%20'outfox_seed_js';element.charset%20=%20'utf-8',element.setAttribute('src',%20'/web2/seed.js?'%20+%20Date.parse(new%20Date()));document.body.appendChild(element);})())&);};
function PageTranslationGoogle() {
var cel = this._
var docurl = content.location.
if (docurl.match(/^about/)) {
} else if(docurl.match(/^https/)) {
docurl = docurl.replace(/https/i, &http&);
var fordUrl = &/translate?hl=& + cel + &&sl=auto&tl=& + cel + &&u=& + decodeURIComponent(docurl);
gBrowser.selectedTab = gBrowser.addTab(fordUrl);
function PageTranslationGoogleInPage() {
gBrowser.loadURI(&javascript:{d=b=d.o=d.createElement('scri'+'pt');o.setAttribute('src','/translate_a/element.js?cb=googleTranslateElementInit');o.setAttribute('type','text/javascript');b.appendChild(o);v=b.insertBefore(d.createElement('div'),b.firstChild);v.id='google_translate_element';v.style.display='none';p=d.createElement('scri'+'pt');p.text='function%20googleTranslateElementInit(){new%20google.translate.TranslateElement({pageLanguage:%22%22},%22google_translate_element%22);}';p.setAttribute('type','text/javascript');b.appendChild(p);}void%200&);
PageTranslationBing() {
gBrowser.addTab('/bv.aspx?from=&to=zh-CHS&a=' + decodeURIComponent(gBrowser.currentURI.spec));
PageTranslationBingInPage() {
gBrowser.loadURI('/bv.aspx?from=&to=zh-CHS&a=' + decodeURIComponent(gBrowser.currentURI.spec));
PageTranslationBaidu() {
gBrowser.loadURI(&javascript:(function(){window.open('/transpage?query='+unescape(document.location.href)+'&from=auto&to=zh&source=url&render=1')})();&);
function PageTranslationXiaod() {
gBrowser.loadURI(&javascript:void((function(){hjelm=document.createElement('script');hjelm.setAttribute('src','/app/js/dict_ajax.js');document.body.appendChild(hjelm);})())&);
function PageTranslationHandian() {
gBrowser.loadURI(&javascript:void((function()%20{var%20element=document.createElement('script');%20element.setAttribute('src',%20'http://www.zdic.net/tools/zih.asp');%20document.body.appendChild(element);})())&);
function PageTranslationIciba() {
gBrowser.loadURI(&javascript:var%20ICIBA_HUAYI_ALLOW=1,iciba_huaci_url=%22[url]/huaci/%22;void%20function[/url](){if(!document.getElementById(%22icIBahyI-yi%22)){var%20a=document.createElement(%22div%22);a.id=%22icIBahyI-yi%22,a.style.display=%22none%22,a.style.zIndex=%%22,document.body.insertBefore(a,document.body.firstChild);var%20i=document.createElement(%22div%22);i.id=%22icIBahyI-main_box%22,i.style.display=%22none%22,document.body.insertBefore(i,document.body.firstChild);var%20e='%3Clink%20type=%22text/css%22%20rel=%22stylesheet%22%20href=%22'+iciba_huaci_url+'mini.css%22%20/%3E%3Cobject%20style=%22height:0width:0overflow:%22%20classid=%22clsid:d27cdb6e-ae6d-11cf-96b8-%22%20codebase=%22[url]/pub/shockwave/cabs/flash/swflash.cab%23version=6[/url],0,0,0%22%20width=%220%22%20height=%220%22%20id=%22asound_hanci%22%20align=%22absmiddle%22%3E%3Cparam%20name=%22allowScriptAccess%22%20value=%22always%22%20/%3E%3Cparam%20name=%22movie%22%20value=%22[flash]/top/asound.swf%22%20/%3E%3Cparam%20name=%22quality%22%20value=%22high%22%20/%3E%3Cembed%20src=%22[url]/top/asound.swf[/url][/flash]%22%20quality=%22high%22%20width=%220%22%20height=%220%22%20name=%22asound_hanci%22%20align=%22absmiddle%22%20allowScriptAccess=%22always%22%20type=%22application/x-shockwave-flash%22%20pluginspage=%22[url]/go/getflashplayer%22%20/%3E%3C/object%3E%3Cdiv%20class=%22icIBahyI-main_title%22%20id=%22icIBahyI-main_title%22%20%3E%3Ca%20href=%22javascript:;%22%20id=%22icIBahyI-gb%22%20class=%22icIBahyI-gb%22%20title=%22%E5%85%B3%E9%97%AD%22%3E%3C/a%3E%3Ca%20href=%22javascript:;%22%20id=%22icIBahyI-dq%22%20class=%22icIBahyI-dq2%22%20title=%22%E7%82%B9%E5%87%BB%E5%9B%BA%E5%AE%9A%E7%BB%93%E6%9E%9C%22%3E%3C/a%3E%E7%88%B1%E8%AF%8D%E9%9C%B8%20%E5%8D%B3%E5%88%92%E5%8D%B3%E8%AF%91%3Cdiv%20class=%22icIBahyI-sz_list%22%20id=%22icIBahyI-sz_list%22%3E%3Ca%20href=%22javascript:;%22%3E%E5%85%B3%E9%97%AD%E5%8D%B3%E5%88%92%E5%8D%B3%E8%AF%91%3C/a%3E%3Ca%20href=%22%23%22%20target=%22_blank%22%3E%E5%8F%8D%E9%A6%88%3C/a%3E%3Ca%20href=%22%23%22%20style=%22border:%22%20target=%22_blank%22%3E%E5%B8%AE%E5%8A%A9%3C/a%3E%3Cspan%20class=%22icIBahyI-j%20icIBahyI-tl%22%3E%3C/span%3E%3Cspan%20class=%22icIBahyI-j%20icIBahyI-tr%22%3E%3C/span%3E%3Cspan%20class=%22icIBahyI-j%20icIBahyI-bl%22%3E%3C/span%3E%3Cspan%20class=%22icIBahyI-j%20icIBahyI-br%22%3E%3C/span%3E%3C/div%3E%3C/div%3E%3Cdiv%20class=%22icIBahyI-search%22%3E%3Cinput%20id=%22ICIBA_HUAYI_input%22%20name=%22%22%20type=%22text%22%20onkeydown=%22ICIBA_HUAYI_KEYDOWN[/url](event);%22%3E%3Ca%20href=%22javascript:;%22%20class=%22icIBahyI-sear%22%20onclick=%22ICIBA_HUAYI_searchword()%22%20%3E%E6%9F%A5%20%E8%AF%8D%3C/a%3E%3C/div%3E%3Cspan%20class=%22icIBahyI-contTop%22%3E%3C/span%3E%3Cdiv%20class=%22icIBahyI-loading%22%20id=%22loading%22%3E%3C/div%3E%3Cdiv%20class=%22icIBahyI-main_cont%22%20id=%22icIBahyI-main_cont%22%3E%3C/div%3E%3Cdiv%20class=%22icIBahyI-CB%22%20id=%22icIBahyI-scbiframe%22%20style=%22display:none%22%3E%3C/div%3E%3Cdiv%20id=%22ICIBA_TOO_LONG%22%20style=%22height:150px%22%20class=%22icIBahyI-footer%22%3E%E6%82%A8%E5%88%92%E5%8F%96%E7%9A%84%E5%86%85%E5%AE%B9%E5%A4%AA%E9%95%BF%EF%BC%8C%E5%BB%BA%E8%AE%AE%E6%82%A8%E5%8E%BB%E7%88%B1%E8%AF%8D%E9%9C%B8%3Ca%20href=%22[url][/url]%22%3E%E7%BF%BB%E8%AF%91%3C/a%3E%E9%A1%B5%E9%9D%A2%E3%80%82%3C/div%3E%3Cspan%20class=%22icIBahyI-contB%22%3E%3C/span%3E';document.getElementById(%22icIBahyI-main_box%22).innerHTML=e;var%20c=document.createElement(%22script%22);c.setAttribute(%22src%22,iciba_huaci_url+%22dict.php%22),document.body.appendChild(c);var%20i=document.createElement(%22div%22);i.id=%22icIBahyI-USER_LOGIN%22,i.className=%22icIBahyI-USER_LOGIN%22,i.style.display=%22none%22,document.body.insertBefore(i,document.body.firstChild);var%20t=document.createElement(%22script%22);t.setAttribute(%22src%22,iciba_huaci_url+%22ICIBA_HUACI_COM.js%22),document.body.appendChild(t)}}();&);
gBrowser.loadURI(&javascript:void((function(){hjelm=document.createElement('script');hjelm.setAttribute('src','/huaci/huaci.js');document.body.appendChild(hjelm);})())&);
function PageTranslationOpenWindowGoogle(event) {
window.open(&/m/translate&,&谷歌翻译&,&resizable,scrollbars,status,title&).resizeTo(400, 600);
function PageTranslationOpenWindowYoudao(event) {
window.open(&/dict?le=eng&q=a&,&有道翻译&,&resizable,scrollbars,status,title&).resizeTo(400, 600);
function PageTranslationSimpleChinese() {
gBrowser.loadURI('javascript:(function(){var%20s=document.getElementById(&tongwenlet_cn&);if(s!=null){document.body.removeChild(s);}var%20s=document.createElement(&script&);s.language=&javascript&;s.type=&text/javascript&;s.src=&https://git.oschina.net/runningcheese/JiathisQR.js/raw/master/bookmarklet_cn.js&;s.id=&tongwenlet_cn&;document.body.appendChild(s);%20})();');
function PageTranslationTraditionalChinese() {
gBrowser.loadURI('javascript:(function(){var%20s=document.getElementById(&tongwenlet_tw&);if(s!=null){document.body.removeChild(s);}var%20s=document.createElement(&script&);s.language=&javascript&;s.type=&text/javascript&;s.src=&https://git.oschina.net/runningcheese/JiathisQR.js/raw/master/bookmarklet_tw.js&;s.id=&tongwenlet_tw&;document.body.appendChild(s);%20})();');
//引入FGgTranslator翻译代码
messageManager.loadFrameScript('data:application/charset=UTF-8,'+ encodeURIComponent('('+ (function(){
FGgTranslator
// @author
// @version
gBrowser.selectedBrowser.messageManager.sendAsyncMessage('FGgTranslator', readFromClipboard());
// ==/FireGesturesScript==
var FGgTranslator = {
//翻译框出现的位置相对于鼠标手势结束时的横坐标位移
//纵坐标位移, 值越大越往 上/左
google: '/',
//link: 'http://173.194.127.152/', //直接使用服务器IP,
//可以换一个比较通畅的google翻译服务器地址或IP,
//注意地址或IP最后还有还有&/&。
service: 'baidu',
bingAppId: '',
selectText: null,
boxElements:null,
from: 'auto',
checkLanguge: 'auto',
camelCase: false,
preSelection: [],
originDocument: null,
_languages:{
'google-bing':{
en: '英语 English',
ja: '日语 Japanese',
fr: '法语 French',
ru: '俄语 Russian',
de: '德语 German',
ko: '韩语 Korean',
ar: '阿拉伯语 Arabic',
et: '爱沙尼亚语 Estonian',
bg: '保加利亚语 Bulgarian',
pl: '波兰语 Polish',
fa: '波斯语 Persian',
da: '丹麦语 Danish',
fi: '芬兰语 Finnish',
ht: '海地克里奥尔语 Haitian Creole',
nl: '荷兰语 Dutch',
ca: '加泰罗尼亚语 Catalan',
cs: '捷克语 Czech',
lv: '拉脱维亚语 Latvian',
lt: '立陶宛语 Lithuanian',
ro: '罗马尼亚语 Romanian',
mt: '马耳他语 Maltese',
ms: '马来语 Malay',
no: '挪威语 Norwegian',
pt: '葡萄牙语 Portuguese',
sv: '瑞典语 Swedish',
sk: '斯洛伐克语 Slovak',
sl: '斯洛文尼亚语 Slovenian',
th: '泰语 Thai',
tr: '土耳其语 Turkish',
cy: '威尔士语 Welsh',
ur: '乌尔都语 Urdu',
uk: '乌克兰语 Ukrainian',
el: '希腊语 Greek',
es: '西班牙语 Spanish',
hu: '匈牙利语 Hungarian',
it: '意大利语 Italian',
hi: '印地语 Hindi',
id: '印尼语 Indonesian',
vi: '越南语 Vietnamese',
'zh-TW': '中文(繁体)',
'zh-CN': '中文(简体)',
sq: '阿尔巴尼亚语 Albanian',
az: '阿塞拜疆语 Azerbaijani',
ga: '爱尔兰语 Irish',
eu: '巴斯克语 Basque',
be: '白俄罗斯语 Belarusian',
is: '冰岛语 Icelandic',
bs: '波斯尼亚语 Bosnian',
af: '布尔语(南非荷兰语) Afrikaans',
tl: '菲律宾语 Filipino',
km: '高棉语 Khmer',
ka: '格鲁吉亚语 Georgian',
gu: '古吉拉特语 Gujarati',
ha: '豪萨语 Hausa',
gl: '加利西亚语 Galician',
kn: '卡纳达语 Kannada',
hr: '克罗地亚语 Croatian',
la: '拉丁语 Latin',
lo: '老挝语 Lao',
mr: '马拉地语 Marathi',
mk: '马其顿语 Macedonian',
mi: '毛利语 Maori',
mn: '蒙古语 Mongolian',
bn: '孟加拉语 Bengali',
hmn: '苗语 Hmong',
zu: '南非祖鲁语 Zulu',
ne: '尼泊尔语 Nepali',
pa: '旁遮普语 Punjabi',
sr: '塞尔维亚语 Serbian',
eo: '世界语 Esperanto',
sw: '斯瓦希里语 Swahili',
ceb: '宿务语 Cebuano',
so: '索马里语 Somali',
te: '泰卢固语 Telugu',
ta: '泰米尔语 Tamil',
iw: '希伯来语 Hebrew',
hy: '亚美尼亚语 Armenian',
ig: '伊博语 Igbo',
yi: '意第绪语 Yiddish',
jw: '印尼爪哇语 Javanese',
yo: '约鲁巴语 Yoruba'
'zh-CHT': '中文(繁体)',
'zh-CHS': '中文(简体)',
mww: '白苗文 Hmong Daw',
tlh: '克林贡语 Klingon',
he: '希伯来语 Hebrew'
cht: '中文(繁体)',
zh: '中文(简体)',
en: '英语',
yue: '粤语',
wyw: '文言文',
jp: '日语',
de: '德语',
ru: '俄语',
fra: '法语',
kor: '韩语',
est: '爱沙尼亚语',
ara: '阿拉伯语',
bul: '保加利亚语',
pl: '波兰语',
dan: '丹麦语',
fin: '芬兰语',
nl: '荷兰语',
cs: '捷克语',
rom: '罗马尼亚语',
pt: '葡萄牙语',
swe: '瑞典语',
slo: '斯洛文尼亚语',
th: '泰语',
spa: '西班牙语',
el: '希腊语',
it: '意大利语',
hu: '匈牙利语'
langMap: [
['zh-CN', 'zh-CHS', 'zh'],
['zh-TW', 'zh-CHT', 'cht'],
['ar', 'ar', 'ara'],
['fr', 'fr', 'fra'],
['ko', 'ko', 'kor'],
['ja', 'ja', 'jp'],
['es', 'es', 'spa'],
['et', 'et', 'est'],
['bg', 'bg', 'bul'],
['da', 'da', 'dan'],
['fi', 'fi', 'fin'],
['ro', 'ro', 'rom'],
['sv', 'sv', 'swe'],
['sl', 'sl', 'slo']
baiduLM: {
en: ['yue', 'wyw'],
jp: ['yue', 'wyw'],
yue: 'zh,cht',
th: ['yue', 'wyw'],
ara: ['yue', 'wyw'],
est: ['yue', 'wyw'],
bul: ['yue', 'wyw'],
pl: ['yue', 'wyw'],
fra: ['yue', 'wyw'],
fin: ['yue', 'wyw'],
spa: ['yue', 'wyw'],
dan: ['yue', 'wyw'],
wyw: 'zh,cht',
kor: ['yue', 'wyw'],
ru: ['yue', 'wyw'],
pt: ['yue', 'wyw'],
de: ['yue', 'wyw'],
it: ['yue', 'wyw'],
cs: ['yue', 'wyw'],
rom: ['yue', 'wyw'],
swe: ['yue', 'wyw'],
slo: ['yue', 'wyw'],
hu: ['yue', 'wyw'],
el: ['yue', 'wyw'],
nl: ['yue', 'wyw']
get languages(){
var _l = this._languages,
s = _l[this.service];
gb = 'google-bing';
if(!!~gb.indexOf(this.service))
for(var i in _l[gb]) l[i] = _l[gb][i];
for(var i in s) l[i] = s[i];
init: function(event, clipboardText){
if(!content.document.body)
this.selectText = this.getSelection(event);
if(this.selectText.replace(/\s+/g,'') === ''){
if(clipboardText && clipboardText.trim()){
this.selectText = clipboardText.replace(/\n+/g,'\n');
if(!this.boxElements){
this.getTranslateBox();
this.boxElements.box.drag = {
status: false,
this.boxElements.style =
this.setStyle(this.boxElements.box);
//nightly 41 050622 ([url]//[/url])
//https://bugzilla.mozilla.org/show_bug.cgi?id=1146136
: this.from,
: this.to,
camelCase : this.camelCase,
: this.service,
bingAppId : this.bingAppId
} = this.getPref());
content.document.addEventListener('mousedown',this, false);
content.document.addEventListener('mouseup',this, false);
content.document.addEventListener('mousemove',this, false);
content.document.addEventListener('keypass',this, false);
content.addEventListener('unload',this, false);
this.boxElements.detail.addEventListener('DOMMouseScroll', this, false);
(this.originDocument = event.view.document).addEventListener('mousedown',this, false);
var pageXY = (function(e){
var target = e.view,
while(target != null && target != content.top){
rect = target.frameElement.getBoundingClientRect();
top += rect.top || 0;
left += rect.left || 0;
target = target.
x: left + e.clientX,
y: top + e.clientY
})(event);
this.boxElements.box.style.top = pageXY.y + content.pageYOffset - this.offset.y +'px';
this.boxElements.box.style.left = pageXY.x + content.pageXOffset - this.offset.x +'px';
this.setTranslateText();
googleService: function(res){
var {strFilter: sF, title: ftt, resultText: resultText} = this.filter,
ftt = ftt.bind(this.filter),
resultBox = this.boxElements.resultB
var text = JSON.parse(res.responseText.replace(/\[,+|,{2,}(?!\])|,+\]/g, function(str){
return Array.prototype.join.call(str, 'null');
rt = '',//译文
rp = '',//注音
languages = this.
if(!res.responseText || !text[0]){
return this.statusAlert('未知错误');
//原文所属语言
this.checkLanguge = text[2];
var t = text[0];
for(var i=0;i&t.i++){
if(!t[i][0] && !t[i][1])
rt += ftt(t[i][0], t[i][1],
(languages[text[2]] +
' -& ' + languages[this.to]));
rp += t[i][1];
rp = t[t.length - 1][3] ? ftt(t[t.length - 1][3], rp) : '';
//显示翻译文本
this.boxElements.resultText = resultText(rt);
//显示注音
this.boxElements.phonetic =
/*//////////////////////////////////*/
&span class=&_FgGTr-D-t1-Ci&&[词性]&/span&
&ul class=&_FgGTr-D-t1-Ul&&
&li class=&_FgGTr-D-t1-li&&
&span&未翻译文本&/span&
&li&译文1&/li&
if(text[1]){
var t1 = text[1],
sp = li = '';
for(var m=0;m&t1.m++){
li = '&span class=&_FgGTr-D-t1-Ci&&['+ sF(t1[m][0])
+ '].&/span&&ul class=&_FgGTr-D-t1-Ul&&';
for(var n=0;n&t1[m][2].n++){
li += '&li class=&_FgGTr-D-t1-li&&&span&'
+ sF(t1[m][2][n][0]) +'&/span&&span&&ul&'
for(var l=0;l&t1[m][2][n][1].l++){
li += '&li&'+ sF(t1[m][2][n][1][l]) +'&/li&';
li += '&/ul&&/span&&/li&';
sp += li + '&/ul&';
var span = content.document.createElement('span');
span.innerHTML =
this.boxElements.detail.appendChild(span);
/*//////////////////////////////////*/
&span class=&_FgGTr-D-t5-Ul&&&ul&
&li class=&_FgGTr-D-t5-li1&&
&span&未翻译文本&/span&
&li class=&_FgGTr-D-t5-li2&&
&span&译文0&/span&
&li&译文1&/li&
&/ul&&/span&*/
}else if(text[5]){
var t5 = text[5],
li1 = li2 = '',
filter = {};
for(var j=0;j&t5.j++){
if(!(t5[j][0] in filter) && t5[j][2] &&
(t5[j][2].length!=1 || (t5[j][0] != t5[j][2][0][0])) &&
!sF(t5[j][0], t5[j][2][0][0])
li1 += '&li class=&_FgGTr-D-t5-li1&&&span&'+sF(t5[j][0])+'&/span&&/li&';
li2 += '&li class=&_FgGTr-D-t5-li2&&&span&&span&'
+sF(t5[j][2][0][0])+'&/span&&ul&';
for(var k=0;k&t5[j][2].k++){
li2 += '&li&'+sF(t5[j][2][k][0])+'&/li&';
li2 += '&/ul&&/span&&/li&';
filter[t5[j][0]] =
if(!!li1 && !!li2){
var span = content.document.createElement('span');
span.innerHTML = '&ul&'+li1+'&/ul&&ul&'+li2+'&/ul&';
this.boxElements.detail.appendChild(span);
this.boxElements.detail.moreUl = span.lastC
//设置滚动条
this.setClassName(this.boxElements.detail, '_FgGTrDetailOverflow', false);
if(text[1] || text[5]){
this.setScrollbar();
getGoogleTK: function(str){
function b(a, b) {
for (var d = 0; d & b.length - 2; d += 3) {
var c = b.charAt(d + 2),
c = &a& &= c ? c.charCodeAt(0) - 87 : Number(c),
c = &+& == b.charAt(d + 1) ? a &&& c : a &&
a = &+& == b.charAt(d) ? a + c &
function tk(a) {
for (var e = ['406398',''], h = Number(e[0]) || 0, g = [], d = 0, f = 0; f & a. f++) {
var c = a.charCodeAt(f);
128 & c ? g[d++] = c : (2048 & c ? g[d++] = c && 6 | 192 : (55296 == (c & 64512) && f + 1 & a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) && 10) + (a.charCodeAt(++f) & 1023), g[d++] = c && 18 | 240, g[d++] = c && 12 & 63 | 128) : g[d++] = c && 12 | 224, g[d++] = c && 6 & 63 | 128), g[d++] = c & 63 | 128)
for (d = 0; d & g. d++) a += g[d], a = b(a, &+-a^+6&);
a = b(a, &+-3^+b+-f&);
a ^= Number(e[1]) || 0;
0 & a && (a = (a & ) + );
return a.toString() + &.& + (a ^ h)
return tk(str);
bingService: function(res, details){
this.statusAlert('');
var {strFilter: sF, title: ftt, resultText: resultText} = this.filter,
ftt = ftt.bind(this.filter),
resultBox = this.boxElements.resultBox,
sentRequest = this.sentRequest.bind(this),
detailBox = this.boxElements.
var bingTrantor = function(res){
var text = res.responseT
if(!text){
this.loadingAnimation();
return this.statusAlert('未知错误');
text = JSON.parse(text);
}catch(ex){
this.loadingAnimation();
return this.statusAlert('服务器响应格式错误');
//原文所属语言
this.checkLanguge = text.
var cText = this.camelCaseText.trim(),
oText = cText.split('\n'), //原文
rt = '', //译文
languages = this.
for(var i=0;i&text.items.i++){
rt += ftt(text.items[i].text, oText[i],
(languages[text.from] +
' -& ' + languages[this.to]))
.replace(/\&\/span\&/, '&br /&$&');
//显示翻译文本
this.boxElements.resultText = resultText(rt);
text.items.length == 1 && (text.items[0].wordAlignment || ' ').split(' ').length == 1 && sentRequest({
method: 'GET',
url: '/translator/api/Dictionary/Lookup?from='
+ this.checkLanguge +'&to='+ this.to +'&text='+ encodeURIComponent(cText),
rqType: 'bingDictCallback',
Cookie: this.bingAppId
}, function(res){
var text = res.responseT
text = JSON.parse(text);
}catch(ex){}
var sp = li = '';
for(var pt of text.items){
li = '&span class=&_FgGTr-D-t1-Ci&&['+ pt[0].posTag
+ '].&/span&&ul class=&_FgGTr-D-t1-Ul&&';
for(var item of pt){
li += '&li class=&_FgGTr-D-t1-li&&&span&'
+ sF(item.displayTarget) +'&/span&&span&&ul&';
for(var bt of item.backTranslations){
li += '&li&'+ sF(bt.displayText) +'&/li&';
li += '&/ul&&/span&&/li&';
sp += li + '&/ul&';
var span = content.document.createElement('span');
span.innerHTML =
this.boxElements.detail.appendChild(span);
//设置滚动条
this.setClassName(detailBox, '_FgGTrDetailOverflow', false);
this.setScrollbar();
}.bind(this));
}.bind(this);
if(typeof details.retry == 'number'){//先获取请求翻译页面获取令牌cookies作为appid
if(details.retry & 3) return this.statusAlert(this.service + ' 服务发生未知错误');
sentRequest({
url: '/translator/?to='+ this.to +'&text=' +
this.camelCaseText,
retry: details.retry
}, function(res){
var ck = res.getResponseHeader('Set-Cookie').split('\n');
this.setPref.call(this, {bingAppId: (this.bingAppId = ['mtstkn', 'MUID'].map(function(i){
for(var c of ck){
var m = c.match(new RegExp(i+'=[^;]+'));
if(m) return m[0];
return '';
}).join('; '))}); //保存bingAppId
(details.headers || (details.headers = {}))['Cookie'] = this.bingAppId;
sentRequest(details, bingTrantor);
}.bind(this));
bingTrantor(res);
baiduService: function(res, details){
var {title: ftt, resultText: resultText, strFilter: sF} = this.filter,
ftt = ftt.bind(this.filter),
resultBox = this.boxElements.resultBox,
detailBox = this.boxElements.detail,
sentRequest = this.sentRequest.bind(this),
setScrollbar = this.setScrollbar.bind(this),
text = res.responseText,
err = function(msg){
this.loadingAnimation();
return this.statusAlert(msg || '未知错误');
}.bind(this);
if(text == '') return err();
text = JSON.parse(text);
if(text.error != 0 && text.msg != 'success') return err(text.msg)
}catch(ex){
return err('服务器响应格式错误');
//原文所属语言
this.checkLanguge = text.lan || 'auto';
//当自动检测到为zh/en, 且翻译目标语言为zh/en时,默认翻译为 en/zh
if(this.from == 'auto'
&& this.checkLanguge == this.to
&& ['zh', 'en', 'cht'].indexOf(this.to)&-1
this.to = ( ['zh', 'cht'].indexOf(this.to)&-1 ? 'en' : this.to);
this.setResultLink();
this.updateLanguages();
details.postData = 'from='+ (this.from == 'auto' ? this.checkLanguge : this.from)
+ '&to=' + this.to + '&query=' + details.tText + '&transtype=hash&simple_means_flag=3'; //'&transtype=realtime';
details.url = '/v2transapi';
//上次请求清除,重新添加
this.loadingAnimation();
sentRequest.call(this, details, function(res){
clearInterval(resultBox.loading);
var text = res.responseText,
tRD = null,
tDM = null,
languages = this.languages,
rt = '';//译文
if(text == '') return err();
text = JSON.parse(text);
}catch(ex){
return err('服务器响应格式错误');
var tt_r = text.trans_result,
td_r = text.dict_
//重新设置原文所属语言
this.checkLanguge = tt_r.
//翻译结果
tRD = tt_r.
var ara_ru = !!~['ara', 'ru'].indexOf(this.checkLanguge);
for(var p of tRD){
if(!!p.result && p.dst){
for(var ci of p.result){
var range = ci[4][0].split('|').map(function(r){return parseInt(r, 10)}),
spr = ci[3], _spr = ci[1]; //添加 空格、换行
spr.forEach(function(s){
s = s.split('|');
if(s.length){
_spr = _spr.split('');
_spr.splice(s[0] == '0' ? 0 : _spr.length, 0, s[1]); //0为句前,1为末尾
_spr = _spr.join('');
rt += ftt(_spr,
this.filter.cut(p.src, range[0], range[0] + range[1], ara_ru),
(languages[this.checkLanguge] + ' -& ' + languages[this.to]));
rt += ftt(p.dst, p.src, (languages[this.checkLanguge] + ' -& ' + languages[this.to]));
if(p != tRD[tRD.length-1])
rt = rt.replace(/(\&span title\=&[^&]+?& class\=&)([^&]+?)(&\&[^\&]+)\&\/span\&$/,
'$1$2 _FgGTrR-T-Span-P$3&/span&&br /&');
this.checkLanguge =
this.boxElements.resultText =
resultText(rt == '' ? this.camelCaseText : rt);
var dictResult =
//简单翻译
var tSM = td_r.simple_
var smUL = '',
tSM_symbols = tSM.symbols,
tSM_word_name = [];
if(td_r.err_words){ //大小写区别单词
tSM_word_name.push(tSM.word_name);
for(var tEW of td_r.err_words){
if(Array.isArray(tEW.symbols)){
tSM_symbols = tSM_symbols.concat(tEW.symbols);
tSM_word_name.push(tEW.word_name);
for(var p of tSM_symbols){
var ph = [];
if(tSM_word_name.length){
smUL += '&b class=&_FgGTr-bd-sm-WordName&&' + tSM_word_name[tSM_symbols.indexOf(p)];
if(!p.word_symbol){
p.ph_en && ph.push('[英]:['+ p.ph_en + ']');
p.ph_am && ph.push('[美]:['+ p.ph_am + ']');
(p.ph_en == p.ph_am) && ph.pop();
if (ph.join(', ') != '') smUL += '&div class=&_FgGTr-bd-sm-Phonetic&&'+ ph.join(', ') +'&/div&';
smUL += '&div class=&_FgGTr-bd-sm-Phonetic&&'+ p.word_symbol +'&/div&';
if(tSM_word_name.length){
smUL += '&/b&';
for(var parts of p.parts){
//parts.part
//parts.means.word_mean zh-&en
//词性 zh-&en parts.part_name
parts.part_name && (smUL += '&div class=&_FgGTr-bd-sm-partsName&&&b&['+ parts.part_name +']&/b&');
if(parts.part){
smUL += '&div class=&_FgGTr-bd-sm-parts&&&b&'+ parts.part +'&/b&&ul&';
for(var means of parts.means)
smUL += '&li&' + means + '&/li&';
smUL += '&/ul&&/div&';
}else if(parts.means){
smUL += '&ul class=&_FgGTr-bd-sm-parts _FgGTr-bd-sm-parts-sg&&';
for(var means of parts.means){
if(Array.isArray(parts.means)){
if(typeof means == 'string'){
smUL += '&li&' + means + '&/li&';
}else if(typeof means == 'object' && means.word_mean){
smUL += '&li&' + means.word_mean + '&/li&';
}else if(means.word_mean){
smUL += '&li&' + means.word_mean + '&/li&';
smUL += '&/ul&';
parts.part_name && (smUL += '&/div&');
//单词其他形式
if(tSM.exchange){
var exc = {
'word_done': '过去分词',
'word_past': '过去式',
'word_ing': '现在进行时',
'word_pl': '复数',
'word_est': '最高级',
'word_er': '比较级',
'word_third': '第三人称单数'
}, _exc = '';
for(var wx in exc){
if((wx in tSM.exchange) && tSM.exchange[wx]){
_exc += '&li&&i&' + exc[wx] + ':&/i&&span&';
for(var wxc of tSM.exchange[wx]){
_exc += '&a target=&_blank& href=&/#'
+ (this.checkLanguge || this.from) +'/'+ this.to +'/'
+ wxc +'&&' + wxc + '&/a&';
_exc += '&/span&&/li&';
if(_exc !='') smUL += '&ul class=&_FgGTr-bd-sm-exchange&&' + _exc + '&/ul&';
if(smUL != ''){
dictResult = content.document.createElement('div');
dictResult.id = '_FgGTr-bd-dict-result';
dictResult.innerHTML = smUL;
detailBox.appendChild(dictResult);
//其他语言 jp &-& en
var tCt = td_r.content,
tVe = td_r.
var tcUL = '';
for(var i of tCt){
tcUL += '&ul&'
for(var m of i.mean){
tcUL += '&li class=&_FgGTr-bd-sm-parts&&'+ (m.pre ? '&b&'+ m.pre +'&/b&' : '') + '&ul&';
for(var c in m.cont){
tcUL += '&li&' + c + '&/li&';
tcUL += '&/ul&&/li&';
tcUL += '&/ul&'
if(tcUL != ''){
dictResult = content.document.createElement('div');
dictResult.id = '_FgGTr-bd-dict-result';
dictResult.innerHTML = tcUL;
detailBox.appendChild(dictResult);
var _ph = {}, ph = '';
for(var i of tVe) for(var p in i) _ph[p] = i[p];
if(_ph.en_phonic && _ph.us_phonic){//en -& jp 读音
ph = (_ph.en_phonic == _ph.us_phonic)
? '[EN]:' + _ph.en_phonic
: '[EN]:' + _ph.en_phonic + '' + ', [US]:' + _ph.us_
}else if(_ph.phonic){//jp -& en 读音
(ph != '') && (this.boxElements.phonetic = '&span class=&_FgGTrR-T-Span&&' + ph + '&span&');
//其他详细翻译
var tab = '', synthesize = '', net = '', cizu = '',
tongfanyici = '', baike = '', tContent = '',
zhxiyi = '', enxiyi = '';
var setTab = function(tName){
for(var i in tName){
if(tName[i] != ''){
tab += '&li&' + i + '&/li&';
tContent += '&li&' + tName[i] + '&/li&';
if(tContent && tab){
tContent = '&div&&ul class=&_FgGTr-bd-tContent&&' + tContent + '&/ul&&/div&';
detailBox.innerHTML += ('&ul class=&_FgGTr-bd-drTab&&'+ tab + '&/ul&' + tContent);
var tabs = detailBox.querySelectorAll('._FgGTr-bd-drTab&li'),
contents = detailBox.querySelectorAll('._FgGTr-bd-tContent&li');
for(var i=0, len = tabs. i& i++){
if(i == 0) {
tabs[0].classList.add('_FgGTr-bd-drTab-current');
contents[0].classList.add('_FgGTr-bd-tContent-current');
tabs[0].parentNode.style
.setProperty('min-width', (tabs[0].offsetWidth + 4) * len + 'px', 'important');
//设置当前标签后才设置滚动条
setScrollbar(contents[0].parentNode.parentNode);
tabs[i].onclick = (function(t){
return function(){
if(tabs[t].classList.contains('_FgGTr-bd-drTab-current'))
//记录上一个的滚动位置
var perv = detailBox.querySelector('._FgGTr-bd-tContent-current');
if(!perv.WHTB)
perv.WHTB = {};
perv.WHTB.T = perv.parentNode.offsetT
for(var i=0; i& i++){
tabs[i].classList[i == t ? 'add' : 'remove']('_FgGTr-bd-drTab-current');
contents[i].classList[i == t ? 'add' : 'remove']('_FgGTr-bd-tContent-current');
setScrollbar(contents[t].parentNode.parentNode);
//4个基础标签 & 后来新增的2个扩展标签
if(td_r && ((typeof td_r == 'object') && !Array.isArray(td_r) || dictResult)){
if(td_r.synthesize_means && td_r.synthesize_means.symbols
&& td_r.synthesize_means.symbols.length){ //汉英辞典
for(var i of td_r.synthesize_means.symbols){
synthesize += '&li&';
if(i.xg != ''){
synthesize += '&b&' + td_r.synthesize_means.word_name
+ ' &span&[' + i.word_symbol + ']&/span&&/b&';
for(var cys of (i.cys.length && i.cys || i.parts.length && i.parts)){
if(cys.part_name){
synthesize += '&h5&[' + cys.part_name + ']&/h5&';
if(cys.means && cys.means.length){
synthesize += '&ul class=&_FgGTr-bd-synthesizeCys&&';
for(means of cys.means){
synthesize += '&li&&h6&' + means.word_mean+ '&/h6&';
if(means.ljs && means.ljs.length){
synthesize += '&ul class=&_FgGTr-bd-synthesizeLjs&&';
for(var ljs of means.ljs)
synthesize += '&li&&ul&&li&'+ ljs.ly + '&/li&&li&' + ljs.ls + '&/li&&/ul&&/li&';
synthesize += '&/ul&';
synthesize += '&/li&';
synthesize += '&/ul&';
synthesize += '&/li&';
if(synthesize != '') synthesize = '&ul class=&_FgGTr-bd-synthesize&&' + synthesize + '&/ul&';
if(td_r.net_means){ //网络析义
for(var i of td_r.net_means)
net += '&li&&span&' + i.means + '&/span&&/li&';
if(net != '') net = '&ul class=&_FgGTr-bd-net-means&&' + net + '&/ul&';
var _cizu = (td_r.cizu && td_r.cizu.length && td_r.cizu) || (td_r.cizuxiyu
&& td_r.cizuxiyu.cizu && td_r.cizuxiyu.cizu.length && td_r.cizuxiyu.cizu);
if(_cizu){ //短语词组
for(var i of _cizu){
cizu += '&li&&span&'+ (i.cz_name || i.cizu_name) +'&/span&';
if(i.jx && i.jx.length){
cizu += '&ul class=&_FgGTr-bd-czjx&&';
for(var jx of i.jx){
cizu += '&li&&span&' + (jx.jx_en || jx.jx_cn_mean) + '&/span&';
if(jx.lj && jx.lj.length){
cizu += '&ul class=&_FgGTr-bd-czlj&&';
for(var lj of jx.lj){
cizu += '&li&'+ lj.lj_ly +'&/li&&li&' + lj.lj_ls + '&/li&';
cizu += '&/ul&';
cizu += '&/li&'
cizu += '&/ul&';
cizu += '&/li&';
if(cizu != '') cizu = '&ul class=&_FgGTr-bd-cizu&&' + cizu + '&/ul&';
if((td_r.tongyici && td_r.tongyici.length) //同反义词
|| (td_r.fanyici && td_r.fanyici.length)){
tongfanyici = (function(tfyc){
var ul = [];
for(var tf in tfyc){
if(tfyc[tf]){
var str = '';
for(var i of tfyc[tf]){
if(i.means){//en-&zh
str += '&li&&b&'+ i.part_name +'&/b&&span&&ul class=&_FgGTr-bd-part-name&&';
for(var m of i.means){
str += '&li&&h6&' + m.word_mean + '&/h6&&ul class=&_FgGTr-bd-word-mean&&';
for(var cis of m.cis){
str += '&li&&a target=&_blank& href=&/#'
+ (this.checkLanguge || this.from) +'/'+ this.to +'/'
+ cis.ci_name +'&&' + cis.ci_name + '&/a&&/li&';
str += '&/ul&&/span&&/li&';
str += '&/ul&&/span&&/li&';
}else if(i.ci_name){//zh-&en
str += '&li&&h6&' + i.ci_name + '&/h6&&/li&';
if(str != '') ul.push('&h5 class=&_FgGTr-bd-tongfanyiciTitle&&'+ ('同反'.charAt(tf))
+'义词&/h5&&ul class=&_FgGTr-bd-tongfanyici&&' + str + '&/ul&');
return ul.join('');
}).call(this, [td_r.tongyici, td_r.fanyici]);
var _baike = td_r.baike_means && td_r.baike_means.content && td_r.baike_
if(_baike){//百科析义
baike = '&div class=&_FgGTr-bd-baike&&&span&'+ _baike.content.replace(/\&/g, '&')
+'&/span&&a title=&前往百科页面& href=&'+ _baike.link +'& target=&_blank&&&/a&&/div&';
if(td_r.zdict){// 中中析义
zhxiyi = (function(zdict){
var arr = [];
for(var zd in zdict){
var xiyi = '';
if(!zdict[zd] || (
(!zdict[zd].means || !zdict[zd].means.length) && !zdict[zd].chenyu)
var cyu = zdict[zd].
if(cyu){//成语解释
var _cyu = {
synonyms: '同义词',
xiyi += '&div class=&_FgGTr-bd-zdictTitle&&成语解释&/div&&div class=&_FgGTr-bd-zdictCyu&&';
if(cyu.pinyin) xiyi += '&b&' + td_r.zdict.word + ' &span&[' + cyu.pinyin + ']&/span&&/b&';
xiyi += '&ul&';
for(var cy in _cyu){
if(!cyu[cy])
xiyi += '&li&&b&' + _cyu[cy] + ':&/b&&span&' + cyu[cy] + '&/span&&/li&';
xiyi += '&/ul&&/div&';
arr.push(xiyi);
xiyi = '';
if(zdict[zd].means && zdict[zd].means.length){//字词、引证解释
xiyi += '&div class=&_FgGTr-bd-zdictTitle&&'+ ['字词', '引证'][zd] + '解释&/div&'
+ '&ul class=&_FgGTr-bd-zdictMs&&';
for(var means of zdict[zd].means){
xiyi += '&li&';
if(means.pinyin)
xiyi += '&b&' + td_r.zdict.word + ' &span&[' + means.pinyin + ']&/span&&/b&';
for(var exp of means.exp){
if(zd == 1 && exp.pos) xiyi += '&div class=&_FgGTr-bd-zdictPos&&&h5&' + exp.pos + '&/h5&';
for(var des of exp.des){
//去掉原先的序号 (1) / 1.
xiyi += '&h6&' + des.main.replace(/^(?:\(\d+\)(?!\.)|\d+\.)/,'') + '&/h6&';
if(des.sub && des.sub.length){
xiyi += '&ul class=&_FgGTr-bd-zdictSub&&';
for(var sub of des.sub)
if(sub) xiyi += '&li&' + sub + '&/li&';
xiyi += '&/ul&';
if(zd == 1 && exp.pos) xiyi += '&/div&';
xiyi += '&/li&';
xiyi += '&/ul&';
arr.push(xiyi);
arr = arr.join('&/li&&li&');
return arr ? '&ul class=&_FgGTr-bd-zdict&&&li&' + arr + '&/li&&/ul&': '';
}).call(this, [td_r.zdict.simple, td_r.zdict.detail]);
if(td_r.edict && td_r.edict.item && td_r.edict.item.length){// 英英析义
for(var item of td_r.edict.item){
enxiyi += '&li&&h5&' + item.pos + '&/h5&';
for(var tg of item.tr_group){
enxiyi += '&h6 class=&_FgGTr-bd-edictTg&&' + tg.tr + '&/h6&';
if(tg.example && tg.example.length){
enxiyi += '&ul class=&_FgGTr-bd-edictExample&&';
for(var example of tg.example){
enxiyi += '&li&' + example + '&/li&';
enxiyi += '&/ul&';
if(tg.similar_word && tg.similar_word.length){
//同义词synonym
enxiyi += '&h6&synonym:&/h6&&ul class=&_FgGTr-bd-edictSynonym&&';
for(var synonym of tg.similar_word){
enxiyi += '&li&&a target=&_blank& href=&/#'
+ (this.checkLanguge || this.from) +'/'+ this.to +'/'
+ synonym +'&&' + synonym + '&/a&&/li&';
enxiyi += '&/ul&';
enxiyi += '&/li&';
if(enxiyi != '') enxiyi = '&ul class=&_FgGTr-bd-edict&&' + enxiyi + '&/ul&';
setTab({//标签 & 标签内容
'中中析义': zhxiyi,
'英英析义': enxiyi,
'汉英辞典': synthesize,
'短语词组': cizu,
'同反义词': tongfanyici,
'网络析义': net,
'百科析义': baike
if(!tt_r && !td_r && text.error == 999 && text.from != null){
this.checkLanguge = text.
if(text.query)
this.boxElements.resultText = text.
}.bind(this));
setTranslateText: function(word){
word = (word || this.camelCaseText).trim();
var details = {},
callback = null,
sentRequest = this.sentRequest,
detailBox = this.boxElements.
//清除翻译文本
this.boxElements.resultText = '';
//清除状态
this.boxElements.alertBox = '';
//清空原来的
while(detailBox.children.length){
detailBox.removeChild(detailBox.firstChild);
detailBox.style.minWidth = '';
this.setClassName(detailBox, '_FgGTrDetailOverflow', false);
//清除注音
this.boxElements.phonetic = '';
//设置链接
this.setResultLink();
if(this.service == 'google'){
details.url = this.google + 'translate_a/single?client=t&hl=auto&dt=bd&dt=ex&dt=ld&dt=md&sl=' + this.from + '&tl=' + this.to
+ '&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&source=btn&srcrom=1&ssel=0&tsel=0&tk='+ this.getGoogleTK(word) +'&q='
+ encodeURIComponent(word) + '&getTime=';
details.timeout = 10000;
}else if(this.service == 'bing'){
details.url = '/translator/api/Translate/TranslateArray?from='+ (this.from == 'auto' ? '-' : this.from) +'&to=' + this.
details.method = 'POST';
details.headers = {
'Content-Type': 'application/ charset=utf-8',
'Cookie': this.bingAppId,
'X-Requested-With': 'XMLHttpRequest',
'Referer': '/translator/?to=' + this.to + '&text='+encodeURIComponent(word)
details.postData = JSON.stringify(word.split('\n').map(function(t){
return {id: ''.substr.call(Math.random(), 9, 11), text: t}
}else if(this.service == 'baidu'){
details.method = 'POST';
details.tText = encodeURIComponent(word);
details.url = '/langdetect';
details.postData = 'query='+ encodeURIComponent(this.filter.cut(word, 0, 50)).replace(/%20/g, '+');
details.headers = {
'Content-Type': 'application\/x-www-form-',
'X-Requested-With': 'XMLHttpRequest',
'Accept':'*\/*'
this.loadingAnimation();
details.url && sentRequest.call(this, details, callback);
updateLanguages: function(both){
var index = ['google', 'bing', 'baidu'].indexOf(this.service),
languages = this.languages,
updateList = {},
lg = this._languages.langM
for(var i of lg){
for(var j of i){
if(j == this.from)
this.from = i[index];
if(j == this.to)
this.to = i[index];
//如果不支持翻译的语言则设置为自动
(!languages[this.from]) && (this.from = 'auto');
(!languages[this.to]) && (this.to = lg[0][index]);
if(index == 2){//baidu
//数组为以外的语言,字符串(,)分割为只能翻译语言,空字符串为全能翻译语言。
var _lm = this._languages.baiduLM,
baiduLM = {};
for(var m in _lm){
if(typeof _lm[m] == 'string' && _lm[m] != ''){
_lm[m].split(',').forEach(function(o){
(baiduLM[m] || (baiduLM[m] = [])).push(o);
for(var o in _lm){
(_lm[m] == '' ? true : !~_lm[o].indexOf(m)) && (o != m)
&& ((baiduLM[m] || (baiduLM[m] = [])).push(o));
both && (updateList.from = languages);
var blm = baiduLM[this.from];
updateList.to = {};
for(var i of blm){
updateList.to[i] = languages[i];
(!~blm.indexOf(this.to)) && (this.to = blm[0]);
}else if(this.from == 'auto'){
updateList.to =
both && (updateList.from = languages);
updateList.to =
this.updateSelectMenu(updateList);
updateSelectMenu: function(obj){
var o = this.boxElements,
optionsBox = o.optionsBox,
select = optionsBox.getElementsByClassName('_FgGTrOptionsSelect'),
{from: fromList, to: toList} =
if(!select.length)
for(var i=0;i&select.i++){
if(select[i].className.indexOf('Service')&0){
var itemsText = '', item = '',
languages = [fromList, toList][i];
if(languages){
for(item in languages){
var isZH = languages[item].indexOf('中文') == 0, //中文排在前
option = '&option value=&'+ item +'&&'+ languages[item] +'&/option&';
itemsText = (isZH ? (option + itemsText) : (itemsText + option));
select[i].innerHTML = (i != 1 ? '&option value=&auto&&自动检测&/option&' : '') + itemsT
select[0].value = this.
select[1].value = this.
sentRequest: function(details, callback){
var resultBox = this.boxElements.resultB
if(resultBox.ajaxRequest && resultBox.ajaxRequest.status !== 200){
resultBox.ajaxRequest.abort();
var {url, method, postData, headers, rqType, timeout} =
var ld = rqType !='bingDictCallback';
resultBox.ajaxRequest = this.ajax({
method : method || 'GET',
url : url + (/\=$/.test(url) ? new Date().getTime() : ''),
timeout: timeout || 5000,
postData: postData,
headers: headers || {},
onload : function(res) {
res = res.
if (res.status == 200) {
if(callback){
callback(res);
clearInterval(resultBox.loading);
this[this.service + 'Service'](res, details);
}else if(res.status == 404 || res.status / 500 &= 1){
ld && this.loadingAnimation();
ld && this.statusAlert('错误:访问'+ this.service +'翻译服务器出错。');
}else if(res.status == 403){
json = JSON.parse(res.responseText);
}catch(e){
this.statusAlert('错误:访问'+ this.service +'翻译服务器出错。Code:' + res.status);
if(json && json.message){
clearInterval(resultBox.loading);
details.retry = (details.retry || 0) + 1;
this[this.service + 'Service'](res, details);
this.statusAlert('错误:访问'+ this.service +'翻译服务器出错。Code:' + res.status);
}else if(res.status == 414 || res.status == 400){
if(this.service == 'google'){
this.statusAlert('错误:要翻译的文本过长。');
ld && this.statusAlert('错误:网络错误');
ld && this.loadingAnimation();
}.bind(this),
ontimeout: function(e){
ld && this.loadingAnimation();
ld && this.statusAlert('错误:访问'+ this.service +'翻译服务器超时。');
e.target.abort();
}.bind(this),
onerror: function(e){
ld && this.loadingAnimation();
ld && this.statusAlert('错误:访问'+ this.service +'翻译服务器发生错误。');
e.target.abort();
}.bind(this)
getTranslateBox: function (){
var box = content.document.createElement('div');
box.id = '_FgGTrMainBox';
box.innerHTML = '\
&div id=&_FgGTrResult&&\
&a title=&前往翻译页面& target=&_blank&&\
&span class=&_FgGTrResultText&&loading&/span&\
&div class=&_FgGTrSoundAndAlertBox&&\
&a class=&_FgGTrSoundButton& title=&发音&&&/a&\
&span class=&_FgGTrAlertBox _FgGTr-text-label&&&/span&\
&span class=&_FgGTrSoundPhonetic&&&/span&\
&div class=&_FgGTrDetail&&&/div&\
&div class=&_FgGTrOptions&&\
&a class=&_FgGTrOptionsToggle& title=&设置&&▼&/a&\
&div class=&_FgGTrOptionsBox&&&/div&';
content.document.body.appendChild(box);
this.boxElements = {
toggleOn: false,
style: null,
set resultText(text) this.resultBox.innerHTML = text,
get resultText() this.resultBox.textContent,
set phonetic(text) this.phoneticBox.innerHTML = text,
set alertBox(text) this.alertBox.textContent = text,
get alertBox() this.get('AlertBox'),
get phoneticBox() this.get('SoundPhonetic'),
get soundButton() this.get('SoundButton'),
get resultBox() this.get('ResultText'),
get toggleButton() this.get('OptionsToggle'),
get optionsBox()
this.get('OptionsBox'),
get detail() this.get('Detail'),
get swapButton() this.get('SwapButton'),
get saveButton() this.get('OptionsSave'),
get cancelButton() this.get('OptionsCancel'),
get checkbox() this.get('OptionsCheckbox'),
get serviceSelect() this.get('OptionsService'),
get: function(name) {
return this.box.querySelector('._FgGTr'+ name);
setResultLink: function(){
var obj = {
: encodeURIComponent(this.camelCaseText.trim()),
: this.from,
: this.to,
checkLanguge: this.checkLanguge
var link = this.boxElements.resultBox.parentN
if(this.service == 'google'){
link.href = (this.google.indexOf('translate') & 0
//无法使用服务器IP直接连接至谷歌翻译页面
: this.google) + '?text='+ obj.text +'&langpair='+ obj.from +'|'+ obj.
}else if(this.service == 'bing'){
link.href = '/translator/default.aspx?to='+ obj.to +'&text='+ obj.
}else if(this.service == 'baidu'){
link.href = '/#'
+ obj.from + '/' + obj.to + '/' + obj.
loadingAnimation: function(){
var resultBox = this.boxElements.resultBox,
_loading =
clearInterval(resultBox.loading);
resultBox.textContent = 'loading..';
_loading = resultBox.loading = setInterval(function(){
if(resultBox.textContent.length&10){
resultBox.textContent += '.';
resultBox.textContent = 'loading';
}catch(ex){
clearInterval(_loading);
setOptionsBox: function(){
var o = this.boxE
this.setClassName(o.toggleButton.parentNode, '_FgGTrOptionsHidden', true);
if(o.optionsBox.children.length){
return this.toggleHidden(o.optionsBox);
var optionsBox = o.optionsB
optionsBox.innerHTML = '\
&span class=&_FgGTr-text-label&&从:&/span&\
&select class=&_FgGTrOptionsSelect _FgGTrOptionsSelectFrom&&&/select&\
&a class=&_FgGTrSwapButton& title=&交换&&&/a&\
&span class=&_FgGTr-text-label&&译作:&/span&\
&select class=&_FgGTrOptionsSelect _FgGTrOptionsSelectTo&&&/select&\
&span class=&_FgGTr-text-label&&服务:&/span&\
&select class=&_FgGTrOptionsSelect _FgGTrOptionsService&&\
&option value=&google&&google&/option&\
&option value=&bing&&bing&/option&\
&option value=&baidu&&baidu&/option&\
&/select&\
&span id=&_FgGTrOptionsCheckboxSpan&&\
&input type=&checkbox& class=&_FgGTrOptionsCheckbox& /&\
&span class=&_FgGTr-text-label&&驼峰式&/span&\
&span id=&_FgGTrOptionsButtonSpan&&\
&a class=&_FgGTrOptionsButton _FgGTrOptionsSave&&保存&/a&\
&a class=&_FgGTrOptionsButton _FgGTrOptionsCancel&&取消&/a&\
var select = optionsBox.getElementsByClassName('_FgGTrOptionsSelect');
//更新选择语言框
this.updateLanguages(true);
o.toggleOn =
o.checkbox.checked
= this.camelC
o.serviceSelect.value = this.
o.optionsBox.addEventListener('change', this, false);
getPlayList: function(){
var str = this.camelCaseT
if(this.service == 'google'){
var strArr = str.split(/(?=[ \u3000\n\r\t\s\,\.\?\!\!\?\。\,\u4e00-\u9fa5])/),
strArr2 = [], strLeng = '',
u1 = this.google + 'translate_tts?q=',
u2 = '&tl=' + this.checkLanguge + '&prev=input&client=t';
for(var j=0; j&strArr. j++){
if((strLeng + strArr[j]).length&=100){
strLeng += strArr[j];
strArr2.push(u1 + encodeURIComponent(strLeng) + u2 + '&tk=' + this.getGoogleTK(strLeng));
strLeng = strArr[j];
if(j==strArr.length-1){
strArr2.push(u1 + encodeURIComponent(strLeng) + u2 + '&tk=' + this.getGoogleTK(strLeng));
return strArr2;
}else if(this.service == 'bing'){
return ['https://translator/api/language/Speak?gender={gender}&locale={locale}&media=audio/mp3&text='+encodeURI(str.replace(/ +/g, '+'))];
}else if(this.service == 'baidu'){
var lan = (this.checkLanguge || (this.from == 'auto' ? this.checkLanguge : this.from)),
lan = (lan == 'cht' ? 'zh' : lan),
part = '&text=' + encodeURIComponent(str);
return [(lan != 'zh')
? '/gettts?source=web&lan=' + lan + part
: '/text2audio?pid=101&ie=UTF-8&lan=' + lan + part
_audioSource: null,
_audioCtx: null,
playSound: function(pl){
if(this._audioSource){
this._audioSource.stop();
this._audioSource =
this._audioCtx.close();
this._audioCtx =
}catch(ex){
console.error(ex);
var that = this,
PL = pl || that.getPlayList.call(that),
PS = that.playSound.bind(that);
if(that.service == 'bing' && !pl){
var from = (that.checkLanguge || (that.from == 'auto' ? that.checkLanguge : that.from)),
lang = {'en': 'en-US', 'zh-CHS': 'zh-CN', 'zh-CHT': 'zh-TW', 'ja': 'ja-JP'};//常用语言
if(from in lang){
PL = PL.map(function(u){
return u.replace('{gender}', 'Male').replace('{locale}', lang[from]);
return that.ajax({
method: 'GET',
timeout: 5000,
headers: { Cookie: this.bingAppId},
url: '/translator/api/Language/GetSpeechDialectsForLocale?locale=' + from,
onload: function(res) {
res = res.target.responseT
l = JSON.parse(res);
}catch(ex){
that.statusAlert('Bing 发音服务响应格式错误。', 1000);
l = l.pop();
that.playSound.call(that, PL.map(function(u){
return u.replace('{gender}', l.genders.shift()).replace('{locale}', l.locale);
onerror: function(){
that.statusAlert('Bing 发音服务网络错误。', 1000);
ontimeout:function(){
that.statusAlert('Bing 发音服务网络超时。', 1000);
var header = {
//google当使用服务器IP时要发送Host,否则返回404无法发音
Host: !~this.google.indexOf('google') ? '' : this.google.match(/https?:\/\/([^\/]+)/)[1],
Referer: !~this.google.indexOf('google') ? '/' : this.google
bing: {Host:'', Referer:'/translator/', Cookie: this.bingAppId},
baidu: {Referer:''}
this._audioCtx = new content.AudioContext();
this._audioSource = this._audioCtx.createBufferSource();
var playIndex = function(idx){
PL[idx] && that.ajax({
method: 'GET',
timeout: 5000,
responseType: 'arraybuffer',
url: PL[idx],
headers: (that.service in header) ? header[that.service] : [],
onload: function(res) {
res = res.
if (res.status == 200) {
if(!that._audioSource)
that._audioCtx.decodeAudioData(res.response, function(buffer) {
that._audioSource.buffer =
that._audioSource.connect(that._audioCtx.destination);
that._audioSource.start(0);
that.statusAlert('共'+ PL.length
+ '段语音,正在播放第' + (idx + 1) + '段。', 2500);
}, function(e){
that._audioSource =
that._audioCtx.close();
that.statusAlert('错误: 第'+ ((!!~idx ? idx : 0) + 1) +'段语音加载失败。', 2500);
that._audioSource && (that._audioSource.onended = function(){
if(idx == PL.length){
this.stop();
that._audioSource =
that._audioCtx.close();
that._audioCtx =
playIndex(idx);
}else if(res.status == 404 || res.status / 500 &= 1){
if(that.service == 'google' && res.status == 404){
that.statusAlert('错误:无此语音,或文本过长。', 1000);
that.statusAlert('网络错误。', 1000);
ontimeout: function(e){
that.statusAlert('错误:访问'+ that.service +'翻译服务器超时。');
e.target.abort();
playIndex(0);
statusAlert: function(text, delay){
clearTimeout(this.boxElements.alertBox.hideTimer);
this.setClassName(this.boxElements.alertBox, '_FgGTrAlertBoxHide', false);
this.boxElements.alertBox =
this.boxElements.alertBox.hideTimer = setTimeout(function(){
!delay || this.setClassName(this.boxElements.alertBox,
'_FgGTrAlertBoxHide', true);
}catch(ex){
clearTimeout(arguments.callee);
}.bind(this), typeof delay == 'number' ? delay : 1000);
ajax: function(obj){
var req = Components.classes['@mozilla.org/xmlextras/1']
.createInstance(Components.interfaces.nsIXMLHttpRequest);
req.open(obj.method, obj.url, true);
if(obj.headers){
for(var i in obj.headers){
req.setRequestHeader(i, obj.headers[i]);
if(obj.responseType) req.responseType = obj.responseT
if(obj.timeout) req.timeout = obj.
if(obj.ontimeout) req.ontimeout = obj.
if(obj.onerror) req.onerror = obj.
req.send(obj.postData && obj.method=='POST' ? obj.postData : null);
req.onload = obj.
removeTranslateBox: function(){
this.selectText =
if(this._audioSource){
this._audioSource.stop();
this._audioSource =
this._audioCtx.close();
this._audioCtx =
}catch(ex){
console.error(ex);
this.preSelection = [];
if(this.boxElements){
clearInterval(this.boxElements.resultBox.loading);
this.boxElements.detail.removeEventListener('DOMMouseScroll', this, false);
content.document.body.removeChild(this.boxElements.box);
this.boxElements =
content.document.removeEventListener('mousedown',this, false);
content.document.removeEventListener('mouseup',this, false);
content.document.removeEventListener('mousemove',this, false);
content.document.removeEventListener('keypass',this, false);
content.removeEventListener('unload', this, false);
this.originDocument.removeEventListener('mousedown',this, false);
setScrollbar: function(element){
if(!this.boxElements)
var detailBox = this.boxElements.
if(element && detailBox.scrollbar && detailBox.scrollbar.bar){
//移除原来的滚动条, 由detail滚动条切换到baidu try
element.removeChild(detailBox.scrollbar.bar);
this.setClassName(element, '_FgGTrDetailOverflow', false);
}catch(ex){}
detailBox.scrollbar.bar =
var scrollBox = element || detailBox,
contentBox = scrollBox.firstC
scrollBox.style.minWidth = '';
if(!contentBox)
//缓存宽高
var bdTab = detailBox.querySelector('._FgGTr-bd-tContent-current'),
WHTB = (bdTab && bdTab.WHTB || (bdTab && (bdTab.WHTB = {}))),
antiBlink = function(add){
//消除伸缩闪烁
bdTab || this.setClassName(this.boxElements.box, '_FgGTr-AntiBlink', add);
bdTab && this.setClassName(bdTab.parentNode, '_FgGTr-AntiBlink', add);
}.bind(this);
antiBlink(true);
setTimeout(function(){
var detailHeight = 150,
contentStyle = content.getComputedStyle(contentBox, null),
contentHeight = (bdTab && (typeof WHTB.H == 'number'))
? WHTB.H : parseInt(contentStyle.height),
contentWidth = (bdTab && (typeof WHTB.W == 'number'))
? WHTB.W : parseInt(contentStyle.width);
if(bdTab && !WHTB.H){
//如果未设置
WHTB.H = contentH
WHTB.W = contentW
if(contentHeight & 250) return antiBlink(false);
var scrollbar = content.document.createElement('div'),
thumb = content.document.createElement('div');
scrollbar.className = '_FgGTr-scrollbar';
thumb.className = '_FgGTr-thumb';
detailBox.scrollbar = {
scrollBox: scrollBox,
bar: scrollbar,
thumb: thumb,
status: false,
contentBox: contentBox,
barHeight: parseInt(detailHeight),
thumbHeight: Math.max(parseInt(detailHeight /
contentBox.offsetHeight * detailHeight), 10),
//上次滚动位置
if(bdTab){
contentBox.style.top = (!WHTB.T ? 0 : WHTB.T) + 'px';
thumb.style.top = (!WHTB.B ? 0 : WHTB.B) + 'px';
this.setClassName(scrollBox, '_FgGTrDetailOverflow', true);
if(contentWidth&=382){
contentWidth = 382
contentWidth += 12;
scrollBox.style.setProperty('min-width', contentWidth + 'px','important');
thumb.style.setProperty('height', detailBox.scrollbar.thumbHeight + 'px','important');
scrollbar.appendChild(thumb);
scrollBox.appendChild(scrollbar);
antiBlink(false);
}.bind(this), (bdTab && typeof WHTB.H == 'number') ? 0 : 50);
onScroll: function(event){
var od = this.boxElements.detail,
scroll = od.scrollbar,
bdTab = od.querySelector('._FgGTr-bd-tContent-current');
if(!scroll || !scroll.bar)
var scrollBox = scroll.scrollBox || od,
sbHeight = scroll.bar.offsetH
if(event.type == 'mousedown'){
if(event.target == scroll.thumb){
scroll.status =
scroll.Y = event.clientY - scroll.thumb.offsetT
}else if(event.type == 'mousemove'){
var T = event.clientY - scroll.Y,
Y = 0, p = 0;
if(T &= scroll.bar.offsetTop){
Y = scroll.bar.offsetT
}else if(T &= sbHeight - scroll.thumbHeight){
Y = sbHeight - scroll.thumbH
p = (scroll.thumb.offsetTop - scroll.bar.offsetTop) /
(sbHeight - scroll.thumbHeight);
if(p&=0.95){
}else if(p&0.05){
scroll.contentBox.style.top =
parseInt((scrollBox.offsetHeight -
scroll.contentBox.offsetHeight) * p) + 'px';
scroll.thumb.style.top = Y +'px';
if(bdTab){
if(!bdTab.WHTB)
bdTab.WHTB = {};
bdTab.WHTB.B = Y
}else if(event.type == 'DOMMouseScroll'){
if(scrollBox.contains(event.target)){
event.preventDefault();
var s = parseInt(0 - event.detail * 4),
ct = scroll.contentBox.offsetTop + s,
cy = 0, p = 0, t = 0,
outerHeight = scrollBox.offsetHeight,
innerHeight = scroll.contentBox.offsetH
if(ct &= outerHeight - innerHeight){
cy = outerHeight - innerH
}else if(ct&=0){
p = cy/(outerHeight - innerHeight);
if(p&=0.95){
}else if(p&0.05){
t = parseInt((sbHeight - scroll.thumbHeight) * p);
}else if(t&= sbHeight - scroll.thumbHeight){
t = sbHeight - scroll.thumbH
scroll.thumb.style.top = parseInt(t*p) + 'px';
scroll.contentBox.style.top = cy + 'px';
if(bdTab){
if(!bdTab.WHTB)
bdTab.WHTB = {};
bdTab.WHTB.B = parseInt(t*p);
//渐变过渡
this.setClassName(scroll.bar, '_FgGTrScrolling', true);
if(event.type == 'DOMMouseScroll' && scroll.contentBox.contains(event.target))
this.setClassName(scroll.contentBox, '_FgGTrScrolling', true);
clearTimeout(scroll.scrTimer);
scroll.scrTimer = setTimeout(function(){
if(event.type == 'DOMMouseScroll'){
this.setClassName(scroll.contentBox, '_FgGTrScrolling', false);
this.setClassName(scroll.bar, '_FgGTrScrolling', false);
}.bind(this), 500);
handleEvent: function(event){
var box = this.boxElements.
var target = event.target,
drag = box.drag,
o = this.boxE
if(!event.altKey && event.type == 'mousedown' && event.button==0){
if(box.contains(target)){
switch(target){
case o.soundButton:
this.playSound();
case o.toggleButton:
this.setOptionsBox();
case o.saveButton:
this.setPref();
this.toggleHidden();
case o.cancelButton:
this.toggleHidden();
case o.swapButton:
this.swapLanguages();
if(this.onScroll(event))
var eTarget = event.explicitOriginalTarget,
oTarget = event.originalT
if ((o.detail.contains(target)
|| o.resultBox.contains(target)
|| o.phoneticBox.contains(target))
&& eTarget.nodeType == 3 && oTarget.nodeType == 1
|| target.classList.contains('_FgGTrOptionsSelect')
drag.status =
this.setClassName(o.box, '_FgGTrOptionsGrab', true);
drag.X = event.clientX - box.offsetL
drag.Y = event.clientY - box.offsetT
this.removeTranslateBox();
if(!~Array.prototype.slice.call(box.querySelectorAll('._FgGTrOptionsSelect'))
.indexOf(target) &&
(drag.status || (o.detail.scrollbar && o.detail.scrollbar.status))){
event.preventDefault();
if(event.type == 'mouseup' || event.type == 'keypass'){
if(event.type == 'mouseup'){
box.drag.status =
o.detail.scrollbar && (o.detail.scrollbar.status = false);
this.setClassName(o.box, '_FgGTrOptionsGrab _FgGTrOptionsGrabbing', false);
clearTimeout(o.selectionTimer);
if(((o.detail.children[0] && o.detail.children[0] != target &&
o.detail.children[0].contains(target))
&& !(target.classList && target.classList.contains('_FgGTr-D-t1-Ci'))
) || event.altKey || event.button!=0
o.selectionTimer = setTimeout(function(){
var selection = content.getSelection();
if(selection.focusNode
&& box.contains(selection.focusNode)
&& selection.toString().replace(/\s/g, '') !='')
for (var i in this.preSelection){
selection.addRange(this.preSelection[i]);
}.bind(this),50);
if(event.type == 'mousemove'){
if(drag.status){
this.setClassName(o.box, '_FgGTrOptionsGrabbing', true);
this.setClassName(o.box, '_FgGTrOptionsGrab',false);
box.style.left = event.clientX - drag.X + 'px';
box.style.top
= event.clientY - drag.Y + 'px';
if(o.detail.scrollbar && o.detail.scrollbar.status){
this.onScroll(event);
if(o.detail.moreUl && o.detail.moreUl.contains(target)){
Array.prototype.forEach.call(o.detail.moreUl.children, function(li){
if(li.contains(target)){
li.getElementsByTagName('ul')[0].s}

我要回帖

更多关于 网贷不还 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信