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)

  1. // ==UserScript==
  2. // @name Gota.io Chat Translator
  3. // @namespace http://tampermonkey.net/
  4. // @version 1
  5. // @description click on a message in chat to translate it (uses google translate and auto detects language, so it may be incorrect)
  6. // @author yl3
  7. // @match https://gota.io/web/*
  8. // @license MIT
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. var languageMap = {
  13. 'af': 'Afrikaans',
  14. 'sq': 'Albanian',
  15. 'ar': 'Arabic',
  16. 'hy': 'Armenian',
  17. 'bn': 'Bengali',
  18. 'bs': 'Bosnian',
  19. 'ca': 'Catalan',
  20. 'hr': 'Croatian',
  21. 'cs': 'Czech',
  22. 'da': 'Danish',
  23. 'nl': 'Dutch',
  24. 'eo': 'Esperanto',
  25. 'et': 'Estonian',
  26. 'tl': 'Filipino',
  27. 'fi': 'Finnish',
  28. 'fr': 'French',
  29. 'de': 'German',
  30. 'el': 'Greek',
  31. 'gu': 'Gujarati',
  32. 'ht': 'Haitian',
  33. 'ha': 'Hausa',
  34. 'he': 'Hebrew',
  35. 'hi': 'Hindi',
  36. 'hu': 'Hungarian',
  37. 'is': 'Icelandic',
  38. 'id': 'Indonesian',
  39. 'it': 'Italian',
  40. 'ja': 'Japanese',
  41. 'jw': 'Javanese',
  42. 'kn': 'Kannada',
  43. 'km': 'Khmer',
  44. 'ko': 'Korean',
  45. 'la': 'Latin',
  46. 'lv': 'Latvian',
  47. 'lt': 'Lithuanian',
  48. 'mk': 'Macedonian',
  49. 'ml': 'Malayalam',
  50. 'mn': 'Mongolian',
  51. 'my': 'Burmese',
  52. 'ne': 'Nepali',
  53. 'no': 'Norwegian',
  54. 'pl': 'Polish',
  55. 'pt': 'Portuguese',
  56. 'pa': 'Punjabi',
  57. 'ro': 'Romanian',
  58. 'ru': 'Russian',
  59. 'sr': 'Serbian',
  60. 'si': 'Sinhalese',
  61. 'sk': 'Slovak',
  62. 'sl': 'Slovenian',
  63. 'es': 'Spanish',
  64. 'su': 'Sundanese',
  65. 'sw': 'Swahili',
  66. 'sv': 'Swedish',
  67. 'tl': 'Tagalog',
  68. 'ta': 'Tamil',
  69. 'te': 'Telugu',
  70. 'th': 'Thai',
  71. 'tr': 'Turkish',
  72. 'uk': 'Ukrainian',
  73. 'ur': 'Urdu',
  74. 'vi': 'Vietnamese',
  75. 'cy': 'Welsh',
  76. 'xh': 'Xhosa',
  77. 'yi': 'Yiddish',
  78. 'zu': 'Zulu'
  79. };
  80.  
  81. setTimeout(function() {
  82.  
  83. if(typeof(top.translate) == 'undefined') {
  84. top.translate = function(text, fromL, toL) {
  85. var fL = fromL || 'en';
  86. var tL = toL || 'de';
  87. var url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=' + fL + "&tl=" + tL + "&dt=t&q=" + encodeURI(text);
  88. var parseJSON = txt => JSON.parse(txt.split(',').map(x => x || 'null').join(','));
  89. var joinSnippets = json => json[0].map(x => x[0]).join('');
  90.  
  91. return fetch(url).then(function(res) {
  92. return res.text();
  93. }).then(function(text) {
  94. var json = parseJSON(text);
  95. var translatedText = joinSnippets(json);
  96. var detectedLanguage = json[2];
  97. var detectedLanguageName = languageMap[detectedLanguage] || detectedLanguage;
  98.  
  99. return [translatedText, detectedLanguageName];
  100. });
  101. };
  102. }
  103.  
  104. document.getElementById('chat-body-0').addEventListener('click', function(e) {
  105. if(e.target.tagName === 'TD') {
  106. const span = e.target.querySelector('span[data-msgid]');
  107. if(span) {
  108. if(!span.hasAttribute('data-executed')) {
  109. span.setAttribute('data-executed', 'true');
  110. dostuff(span, e.target);
  111. }
  112. }
  113. }
  114. if(e.target.tagName === 'SPAN' && e.target.hasAttribute('data-msgid')) {
  115. if(!e.target.hasAttribute('data-executed')) {
  116. const parentElement = e.target.parentElement;
  117. e.target.setAttribute('data-executed', 'true');
  118. dostuff(e.target, parentElement);
  119. }
  120. }
  121. });
  122.  
  123. function dostuff(target, parent) {
  124. target.style.filter = 'brightness(0.6)';
  125. translate(target.innerHTML, 'auto', 'en').then(function(r) {
  126. if(r[0] == target.innerHTML) {
  127. return;
  128. }
  129. parent.innerHTML = parent.innerHTML + '<span style="color: rgb(255, 255, 255);"> [' + r[1] + ' detected - ' + r[0] + ']</span>'
  130. })
  131. }
  132.  
  133. }, 5000);