MineFun Chat Translator

Simple script to auto translate all chat messages in MineFun into English :)

  1. // ==UserScript==
  2. // @name MineFun Chat Translator
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.2
  5. // @description Simple script to auto translate all chat messages in MineFun into English :)
  6. // @author November2246
  7. // @match https://minefun.io/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=minefun.io
  9. // @run-at document-start
  10. // @license ISC
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. // Rip data attribute for messages
  15. let messageDataAttribute;
  16. document.addEventListener('DOMContentLoaded', async () => {
  17. const messageDataInterval = setInterval(() => {
  18. try {
  19. let css = [...document.styleSheets].find(x => x?.href && x?.href.includes('assets/Game-'));
  20. if (!css) return;
  21.  
  22. let match = [...css.cssRules].find(x => x?.selectorText && x?.selectorText.includes('.messages[data-v-'))?.selectorText;
  23. if (!match) return;
  24.  
  25. messageDataAttribute = match.slice(10, -1);
  26. clearInterval(messageDataInterval);
  27. } catch {}
  28. }, 250);
  29. });
  30.  
  31. // Hook setAttribute on div elements to handle message divs
  32. const _createElement = document.createElement;
  33. document.createElement = function createElement() {
  34. const el = _createElement.apply(this, arguments);
  35. if (el.tagName !== 'DIV') return el;
  36.  
  37. const _setAttribute = el.setAttribute;
  38. el.setAttribute = function setAttribute() {
  39. if (messageDataAttribute && arguments[0] === messageDataAttribute) handleMessage(this);
  40. return _setAttribute.apply(this, arguments);
  41. }
  42.  
  43. return el;
  44. }
  45.  
  46. // Handle message translation, adding [language] prefix and translated content
  47. function handleMessage(el) {
  48. if (!el || el?.children?.length !== 2) return;
  49. const userEl = el.children[0];
  50. const textEl = el.children[1];
  51.  
  52. if (!textEl.innerText) return;
  53. console.log(`Attempting to auto-translate message: "${textEl.innerText}"`);
  54.  
  55.  
  56. translateMessage(textEl.innerText).then(translated => {
  57. if (!textEl?.innerText) return;
  58. textEl.innerText = `[${translated[0]}]: ${translated[1]}`;
  59. }).catch(err => {
  60. console.warn('Tranlation error...', e);
  61. });
  62. }
  63.  
  64. // Message cache to prevent duplicate requests to Google's API
  65. const messageCache = {};
  66.  
  67. // Abuse google translate API to auto translate message text
  68. async function translateMessage(text) {
  69. if (messageCache[text]) return messageCache[text];
  70.  
  71. const res = await fetch("https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=" + encodeURIComponent(text));
  72. const data = await res.json();
  73. const result = [data[2], data[0].map(x => x[0]).join('')];
  74. messageCache[text] = result;
  75.  
  76. return result;
  77. }