скачивается файл размером 159 кб. А раньше я качал этот файл размером 13 кб.
Это поправимо ?
Да конечно, этот файл весит всего 11,9 KB, и его можно забрать здесь
Рекомендую, перезагрузить ваше устройство с полной переустановкой системы, на макос это делается так...
Жизнь иногда такое выкидывает, что хочется подобрать...
На форуме
Да, глючит этот скрипт с загрузкой метод Aris-t2 и метод Endor8, хотя в UCF работает прекрасно.
хотя рекомендую, хотя в UCF работает прекрасно
Жизнь иногда такое выкидывает, что хочется подобрать...
На форуме
Видимо, UCF скрипты в неизменном виде нормально работать не будут.
Кроме того, один SingleHTML.jsm мало полезен! Из меню запускать скрипт неудобно.
Нужен ucf_hookClicks.js, чтобы сохранять страницы по клику на кнопке Загрузки или по сочетанию клавиш.
Рекомендую, перезагрузить ваше устройство с полной переустановкой системы, на макос это делается так...
Это шутка? Только винда требует перестановки при различных глюках системы. МакOS, также как Линукс, не имеет таких недостатков.
Отредактировано Dobrov (03-10-2023 01:15:07)
Отсутствует
Farby
Да конечно, этот файл весит всего 11,9 KB, и его можно забрать здесь...
Его и использую сейчас.
Dobrov
Ясно. Может быть уважаемый Dumby поможет в этом вопросе. Подождем.
Отсутствует
Dobrov
Дело в том, что UCF уже давно не обновляется автором. А искать его исправленную версию разными умельцами под новые выпуски Firefox тот ещё гемморой. Как то так.
Хотя я его использую на 91esr и на тестовой 115esr.
Отсутствует
Открываю Firefox, открываю вкладку, на ней скрипт работает. Можно сохранить. Открываю вторую вкладку, на ней скрипт не работает.
Хмм , я вижу это. Слетает хром-регистрация.
Она и должна слетать, а чтобы не слетала нужно где-то сохранить на неё ссылку.
И так и сделано, ссылка добавлена в ucfBox, но это, почему-то, не помогает.
Перенёс ссылку из ucfBox'а в конфигский сандбокс, и теперь, вроде, не слетает.
Вобщем, попробуй заменить sb[Symbol()] на globalThis[Symbol()]
Отсутствует
Дело в том, что UCF уже давно не обновляется автором. А искать его исправленную версию разными умельцами под новые выпуски Firefox тот ещё гемморой.
UCF (по ссылке в родной теме) работает на версиях Firefox 78-118.
посмотрел код поддержки методов Aris-t2 и Endor8. По моему, их качество проигрывают по сравнению с UCF,
да и обновлялись они в 2018 году, а UCF на 2 года новее.
Отсутствует
Dumby
Вобщем, попробуй заменить sb[Symbol()] на globalThis[Symbol()]
Заменил, теперь скрипт прекрасно заработал на всех открытых вкладках, как и в UCF !
Спасибо Вам за ваше внимание.
Dobrov
Вам тоже спасибо.
Отсутствует
посмотрел код поддержки методов Aris-t2 и Endor8. По моему, их качество проигрывают по сравнению с UCF,
Они просты, они работают, а ucf это целый комплекс, досконально разбирающихся в нем дай бог чтобы с десяток нашелся, вследствие чего при любом катаклизме все мольбы к Dumby, и в те моменты оба форума забиты постами, почему перестало работать.
да и обновлялись они в 2018 году, а UCF на 2 года новее.
А нужны ли обновления ради обновлений? Aris-t2 держит руку на пульсе, свои скрипты регулярно обновляет, проблемы с ними и с активацией практически отсутствуют, в поддержании работоспособности при смене версий браузера практически не нуждается, вроде больше ничего и не надо. Скрипты этих двух товарищей очень популярны среди иноязычных пользователей, и они совсем ничего не знают о ucf, такое сложилось мнение.
В конечном счете у юзера есть альтернативный выбор, каждый возьмет, что его устроит.
Отсутствует
Dumby
Вот здесь Вы мне помогли со скриптом google-translate.js.
Возможно ли его сделать для загрузчика метода Endor8.?
Сейчас в контекстном меню появляется пункт Перевод из буфера, да и он не работает.
Код скрипта google-translate.js там .
Скрипт google-translate-loader.js у меня сейчас такой:
({ async init() { await delayedStartupPromise; var code = Cu.readUTF8URI(Services.io.newURI( "chrome://scripts/google-translate.js" )); var addEventListener = (...args) => { var trg = args[3]; if (!trg) trg = args[3] = window; trg.addEventListener(...args); this.handlers.push(args); } new Function( "_id,xhtmlns,addDestructor,addEventListener,gClipboard", code ).call( this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml", () => {}, addEventListener, {read: () => readFromClipboard()} ); addEventListener("unload", this, {once: true}); }, handlers: [], handleEvent() { for(var args of this.handlers) args.pop().removeEventListener(...args); delete this.handlers; } }).init();
Отсутствует
Dumby, на счет urlbar-memory-indicator заметил, что в 117 звездочка была левее индикатора, как в 118.0 - не знаю, а в 118.0.1 уже правее, причем без разницы - after или before
win.document.getElementById("star-button-box").after(clone);
Пока поправил стилем
Отсутствует
Возможно ли его сделать для загрузчика метода Endor8.?
Сейчас в контекстном меню появляется пункт Перевод из буфера, да и он не работает.
Скрипт google-translate-loader.js у меня сейчас такой
Это что ещё такое: «chrome://scripts/google-translate.js»?
Даже если бы метод Endor8 содержал какую-то свою хром-регистрацию,
а он не содержит, то такой адрес просто невозможен сам по себе.
Да и зачем это вообще, можно ведь прямо из файла читать.
И, нужно говорить где у тебя эти файлы лежат и что прописано в userChrome.js
а то непонятно. Такой google-translate-loader.js работать не может,
но какой-то пункт появляется, значит google-translate.js в авто-папке лежит,
а это неправильно, нужно либо сменить расширение, либо положить в другую папку.
Ладно, вот совмещённый вариант. Не слишком оптимально, зато гадать не надо.
location.href.endsWith("://browser/content/browser.xhtml") && ({ async init(func) { await delayedStartupPromise; var code = func.toString(); code = code.slice(code.indexOf("{") + 1, -1).trim(); var addEventListener = (...args) => { var trg = args[3]; if (!trg) trg = args[3] = window; trg.addEventListener(...args); this.handlers.push(args); } new Function( "_id,xhtmlns,addDestructor,addEventListener,gClipboard,LOG", code ).call( this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml", () => {}, addEventListener, {read: readFromClipboard}, Cu.reportError ); window.addEventListener("unload", this, {once: true}); }, handlers: [], handleEvent() { for(var args of this.handlers) args.pop().removeEventListener(...args); delete this.handlers; } }).init(() => { // Здесь код google-translate.js });
Код скрипта google-translate.js там .
Там loadURI(url, торчит, надо заменить, например, на fixupAndLoadURIString(url,
Ещё вот этот кусок совсем какой-то левый, возможно так подойдёт
/* ((id, g) => addDestructor(reason => id in g && g[id].destroy(reason)) || id in g || ({ actions: [{ title: "Перевод из буфера", tooltip: "Перевод из буфера", iconURL: gticon, id: "TranslateBufer1", _insertBeforeActionID: "copyURL", // onCommand: (e, btn) => e.view.BrowserReloadOrDuplicate(e) onCommand: (e, btn) => ujs_google_translat('auto|ru') }], init() { g[id] = this; this.actions = this.actions.map(action => { action.extensionID = "custombuttons@xsms.org"; return g.PageActions.addAction(new g.PageActions.Action(action)); }); }, destroy(reason) { if (reason[5] != "e") return; delete g[id]; for(var action of this.actions) action.remove(); } }).init())( "CBPageActionsMaker", Cu.import("resource:///modules/PageActions.jsm", {}) ); */ (id => { var action = PageActions.actionForID(id); if (!action) { var obj = {id, iconURL: gticon, onCommand(e) {this[e.view.browsingContext.id]("auto|ru");}}; obj.title = obj.tooltip = "Перевод из буфера"; action = PageActions.addAction(new PageActions.Action(obj)); } action[id = browsingContext.id] = ujs_google_translat; addEventListener("unload", () => delete action[id]); })("TranslateBufer1");
/* var grabX = e.clientX, grabY = e.clientY, origX = parseInt(w.style.left), origY = parseInt(w.style.top); var mouseMove = function(ev){ w.style.left = origX+ev.clientX-grabX+'px'; w.style.top = origY+ev.clientY-grabY+'px'; }; */ var st = w.style; var mouseMove = e => { st.top = parseInt(st.top) + e.movementY + "px"; st.left = parseInt(st.left) + e.movementX + "px"; }
заметил, что в 117 звездочка была левее индикатора, как в 118.0 - не знаю, а в 118.0.1 уже правее
Странно, я попробовал на 117 добавить код в custom_script_win.js по событию "load",
и у меня звёздочка справа от индикатора.
Добавляется то всё правильно, а затем инициализируется модуль PageActions
и переставляет звёздочку в конец.
То есть, получается не по-задумке.
Можно попробовать подождать, пусть она сначала передобавится.
/* (this.init = win => { */ (this.init = async win => { await win.delayedStartupPromise;
Отсутствует
Dumby
Ладно, вот совмещённый вариант.
Все сделал как Вы сказали, сделал все правки, работает прекрасно.
В userChrome.js прописано так:
Поместил его в папку с остальными скриптами.
Огромное спасибо Вам за помощь !
Вот такой у меня сейчас google_translate.js
location.href.endsWith("://browser/content/browser.xhtml") && ({ async init(func) { await delayedStartupPromise; var code = func.toString(); code = code.slice(code.indexOf("{") + 1, -1).trim(); var addEventListener = (...args) => { var trg = args[3]; if (!trg) trg = args[3] = window; trg.addEventListener(...args); this.handlers.push(args); } new Function( "_id,xhtmlns,addDestructor,addEventListener,gClipboard,LOG", code ).call( this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml", () => {}, addEventListener, {read: readFromClipboard}, Cu.reportError ); window.addEventListener("unload", this, {once: true}); }, handlers: [], handleEvent() { for(var args of this.handlers) args.pop().removeEventListener(...args); delete this.handlers; } }).init(() => { // Здесь код google-translate.js //Google, var langFrom_google_text = "auto";//авто var langTo_google_text = "ru"; //Назначаем иконки var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg=="; var gticon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADKElEQVR42p2TX2hTdxTHPzfJTW6T3qQmapvWabUbog+udp3kYeLQ4f6wiZQNtjlXHyZaBYe6TekYVGRQYexFscOtuD7UdWxzMtAXEbZStKIbDsaUCbVj9o8mTW+aNrlJbu5vJ8Ex2OMO/Lj87jnne873nO9PSyTV3tkAfYi5NhQ1MB1Ijc3ijN+D7CQh28YK+GHDMyxpjlJTkmAdQi5dWvOsUrYkGB5QC5Kcg/aFBxxqqycmcY38a/1yTqYgMw8ByfFKjtZ4V6myCeW8IApyfOw2155fw1DG4dOJJK1r45x5BPDUpZuMr2uXSuAvgBMQgOitjLJNn7iDSJP0rIJ35dt19TeGoi0Es1MMP72KFvm3+88phuYM3HCd3ObQizpa/cW7Kh020E0Tz1yOUxvjdIr7o6t/cLpkEJqZp7s5zN62ZewfnWLQ9VIIBqodBdI5tIbBG8oKhSAaJZDN8tpSP5+3L8eVgLbeAdKal7NH3mKL3FcOXCfV1ITjc7FLFrWZIlpt/4+qEA7hLRrCwk/RusOXu7ax8xHvGTkVgi/89As/T8ia9EUyghKOWSaYyqNx8oIiuEgcshetsooceibJinvTfNH1DpseD3LHSZE4eprs6k24NQaevI1fF8q5FJqv9xvlmFLdkKZlhb77E8TdIlFD54OOl3mzdXm1k+sP0jzbdwF7cRhsj8ysAWYnpYPeQfXPnn3JJG8/sZT+PW8gkuDbkWEiRh3b29dV/edujNE5dB4nHJSCUrQsTdP9mUKrCKHA5piHK+918quVp/VoD9W9uhGejNRx6+N9VZAmoTJZmhbK4vR7BGDPCQEQ/qU8R15aT2/Hi/R8PcyxyyMyVBmaXwIfPiTVf5yYHiF28ARpOyuqk3nJ4DV2HFc4SamUZ3vrGr7vPlitFNraQc4SzZZt6ptWMv3DAOdGrrGj7yvR+2KYr5A0BeCVAwqvBQuyMG+MTzp3cvj15/ivfXfzNq++/yFEIlD7GFjZ6uPRaE4oGuNQI68jIINJu0QbTFoadIJlL7lSgb8sxbSVEb8geUUVtkh55r50MY5Wec6jibV9/A9LjP7e9TdFQScjW9P1XAAAAABJRU5ErkJggg=="; function GetXmlHttpObject(){ if (window.XMLHttpRequest){ return new XMLHttpRequest();} if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP");} return null; }; var lc = navigator.lastClick = {}; addEventListener("mouseup", e => { if (e.button) return; lc.X = e.screenX - mozInnerScreenX; lc.Y = e.screenY - mozInnerScreenY; }, false, gBrowser.tabpanels || 1); var createWindow = function(text, status, title, id, pos, size){ var win = window, doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId); var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()}; if(w)w.closeWin(); w = doc.createElementNS(xhtmlns, 'div'); w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:2px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#eaeaea;padding-top:0px;border-radius:4px;box-shadow:0 0 15px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");')); w.id = wId; w.closeWin = function(){ doc.removeEventListener('keydown', keyDown, false); this.parentNode.removeChild(this); }; w.addEle = function(str, style){ var ele = doc.createElementNS(xhtmlns, 'div'); ele.setAttribute('style', style); if(str){ ele.innerHTML = str; for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){ el = all[i]; if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){ el.parentNode.removeChild(el); } else{ for(var att = el.attributes, j = att.length; j--;){ if(/^on[a-z]+$/i.test(att[j].name))att[j].value = ''; } } } }; return this.appendChild(ele); }; w.addEle1 = function(str, style){ var ele = doc.createElementNS(xhtmlns, 'textarea'); ele.setAttribute('style', style); if(str){ ele.innerHTML = str; for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){ el = all[i]; if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){ el.parentNode.removeChild(el); }else{ for(var att = el.attributes, j = att.length; j--;){ if(/^on[a-z]+$/i.test(att[j].name))att[j].value = ''; } } } }; return this.appendChild(ele); }; var img = doc.createElementNS(xhtmlns, 'div'); img.setAttribute('style', 'display:block;float:right;width:16px;height:16px;padding:0;margin-top:2px;margin-right:1px;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQUlEQVR4Xm2SPUhbURTHfzfNJ4nU0Axx7CJCN2kQtIgVCtq6OdQuBUftWIQqFNsKDo6iHTqIqN3a0kklUKTS2AZrcOjioFtRjFWUfH+803cS9GHwB4dzcu75/+8L9xgaSEDbLXhaASzAyXAMn5/DHxwwjeJgKLRxd3Q0atxuLhGgWqmQmp9PJ7LZJ5Ow3WhQFweDG20LC1FfRwc3kUsm+T48fPIzl3s8VTdxxLt+/2FhdlZkc1MkmdR8Pba2ajlrz3z1+9OvIOaIfb7DwsSEyNKSyM6OSLksEo/rbw2ttadntV7Gnv3k86VfqskvmDzv7hZ580Zkelrk4kJqFIsii4satVrRs+rYmBQHBuRvS4u8g/fuCmDOz+HgAIWpKRgfh3AYhoZQ8Hqxjo4o9PdT3d1FcQEl8KoBnJ7C/j6KZkZGYG4OIhEUFed7erD29q69jGrd1qVBqcQVKgwEuMSEQhjtXRk4JvW/kM1i2WGMga4uzMoKBIOIfbNiolEC6+uU+/qQRALFA1QBlwVYxmBcLmhuxqytQSgEKu7t1dBavwKvbeINh/Has2IMqnXpem4bky6qWLdvZgaOj2FwEHNyoqG19vRMZ8jZs1+NOfsNcZS3EFvzeNL51laRe/dEYrFadsLpZeyZDx7P6QN4Btwx1OE1xO4HAquP2tsjAZ+Pm8gWi3xMpc6W8/kXPyAO/DM4oOsZa2pafdjZGXF7PAgOpXKZL4nE2XImcyUGMDSg63kbhgvgtYCq8+akIL4J3y7Fyn+DokZOnLlMyQAAAABJRU5ErkJggg==");background:-o-skin("Caption Close Button Skin");'); img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close'; img.addEventListener('click', function(){this.parentNode.closeWin()}, false); w.appendChild(img); var title = w.addEle(title, 'display:table;color:#000;font:17px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;'); title.onclick = e => { e.preventDefault(); var url = e.target.href; // Здесь открываем url как хотим. var ctabpos = gBrowser.selectedTab._tPos +1; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addWebTab(url), ctabpos); doc.getElementById(wId).closeWin(); } var cnt = w.addEle1(text, 'display:block;border:1px solid #aaa;padding-bottom:3px;padding-left:3px;background-color:#fafcfe;color:#000;font:17px Times New Roman;width:310px;height:160px;overflow:auto;cursor:text;-moz-user-focus:normal;-moz-user-select:text;'); cnt.contentEditable="true"; cnt.context="contentAreaContextMenu"; w.addEle(status, 'display:table;font:12px Times New Roman;font-weight:bold;color:blue;width:auto;height:auto;padding-top:2px;margin:0 3px;cursor:pointer;'); w.addEventListener('mousedown', function(e){ if(e.target == w){ e.preventDefault(); var st = w.style; var mouseMove = e => { st.top = parseInt(st.top) + e.movementY + "px"; st.left = parseInt(st.left) + e.movementX + "px"; } doc.addEventListener('mousemove', mouseMove, false); doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false); } }, false); doc.documentElement.appendChild(w); if(size){ cnt.style.height = size.height; cnt.style.width = size.width; } else{ for(var i = 3; i < 10; i++){ if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){ cnt.style.height = 80*i+'px'; cnt.style.width = 160*i+'px'; } else break; } }; var docEle = (doc.compatMode == 'CSS1Compat' && win.postMessage) ? doc.documentElement : doc.body; var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight; if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0}; if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0}; var hW = parseInt(w.offsetWidth/2); w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px'; w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px'; w.style.visibility = 'visible'; doc.addEventListener('keydown', keyDown, false); return w; }; var getHash = function (txt) { TKK=eval('((function(){var a\x3d817046147;var b\x3d-335196159;return 410049+\x27.\x27+(a+b)})())'); function sM(a) { var b; if (null !== yr) b = yr; else { b = wr(String.fromCharCode(84)); var c = wr(String.fromCharCode(75)); b = [b(), b()]; b[1] = c(); b = (yr = window[b.join(c())] || "") || "" } var d = wr(String.fromCharCode(116)) , c = wr(String.fromCharCode(107)) , d = [d(), d()]; d[1] = c(); c = "&" + d.join("") + "="; d = b.split("."); b = Number(d[0]) || 0; for (var e = [], f = 0, g = 0; g < a.length; g++) { var l = a.charCodeAt(g); 128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = l >> 18 | 240, e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224, e[f++] = l >> 6 & 63 | 128), e[f++] = l & 63 | 128) } a = b; for (f = 0; f < e.length; f++) a += e[f], a = xr(a, "+-a^+6"); a = xr(a, "+-3^+b+-f"); a ^= Number(d[1]) || 0; 0 > a && (a = (a & 2147483647) + 2147483648); a %= 1E6; return c + (a.toString() + "." + (a ^ b)) } var yr = null; var wr = function(a) { return function() { return a } } , xr = function(a, b) { for (var c = 0; c < b.length - 2; c += 3) { var d = b.charAt(c + 2) , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d) , d = "+" == b.charAt(c + 1) ? a >>> d : a << d; a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d } return a }; return sM(txt); }; //----------Перевести текст из буфера в окне Google------------ var ujs_google_translat = function (dir){ var lng = 'ru'; var txt = gClipboard.read(); var l = dir.split('|'); var encTxt = encodeURIComponent(txt); var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)}; if (txt) { winWait(lng); var xhr = new XMLHttpRequest(); var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt); var urlt = "http://translate.google.com/translate_t?text="+encTxt+"&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&ujs=gtt"; xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); xhr.onreadystatechange = function() { try{ if (xhr.readyState == 4 && xhr.status == 200) { var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />")); for(var i = 0, n; n = tmp[0][i]; i++){ if(n[0])result += n[0].toString(); }; // result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>'; status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase(); createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick); } } catch (x){LOG(x)}; }; xhr.send('q=' + encodeURIComponent(txt)); }; }; //----------Перевести выделенный текст в окне Google------------ function ujs_google_translate (){ var lng = 'ru'; var txt = gContextMenu.selectionInfo.fullText; var encTxt = encodeURIComponent(txt); var winWait = function(lng){createWindow('', (lng == 'ru' ? 'Подождите идет перевод' : 'Wait, is going Translating')+'\u2026', 'Google Translate', '_gt', window.navigator.lastClick)}; if (txt) { winWait(lng); var xhr = new XMLHttpRequest(); // var url = 'https://translate.google.com/translate_a/single?client=t&sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt); var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt); var urlt = "http://translate.google.com/translate_t?text="+encTxt+"&sl=' + langFrom_google_text + '&tl=' + langTo_google_text +'&hl=' + lng + '&eotf=0&ujs=gtt"; xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); xhr.onreadystatechange = function() { try{ if (xhr.readyState == 4 && xhr.status == 200) { var result = '', status = '', tmp = JSON.parse(xhr.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />")); for(var i = 0, n; n = tmp[0][i]; i++){ if(n[0])result += n[0].toString(); }; // result = '<span style="background-color:inherit;color:inherit;font-size:inherit;font-family:Times,serif;">' + result + '</span>'; //status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + l[1].toUpperCase(); status = tmp[8][0][0].toUpperCase() + ' -\u203A ' + langTo_google_text.toUpperCase(); createWindow(result, status, '<a href="'+urlt.replace(/&/g,'&')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', window.navigator.lastClick); } } catch (x){LOG(x)}; }; xhr.send('q=' + encodeURIComponent(txt)); }; }; //----------Заменить текст переводом Google------------ function ujs_google_TexReplace() { var lng = 'ru'; var txt = gContextMenu.selectionInfo.fullText; if (txt) { var xhr = new XMLHttpRequest(); var url = 'https://translate.google.com/translate_a/single?client=gtx&sl=' + langFrom_google_text + '&tl=' + langTo_google_text + '&hl=' + lng + '&eotf=0&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t' + getHash(txt); function gettransdata(){ xmlhttp=GetXmlHttpObject(); xmlhttp.onreadystatechange=stateChanged; xmlhttp.open('POST', url, true); xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8'); xmlhttp.send('q=' + encodeURIComponent(txt)); } function stateChanged() { if (xmlhttp.readyState == 4 ) { var result = ''; var data = JSON.parse(xmlhttp.responseText.replace(/\[(?=,)/g, '[0').replace(/,(?=,|\])/g, ',0').replace(/\\n/g, "<br />")); for(var i = 0, n; n = data[0][i]; i++){ if(n[0])result += n[0].toString(); }; var msgName = _id + ":ReplaceSelectionRangeAt0"; var url = "data:," + encodeURIComponent( `addMessageListener("${msgName}", function listener(msg) { removeMessageListener("${msgName}", listener); var win = {}; Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager) .getFocusedElementForWindow(content, true, win); var sel = win.value.document.getSelection(); if (sel.isCollapsed) return; var range = sel.getRangeAt(0); range.deleteContents(); range.insertNode(range.createContextualFragment(msg.data)); });` ); function replace(tagString) { var mm = gBrowser.selectedBrowser.messageManager; mm.loadFrameScript(url, false); mm.sendAsyncMessage(msgName, tagString); } replace('<span>'+result+'</span>'); } } gettransdata(); } }; //--------Перевести страницу с Google-------------- function ujs_googlePage_translate() { var urlt = gBrowser.currentURI.spec; var url = "http://translate.google.com/translate?hl=ru&sl=auto&tl=ru&u="+ encodeURIComponent(urlt) + "&sandbox=1"; gBrowser. fixupAndLoadURIString(url, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() }); }; //Контекстное меню для перевода из буфера------------------------------------------- (function () { if ( document.getElementById("TranslateBufer") ) return; var contextMenu = document.getElementById("contentAreaContextMenu"); var Item = document.createXULElement("menuitem"); Item.setAttribute("Id", "TranslateBufer"); Item.setAttribute("label", "Перевод из буфера"); Item.setAttribute("class", "menuitem-iconic"); Item.setAttribute("image", mainicon); Item.addEventListener("command", function(){ujs_google_translat('auto|ru')}, false); contextMenu.insertBefore(Item, document.getElementById("context-viewpartialsource-selection") ); addDestructor(function() { contextMenu.removeChild( Item ) }); })(); (id => { var action = PageActions.actionForID(id); if (!action) { var obj = {id, iconURL: gticon, onCommand(e) {this[e.view.browsingContext.id]("auto|ru");}}; obj.title = obj.tooltip = "Перевод из буфера"; action = PageActions.addAction(new PageActions.Action(obj)); } action[id = browsingContext.id] = ujs_google_translat; addEventListener("unload", () => delete action[id]); })("TranslateBufer1"); //Контекстное меню для перевода страниц------------------------------------------- (function () { if ( document.getElementById("TranslatePage") ) return; var menu = document.createXULElement("menu"); var menuPopup = document.createXULElement("menupopup"); var contextMenu = document.getElementById("contentAreaContextMenu"); menu.id = "TranslatePage"; menu.setAttribute("label", "Перевести страницу"); menu.setAttribute("class", "menu-iconic"); menu.setAttribute("image", mainicon); contextMenu.insertBefore(menu, document.getElementById("context-viewsource") ); menu.appendChild( menuPopup ); addDestructor(function() { contextMenu.removeChild( menu ) }); var array = [ {label:"Google", func: ujs_googlePage_translate, image:gticon}, ]; array.forEach(function( m ) { if ( "separator" in m ) { menuPopup.appendChild( document.createXULElement("menuseparator") ); return }; var mItem = document.createXULElement("menuitem"); mItem.setAttribute("label", m.label); mItem.setAttribute("class", "menuitem-iconic"); mItem.setAttribute("image", m.image); mItem.addEventListener("command", m.func, false); menuPopup.appendChild( mItem ); }); addEventListener("popupshowing", function() { menu.hidden = gContextMenu.isTextSelected || gContextMenu.onImage || gContextMenu.onTextInput ; }, true, contextMenu ); })(); //Контекстное меню для перевода текста------------------------------------------- (function () { if ( document.getElementById("TranslateSelected") ) return; var menu = document.createXULElement("menu"); var menuPopup = document.createXULElement("menupopup"); var contextMenu = document.getElementById("contentAreaContextMenu"); menu.id = "TranslateSelected"; menu.setAttribute("label", "Перевести выделенный текст"); menu.setAttribute("class", "menu-iconic"); menu.setAttribute("image", mainicon); contextMenu.insertBefore(menu, document.getElementById("context-viewpartialsource-selection") ); menu.appendChild( menuPopup ); addDestructor(function() { contextMenu.removeChild( menu ) }); var array = [ {label:"В окне Google", func: ujs_google_translate, image:gticon}, { separator: ''}, {label:"Заменить текст переводом Google", func: ujs_google_TexReplace, image:gticon}, ]; array.forEach(function( m ) { if ( "separator" in m ) { menuPopup.appendChild( document.createXULElement("menuseparator") ); return }; var mItem = document.createXULElement("menuitem"); mItem.setAttribute("label", m.label); mItem.setAttribute("class", "menuitem-iconic"); mItem.setAttribute("image", m.image); mItem.addEventListener("command", m.func, false); menuPopup.appendChild( mItem ); }); addEventListener("popupshowing", function() { menu.hidden = !gContextMenu.isTextSelected; }, false, contextMenu ); })(); });
Отсутствует
Dumby
А можно ли адаптировать кнопку Attributes_Inspector для загрузчика метода Endor8.?
Сейчас, если его поместить в папку со всеми скриптами и запустить браузер, то он сразу запускается и можно смотреть атрибуты. Кнопка не создается.
Отсутствует
Dumby
А можно ли адаптировать кнопку Attributes_Inspector для загрузчика метода Endor8.?
Сейчас, если его поместить в папку со всеми скриптами и запустить браузер, то он сразу запускается и можно смотреть атрибуты. Кнопка не создается.
Ну, например, переименовываешь его в AttributesInspector.txt (txt, не js),
и кладёшь рядом скрипт, который создаст кнопку.
(async (cui, id, self) => cui?.getWidget(id)?.provider != "api" && cui.createWidget(self = { id, label: "Attributes Inspector", localized: false, onCreated(btn) { btn._handleClick = this.click; btn.setAttribute("tooltiptext", this.label); btn.onmouseenter = btn.onmouseleave = this.onmouse; btn.image = "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf///////////9EAKf/RACn/0QAp////////////0QAp///////////////////////RACn/0QAp/9EAKf/RACn////////////RACn/0QAp/9EAKf///////////9EAKf//////////////////////0QAp/9EAKf/RACn/0QAp////////////0QAp/9EAKf/RACn////////////RACn/0QAp////////////0QAp/9EAKf/RACn/0QAp/9EAKf///////////9EAKf/RACn/0QAp////////////0QAp/9EAKf///////////9EAKf/RACn/0QAp/9EAKf/RACn//////////////////////////////////////9EAKf/RACn////////////RACn/0QAp/9EAKf/RACn/0QAp///////////////////////////////////////RACn/0QAp////////////0QAp/9EAKf/RACn/0QAp/9EAKf///////////9EAKf/RACn/0QAp////////////0QAp/9EAKf///////////9EAKf/RACn/0QAp/9EAKf/RACn////////////RACn/0QAp/9EAKf///////////9EAKf/RACn////////////RACn/0QAp/9EAKf/RACn/0QAp/////////////////9EAKf/RACn////////////RACn/0QAp////////////0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/////////////////////////////////0QAp/9EAKf///////////9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf//////////////////////0QAp/9EAKf//////////////////////0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp////////////0QAp/9EAKf/RACn//////////////////////9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/RACn/0QAp/9EAKf/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="; }, click() { (this._handleClick = new this.ownerGlobal.Function(self.code).bind(this))(); }, get code() { delete this.code; var file = Services.dirsvc.get("UChrm", Ci.nsIFile); ["scripts", "AttributesInspector.txt"].forEach(file.append); return this.code = "this.focusedWindow && this.focusedWindow.focus();\n" + Cu.readUTF8File(file); }, onmouse: e => e.target.focusedWindow = e.type.endsWith("r") && Services.wm.getMostRecentWindow(null) }))(window.CustomizableUI, "AttributesInspector");
Отсутствует
Dumby
Спасибо Вам за помощь. Все работает прекрасно с вашим Мод-вриантом AttributesInspector.
Ctrl+Shift+C - copy tooltip's contents тоже работает, а в старом не работало.
Отсутствует
Dumby, теперь все норм при ожидании, звездочка относительно индикатора появляется там где нужно в зависимости от after или before.
Несколькими постами ранее обсуждался скрипт google_translate.js (userChrome загрузка) . Я переделал меню для перевода страниц в пункт меню и пару моментов не смог понять:
1. Строка с addDestructor. Комментировал ее и никаких негативных изменений или последствий визуально не увидел. При каких событиях они наступят?
2. Два addEventListener. true или false? Читал, но вникнуть не смог, наверное потому, что, меняя значени(е)(я), опять же не увидел никакой разницы
/** ------------------------- Пункт контекстного меню для перевода страниц ------------------------- **/ (function () { if (document.getElementById("TranslatePage")) return; var contextMenu = document.getElementById("contentAreaContextMenu"); var Item = document.createXULElement("menuitem"); Item.setAttribute("id", "TranslatePage"); Item.setAttribute("label", "Translate Page"); Item.setAttribute("class", "menuitem-iconic"); Item.setAttribute("image", mainicon); Item.addEventListener("command", function() {ujs_googlePage_translate()}, false); contextMenu.insertBefore(Item, document.getElementById("context-viewsource")); addDestructor(function() {contextMenu.removeChild(Item)}); contextMenu.addEventListener("popupshowing", function() { Item.hidden = document.getElementById("context-savepage").hidden }, false); })();
Отредактировано 6e73epo (09-10-2023 00:54:57)
Отсутствует
Dumby
Еще касательно google_translate.js
В окне перевода в конец текста добавляются 3, 5, 6 пустых строчек. Такая же проблема была с оригинальным кодом для Custom Buttons, но одна из его модификаций НЕ добавляла пустые строчки https://forum.mozilla-russia.org/viewto … 96#p777296
Спасибо, если исправите это в нашем случае.
Up
Хм, обнаружился баг. Наличие в переводимом тексте символа стрелки влево < приводит к падению окна перевода. Проверить можно здесь https://malwaretips.com/threads/testing … st-1052718
Отредактировано fuchsfan (09-10-2023 09:40:29)
Отсутствует
Несколькими постами ранее обсуждался скрипт google_translate.js (userChrome загрузка) . Я переделал меню для перевода страниц в пункт меню и пару моментов не смог понять:
1. Строка с addDestructor. Комментировал ее и никаких негативных изменений или последствий визуально не увидел. При каких событиях они наступят?
Нет, никакой «скрипт» google_translate.js не обсуждался.
Это просто код для Custom Buttons кнопки.
Поскольку никакой перевод для меня не возможен,
было предложено чисто формальное решение — пишем оболочку,
некий симулятор CB-кнопки, которая добавляет недостающее,
то, что специфично этому расширению и на что расчитывает код.
Функция addDestructor() — одна из таких вещей.
Предназначена для зачистки от результатов предыдущего исполнения кода
при переинициализации кнопки, например, удалить добавленные пункты меню,
ведь будут созданы новые, а то иначе будет эффект размножения.
Скрипты для большинства загрузчиков не restartless, исполняются в окне только раз,
поэтому, в данном случае, на addDestructor() просто поставлена заглушка — пустая функция.
2. Два addEventListener. true или false? Читал, но вникнуть не смог
Да я тоже не особо это понимаю.
Событие как-то спускается сверху вниз до цели, а затем поднимается обратно.
Если true, можно перехватить пораньше, и, например, вызвать e.stopPropagation().
Может ещё что-то, не знаю.
В приведённом отрывке true, вроде как, совсем никчему.
В окне перевода в конец текста
Ещё раз повторю, негде мне взять никакой текст.
но одна из его модификаций НЕ добавляла пустые строчки https://forum.mozilla-russia.org/viewto … 96#p777296
Насколько я вижу, для сплошного текста в окне перевода,
Андрей предложил заменить .replace(/\\n/g, "<br />")); на .replace(/\\n/g, "").replace(/\\r/g, ""));
Так что можешь попробовать.
Проверить можно
Как теперь, надеюсь, понятно, проверить можно, но не мне.
Если бы дал xhr.responseText, то, может быть, попробовал бы посмотреть.
Ну, типа воткнуть после if (xhr.readyState == 4 && xhr.status == 200) {
строку console.log(xhr.responseText); и забрать responseText с консоли.
Отсутствует
строку console.log(xhr.responseText); и забрать responseText с консоли.
[[["Когда переключатели \u003cswh\u003e и \u003cwdac\u003e","When \u003c SWH \u003e and \u003c WDAC \u003e switches are ON",null,null,3,null,null,[[null,"offline"]],[[["edbff5b2398eeca464de2caaf36a7a7e","efficient_models_2022q2.md"]]]],[null,null,"Kogda pereklyuchateli \u003cswh\u003e i \u003cwdac\u003e"]],null,"en",null,null,[["When \u003c SWH \u003e and \u003c WDAC \u003e switches are ON",null,[["Когда переключатели \u003cswh\u003e и \u003cwdac\u003e",0,true,false,[3],null,[[3]]],["Когда переключатели \u003cswh\u003e и \u003cwdac\u003e включены",0,true,false,[8]]],[[0,41]],"When \u003c SWH \u003e and \u003c WDAC \u003e switches are ON",0,0]],1,[],[["en"],null,[1],["en"]]] google-translate.uc.js:257:29
XML Parsing Error: mismatched tag. Expected: </wdac>. Location: Line Number 1, Column 93: chrome://browser/content/browser.xhtml : Unable to run script because scripts are blocked internally. 2 SyntaxError: An invalid or illegal string was specified google-translate.uc.js:70:13 addEle1 chrome://chrome/content/jsx/google-translate.uc.js?1696864250457 line 31 > Function:70 createWindow chrome://chrome/content/jsx/google-translate.uc.js?1696864250457 line 31 > Function:98 onreadystatechange chrome://chrome/content/jsx/google-translate.uc.js?1696864250457 line 31 > Function:266
Отредактировано Farby (09-10-2023 21:05:11)
Жизнь иногда такое выкидывает, что хочется подобрать...
На форуме
Dumby, благодарю, подчистил от деструктора.
Хм, обнаружился баг. Наличие в переводимом тексте символа стрелки влево < приводит к падению окна перевода
Логично. Добавь перед созданием окна, что-то типа такого, а может Dumby подскажет куда правильнее вставить замену
result=result.replace(/</g, '<');
Отсутствует
Хм, обнаружился баг. Наличие в переводимом тексте символа стрелки влево < приводит к падению окна перевода.
Никогда не замечал раньше (просто не попадалось). Здесь так же.
Отсутствует
может Dumby подскажет куда правильнее вставить замену
Да я вообще не понимаю почему в коде на <textarea> устанавливается innerHTML
Гугл когда-нибудь отдаёт на запрос перевода простого текста что-нибудь HTML'ское?
Если нет, то почему бы не просто value, типа так
/* w.addEle1 = function(str, style){ var ele = doc.createElementNS(xhtmlns, 'textarea'); ele.setAttribute('style', style); if(str){ ele.innerHTML = str; for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){ el = all[i]; if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){ el.parentNode.removeChild(el); }else{ for(var att = el.attributes, j = att.length; j--;){ if(/^on[a-z]+$/i.test(att[j].name))att[j].value = ''; } } } }; return this.appendChild(ele); }; */ ....... /* var cnt = w.addEle1(text, 'display:block;border:1px solid #aaa;padding-bottom:3px;padding-left:3px;background-color:#fafcfe;color:#000;font:17px Times New Roman;width:310px;height:160px;overflow:auto;cursor:text;-moz-user-focus:normal;-moz-user-select:text;'); cnt.contentEditable="true"; cnt.context="contentAreaContextMenu"; */ var cnt = doc.createElement("textarea"); cnt.style.cssText = ` color: #000; width: 310px; height: 160px; outline: none; padding-left: 3px; padding-bottom: 3px; border: 1px solid #aaa; background-color: #fafcfe; font: 17px Times New Roman; `; if (text) cnt.value = text; w.append(cnt);
Отсутствует