- // ==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);