Test Translator

AI Translation using Gemini

// ==UserScript==
// @name         Test Translator
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  AI Translation using Gemini
// @author       You
// @match        *://*/*
// @grant        none
// ==/UserScript==

(async function() {
    'use strict';
    
    let gemini;
    
    // Add styles
    const style = document.createElement('style');
    style.textContent = `
        #translate-prompt {
            position: fixed;
            top: 20px;
            right: 20px;
            background: white;
            padding: 10px;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.2);
            z-index: 10000;
            display: none;
        }
        button {
            margin: 5px;
            padding: 5px 10px;
            cursor: pointer;
        }
    `;
    document.head.appendChild(style);

    // Add prompt HTML
    const promptDiv = document.createElement('div');
    promptDiv.id = 'translate-prompt';
    promptDiv.innerHTML = `
        
Translate?


        Yes
        No
    `;
    document.body.appendChild(promptDiv);

    // Load Gemini API dynamically
    try {
        const module = await import('https://api.websim.ai/blobs/0194e43b-7e45-75e7-ad7e-5848f3b43828.js');
        gemini = module.gemini;
        
        // Function to detect non-English text
        function hasNonEnglishText(text) {
            const nonEnglishPattern = /[^\x00-\x7F]+/;
            return nonEnglishPattern.test(text);
        }

        // Function to translate text using Gemini
        async function translateText(text) {
            try {
                const prompt = `Translate this text to English: ${text}`;
                const response = await gemini.generate(prompt);
                return response;
            } catch (error) {
                console.error('Translation error:', error);
                return text;
            }
        }

        // Function to replace text in the DOM
        function replaceText(element, translatedText) {
            element.textContent = translatedText;
        }

        // Main function to check page content
        function checkPageContent() {
            const textNodes = document.evaluate(
                '//text()', 
                document, 
                null, 
                XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 
                null
            );

            let hasNonEnglish = false;
            
            for (let i = 0; i < textNodes.snapshotLength; i++) {
                const node = textNodes.snapshotItem(i);
                if (hasNonEnglishText(node.textContent)) {
                    hasNonEnglish = true;
                    break;
                }
            }

            if (hasNonEnglish) {
                showTranslatePrompt();
            }
        }

        function showTranslatePrompt() {
            const prompt = document.getElementById('translate-prompt');
            prompt.style.display = 'block';
            
            document.getElementById('yes').addEventListener('click', async () => {
                const textNodes = document.evaluate(
                    '//text()', 
                    document, 
                    null, 
                    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 
                    null
                );
                
                for (let i = 0; i < textNodes.snapshotLength; i++) {
                    const node = textNodes.snapshotItem(i);
                    if (hasNonEnglishText(node.textContent)) {
                        const translatedText = await translateText(node.textContent);
                        replaceText(node, translatedText);
                    }
                }
                
                prompt.style.display = 'none';
            });
            
            document.getElementById('no').addEventListener('click', () => {
                prompt.style.display = 'none';
            });
        }
        
        // Run the check
        checkPageContent();
        
    } catch (err) {
        console.error('Failed to load Gemini:', err);
    }
})();