Crunchyroll Auto Skip with Settings

Auto skip the intro and ending if it is available. Some parameter with lot langague.

Fra 23.10.2024. Se den seneste versjonen.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Crunchyroll Auto Skip with Settings
// @namespace    https://greatest.deepsurf.us/scripts/513644
// @version      1.3
// @description  Auto skip the intro and ending if it is available. Some parameter with lot langague.
// @author       MASTERD
// @match        *://*.crunchyroll.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=crunchyroll.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    //langue a traduire
    const userLanguage = navigator.language.startsWith('fr') ? 'fr' : 'en';

    // Variables pour gérer les paramètres stockés
    let settings = {
        active: localStorage.getItem('active') === 'true',
        delay: parseInt(localStorage.getItem('delay'), 10) || 0,
        exsave: localStorage.getItem('exsave') === 'true',
        show: localStorage.getItem('show') === 'true'
    };
    let previousDelay = localStorage.getItem('delay') || '0';
    let previousActive = localStorage.getItem('active') || 'true';
    let firstLoad = true;

    // Observer les changements de la page
    const observer = new MutationObserver(() => {
        observeSkipButton();
    });
    observer.observe(document.body, { childList: true, subtree: true });

    // Fonction pour ajouter le bouton engrenage (Paramètres)
    function addSettingsButton() {
        const settingsButton = document.createElement('div');
        settingsButton.id = 'settingsButton';
        settingsButton.style.position = 'fixed';
        settingsButton.style.top = '10px';
        settingsButton.style.right = '10px';
        settingsButton.style.width = '2rem';
        settingsButton.style.height = '2rem';
        settingsButton.style.cursor = 'pointer';
        settingsButton.style.zIndex = '9990';
        settingsButton.style.backgroundImage = 'url(https://cdn.icon-icons.com/icons2/272/PNG/512/Settings_30027.png)';
        settingsButton.style.backgroundSize = 'contain';
        settingsButton.style.backgroundRepeat = 'no-repeat';

        document.body.appendChild(settingsButton);
        settingsButton.addEventListener('click', showSettingsWindow);
    }

    // Fonction pour afficher la fenêtre de paramètres
    function showSettingsWindow() {
        const overlay = document.createElement('div');
        overlay.id = 'settingsOverlay';
        overlay.style.position = 'fixed';
        overlay.style.top = '0';
        overlay.style.left = '0';
        overlay.style.width = '100%';
        overlay.style.height = '100%';
        overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.4)';
        overlay.style.zIndex = '9994';

        const settingsWindow = document.createElement('div');
        settingsWindow.id = 'settingsWindow';
        settingsWindow.style.position = 'fixed';
        settingsWindow.style.top = '10%';
        settingsWindow.style.left = '25%';
        settingsWindow.style.width = '50%';
        settingsWindow.style.backgroundColor = 'white';
        settingsWindow.style.zIndex = '9995';
        settingsWindow.style.boxShadow = '0px 0px 10px rgba(0,0,0,0.5)';
        settingsWindow.style.borderRadius = '10px';
        settingsWindow.style.padding = '20px';

        // Bouton de fermeture "X"
        const closeButton = document.createElement('span');
        closeButton.textContent = 'X';
        closeButton.style.position = 'absolute';
        closeButton.style.top = '10px';
        closeButton.style.right = '20px';
        closeButton.style.cursor = 'pointer';
        closeButton.style.fontSize = '200%';
        closeButton.style.color = 'black';
        closeButton.style.backgroundColor = 'lightgray';
        closeButton.style.padding = '5px';
        closeButton.style.borderRadius = '5px';
        closeButton.style.padding = '20px';

        //langue a traduire

        // Formulaire de paramètres
        const activeToggle = createToggle(translations[userLanguage].activeToggle, settings.active, (value) => settings.active = value);
        const showToggle = createToggle(translations[userLanguage].showToggle, settings.show, (value) => settings.show = value);
        const exsaveToggle = createToggle(translations[userLanguage].exsaveToggle, settings.exsave, (value) => settings.exsave = value);
        const delayInput = createInput(translations[userLanguage].delayInput, settings.delay, (value) => settings.delay = parseInt(value, 10));

        // Boutons de gestion des paramètres
        const saveButton = createButton(translations[userLanguage].saveButton, saveAndClose);
        const cancelButton = createButton(translations[userLanguage].cancelButton, hideSettingsWindow);
        const defaultButton = createButton(translations[userLanguage].defaultButton, resetDefaults);

        // Ajouter les éléments à la fenêtre
        settingsWindow.appendChild(closeButton);
        settingsWindow.appendChild(activeToggle);
        settingsWindow.appendChild(delayInput);
        settingsWindow.appendChild(document.createElement("br"));
        settingsWindow.appendChild(showToggle);
        settingsWindow.appendChild(exsaveToggle);
        settingsWindow.appendChild(document.createElement("br"));
        settingsWindow.appendChild(saveButton);
        settingsWindow.appendChild(cancelButton);
        settingsWindow.appendChild(defaultButton);

        document.body.appendChild(overlay);
        document.body.appendChild(settingsWindow);

        // Gestion des événements
        closeButton.addEventListener('click', hideSettingsWindow);
        overlay.addEventListener('click', handleOverlayClick);
    }

    // Création des éléments de formulaire
    function createToggle(labelText, isChecked, onChange) {
        const container = document.createElement('div');
        const label = document.createElement('label');
        const checkbox = document.createElement('input');
        checkbox.type = 'checkbox';
        checkbox.checked = isChecked;

        checkbox.addEventListener('change', () => onChange(checkbox.checked));

        label.textContent = labelText;
        label.style.color = 'black';
        label.style.padding = '0 10px';
        container.appendChild(label);
        container.appendChild(checkbox);

        return container;
    }

    function createInput(labelText, value, onChange) {
        const container = document.createElement('div');
        const label = document.createElement('label');
        const input = document.createElement('input');
        input.type = 'text';
        input.value = value;

        input.addEventListener('input', () => onChange(input.value));

        label.textContent = labelText;
        label.style.color = 'black';
        label.style.padding = '0 10px';
        container.appendChild(label);
        container.appendChild(input);

        return container;
    }

    function createButton(text, onClick) {
        const button = document.createElement('button');
        button.textContent = text;
        button.style.padding = '10px';
        button.style.margin = '3px';
        button.style.border = 'revert';
        button.style.borderRadius = 'inherit';
        button.style.backgroundColor = 'lightgrey';
        button.addEventListener('click', onClick);

        return button;
    }

    // Gérer les actions du formulaire
    function saveAndClose() {
        saveSettings();
        hideSettingsWindow();
    }

    function resetDefaults() {
        settings.active = true;
        settings.delay = 0;
        settings.exsave = false;
        settings.show = true;
        saveSettings();
        hideSettingsWindow();
    }

    function hideSettingsWindow() {
        const overlay = document.getElementById('settingsOverlay');
        const settingsWindow = document.getElementById('settingsWindow');

        if (overlay) {
            document.body.removeChild(overlay);
        }
        if (settingsWindow) {
            document.body.removeChild(settingsWindow);
        }
        settings = {
            active: localStorage.getItem('active') === 'true',
            delay: parseInt(localStorage.getItem('delay'), 10) || 0,
            exsave: localStorage.getItem('exsave') === 'true',
            show: localStorage.getItem('show') === 'true'
        };
    }

    // Fonction pour sauvegarder les paramètres dans localStorage
    function saveSettings() {
        localStorage.setItem('active', settings.active);
        localStorage.setItem('delay', settings.delay);
        localStorage.setItem('exsave', settings.exsave);
        localStorage.setItem('show', settings.show);
        waitForIframe();
    }

    // Gérer le clic sur l'overlay
    function handleOverlayClick() {

        if (localStorage.getItem('show')) {
            // Créer l'overlay
            const overlay = document.createElement('div');
            overlay.id = 'customOverlay';
            overlay.style.position = 'fixed';
            overlay.style.top = '0';
            overlay.style.left = '0';
            overlay.style.width = '100%';
            overlay.style.height = '100%';
            overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; // Fond semi-transparent
            overlay.style.zIndex = '9998'; // Derrière la boîte de dialogue

            // Créer le conteneur pour l'alerte
            const alertDiv = document.createElement('div');
            alertDiv.id = 'customAlert';
            alertDiv.style.position = 'fixed';
            alertDiv.style.top = '50%';
            alertDiv.style.left = '50%';
            alertDiv.style.transform = 'translate(-50%, -50%)';
            alertDiv.style.padding = '20px';
            alertDiv.style.backgroundColor = '#fff';
            alertDiv.style.border = '1px solid #ccc';
            alertDiv.style.zIndex = '9999';
            alertDiv.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.1)';
            alertDiv.style.color = '#000'; // Texte noir

            // Ajouter le texte du message
            const message = document.createElement('p');
            //langue a traduire
            message.textContent = translations[userLanguage].confirmExit;
            alertDiv.appendChild(message);

            // Ajouter une checkbox avec le texte "Sauvegarder votre choix"
            const checkboxDiv = document.createElement('div');
            const checkbox = document.createElement('input');
            checkbox.type = 'checkbox';
            checkbox.id = 'saveChoiceCheckbox';
            checkboxDiv.appendChild(checkbox);

            const checkboxLabel = document.createElement('label');
            checkboxLabel.htmlFor = 'saveChoiceCheckbox';
            //langue a traduire
            checkboxLabel.textContent = translations[userLanguage].saveChoice;
            checkboxLabel.style.padding = '0 10px';
            checkboxDiv.appendChild(checkboxLabel);

            alertDiv.appendChild(checkboxDiv);

            // Ajouter les boutons Oui et Non
            const buttonContainer = document.createElement('div');
            buttonContainer.style.marginTop = '10px';
            buttonContainer.style.display = 'flex';
            buttonContainer.style.justifyContent = 'space-between';

            // Bouton Oui
            const yesButton = document.createElement('button');
            //langue a traduire
            yesButton.textContent = translations[userLanguage].yes;
            yesButton.onclick = function() {
                if (checkbox.checked) {
                    settings.show = false;
                }
                settings.exsave = true;
                saveSettings();
                hideSettingsWindow();
                closeAlert();
            };

            // Bouton Non
            const noButton = document.createElement('button');
            //langue a traduire
            noButton.textContent = translations[userLanguage].no;
            noButton.onclick = function() {
                if (checkbox.checked) {
                    settings.show = false;
                    localStorage.setItem('show', settings.show);
                }
                settings.exsave = false;
                localStorage.setItem('exsave', settings.exsave);
                hideSettingsWindow();
                closeAlert();
                settings = {
                    active: localStorage.getItem('active') === 'true',
                    delay: parseInt(localStorage.getItem('delay'), 10) || 0,
                    exsave: localStorage.getItem('exsave') === 'true',
                    show: localStorage.getItem('show') === 'true'
                };
            };

            // Ajouter les boutons au conteneur
            buttonContainer.appendChild(yesButton);
            buttonContainer.appendChild(noButton);
            alertDiv.appendChild(buttonContainer);

            // Ajouter la boîte de dialogue et l'overlay à la page
            document.body.appendChild(overlay);
            document.body.appendChild(alertDiv);

            // Fonction pour fermer l'alerte
            function closeAlert() {
                document.body.removeChild(alertDiv);
                document.body.removeChild(overlay);
            }
        } else {
            if (settings.exsave) {
                saveSettings();
            }
            hideSettingsWindow();
        }
    }

    // Observer les changements de style sur le bouton "Passer l'intro"
    function observeSkipButton() {
        const skipButton = document.querySelector('div[data-testid="skipButton"]');

        if (skipButton) {
            const delay = parseInt(localStorage.getItem('delay'), 10) || 0;
            let noSkipButton = document.querySelector('#noSkipButton');

            if (!noSkipButton) {
                noSkipButton = document.createElement('button');
                noSkipButton.id = 'noSkipButton';
                //langue a traduire
                noSkipButton.textContent = translations[userLanguage].AutoSkOff;
                noSkipButton.style.position = 'absolute';
                noSkipButton.style.right = '200px';
                noSkipButton.style.bottom = '100px';
                noSkipButton.style.height = '40px';
                noSkipButton.style.padding = '0 16px';
                noSkipButton.style.zIndex = '1';
                noSkipButton.style.display = 'block';
                noSkipButton.classList.add("css-1dbjc4n");
                noSkipButton.style.cursor = 'pointer';
                noSkipButton.value = '0';
                skipButton.parentNode.insertBefore(noSkipButton, skipButton);

                // Gérer le clic sur le bouton "no skip"
                noSkipButton.addEventListener('click', () => {
                    if (noSkipButton.value === "0") {
                        noSkipButton.value = '1';
                        //langue a traduire
                        noSkipButton.textContent = translations[userLanguage].AutoSkON;
                        console.log('Le bouton "No Skip" a été désactivé.');
                        const message = { type: 'noskip', value: noSkipButton.value };
                        sendMessageToParent(message);
                    } else {
                        noSkipButton.value = '0';
                        //langue a traduire
                        noSkipButton.textContent = translations[userLanguage].AutoSkOff;
                        console.log('Le bouton "No Skip" a été réactivé.');
                        const message = { type: 'noskip', value: noSkipButton.value };
                        sendMessageToParent(message);
                    }
                });

                // Variable pour stocker temporairement l'observateur
                let mutationObserverActive = true;

                // Observer les changements de style du bouton "Passer l'intro"
                const observer = new MutationObserver((mutations) => {


                    mutations.forEach((mutation) => {
                        if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
                            if (!skipButton.style.opacity || skipButton.style.opacity !== '0') {
                                const innerButton = skipButton.querySelector('div[tabindex="0"]');
                                if (innerButton) {
                                    if (localStorage.getItem('active') === 'true' && noSkipButton.value === "0") {
                                        const x = parseInt(localStorage.getItem('delay'), 10) || 0;
                                        setTimeout(function() {
                                            if (noSkipButton.value === "0") {
                                                innerButton.click(); // Ne pas exécuter si "no skip" est activé
                                            }
                                        }, x);
                                    }
                                }
                            }
                            if (!mutationObserverActive) return; // Désactiver les mutations pendant le survol du bouton "No Skip"
                            // Gérer l'affichage du bouton "no skip"
                            if (skipButton.style.opacity === '0') {
                                if (noSkipButton) {
                                    noSkipButton.style.display = 'none';
                                }
                            } else {
                                if (noSkipButton) {
                                    noSkipButton.style.display = 'block';
                                }
                            }
                        }
                    });
                });

                observer.observe(skipButton, { attributes: true });

                // Observer si le bouton "Passer l'intro" est supprimé du DOM
                const skipButtonRemovalObserver = new MutationObserver((mutations) => {
                    mutations.forEach((mutation) => {
                        mutation.removedNodes.forEach((removedNode) => {
                            if (removedNode === skipButton) {
                                console.log('Le bouton "Passer l\'intro" a été supprimé.');
                                if (noSkipButton) {
                                    noSkipButton.remove(); // Supprimer le bouton "No Skip" quand "skipButton" disparaît
                                    console.log('Le bouton "No Skip" a été supprimé.');
                                }
                            }
                        });
                    });
                });

                skipButtonRemovalObserver.observe(document.body, { childList: true, subtree: true });

                // Désactiver temporairement l'observateur lorsque la souris est sur "noSkipButton"
                noSkipButton.addEventListener('mouseover', () => {
                    mutationObserverActive = false; // Désactive l'observateur temporairement
                    if (skipButton) {
                        skipButton.style.opacity = '1'; // Forcer l'affichage du bouton "skipButton"
                    }
                });

                noSkipButton.addEventListener('mouseout', () => {
                    mutationObserverActive = true; // Réactiver l'observateur après avoir quitté "noSkipButton"
                    if (skipButton) {
                        skipButton.style.opacity = ''; // Rétablir l'état initial
                    }
                });
            }
        }

        // Écouteur de messages pour recevoir les mises à jour
        window.addEventListener('message', function(event) {
            if (event.origin !== 'https://www.crunchyroll.com' && event.origin !== 'https://static.crunchyroll.com') {
                console.log('Message ignoré, origine incorrecte:', event.origin);
                return;
            }

            const receivedMessage = event.data;

            if (receivedMessage.type === 'noskip') {
                const noSkipButton = document.getElementById('noSkipButton');
                if (noSkipButton) {
                    noSkipButton.value = receivedMessage.value;
                    console.log('Valeur du bouton No Skip mise à jour:', noSkipButton.value);
                } else {
                    console.log('Bouton No Skip non trouvé.');
                }
            }
        });
    }

    // Fonction pour envoyer un message au parent
    function sendMessageToParent(message) {
        window.parent.postMessage(message, '*');
    }

    // Ne pas exécuter dans les iframes
    if (window.self === window.top) {
        addSettingsButton();
    }

    // Fonction pour envoyer les valeurs de delay et active à l'iframe
    function sendValuesToIframe(iframe) {
        const delayValue = localStorage.getItem('delay') || '0'; // Valeur de delay
        const activeValue = localStorage.getItem('active') || 'true'; // Valeur de active

        // Envoyer seulement si la valeur de delay a changé
        if (delayValue !== previousDelay || firstLoad == true) {
            const message = {
                type: 'delay',
                value: delayValue
            };

            iframe.contentWindow.postMessage(message, 'https://static.crunchyroll.com');
            console.log('Message delay envoyé à l\'iframe:', message);

            previousDelay = delayValue; // Mettre à jour la valeur précédente
        }

        // Envoyer seulement si la valeur de active a changé
        if (activeValue !== previousActive || firstLoad == true) {
            const message = {
                type: 'active',
                value: activeValue
            };

            iframe.contentWindow.postMessage(message, 'https://static.crunchyroll.com');
            console.log('Message active envoyé à l\'iframe:', message);

            previousActive = activeValue; // Mettre à jour la valeur précédente
            firstLoad = false;
        }
    }

    // Vérifier si l'iframe est chargé et disponible
    function waitForIframe() {
        const iframe = document.querySelector('.video-player');
        if (iframe && iframe.src.includes('https://static.crunchyroll.com')) {
            console.log('Iframe trouvé:', iframe);

            // Envoyer les valeurs lors du premier chargement de l'iframe
            iframe.onload = function() {
                sendValuesToIframe(iframe);
            };

            // Vérifier périodiquement si les valeurs de delay ou active ont changé
            setInterval(function() {
                sendValuesToIframe(iframe); // Envoyer à chaque changement de delay ou active
            }, 1000); // Vérifier toutes les secondes
        } else {
            setTimeout(waitForIframe, 500); // Réessayer après 500 ms si l'iframe n'est pas trouvé
        }
    }

    // Lancer la fonction de vérification lorsque la page est complètement chargée
    window.addEventListener('load', waitForIframe);

    // Écouter les messages provenant de l'iframe
    window.addEventListener('message', function(event) {
        // Vérifier que l'origine du message est correcte
        if (event.origin !== 'https://www.crunchyroll.com') {
            return;
        }

        // Récupérer les données envoyées par le parent (qui est un objet structuré)
        const receivedMessage = event.data;

        // Vérifier que le type de message est bien 'delay'
        if (receivedMessage.type === 'delay') {
            const delay = receivedMessage.value;
            console.log('Delay reçu du parent:', delay);

            // Enregistrer la valeur dans le localStorage de l'iframe
            localStorage.setItem('delay', delay);
        }

        // Vérifier que le type de message est bien 'active'
        if (receivedMessage.type === 'active') {
            const active = receivedMessage.value;
            console.log('Active reçu du parent:', active);

            // Enregistrer la valeur dans le localStorage de l'iframe
            localStorage.setItem('active', active);
        }
    });

    //traduction traduire
    const translations = {
        ar: {
            activeToggle: "تفعيل التخطي التلقائي",
            showToggle: "عرض تنبيه التراكب",
            exsaveToggle: "حفظ عند الخروج من التراكب",
            delayInput: "التأخير قبل التخطي (مللي ثانية)",
            saveButton: "حفظ",
            cancelButton: "إلغاء",
            defaultButton: "الإفتراضي",
            confirmExit: "هل تريد الخروج وحفظ الإعدادات؟",
            saveChoice: "حفظ اختيارك",
            yes: "نعم",
            no: "لا",
            AutoSkOff: "تعطيل التخطي التلقائي",
            AutoSkON: "إعادة تفعيل التخطي التلقائي"
        },
        ca: {
            activeToggle: "Activar el salt automàtic",
            showToggle: "Mostra l'alerta de superposició",
            exsaveToggle: "Desa en sortir de la superposició",
            delayInput: "Retard abans de saltar (ms)",
            saveButton: "Desa",
            cancelButton: "Cancel·lar",
            defaultButton: "Per defecte",
            confirmExit: "Vols sortir i desar la configuració?",
            saveChoice: "Desa la teva elecció",
            yes: "Sí",
            no: "No",
            AutoSkOff: "Desactivar Salt Automàtic",
            AutoSkON: "Reactivar Salt Automàtic"
        },
        zh: {
            activeToggle: "启用自动跳过",
            showToggle: "显示覆盖警报",
            exsaveToggle: "退出覆盖时保存",
            delayInput: "跳过前的延迟(毫秒)",
            saveButton: "保存",
            cancelButton: "取消",
            defaultButton: "默认",
            confirmExit: "是否要退出并保存设置?",
            saveChoice: "保存您的选择",
            yes: "是",
            no: "否",
            AutoSkOff: "禁用自动跳过",
            AutoSkON: "重新启用自动跳过"
        },
        en: {
            activeToggle: "Enable automatic skip",
            showToggle: "Show overlay alert",
            exsaveToggle: "Save when exiting overlay",
            delayInput: "Delay before skipping (ms)",
            saveButton: "Save",
            cancelButton: "Cancel",
            defaultButton: "Default",
            confirmExit: "Do you want to quit and save the settings?",
            saveChoice: "Save your choice",
            yes: "Yes",
            no: "No",
            AutoSkOff: "Disable Auto Skip",
            AutoSkON: "Re-enable Auto Skip"
        },
        fr: {
            activeToggle: "Activer le skip automatique",
            showToggle: "Afficher l'alerte de l'overlay",
            exsaveToggle: "Sauvegarder en quittant l'overlay",
            delayInput: "Délai avant de skip (ms)",
            saveButton: "Sauvegarder",
            cancelButton: "Annuler",
            defaultButton: "Défaut",
            confirmExit: "Voulez-vous quitter et sauvegarder les paramètres?",
            saveChoice: "Sauvegarder votre choix",
            yes: "Oui",
            no: "Non",
            AutoSkOff: "Désactiver Auto Skip",
            AutoSkON: "Réactiver Auto Skip"
        },
        de: {
            activeToggle: "Automatisches Überspringen aktivieren",
            showToggle: "Overlay-Warnung anzeigen",
            exsaveToggle: "Beim Verlassen des Overlays speichern",
            delayInput: "Verzögerung vor dem Überspringen (ms)",
            saveButton: "Speichern",
            cancelButton: "Abbrechen",
            defaultButton: "Standard",
            confirmExit: "Möchten Sie beenden und die Einstellungen speichern?",
            saveChoice: "Speichern Sie Ihre Wahl",
            yes: "Ja",
            no: "Nein",
            AutoSkOff: "Automatisches Überspringen deaktivieren",
            AutoSkON: "Automatisches Überspringen erneut aktivieren"
        },
        hi: {
            activeToggle: "स्वचालित स्किप सक्षम करें",
            showToggle: "ओवरले चेतावनी दिखाएं",
            exsaveToggle: "ओवरले से बाहर निकलते समय सहेजें",
            delayInput: "स्किप करने से पहले विलंब (मिलीसेकंड)",
            saveButton: "सहेजें",
            cancelButton: "रद्द करें",
            defaultButton: "डिफ़ॉल्ट",
            confirmExit: "क्या आप बाहर निकलना और सेटिंग्स सहेजना चाहते हैं?",
            saveChoice: "अपनी पसंद सहेजें",
            yes: "हां",
            no: "नहीं",
            AutoSkOff: "स्वचालित स्किप अक्षम करें",
            AutoSkON: "स्वचालित स्किप फिर से सक्षम करें"
        },
        id: {
            activeToggle: "Aktifkan lewati otomatis",
            showToggle: "Tampilkan peringatan overlay",
            exsaveToggle: "Simpan saat keluar dari overlay",
            delayInput: "Tunda sebelum melewati (ms)",
            saveButton: "Simpan",
            cancelButton: "Batal",
            defaultButton: "Default",
            confirmExit: "Apakah Anda ingin keluar dan menyimpan pengaturan?",
            saveChoice: "Simpan pilihan Anda",
            yes: "Ya",
            no: "Tidak",
            AutoSkOff: "Nonaktifkan Lewati Otomatis",
            AutoSkON: "Aktifkan kembali Lewati Otomatis"
        },
        it: {
            activeToggle: "Abilita salto automatico",
            showToggle: "Mostra avviso sovrapposizione",
            exsaveToggle: "Salva quando esci dalla sovrapposizione",
            delayInput: "Ritardo prima del salto (ms)",
            saveButton: "Salva",
            cancelButton: "Annulla",
            defaultButton: "Predefinito",
            confirmExit: "Vuoi uscire e salvare le impostazioni?",
            saveChoice: "Salva la tua scelta",
            yes: "Sì",
            no: "No",
            AutoSkOff: "Disabilita Salto Automatico",
            AutoSkON: "Riattiva Salto Automatico"
        },
        ja: {
            activeToggle: "自動スキップを有効にする",
            showToggle: "オーバーレイ警告を表示",
            exsaveToggle: "オーバーレイを終了するときに保存",
            delayInput: "スキップ前の遅延 (ミリ秒)",
            saveButton: "保存",
            cancelButton: "キャンセル",
            defaultButton: "デフォルト",
            confirmExit: "終了して設定を保存しますか?",
            saveChoice: "選択を保存する",
            yes: "はい",
            no: "いいえ",
            AutoSkOff: "自動スキップを無効にする",
            AutoSkON: "自動スキップを再度有効にする"
        },
        ms: {
            activeToggle: "Aktifkan lompat automatik",
            showToggle: "Tunjukkan amaran overlay",
            exsaveToggle: "Simpan apabila keluar dari overlay",
            delayInput: "Kelewatan sebelum melompat (ms)",
            saveButton: "Simpan",
            cancelButton: "Batal",
            defaultButton: "Lalai",
            confirmExit: "Adakah anda mahu keluar dan menyimpan tetapan?",
            saveChoice: "Simpan pilihan anda",
            yes: "Ya",
            no: "Tidak",
            AutoSkOff: "Lumpuhkan Lompat Automatik",
            AutoSkON: "Dayakan semula Lompat Automatik"
        },
        pl: {
            activeToggle: "Włącz automatyczne pomijanie",
            showToggle: "Pokaż alert nakładki",
            exsaveToggle: "Zapisz przy wychodzeniu z nakładki",
            delayInput: "Opóźnienie przed pominięciem (ms)",
            saveButton: "Zapisz",
            cancelButton: "Anuluj",
            defaultButton: "Domyślnie",
            confirmExit: "Czy chcesz zakończyć i zapisać ustawienia?",
            saveChoice: "Zapisz swój wybór",
            yes: "Tak",
            no: "Nie",
            AutoSkOff: "Wyłącz automatyczne pomijanie",
            AutoSkON: "Włącz ponownie automatyczne pomijanie"
        },
        pt: {
            activeToggle: "Ativar pulo automático",
            showToggle: "Mostrar alerta de sobreposição",
            exsaveToggle: "Salvar ao sair da sobreposição",
            delayInput: "Atraso antes de pular (ms)",
            saveButton: "Salvar",
            cancelButton: "Cancelar",
            defaultButton: "Padrão",
            confirmExit: "Deseja sair e salvar as configurações?",
            saveChoice: "Salve sua escolha",
            yes: "Sim",
            no: "Não",
            AutoSkOff: "Desativar Pulo Automático",
            AutoSkON: "Reativar Pulo Automático"
        },
        ru: {
            activeToggle: "Включить автоматический пропуск",
            showToggle: "Показать предупреждение наложения",
            exsaveToggle: "Сохранить при выходе из наложения",
            delayInput: "Задержка перед пропуском (мс)",
            saveButton: "Сохранить",
            cancelButton: "Отмена",
            defaultButton: "По умолчанию",
            confirmExit: "Вы хотите выйти и сохранить настройки?",
            saveChoice: "Сохраните свой выбор",
            yes: "Да",
            no: "Нет",
            AutoSkOff: "Отключить автоматический пропуск",
            AutoSkON: "Повторно включить автоматический пропуск"
        },
        es: {
            activeToggle: "Habilitar omisión automática",
            showToggle: "Mostrar alerta de superposición",
            exsaveToggle: "Guardar al salir de la superposición",
            delayInput: "Retraso antes de omitir (ms)",
            saveButton: "Guardar",
            cancelButton: "Cancelar",
            defaultButton: "Por defecto",
            confirmExit: "¿Quieres salir y guardar la configuración?",
            saveChoice: "Guarda tu elección",
            yes: "Sí",
            no: "No",
            AutoSkOff: "Desactivar Omisión Automática",
            AutoSkON: "Reactivar Omisión Automática"
        },
        ta: {
            activeToggle: "தானியங்கி குதிப்பை இயக்கவும்",
            showToggle: "மேல்பட வருகையை காட்டவும்",
            exsaveToggle: "மேல்பட வருகையை விட்டு வெளியேறும்போது சேமிக்கவும்",
            delayInput: "குதிக்கும் முன் தாமதம் (மில்லி வினாடிகள்)",
            saveButton: "சேமிக்கவும்",
            cancelButton: "ரத்துசெய்",
            defaultButton: "இயல்புநிலை",
            confirmExit: "வெளியேறி அமைப்புகளைச் சேமிக்க விரும்புகிறீர்களா?",
            saveChoice: "உங்கள் தேர்வைச் சேமிக்கவும்",
            yes: "ஆம்",
            no: "இல்லை",
            AutoSkOff: "தானியங்கி குதிப்பை முடக்கு",
            AutoSkON: "தானியங்கி குதிப்பை மீண்டும் இயக்கவும்"
        },
        te: {
            activeToggle: "ఆటోమేటిక్ స్కిప్‌ని ఎనేబుల్ చేయండి",
            showToggle: "ఓవర్‌లే అలర్ట్‌ను చూపించండి",
            exsaveToggle: "ఓవర్‌లే నుండి నిష్క్రమించే సమయంలో సేవ్ చేయండి",
            delayInput: "స్కిప్ చేయడానికి ముందు ఆలస్యం (మిల్లీసెకన్లు)",
            saveButton: "సేవ్ చేయండి",
            cancelButton: "రద్దు చేయండి",
            defaultButton: "డిఫాల్ట్",
            confirmExit: "మీరు నిష్క్రమించి సెట్టింగ్‌లను సేవ్ చేయాలనుకుంటున్నారా?",
            saveChoice: "మీ ఎంపికను సేవ్ చేయండి",
            yes: "అవును",
            no: "కాదు",
            AutoSkOff: "ఆటోమేటిక్ స్కిప్‌ని ఆపివేయండి",
            AutoSkON: "ఆటోమేటిక్ స్కిప్‌ని తిరిగి ఎనేబుల్ చేయండి"
        },
        th: {
            activeToggle: "เปิดใช้งานข้ามอัตโนมัติ",
            showToggle: "แสดงการแจ้งเตือนซ้อนทับ",
            exsaveToggle: "บันทึกเมื่อออกจากการซ้อนทับ",
            delayInput: "ความล่าช้าก่อนข้าม (ms)",
            saveButton: "บันทึก",
            cancelButton: "ยกเลิก",
            defaultButton: "ค่าเริ่มต้น",
            confirmExit: "คุณต้องการออกและบันทึกการตั้งค่าหรือไม่?",
            saveChoice: "บันทึกการเลือกของคุณ",
            yes: "ใช่",
            no: "ไม่",
            AutoSkOff: "ปิดใช้งานการข้ามอัตโนมัติ",
            AutoSkON: "เปิดใช้งานการข้ามอัตโนมัติอีกครั้ง"
        },
        tr: {
            activeToggle: "Otomatik atlamayı etkinleştir",
            showToggle: "Bindirme uyarısını göster",
            exsaveToggle: "Bindirmeden çıkarken kaydet",
            delayInput: "Atlamadan önce gecikme (ms)",
            saveButton: "Kaydet",
            cancelButton: "İptal",
            defaultButton: "Varsayılan",
            confirmExit: "Çıkmak ve ayarları kaydetmek istiyor musunuz?",
            saveChoice: "Seçiminizi kaydedin",
            yes: "Evet",
            no: "Hayır",
            AutoSkOff: "Otomatik Atlama'yı devre dışı bırak",
            AutoSkON: "Otomatik Atlama'yı yeniden etkinleştir"
        },
        vi: {
            activeToggle: "Bật bỏ qua tự động",
            showToggle: "Hiển thị cảnh báo lớp phủ",
            exsaveToggle: "Lưu khi thoát lớp phủ",
            delayInput: "Độ trễ trước khi bỏ qua (ms)",
            saveButton: "Lưu",
            cancelButton: "Hủy bỏ",
            defaultButton: "Mặc định",
            confirmExit: "Bạn có muốn thoát và lưu cài đặt không?",
            saveChoice: "Lưu lựa chọn của bạn",
            yes: "Có",
            no: "Không",
            AutoSkOff: "Tắt bỏ qua tự động",
            AutoSkON: "Bật lại bỏ qua tự động"
        }
    };

})();