Greasy Fork

Greasy Fork is available in English.

Drrrkari 翻訳ボット3(Enterキー対応)

翻訳と送信をサポートするスクリプト(不要なタグ削除機能付き)

当前为 2024-11-25 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Drrrkari 翻訳ボット3(Enterキー対応)
// @namespace    http://tampermonkey.net/
// @version      1.3.2
// @description  翻訳と送信をサポートするスクリプト(不要なタグ削除機能付き)
// @author       AoiRabbit
// @match        *://drrrkari.com/room*
// @grant        none
// @require      https://unpkg.com/axios/dist/axios.min.js
// ==/UserScript==

(function () {
    'use strict';

    // DOM 要素取得
    const input = document.querySelector("#message .inputarea textarea");
    const submit = document.querySelector("#message .submit input");

    // 翻訳ボタンの作成
    const translateButton = document.createElement("button");
    translateButton.innerText = "翻訳: OFF";
    translateButton.style.padding = "10px";
    translateButton.style.borderRadius = "5px";
    translateButton.style.backgroundColor = "#008000";
    translateButton.style.color = "white";
    translateButton.style.position = "fixed";
    translateButton.style.bottom = "20px";
    translateButton.style.right = "20px";
    translateButton.style.cursor = "grab";
    translateButton.style.zIndex = "1000";

    // ドラッグ移動用変数
    let isDragging = false;
    let offsetX = 0;
    let offsetY = 0;

    // ボタンの状態管理用変数
    let isTranslationEnabled = false;

    // ボタンのドラッグイベントリスナー
    translateButton.addEventListener("mousedown", (e) => {
        isDragging = true;
        offsetX = e.clientX - translateButton.offsetLeft;
        offsetY = e.clientY - translateButton.offsetTop;
        translateButton.style.cursor = "grabbing";
    });

    document.addEventListener("mousemove", (e) => {
        if (isDragging) {
            translateButton.style.left = `${e.clientX - offsetX}px`;
            translateButton.style.top = `${e.clientY - offsetY}px`;
        }
    });

    document.addEventListener("mouseup", () => {
        isDragging = false;
        translateButton.style.cursor = "grab";
    });

    // ボタンのクリックイベントでON/OFF切り替え
    translateButton.addEventListener("click", () => {
        isTranslationEnabled = !isTranslationEnabled;
        if (isTranslationEnabled) {
            translateButton.innerText = "翻訳: ON";
            translateButton.style.backgroundColor = "#007bff";
        } else {
            translateButton.innerText = "翻訳: OFF";
            translateButton.style.backgroundColor = "#008000";
        }
    });

    // 翻訳と送信を行う関数
    async function handleTranslationAndSend() {
        if (!isTranslationEnabled) {
            sendChatMessage(input.value);
            return;
        }
        const message = input.value;
        if (message) {
            const translatedMessage = await translateMessage(message);
            sendChatMessage(translatedMessage);
        }
    }

    // 翻訳ボタンの動作
    translateButton.onclick = handleTranslationAndSend;

    // ボタンをページに追加
    document.body.appendChild(translateButton);

    // MyMemory APIを利用した翻訳関数
    async function translateMessage(text) {
        try {
            const response = await axios.get(`https://api.mymemory.translated.net/get`, {
                params: {
                    q: text,
                    langpair: "ja|en",
                    de: "[email protected]" // メールアドレスを指定
                }
            });
            let translatedText = response.data.responseData.translatedText;

            // 不要なタグを削除
            translatedText = translatedText.replace(/<[^>]*>/g, "");

            return translatedText;
        } catch (error) {
            return "翻訳に失敗しました";
        }
    }

    // メッセージを送信する関数
    function sendChatMessage(text) {
        if (!text || !input || !submit) return;
        input.value = text;
        submit.click();
    }

    // Enterキーを監視して翻訳して送信
    input.addEventListener("keydown", async (e) => {
        if (e.key === "Enter" && !e.shiftKey) {
            e.preventDefault(); // Enterキーによるデフォルト送信を防止
            await handleTranslationAndSend();
        }
    });
})();