DiscordAutoTranslator

Переводит сообщения на английском и отображает их перевод в каналах Discord - для Web // by LZT users

当前为 2024-09-02 提交的版本,查看 最新版本

// ==UserScript==
// @name         DiscordAutoTranslator
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Переводит сообщения на английском и отображает их перевод в каналах Discord - для Web // by LZT users
// @match        *://discord.com/*
// @author       Timka251 & eretly
// @grant        GM_xmlhttpRequest
// @icon         https://i.pinimg.com/236x/68/95/31/689531dc04ba222ab7af0fa34dc63644.jpg
// @run-at       document-end
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Функция для перевода текста с помощью Google Translate
    function translateText(text, callback) {
        const url = `https://translate.google.com/m?hl=ru&sl=en&tl=ru&ie=UTF-8&prev=_m&q=${encodeURIComponent(text)}`;

        GM_xmlhttpRequest({
            method: "GET",
            url: url,
            onload: function(response) {
                if (response.status === 200) {
                    const parser = new DOMParser();
                    const doc = parser.parseFromString(response.responseText, "text/html");
                    const translatedTextElement = doc.querySelector('.result-container');

                    if (translatedTextElement) {
                        callback(translatedTextElement.textContent.trim());
                    } else {
                        console.error("Перевод не удался");
                    }
                } else {
                    console.error("Ошибка при получении перевода, статус: " + response.status);
                }
            },
            onerror: function() {
                console.error("Ошибка сети во время запроса перевода");
            }
        });
    }

    // Функция для аннотирования сообщений
    function annotateMessage(div) {
        const originalText = div.textContent.trim();
        const container = document.createElement('div');
        container.style.position = 'relative';
        container.style.marginBottom = '10px'; // Отступ между сообщениями

        const translatedDiv = document.createElement('div');
        translatedDiv.style.color = 'rgb(135, 155, 164)';
        translatedDiv.style.marginTop = '0px';
        translatedDiv.style.paddingLeft = '8px'; // Добавляем отступ слева

        translateText(originalText, function(translatedText) {
            translatedDiv.textContent = translatedText;
            container.appendChild(translatedDiv);
            div.parentNode.insertBefore(container, div.nextSibling);
        });
    }

    // Функция для проверки и обработки новых DIV
    function checkNewDiv() {
        const divs = document.querySelectorAll('div[id^="message-content-"]');
        divs.forEach(div => {
            if (!div.dataset.processed) {
                const text = div.textContent;
                const lang = detectLanguage(text);

                if (lang === 'en') {
                    annotateMessage(div);
                }

                div.dataset.processed = 'true';
            }
        });
    }

    // Функция для определения языка текста
    function detectLanguage(text) {
        return text.match(/[a-zA-Z]/) ? 'en' : 'ru';
    }

    // Проверка новых DIV через регулярные интервалы
    setInterval(checkNewDiv, 1000);
})();