Gota.io Chat Translator

click on a message in chat to translate it (uses google translate and auto detects language, so it may be incorrect)

// ==UserScript==
// @name         Gota.io Chat Translator
// @namespace    http://tampermonkey.net/
// @version      1
// @description  click on a message in chat to translate it (uses google translate and auto detects language, so it may be incorrect)
// @author       yl3
// @match        https://gota.io/web/*
// @license MIT
// @grant        none
// ==/UserScript==

var languageMap = {
    'af': 'Afrikaans',
    'sq': 'Albanian',
    'ar': 'Arabic',
    'hy': 'Armenian',
    'bn': 'Bengali',
    'bs': 'Bosnian',
    'ca': 'Catalan',
    'hr': 'Croatian',
    'cs': 'Czech',
    'da': 'Danish',
    'nl': 'Dutch',
    'eo': 'Esperanto',
    'et': 'Estonian',
    'tl': 'Filipino',
    'fi': 'Finnish',
    'fr': 'French',
    'de': 'German',
    'el': 'Greek',
    'gu': 'Gujarati',
    'ht': 'Haitian',
    'ha': 'Hausa',
    'he': 'Hebrew',
    'hi': 'Hindi',
    'hu': 'Hungarian',
    'is': 'Icelandic',
    'id': 'Indonesian',
    'it': 'Italian',
    'ja': 'Japanese',
    'jw': 'Javanese',
    'kn': 'Kannada',
    'km': 'Khmer',
    'ko': 'Korean',
    'la': 'Latin',
    'lv': 'Latvian',
    'lt': 'Lithuanian',
    'mk': 'Macedonian',
    'ml': 'Malayalam',
    'mn': 'Mongolian',
    'my': 'Burmese',
    'ne': 'Nepali',
    'no': 'Norwegian',
    'pl': 'Polish',
    'pt': 'Portuguese',
    'pa': 'Punjabi',
    'ro': 'Romanian',
    'ru': 'Russian',
    'sr': 'Serbian',
    'si': 'Sinhalese',
    'sk': 'Slovak',
    'sl': 'Slovenian',
    'es': 'Spanish',
    'su': 'Sundanese',
    'sw': 'Swahili',
    'sv': 'Swedish',
    'tl': 'Tagalog',
    'ta': 'Tamil',
    'te': 'Telugu',
    'th': 'Thai',
    'tr': 'Turkish',
    'uk': 'Ukrainian',
    'ur': 'Urdu',
    'vi': 'Vietnamese',
    'cy': 'Welsh',
    'xh': 'Xhosa',
    'yi': 'Yiddish',
    'zu': 'Zulu'
};

setTimeout(function() {

    if(typeof(top.translate) == 'undefined') {
        top.translate = function(text, fromL, toL) {
            var fL = fromL || 'en';
            var tL = toL || 'de';
            var url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' + fL + "&tl=" + tL + "&dt=t&q=" + encodeURI(text);
            var parseJSON = txt => JSON.parse(txt.split(',').map(x => x || 'null').join(','));
            var joinSnippets = json => json[0].map(x => x[0]).join('');

            return fetch(url).then(function(res) {
                return res.text();
            }).then(function(text) {
                var json = parseJSON(text);
                var translatedText = joinSnippets(json);
                var detectedLanguage = json[2];
                var detectedLanguageName = languageMap[detectedLanguage] || detectedLanguage;

                return [translatedText, detectedLanguageName];
            });
        };
    }

    document.getElementById('chat-body-0').addEventListener('click', function(e) {
        if(e.target.tagName === 'TD') {
            const span = e.target.querySelector('span[data-msgid]');
            if(span) {
                if(!span.hasAttribute('data-executed')) {
                    span.setAttribute('data-executed', 'true');
                    dostuff(span, e.target);
                }
            }
        }
        if(e.target.tagName === 'SPAN' && e.target.hasAttribute('data-msgid')) {
            if(!e.target.hasAttribute('data-executed')) {
                const parentElement = e.target.parentElement;
                e.target.setAttribute('data-executed', 'true');
                dostuff(e.target, parentElement);
            }
        }
    });

    function dostuff(target, parent) {
        target.style.filter = 'brightness(0.6)';
        translate(target.innerHTML, 'auto', 'en').then(function(r) {
            if(r[0] == target.innerHTML) {
                return;
            }
            parent.innerHTML = parent.innerHTML + '<span style="color: rgb(255, 255, 255);"> [' + r[1] + ' detected - ' + r[0] + ']</span>'
        })
    }

}, 5000);