// ==UserScript== // @name Twitter External Translator // @name:bg Външен преводач на Twitter // @name:zh Twitter外部翻译器 // @name:zh-CN Twitter外部翻译器 // @name:zh-TW Twitter外部翻译器 // @name:cs Externí překladatel Twitter // @name:da Twitter ekstern oversætter // @name:et Twitteri väline tõlkija // @name:fi Twitter Ulkoinen kääntäjä // @name:el Εξωτερικός μεταφραστής Twitter // @name:hu Twitter külső fordító // @name:lv Twitter Ārējais tulkotājs // @name:lt "Twitter" išorinis vertėjas // @name:ro Twitter Traducător extern // @name:sk Externý prekladateľ Twitter // @name:sl Twitter Zunanji prevajalec // @name:sv Twitter Extern översättare // @name:nl Twitter Externe Vertaler // @name:fr Traducteur externe Twitter // @name:de Externer Twitter-Übersetzer // @name:it Traduttore esterno di Twitter // @name:ja ツイッター外部翻訳者 // @name:pl Zewnętrzny tłumacz Twittera // @name:pt Tradutor externo do Twitter // @name:pt-BR Tradutor externo do Twitter // @name:ru-RU Twitter Внешний переводчик // @name:ru Twitter Внешний переводчик // @name:es Traductor externo de Twitter // @description Adds 3rd party translators to Twitter // @description:zh 将第三方翻译添加到推特 // @description:zh-CN 将第三方翻译添加到推特 // @description:zh-TW 將第三方翻譯添加到推特 // @description:bg Добавя преводачи на трети страни в Twitter // @description:cs Přidává překladatele třetích stran na Twitter // @description:da Tilføjer tredjepartsoversættere til Twitter // @description:et Lisab kolmanda osapoole tõlkijad Twitterisse // @description:fi Lisää kolmannen osapuolen kääntäjiä Twitteriin // @description:el Προσθέτει μεταφραστές 3ου μέρους στο Twitter // @description:hu Hozzáadja a 3. féltől származó fordítókat a Twitterhez // @description:lv Pievieno trešās puses tulkotājus Twitter // @description:lt Prideda trečiųjų šalių vertėjus į "Twitter // @description:ro Adaugă traducători de la terțe părți la Twitter // @description:sk Pridáva prekladateľov tretích strán na Twitter // @description:sl Dodaja prevajalce tretjih oseb na Twitterju // @description:sv Lägger till översättare från tredje part till Twitter // @description:nl Voegt vertalers van derden toe aan Twitter // @description:fr Ajout de traducteurs tiers à Twitter // @description:de Fügt Drittanbieter-Übersetzer zu Twitter hinzu // @description:it Aggiunge traduttori di terze parti a Twitter // @description:pl Dodaje tłumaczy innych firm do Twittera // @description:pt Adiciona tradutores de terceiros ao Twitter // @description:pt-BR Adiciona tradutores de terceiros ao Twitter // @description:ja サードパーティの翻訳者をツイッターに追加 // @description:ru-RU Добавляет сторонних переводчиков в Twitter // @description:ru Добавляет сторонних переводчиков в Twitter // @description:es Añade traductores de terceros a Twitter // @author Magic of Lolis // @icon https://abs.twimg.com/favicons/twitter.ico // @version 0.17 // @namespace https://github.com/magicoflolis/userscriptrepo/tree/master/ExternalTranslator#twitter-external-translator // @homepageURL https://github.com/magicoflolis/userscriptrepo/tree/master/ExternalTranslator#twitter-external-translator // @supportURL https://github.com/magicoflolis/userscriptrepo/issues/new // @require https://code.jquery.com/jquery-3.6.0.slim.min.js // @include https://twitter.com/* // @include https://tweetdeck.twitter.com/* // @exclude https://twitter.com/login // @exclude https://twitter.com/signup // @exclude https://twitter.com/account // @exclude https://twitter.com/settings/* // @exclude https://twitter.com/i/flow/signup // @grant none // @inject-into auto // @run-at document-start // @downloadURL none // ==/UserScript== "use strict"; //#region Config /** * You'll need to edit the config manually for now if you're using this * as a user script. */ let cfg = { /** Supported languages * @type {'en'|'zh'|'nl'|'fr'|'de'|'it'|'ja'|'pl'|'pt'|'ru'|'es'} * @type {'bg'|'cs'|'da'|'et'|'fi'|'el'|'hu'|'lv'|'lt'|'ro'|'sk'|'sl'|'sv'} */ lang: ('en'), /** Preferred translator, lowercase only! * @type {'deepl'|'yandex'|'bing'|'google'|'mymemory'|'translate'} */ translator: ('deepl'), /** Preferred display * @type {'text'|'icon'|'text + icon'} */ display: ('text + icon'), iconWidthA: '16', // Twitter iconWidthB: '14', // TweetDeck debug: false }; //#endregion // Web icons are encoded in Data URI. // Can be decoded: https://www.site24x7.com/tools/datauri-to-image.html let icons = { deepl: ``, yandex: ``, bing: ``, google: ``, mymemory: ``, translate: ``, }, //#region Languages en = { sel: `English (en)`, tw: `Translate with`, lg: `Language`, tr: `Translator`, ds: `Display`, ti: `Text + Icon`, t: `Text`, i: `Icon`, s: `Save`, f: checkTXT }, zh = { sel: `中文 (zh)`, tw: `翻译与`, lg: `语种`, tr: `译者`, ds: `显示`, ti: `文本+图标`, t: `案文`, i: `图标`, s: `保存`, f: checkTXT }, bg = { sel: "Български (bg)", tw: "Преведете с", lg: "Език", tr: "Преводач", ds: "Показване на", ti: "Текст + икона", t: "Текст", i: "Икона", s: "Запазване", f: checkTXT }, cs = { sel: "Česky (cs)", tw: "Přeložit pomocí", lg: "Jazyk", tr: "Překladatel", ds: "Zobrazit", ti: "Text + ikona", t: "Text", i: "Ikona", s: "Uložit", f: checkTXT }, da = { sel: "Dansk (da)", tw: "Oversæt med", lg: "Sprog", tr: "Oversætter", ds: "Vis", ti: "Tekst + ikon", t: "Tekst", i: "Ikon", s: "Gem", f: checkTXT }, et = { sel: "Eesti (et)", tw: "Tõlge koos", lg: "Keel", tr: "Tõlkija", ds: "Kuva", ti: "Tekst + ikoon", t: "Tekst", i: "Ikoon", s: "Salvesta", f: checkTXT }, fi = { sel: "Suomalainen (fi)", tw: "Käännä kanssa", lg: "Kieli", tr: "Kääntäjä", ds: "Näytä", ti: "Teksti + kuvake", t: "Teksti", i: "Kuvake", s: "Tallenna", f: checkTXT }, el = { sel: "Ελληνική (el)", tw: "Μεταφράστε με", lg: "Γλώσσα", tr: "Μεταφραστής", ds: "Εμφάνιση", ti: "Κείμενο + εικονίδιο", t: "Κείμενο", i: "Εικονίδιο", s: "Αποθήκευση", f: checkTXT }, hu = { sel: "Magyar (hu)", tw: "Fordítson a", lg: "Nyelv", tr: "Fordító", ds: "Megjelenítés", ti: "Szöveg + ikon", t: "Szöveg", i: "Ikon", s: "Mentés", f: checkTXT }, lv = { sel: "Latviešu (lv)", tw: "Tulkot ar", lg: "Valoda", tr: "Tulkotājs", ds: "Displejs", ti: "Teksts + ikona", t: "Teksts", i: "Ikona", s: "Saglabāt", f: checkTXT }, lt = { sel: "Lietuvių kalba (lt)", tw: "Išversti su", lg: "Kalba", tr: "Vertėjas", ds: "Rodyti", ti: "Tekstas + piktograma", t: "Tekstas", i: "Ikona", s: "Išsaugoti", f: checkTXT }, ro = { sel: "Românesc (ro)", tw: "Tradu cu", lg: "Limba", tr: "Traducător", ds: "Afișați", ti: "Text + Icoană", t: "Text", i: "Icoană", s: "Salvați", f: checkTXT }, sk = { sel: "Slovenská (sk)", tw: "Preložiť s", lg: "Jazyk", tr: "Prekladateľ", ds: "Zobraziť", ti: "Text + ikona", t: "Text", i: "Ikona", s: "Uložiť", f: checkTXT }, sl = { sel: "Slovenski (sl)", tw: "Prevedi z", lg: "Jezik", tr: "Prevajalec", ds: "Prikaži", ti: "Besedilo + ikona", t: "Besedilo", i: "Ikona", s: "Shrani", }, sv = { sel: "Svenska (sv)", tw: "Översätt med", lg: "Språk", tr: "Översättare", ds: "Visa", ti: "Text + ikon", t: "Text", i: "Ikon", s: "Spara", f: checkTXT }, nl = { sel: `Nederlands (nl)`, tw: `Vertaal met`, lg: `Taal`, tr: `Vertaler`, ds: `Weergave`, ti: `Tekst + Pictogram`, t: `Tekst`, i: `Icoon`, s: `Save`, f: checkTXT }, fr = { sel: `Français (fr)`, tw: `Traduire avec`, lg: `Langue`, tr: `Traducteur`, ds: `Afficher`, ti: `Texte + Icône`, t: `Texte`, i: `Icône`, s: `Sauvez`, f: checkTXT }, de = { sel: `Deutsch (de)`, tw: `Übersetzen mit`, lg: `Sprache`, tr: `Übersetzer`, ds: `Anzeige`, ti: `Text + Symbol`, t: `Text`, i: `Icon`, s: `Speichern`, f: checkTXT }, it = { sel: `Italiano (it)`, tw: `Tradurre con`, lg: `Lingua`, tr: `Traduttore`, ds: `Visualizza`, ti: `Testo + icona`, t: `Testo`, i: `Icona`, s: `Salva`, f: checkTXT }, ja = { sel: `日本語 (ja)`, tw: `で翻訳する`, lg: `言語`, tr: `翻訳者`, ds: `ディスプレイ`, ti: `テキスト+アイコン`, t: `テキスト`, i: `アイコン`, s: `保存`, f: checkTXT }, pl = { sel: `Polski (pl)`, tw: `Tłumaczenie za pomocą`, lg: `Język`, tr: `Tłumacz`, ds: `Wyświetlacz`, ti: `Tekst + Ikona`, t: `Tekst`, i: `Ikona`, s: `Zapisz`, f: checkTXT }, pt = { sel: `Português (pt)`, tw: `Traduzir com`, lg: `Idioma`, tr: `Tradutora`, ds: `Mostrar`, ti: `Texto + Ícone`, t: `Texto`, i: `Ícone`, s: `Guardar`, f: checkTXT }, ru = { sel: `Russisch (ru)`, tw: `Перевод с`, lg: `Язык`, tr: `Переводчик`, ds: `Показать`, ti: `Текст + иконка`, t: `Текст`, i: `иконка`, s: `Сохранить`, f: checkTXT }, es = { sel: `Español (es)`, tw: `Traducir con`, lg: `Idioma`, tr: `Traductor`, ds: `Mostrar`, ti: `Texto + Icono`, t: `Texto`, i: `Icono`, s: `Guardar`, f: checkTXT }; //#endregion const log = (...args) => { (cfg.debug) ? console.log('[MoL]', ...args) : false; }, isHTML = (str, doc = new DOMParser().parseFromString(str, "text/html")) => { return Array.from(doc.body.childNodes).some(node => node.nodeType === 1); }; function checkTXT() { return this.tw } async function injectTranslationButton() { let content = '',magicBtn,btContainer,btLang,site, translateTweet = $("div[lang]").eq(0).siblings().eq(0).children("span"), // "Translate Tweet" button translateBio = $('div[data-testid="UserDescription"]').eq(0).siblings().eq(0).children("span"), // "Translate Bio" button trTweet = $("div[lang]").eq(0).siblings().eq(1), // [Tweet] "Translate with ..." button trBio = $('div[data-testid="UserDescription"]').eq(0).siblings().eq(1), // [Bio] "Translate with ..." button name = (cfg.translator == 'yandex') ? `Yandex ${icons.yandex}` : (cfg.translator == 'bing') ? `Bing ${icons.bing}` : (cfg.translator == 'google') ? `Google ${icons.google}` : (cfg.translator == 'mymemory') ? `MyMemory ${icons.mymemory}` : (cfg.translator == 'translate') ? `translate.com ${icons.translate}` : `DeepL ${icons.deepl}`, nIcons = (cfg.translator == 'yandex') ? icons.yandex : (cfg.translator == 'bing') ? icons.bing : (cfg.translator == 'google') ? icons.google : (cfg.translator == 'mymemory') ? icons.mymemory : (cfg.translator == 'translate') ? icons.translate : icons.deepl, checkDisplay = (cfg.display == 'text') ? icons = { deepl: '', yandex: '', bing: '', google: '', mymemory: '', translate: '' } : (cfg.display == 'icon') ? name = nIcons : false, tweetbtn = () => { log("Injecting tweet button") btContainer = translateTweet.parent().siblings().eq(0), // "Tweet" btLang = btContainer.attr("lang"); magicBtn = translateTweet.parent().clone().appendTo(translateTweet.parent().parent()); btContainer.children("span").each((index,item) => { let tweet = $(item).html().trim(); (tweet && tweet != '' && !isHTML(tweet)) ? content += ` ${tweet}` : false; }); (!btLang) ? btLang = "auto" : false; (cfg.lang == 'bg') ? magicBtn.html(`${bg.f()} ${name}`) : (cfg.lang == 'cs') ? magicBtn.html(`${cs.f()} ${name}`) : (cfg.lang == 'da') ? magicBtn.html(`${da.f()} ${name}`) : (cfg.lang == 'et') ? magicBtn.html(`${et.f()} ${name}`) : (cfg.lang == 'fi') ? magicBtn.html(`${fi.f()} ${name}`) : (cfg.lang == 'el') ? magicBtn.html(`${el.f()} ${name}`) : (cfg.lang == 'hu') ? magicBtn.html(`${hu.f()} ${name}`) : (cfg.lang == 'lv') ? magicBtn.html(`${lv.f()} ${name}`) : (cfg.lang == 'lt') ? magicBtn.html(`${lt.f()} ${name}`) : (cfg.lang == 'ro') ? magicBtn.html(`${ro.f()} ${name}`) : (cfg.lang == 'sk') ? magicBtn.html(`${sk.f()} ${name}`) : (cfg.lang == 'sl') ? magicBtn.html(`${sl.f()} ${name}`) : (cfg.lang == 'sv') ? magicBtn.html(`${sv.f()} ${name}`) : (cfg.lang == 'zh') ? magicBtn.html(`${zh.f()} ${name}`) : (cfg.lang == 'nl') ? magicBtn.html(`${nl.f()} ${name}`) : (cfg.lang == 'fr') ? magicBtn.html(`${fr.f()} ${name}`) : (cfg.lang == 'de') ? magicBtn.html(`${de.f()} ${name}`) : (cfg.lang == 'it') ? magicBtn.html(`${it.f()} ${name}`) : (cfg.lang == 'ja') ? magicBtn.html(`${ja.f()} ${name}`) : (cfg.lang == 'pl') ? magicBtn.html(`${pl.f()} ${name}`) : (cfg.lang == 'pt') ? magicBtn.html(`${pt.f()} ${name}`) : (cfg.lang == 'ru') ? magicBtn.html(`${ru.f()} ${name}`) : (cfg.lang == 'es') ? magicBtn.html(`${es.f()} ${name}`) : magicBtn.html(`${en.f()} ${name}`); site = (cfg.translator == 'yandex') ? `https://translate.yandex.com/?lang=${btLang}-${cfg.lang}&text=${content}` : (cfg.translator == 'bing') ? `https://www.bing.com/translator/?text=${content}&from=${btLang}&to=${cfg.lang}` : (cfg.translator == 'google') ? `https://translate.google.com/?q=${content}&sl=${btLang}&tl=${cfg.lang}` : (cfg.translator == 'mymemory') ? `https://mymemory.translated.net/${cfg.lang}/${btLang}/${cfg.lang}/${content}` : (cfg.translator == 'translate') ? `https://www.translate.com/#${btLang}/${cfg.lang}/${content}` : `https://www.deepl.com/translator#${btLang}/${cfg.lang}/${content}`; magicBtn.hover(function() { $(this).addClass("r-1ny4l3l r-1ddef8g") // $(this).css("text-decoration", "underline"); }, function() { $(this).removeClass("r-1ny4l3l r-1ddef8g") // $(this).css("text-decoration", "none"); }); magicBtn.on("click", () => { window.open(`${site}`,'_blank'); }) }, biobtn = () => { log("Injecting bio button") btContainer = translateBio.parent().siblings().eq(0); // "User Bio" btLang = $("div[lang]").attr("lang"); magicBtn = translateBio.parent().clone().appendTo(translateBio.parent().parent()); btContainer.children("span").each((index,item) => { let bio = $(item).html().trim(); (bio && bio != '' && !isHTML(bio)) ? content += ` ${bio}` : false; }); (!btLang) ? btLang = "auto" : false; (cfg.lang == 'bg') ? magicBtn.html(`${bg.f()} ${name}`) : (cfg.lang == 'cs') ? magicBtn.html(`${cs.f()} ${name}`) : (cfg.lang == 'da') ? magicBtn.html(`${da.f()} ${name}`) : (cfg.lang == 'et') ? magicBtn.html(`${et.f()} ${name}`) : (cfg.lang == 'fi') ? magicBtn.html(`${fi.f()} ${name}`) : (cfg.lang == 'el') ? magicBtn.html(`${el.f()} ${name}`) : (cfg.lang == 'hu') ? magicBtn.html(`${hu.f()} ${name}`) : (cfg.lang == 'lv') ? magicBtn.html(`${lv.f()} ${name}`) : (cfg.lang == 'lt') ? magicBtn.html(`${lt.f()} ${name}`) : (cfg.lang == 'ro') ? magicBtn.html(`${ro.f()} ${name}`) : (cfg.lang == 'sk') ? magicBtn.html(`${sk.f()} ${name}`) : (cfg.lang == 'sl') ? magicBtn.html(`${sl.f()} ${name}`) : (cfg.lang == 'sv') ? magicBtn.html(`${sv.f()} ${name}`) : (cfg.lang == 'zh') ? magicBtn.html(`${zh.f()} ${name}`) : (cfg.lang == 'nl') ? magicBtn.html(`${nl.f()} ${name}`) : (cfg.lang == 'fr') ? magicBtn.html(`${fr.f()} ${name}`) : (cfg.lang == 'de') ? magicBtn.html(`${de.f()} ${name}`) : (cfg.lang == 'it') ? magicBtn.html(`${it.f()} ${name}`) : (cfg.lang == 'ja') ? magicBtn.html(`${ja.f()} ${name}`) : (cfg.lang == 'pl') ? magicBtn.html(`${pl.f()} ${name}`) : (cfg.lang == 'pt') ? magicBtn.html(`${pt.f()} ${name}`) : (cfg.lang == 'ru') ? magicBtn.html(`${ru.f()} ${name}`) : (cfg.lang == 'es') ? magicBtn.html(`${es.f()} ${name}`) : magicBtn.html(`${en.f()} ${name}`); site = (cfg.translator == 'yandex') ? `https://translate.yandex.com/?lang=${btLang}-${cfg.lang}&text=${content}` : (cfg.translator == 'bing') ? `https://www.bing.com/translator/?text=${content}&from=${btLang}&to=${cfg.lang}` : (cfg.translator == 'google') ? `https://translate.google.com/?q=${content}&sl=${btLang}&tl=${cfg.lang}` : (cfg.translator == 'mymemory') ? `https://mymemory.translated.net/${cfg.lang}/${btLang}/${cfg.lang}/${content}` : (cfg.translator == 'translate') ? `https://www.translate.com/#${btLang}/${cfg.lang}/${content}` : `https://www.deepl.com/translator#${btLang}/${cfg.lang}/${content}`; magicBtn.hover(function() { $(this).addClass("r-1ny4l3l r-1ddef8g") // $(this).css("text-decoration", "underline"); }, function() { $(this).removeClass("r-1ny4l3l r-1ddef8g") // $(this).css("text-decoration", "none"); }); magicBtn.on("click", () => { window.open(`${site}`,'_blank'); }) }; let check = (!trBio.length && translateBio.length) ? biobtn() : (!trTweet.length && translateTweet.length) ? tweetbtn() : checkDisplay; // Resizes icons if($('.exIcon').length) { $('.exIcon').attr('width', cfg.iconWidthA); }; return check } async function TweetDeck() { let content = '',magicBtn,btContainer,btLang,site, translateTweet = $('a.js-translate-call-to-action'), // "Translate Tweet" button trTweet = translateTweet.eq(1), // [Tweet] "Translate with ..." button name = (cfg.translator == 'yandex') ? `Yandex ${icons.yandex}` : (cfg.translator == 'bing') ? `Bing ${icons.bing}` : (cfg.translator == 'google') ? `Google ${icons.google}` : (cfg.translator == 'mymemory') ? `MyMemory ${icons.mymemory}` : (cfg.translator == 'translate') ? `translate.com ${icons.translate}` : `DeepL ${icons.deepl}`, nIcons = (cfg.translator == 'yandex') ? icons.yandex : (cfg.translator == 'bing') ? icons.bing : (cfg.translator == 'google') ? icons.google : (cfg.translator == 'mymemory') ? icons.mymemory : (cfg.translator == 'translate') ? icons.translate : icons.deepl, checkDisplay = (cfg.display == 'text') ? icons = { deepl: '', yandex: '', bing: '', google: '', mymemory: '', translate: '' } : (cfg.display == 'icon') ? name = nIcons : false, tweetbtn = () => { log("Injecting tweet button") checkDisplay // new dis().check() btContainer = translateTweet.siblings().eq(2), // "Tweet" content = btContainer.text(), // Content of "Tweet" btLang = btContainer.attr("lang"); magicBtn = translateTweet.before(translateTweet.clone()); // Create external translation button (!btLang) ? btLang = "auto" : false; (cfg.lang == 'bg') ? magicBtn.html(`${bg.f()} ${name}`) : (cfg.lang == 'cs') ? magicBtn.html(`${cs.f()} ${name}`) : (cfg.lang == 'da') ? magicBtn.html(`${da.f()} ${name}`) : (cfg.lang == 'et') ? magicBtn.html(`${et.f()} ${name}`) : (cfg.lang == 'fi') ? magicBtn.html(`${fi.f()} ${name}`) : (cfg.lang == 'el') ? magicBtn.html(`${el.f()} ${name}`) : (cfg.lang == 'hu') ? magicBtn.html(`${hu.f()} ${name}`) : (cfg.lang == 'lv') ? magicBtn.html(`${lv.f()} ${name}`) : (cfg.lang == 'lt') ? magicBtn.html(`${lt.f()} ${name}`) : (cfg.lang == 'ro') ? magicBtn.html(`${ro.f()} ${name}`) : (cfg.lang == 'sk') ? magicBtn.html(`${sk.f()} ${name}`) : (cfg.lang == 'sl') ? magicBtn.html(`${sl.f()} ${name}`) : (cfg.lang == 'sv') ? magicBtn.html(`${sv.f()} ${name}`) : (cfg.lang == 'zh') ? magicBtn.html(`${zh.f()} ${name}`) : (cfg.lang == 'nl') ? magicBtn.html(`${nl.f()} ${name}`) : (cfg.lang == 'fr') ? magicBtn.html(`${fr.f()} ${name}`) : (cfg.lang == 'de') ? magicBtn.html(`${de.f()} ${name}`) : (cfg.lang == 'it') ? magicBtn.html(`${it.f()} ${name}`) : (cfg.lang == 'ja') ? magicBtn.html(`${ja.f()} ${name}`) : (cfg.lang == 'pl') ? magicBtn.html(`${pl.f()} ${name}`) : (cfg.lang == 'pt') ? magicBtn.html(`${pt.f()} ${name}`) : (cfg.lang == 'ru') ? magicBtn.html(`${ru.f()} ${name}`) : (cfg.lang == 'es') ? magicBtn.html(`${es.f()} ${name}`) : magicBtn.html(`${en.f()} ${name}`); site = (cfg.translator == 'yandex') ? `https://translate.yandex.com/?lang=${btLang}-${cfg.lang}&text=${content}` : (cfg.translator == 'bing') ? `https://www.bing.com/translator/?text=${content}&from=${btLang}&to=${cfg.lang}` : (cfg.translator == 'google') ? `https://translate.google.com/?q=${content}&sl=${btLang}&tl=${cfg.lang}` : (cfg.translator == 'mymemory') ? `https://mymemory.translated.net/${cfg.lang}/${btLang}/${cfg.lang}/${content}` : (cfg.translator == 'translate') ? `https://www.translate.com/#${btLang}/${cfg.lang}/${content}` : `https://www.deepl.com/translator#${btLang}/${cfg.lang}/${content}`; magicBtn.on("click", () => { window.open(`${site}`,'_blank'); }) }; let check = (!trTweet.length && translateTweet.length) ? tweetbtn() : trTweet.attr('style', 'display: flex !important; align-items: end !important;'); // Resizes icons if($('.exIcon').length) { $('.exIcon').attr('width', cfg.iconWidthB); }; return check } let observer = new MutationObserver(() => {injectTranslationButton()}); let td = new MutationObserver(() => {TweetDeck()}); // Its a headache observing single tweet element, inconsistent load times. const target = document.querySelector("body"), init = { subtree: true, characterData: true, childList: true }; (location.host == 'twitter.com') ? observer.observe($(".css-1dbjc4n")[0], {subtree:true,characterData:true,childList:true}) : (location.host == 'tweetdeck.twitter.com') ? td.observe(target, init) : false;