exsidas
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору /*Initialization Code*/ // // Translate от 10.02.2016. ...............Edit6 // Настройка функций кликов мыши для кнопки ............... this.onclick = this.oncontextmenu = e => { if(e.button == 0) { var sel = getSelect(); sel ? translateText(sel) : translatePage(); }; if(e.button == 1) translateText(gClipboard.read(), true); if(e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) { e.preventDefault(); menu.showPopup(self, -1, -1, "popup", "bottomleft", "topleft"); }; }; var background = 'none', fontSize = 'medium'; // фон и размер шрифта окошка перевода var winWidth = 0.4, winHeight = 0.3; // ширина и высота окошка перевода относительно размера страницы var tmp1, tmp2 = '', lit = /[+%\w-.А-ЯЁа-яё]/; // Создать меню ............... var array = [{ label: "Перевод текста в маленьком окошке", checkbox: '', value: 'Translate.textInPopup' }, { label: "Перевод текста в двойным правым кликом", checkbox: '', value: 'Translate.textWithDoubleRightClick' }, { label: "Перевод страницы в новой вкладке сразу справа", checkbox: '', value: 'Translate.nextPage' }, { label: "Перевод выделенного текста из контекстного меню", checkbox: '', value: 'Translate.textFromContextMenu' }, { separator: '' }, { label: "Удалять подсказки в переводчиках", checkbox: '', value: 'Translate.noTooltipForTranslate', func: '' }, { label: "Удалять панель управления в переводчике Googlе", checkbox: '', value: 'Translate.removeGoogleTranslatorHeader', func: '' }, { separator: '' }, { label: "Перевод страницы в обычном переводчике Google", radio: '', value: 'google' }, { label: "Перевод страницы с заменой текста в переводчике Google", radio: '', value: 'googleBookmarklet' }, { label: "Перевод страницы с заменой текста в переводчике Microsoft", radio: '', value: 'microsoftBookmarklet' } ]; var menu = self.appendChild(document.createElement("menupopup")); array.forEach((m) => { if("separator" in m) { menu.appendChild(document.createElement("menuseparator")); return }; var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.label); if("radio" in m) { mItem.setAttribute("type", "radio"); mItem.setAttribute('checked', cbu.getPrefs("Translate.pageIn") == m.value); mItem.onclick = () => cbu.setPrefs("Translate.pageIn", m.value); } if("checkbox" in m) { mItem.setAttribute('type', 'checkbox'); mItem.setAttribute('checked', cbu.getPrefs(m.value)); mItem.onclick = () => cbu.setPrefs(m.value, !cbu.getPrefs(m.value)); } if("func" in m) mItem.addEventListener("command", () => toggleGoogleTranslatorStyle()); menu.appendChild(mItem); }); menu.setAttribute("onclick", "event.stopPropagation()"); // Получить выделенный текст из страницы или false ............... function getSelect() { let selA = gBrowser.contentDocument.defaultView.getSelection(), selB = gContextMenuContentData, sel = ''; selA = selA ? selA.toString() : ''; selB = selB ? selB.selectionInfo.text.toString() : ''; sel = selA.length > selB.length ? selA : selB; return(sel == '') ? false : sel; }; // Удалить панель управления в переводчике Googlе и подсказки в переводчиках ............... function toggleGoogleTranslatorStyle(arg) { var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); try { sss.unregisterSheet(self.uri, 0) } catch(e) {}; if(cbu.getPrefs("Translate.removeGoogleTranslatorHeader")) { // панель управления var removeHeader = '\ @-moz-document domain("translate.google.com") {\ #gb, #gt-bbar, #gt-c:not([class="g-section"]) { display: none !important; }\ #contentframe { top: 0 !important; }\ }'; }; if(cbu.getPrefs("Translate.noTooltipForTranslate")) { // подсказки в переводчиках var noPopup = '\ /*Microsoft*/\ DIV[translate="no"] { display: none !important; }\ *[lang="ru"] {\ color: black !important;\ background-color: transparent !important;\ }\ /*Google*/\ @-moz-document domain("translate.google.com") {\ .jfk-tooltip { display: none !important; }\ }\ @-moz-document regexp("^https?://translate\.google\..*") {/**/}\ @-moz-document domain("translate.googleusercontent.com") {\ span[onmouseout][onmouseover][style] { background-color: transparent !important; }\ .gmnoprint { display: none !important; }\ }\ .goog-text-highlight {\ background-color: transparent !important;\ border: none !important;\ box-shadow: none !important;\ }\ .goog-tooltip.skiptranslate { display: none !important; }\ '; }; self.css = removeHeader + noPopup; if(!!self.css) { self.uri = makeURI("data:text/css," + encodeURIComponent(self.css)); sss.loadAndRegisterSheet(self.uri, 0); }; arg && addDestructor(() => sss.unregisterSheet(self.uri, 0)); }; toggleGoogleTranslatorStyle(true); // Перевод страницы ............... function translatePage() { var translator = cbu.getPrefs("Translate.pageIn"); // перевод страницы в обычном переводчике Google в новой активной вкладке или текущей вкладке if(translator == "google") { var url = "http://translate.google.com/translate?u=" + encodeURIComponent(content.location) + "&hl=ru&ie=UTF-8&sl=auto&tl=ru"; if(cbu.getPrefs("Translate.nextPage")) { let pos = parseInt(gBrowser.mCurrentTab._tPos, 10) + 1; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab(url), pos); } else { loadURI(url); } return; } // перевод страницы с заменой текста на странице в переводчике Microsoft или Google tmp2 = cbu.getPrefs("security.mixed_content.block_active_content"); cbu.setPrefs("security.mixed_content.block_active_content", false); setTimeout(() => { cbu.setPrefs("security.mixed_content.block_active_content", tmp2); tmp2 = '' }, 15000); if(cbu.getPrefs("Translate.nextPage")) { tmp1 = cbu.getPrefs("browser.tabs.insertRelatedAfterCurrent"); cbu.setPrefs("browser.tabs.insertRelatedAfterCurrent", true); setTimeout(() => cbu.setPrefs("browser.tabs.insertRelatedAfterCurrent", tmp1), 300); gBrowser.getBrowserForTab(gBrowser.selectedTab = gBrowser.duplicateTab(gBrowser.mCurrentTab)) .addEventListener("pageshow", function c(e) { this.removeEventListener(e.type, c); if(content.document.location.protocol == 'about:') { document.getElementById("appcontent").addEventListener("DOMContentLoaded", function l(ev) { let winT = ev.originalTarget.defaultView; if(winT.frameElement) { return; } else { this.removeEventListener(ev.type, l); setTimeout(() => runBukmarklet(), 300); } }); } else setTimeout(() => runBukmarklet(), 300); }); } else runBukmarklet(); // запустить букмарклет для перевода function runBukmarklet() { content.document.location = (translator == "microsoftBookmarklet") //? "javascript:var s = content.document.createElement('script'); s.type = 'text/javascript'; s.src = 'http://labs.microsofttranslator.com/bookmarklet/default.aspx?f=js&to=ru'; content.document.body.insertBefore(s, document.body.firstChild); void(0);" ? "javascript:var div=content.document.createElement('DIV');div.innerHTML=" + '"' + "<div id='MicrosoftTranslatorWidget' class='Dark' style='color:white;background-color:#555555'></div>" + '"' + ";content.document.body.insertBefore(div, document.body.firstChild);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=true&settings=auto&from=&defaultLanguage=ru';var p=document.getElementsByTagName('head')[0]||document.documentElement;p.insertBefore(s,p.firstChild); }},0); void(0);" : "javascript:{var d=document; var b=d.body; var o=d.createElement('script');o.setAttribute('src','http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit&hl=ru');o.setAttribute('type','text/javascript');b.appendChild(o); var v=b.insertBefore(d.createElement('div'),b.firstChild);v.id='google_translate_element';v.style.display='none'; var p=d.createElement('scri'+'pt');p.text='function%20googleTranslateElementInit(){var%20tElem%20=%20new%20google.translate.TranslateElement({pageLanguage:%22%22},%22google_translate_element%22);setTimeout(function()%20{%20tElem.showBanner(true);%20},100);}';p.setAttribute('type','text/javascript');b.appendChild(p);}void%200" }; }; // Обработчик следит за двойным правым кликом мыши на странице и запускает перевод выделенного текста ............... addEventListener("dblclick", e => { if(e.button && cbu.getPrefs("Translate.textWithDoubleRightClick")) { e.preventDefault(); document.getElementById("contentAreaContextMenu").hidePopup(); translateText(getSelect()); }; }, false, gBrowser); // Перевод выделенного текста из контекстного меню ............... var contextMenu = document.getElementById("contentAreaContextMenu"); var mItem = contextMenu.insertBefore(document.createElement("menuitem"), contextMenu.children[1]); mItem.setAttribute("label", "Перевод выделенного текста"); mItem.onclick = () => translateText(getSelect()); addEventListener("popupshowing", () => { mItem.hidden = !cbu.getPrefs("Translate.textFromContextMenu") || !gContextMenu.isTextSelected; }, false, contextMenu); addDestructor(() => { if(tmp2 != '') cbu.setPrefs("security.mixed_content.block_active_content", tmp2); mItem.remove(); }); // Перевести текст в Google переводчике в новой вкладке сразу справа или в маленьком окошке ............... function translateText(textOrig, clipboard) { if(textOrig == false) return; textOrig = textOrig.replace(/#/g,'~'); var text = ''; for(var ii = 0; ii < textOrig.length; ii++) { if(lit.test(textOrig.charAt(ii))) { text = text + textOrig.charAt(ii); } else { try {text = text + encodeURIComponent(textOrig.charAt(ii))} catch(err) {text = text + '%20'}; } }; // перевод в Google переводчике текста if(!cbu.getPrefs("Translate.textInPopup")) { var url = "http://translate.google.com/translate_t?hl=ru#auto|ru|" + text; let pos = parseInt(gBrowser.mCurrentTab._tPos, 10) + 1; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab(url), pos); return; }; var width = (0) || winWidth * gBrowser.boxObject.width; var height = (0) || winHeight * gBrowser.boxObject.height; var fWin = document.commandDispatcher.focusedWindow, bcr; var getSele = fWin ? fWin.getSelection() : ''; // получит координаты у кнопки или у выделенного текста if(clipboard && cbu.getPrefs("Translate.textInPopup")){ bcr = self.getBoundingClientRect(); } else { if(getSele){ try {bcr = getSele.getRangeAt(0).getBoundingClientRect()} catch(er) {bcr = gContextMenuContentData.popupNode.getBoundingClientRect()}; } else bcr = gContextMenuContentData.popupNode.getBoundingClientRect(); }; var posX = fWin.mozInnerScreenX + bcr.left; var posY = fWin.mozInnerScreenY + bcr.bottom + 3; var deltaX = posX + width - (fullScreen ? screen.width : screen.availWidth); if(deltaX > 0) posX -= deltaX; var deltaY = posY + height - (fullScreen ? screen.height : screen.availHeight); if(deltaY > 0) posY -= deltaY; if(posY < 35) posY = 35; var win = window.open('data:text/html;charset=utf-8, <html contenteditable/><title>Получение перевода . . . .</title>', "", "outerWidth=" + width + ", outerHeight=" + height + ", screenX=" + posX + ", screenY=" + posY + ", status=no, scrollbars=yes, resizable=yes"); var beg = "http://translate.google.com/translate_t?prev=hp&hl=ru&js=y&text="; var end = "&file=&sl=auto&tl=ru&history_state0=#"; var url = beg + text + end; var req = new XMLHttpRequest(); req.open("GET", url, true); req.onload = () => { var res = req.responseText; var suHTML = Cc["@mozilla.org/feed-unescapehtml;1"].getService(Ci.nsIScriptableUnescapeHTML); var doc = document.implementation.createHTMLDocument(""); doc.body.appendChild(suHTML.parseFragment(res, false, null, doc.body)); var resultBox = doc.getElementById("result_box"); if(resultBox) { var ruHTML = resultBox.innerHTML; var dataURL = 'data:text/html;charset=utf-8, <html contenteditable/><title>Перевод (предоставлен Google) </title>'; dataURL += '<style>body { background-color: ' + background + '; font-size: ' + fontSize + ' }</style>'; dataURL += ruHTML + '</body></html>'; } else { var dataURL = 'data:text/html;charset=utf-8, <html contenteditable/><title>Ошибка получения. Возможно, слишком большой фрагмент</title>'; } win.location.href = dataURL; win.focus(); // закрывать окошко перевода кликом на странице gBrowser.addEventListener("click", clickToClose, false); function clickToClose(e) { gBrowser.removeEventListener("click", clickToClose, false); if(win) win.close(); }; setTimeout(() => win.addEventListener('unload', function() { gBrowser.removeEventListener("click", clickToClose, false); }), 200); }; req.channel.loadFlags |= req.channel.LOAD_FROM_CACHE; // if possible req.send(null); }; // Подсказка у кнопки ............... this.tooltipText = "Translate \nЛ: Перевести страницу / выделенный текст \nС: Перевести текст из буфера обмена \nП: Меню \nДП: CB меню"; | Всего записей: 925 | Зарегистр. 18-10-2010 | Отправлено: 14:25 08-11-2017 | Исправлено: exsidas, 14:27 08-11-2017 |
|