Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Расширения для Firefox/Mozilla Firefox Extensions (часть 9)

Модерирует : gyra, Maz

Maz (02-04-2019 17:51): Переезжаем: Расширения для Firefox/Mozilla Firefox Extensions (часть 10)  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

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
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » Расширения для Firefox/Mozilla Firefox Extensions (часть 9)
Maz (02-04-2019 17:51): Переезжаем: Расширения для Firefox/Mozilla Firefox Extensions (часть 10)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru