Translate Buttons for beta.character.ai

Adds a translate buttons for character messages in the chat for beta.character.ai

目前为 2022-12-14 提交的版本。查看 最新版本

// ==UserScript==
// @name        Translate Buttons for beta.character.ai
// @namespace   TranslateButtonsForBetaCharacterAI
// @version     1.8
// @description Adds a translate buttons for character messages in the chat for beta.character.ai
// @icon        https://www.google.com/s2/favicons?sz=64&domain=beta.character.ai
// @match       https://beta.character.ai/chat?char=*
// @grant       GM_xmlhttpRequest
// @run-at      document-end
// @license     MIT
// ==/UserScript==

function addButtons() {
    var elements = document.getElementsByClassName("swiper-slide");
    for (var i = 0; i < elements.length; i++) {
        const swiperSlide = elements[i];

        const charMsg = swiperSlide.querySelector(".char-msg");
        if (!charMsg) {
            continue;
        }

        const justifyContentStart = swiperSlide.querySelector(".justify-content-start");
        const markdownWrapper = charMsg.querySelector(".markdown-wrapper");
        if (!markdownWrapper) {
            continue;
        }

        const rootMarkdownWrapper = charMsg.parentElement;

        if (!justifyContentStart.querySelector(".translate-button")) {
            var btn = document.createElement("button");
            btn.textContent = "Tr";
            btn.classList.add("translate-button");
            btn.style.cssText = "width: 30px; height: 30px; margin-left: 8px; display: flex; flex-direction: column;";

            // Add event listener for click event on translate button
            btn.addEventListener("click", function () {
                const translateNodeName = "translate-markdown-wrapper";

                var translateNode = rootMarkdownWrapper.querySelector(`.${translateNodeName}`);
                if (translateNode) {
                    rootMarkdownWrapper.removeChild(translateNode)
                }

                var clone = markdownWrapper.cloneNode(true);
                clone.className = translateNodeName;
                rootMarkdownWrapper.insertBefore(clone, rootMarkdownWrapper.firstChild);

                const text = clone.innerHTML;
                console.log("Message text: " + text);

                // Use the user's language as the target language in the API request
                var url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=" + navigator.language + "&dt=t&q=" + encodeURIComponent(text);

                GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    onload: function (response) {
                        const responseText = JSON.parse(response.responseText);

                        let translation = "";
                        responseText[0].forEach((part) => {
                            translation += part[0];
                        });

                        // Log the translation
                        console.log("Translated text: " + translation);

                        // Replace the original text with the translated text
                        clone.innerHTML = translation;
                    }
                });

            });

            // Log the button being added
            console.log("Added translate button for element: " + justifyContentStart);
            justifyContentStart.appendChild(btn);
        }
    }
}

// Check every second
setInterval(addButtons, 1000);