// ==UserScript== // @name Crunchyroll Auto Skip with Settings // @name:fr Crunchyroll Saut Automatique avec Paramètres // @name:ar تخطي تلقائي لـ Crunchyroll مع الإعدادات // @name:ca Crunchyroll Auto Skip amb Configuracions // @name:zh-CN Crunchyroll 自动跳过设置 // @name:de Crunchyroll Automatisches Überspringen mit Einstellungen // @name:hi क्रंचीरोल ऑटो स्किप सेटिंग्स के साथ // @name:id Crunchyroll Lewati Otomatis dengan Pengaturan // @name:it Crunchyroll Salta Automaticamente con Impostazioni // @name:ja Crunchyroll 自動スキップ設定付き // @name:ms Crunchyroll Langkau Auto dengan Tetapan // @name:pl Crunchyroll Automatyczne Pomijanie z Ustawieniami // @name:pt-PT Crunchyroll Pular Automático com Configurações // @name:ru Crunchyroll Автоматическое Пропускание с Настройками // @name:es Crunchyroll Salto Automático con Configuraciones // @name:ta க்ரஞ்சிரோல் தானியங்கி தவிர்க்கும் அமைப்புகளுடன் // @name:te క్రంచిరోల్ ఆటో స్కిప్ సెట్టింగులతో // @name:th Crunchyroll ข้ามอัตโนมัติพร้อมการตั้งค่า // @name:tr Crunchyroll Ayarlarla Otomatik Geçiş // @name:vi Crunchyroll Tự động Bỏ qua với Cài đặt // @description Automatically skip the intro and ending if available. // @description:fr Sauter automatiquement l'intro et la fin si elles sont disponibles. // @description:ar تخطي تلقائي للمقدمة والنهاية إذا كانت متوفرة. // @description:ca Salta automàticament la introducció i el final si estan disponibles。 // @description:zh-CN 自动跳过片头和片尾(如果可用)。 // @description:de Überspringt automatisch das Intro und Ende, wenn verfügbar。 // @description:hi परिचय और अंत को स्वचालित रूप से छोड़ें, यदि उपलब्ध हो。 // @description:id Lewati intro dan akhir secara otomatis jika tersedia。 // @description:it Salta automaticamente l'intro e il finale se disponibili。 // @description:ja イントロとエンディングを自動的にスキップします(利用可能な場合)。 // @description:ms Langkau intro dan akhir secara automatik jika tersedia。 // @description:pl Automatycznie pomija intro i zakończenie, jeśli są dostępne。 // @description:pt-PT Pule automaticamente a introdução e o final, se disponível。 // @description:ru Автоматически пропускать вступление и концовку, если они доступны。 // @description:es Omite automáticamente la introducción y el final si están disponibles。 // @description:ta தொடக்கமும் முடிவும் கிடைத்தால் தானாகவே தவிர்க்கப்படும்。 // @description:te యింట్రో మరియు ఎండింగ్‌ను ఆటోమేటిక్‌గా స్కిప్ చేయండి, అందుబాటులో ఉంటే。 // @description:th ข้ามส่วนเปิดและส่วนท้ายโดยอัตโนมัติหากมีให้。 // @description:tr Giriş ve bitişi otomatik olarak atlar (eğer mevcutsa)。 // @description:vi Tự động bỏ qua phần giới thiệu và phần kết nếu có。 // @namespace https://greasyfork.org/scripts/513644 // @version 3.3 // @author MASTERD // @match *://*.crunchyroll.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=crunchyroll.com // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Langues prises en charge const supportedLanguages = ['en', 'fr', 'ar', 'ca', 'zh', 'de', 'es', 'hi', 'id', 'it', 'ja', 'ms', 'pl', 'pt', 'ru', 'ta', 'te', 'th', 'tr', 'vi']; const userLanguage = supportedLanguages.find(lang => navigator.language.startsWith(lang)) || 'en'; const defaultSettings = { AutoSkipActive: true, AutoSkipDelay: 0, OverlayAutoSave: false, OverlayAlertShow: true, HistoryButton: true, WatchlistButton: true, ArrowLeftAutoSkip: false, ArrowRightAutoSkip: true, }; const storedSettings = JSON.parse(localStorage.getItem("AutoSkipParameter")) || {}; const updatedSettings = { ...defaultSettings, ...storedSettings }; localStorage.setItem("AutoSkipParameter", JSON.stringify(updatedSettings)); let settings = JSON.parse(localStorage.getItem("AutoSkipParameter")); CleanUpdate(); let OrigineLoad = JSON.parse(localStorage.getItem("AutoSkipParameter")); let firstLoad = true; let mutationObserverActive = true; let ObsSettingsButton = true, observerSkipButt = true, HisButton = true, WatButton = true; new MutationObserver(() => { if (ObsSettingsButton) addSettingsButton(); if (observerSkipButt) observeSkipButton(); if (HisButton) HisWatButton(document.querySelector('.erc-history-collection[data-t="history"]'), 'HistoryButton', 'HistoryButton');; if (WatButton) HisWatButton(document.querySelector('.erc-watchlist-collection[data-t="watchlist"]'), 'WatchlistButton', 'WatchlistButton');; }).observe(document.body, { childList: true, subtree: true }); const applyHoverFocusStyles = (element1, BackColorOn1, BackColorOff1, boxShadowOn1, boxShadowOff1, element2, BackColorOn2, BackColorOff2, boxShadowOn2, boxShadowOff2) => { const addStyles = () => { element1.style.backgroundColor = BackColorOn1; element1.style.boxShadow = boxShadowOn1; if(element2){ element2.style.backgroundColor = BackColorOn2; element2.style.boxShadow = boxShadowOn2; }; }; const removeStyles = () => { element1.style.backgroundColor = BackColorOff1; element1.style.boxShadow = boxShadowOff1; if(element2){ element2.style.backgroundColor = BackColorOff2; element2.style.boxShadow = boxShadowOff2; }; }; element1.addEventListener('mouseover', addStyles); element1.addEventListener('mouseout', removeStyles); element1.addEventListener('focus', addStyles); element1.addEventListener('blur', removeStyles); }; function CleanUpdate() { const oldKeys = ['active', 'delay', 'exsave', 'show']; const newKeys = ['AutoSkipActive', 'AutoSkipDelay', 'OverlayAutoSave', 'OverlayAlertShow']; const parseValue = (value) => { if (value === '"true"') return true; if (value === '"false"') return false; if (!isNaN(value)) return Number(value); // Convertir en nombre si possible return value; // Retourne la valeur telle quelle si ce n'est ni un booléen ni un nombre }; oldKeys.forEach((key, i) => { let value = localStorage.getItem(key); if (value !== null) { settings[newKeys[i]] = parseValue(value); localStorage.removeItem(key); } }); Object.keys(settings).forEach((key) => { if (!(key in defaultSettings)) { delete settings[key]; } }); localStorage.setItem("AutoSkipParameter", JSON.stringify(settings)); } function addSettingsButton() { const userActionsList = document.querySelector('.erc-user-actions'); if (userActionsList) { const svgDiv = document.createElement('div'); svgDiv.innerHTML = ` `; svgDiv.classList.add('erc-header-svg'); const settingsButton = document.createElement('div'); settingsButton.classList.add('erc-header-tile'); settingsButton.classList.add('state-icon-only'); settingsButton.setAttribute('tabindex', '0'); settingsButton.addEventListener('keydown', (event) => { if (event.key === ' ' || event.key === 'Enter') { event.preventDefault(); showSettingsWindow(); // Ouvrir la fenêtre de paramètres } }); settingsButton.addEventListener('click', showSettingsWindow); // Créer un nouvel élément
  • et y ajouter le bouton const newLi = document.createElement('li'); newLi.classList.add('user-actions-item'); settingsButton.appendChild(svgDiv); newLi.appendChild(settingsButton); userActionsList.appendChild(newLi); ObsSettingsButton = false; } } // Fonction pour afficher la fenêtre de paramètres function showSettingsWindow() { const overlay = createElementWithStyles('div', { position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', backgroundColor: 'rgba(0, 0, 0, 0.4)', zIndex: '9994' }); overlay.id = 'settingsOverlay'; const settingsWindow = createElementWithStyles('div', { position: 'fixed', top: '10%', left: '25%', width: '50%', maxHeight: '80vh', overflow: 'auto', backgroundColor: 'white', zIndex: '9995', boxShadow: '0px 0px 10px rgba(0,0,0,0.5)', borderRadius: '10px', padding: '20px', minWidth: '400px', }); settingsWindow.id = 'settingsWindow'; settingsWindow.tabIndex = 0; settingsWindow.addEventListener('mouseover', (event) => { const target = event.target; const activeElement = document.activeElement; if (target === settingsWindow && activeElement.tagName !== 'INPUT' && activeElement.type !== 'text') { settingsWindow.focus(); } else if (settingsWindow.contains(target) && target.tabIndex >= 0 && activeElement.tagName !== 'INPUT' && activeElement.type !== 'text') { target.focus(); } }); settingsWindow.addEventListener('keydown', (event) => { if (document.activeElement === settingsWindow && (event.key === 'Tab' || event.key === 'ArrowUp' || event.key === 'ArrowLeft' || event.key === 'ArrowDown' || event.key === 'ArrowRight')) { event.preventDefault(); closeButton.focus(); } else if (event.key === 'Escape') { hideSettingsWindow(); } }); const closeButton = createButton('X', hideSettingsWindow, 1, { fontSize: '4vw', padding: '0.5vw', maxWidth: '5vw', maxHeight: '5vw', minWidth: '5vw', minHeight: '5vw' }); const HeadLabelTitle = createElementWithStyles('p', { flexGrow: '1', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', fontSize: '2vw', color: 'rgb(255, 124, 0)', webkitTextStroke: '1px black', textShadow: 'rgb(255, 124, 0) 0px 0px 12px', display: 'flex', alignItems: 'center', fontFamily: 'auto', fontWeight: 'bold', background: 'rgba(255, 255, 255, 0.2)', backdropFilter: 'blur(0.5px)', borderRadius: 'inherit', padding: '10px' }, translations[userLanguage].HeadLabelTitle); const img = createElementWithStyles('img', { sizes: '114x114', margin: '10px', width: '1.5em', height: '1.5em', boxShadow: 'inset 0 0 20px 0 rgb(255, 124, 0), 0 0 15px 4px rgb(255, 124, 0)', borderRadius: '2000px' }); img.src = '/build/assets/img/favicons/apple-touch-icon-v2-114x114.png'; HeadLabelTitle.insertBefore(img, HeadLabelTitle.firstChild); const HeadBanner = createSection([ HeadLabelTitle, closeButton ], { maxWidth: '100vw', position: 'sticky', top: '0px', display: 'flex', justifyContent: 'space-between' }, 1); const HeadAutoSkip = createSection([ createToggle(translations[userLanguage].AutoSkipActiveToggle, settings.AutoSkipActive, v => settings.AutoSkipActive = v, 1), createInput(translations[userLanguage].AutoSkipDelayInput, settings.AutoSkipDelay, v => settings.AutoSkipDelay = parseInt(v, 10), 1), createArrowSkipSection() ], {}, 1); const HeadOverlay = createSection([ createToggle(translations[userLanguage].OverlayAlertShowToggle, settings.OverlayAlertShow, v => settings.OverlayAlertShow = v, 1), createToggle(translations[userLanguage].OverlayAutoSaveToggle, settings.OverlayAutoSave, v => settings.OverlayAutoSave = v, 1) ], {}, 1); const HeadOther = createSection([ createToggle(translations[userLanguage].HistoryButtonToggle, settings.HistoryButton, v => settings.HistoryButton = v, 1), createToggle(translations[userLanguage].WatchlistButtonToggle, settings.WatchlistButton, v => settings.WatchlistButton = v, 1) ], {}, 1); const defaultButton = createButton(translations[userLanguage].defaultButton, resetDefaults, 1); defaultButton.addEventListener('keydown', (event) => { if (event.key === 'Tab') { event.preventDefault(); closeButton.focus(); } }); const HeadButton = createSection([ createButton(translations[userLanguage].saveButton, saveAndClose, 1), createButton(translations[userLanguage].cancelButton, hideSettingsWindow, 1), defaultButton ], { display: 'flex', justifyContent: 'space-between' }, 1); settingsWindow.append(HeadBanner, document.createElement('br'), HeadAutoSkip, document.createElement('br'), HeadOverlay, document.createElement('br'), HeadOther, document.createElement('br'), HeadButton); document.body.append(overlay, settingsWindow); overlay.addEventListener('click', handleOverlayClick); closeButton.focus(); } function createElementWithStyles(tag, styles, textContent = '') { const element = document.createElement(tag); Object.assign(element.style, styles); if (textContent) element.textContent = textContent; return element; } function createSection(children, styles = {}, index) { const section = createElementWithStyles('div', { borderRadius: 'inherit', userSelect: 'none', border: 'outset', padding: '5px', ...styles }); section.tabIndex = 0; children.forEach(child => section.appendChild(child)); const firstFocusableChild = children.find(child => child.tabIndex === index); section.addEventListener('keydown', (event) => { if (document.activeElement === section && (event.key === 'Tab' || event.key === 'ArrowUp' || event.key === 'ArrowLeft' || event.key === 'ArrowDown' || event.key === 'ArrowRight')) { event.preventDefault(); if (firstFocusableChild) { firstFocusableChild.focus(); } } }); return section; } function createArrowSkipSection() { const section = createElementWithStyles('div', { display: 'flex', alignItems: 'center', padding: '5px', width: 'fit-content', borderRadius: 'inherit' }); const label = createElementWithStyles('p', { color: 'black', padding: '5px 10px', width: 'fit-content', borderRadius: 'inherit', transition: 'background-color 0.2s ease' }, translations[userLanguage].ArrowAutoSkipToggle); applyHoverFocusStyles(label, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)', ''); const leftToggle = createToggle('[⬅]', settings.ArrowLeftAutoSkip, v => settings.ArrowLeftAutoSkip = v, 1); const rightToggle = createToggle('[➡]', settings.ArrowRightAutoSkip, v => settings.ArrowRightAutoSkip = v, 1); const leftCheckbox = leftToggle.querySelector('input[type="checkbox"]'); const rightCheckbox = rightToggle.querySelector('input[type="checkbox"]'); function syncCheckboxes() { const bothChecked = leftCheckbox.checked && rightCheckbox.checked; const newValue = !bothChecked; [leftCheckbox, rightCheckbox].forEach(checkbox => checkbox.checked = newValue); Object.assign(settings, { ArrowLeftAutoSkip: newValue, ArrowRightAutoSkip: newValue }); } label.addEventListener('click', () => { requestAnimationFrame(syncCheckboxes); }); section.append(label, leftToggle, rightToggle); return section; } // Création des éléments de formulaire function createToggle(labelText, isChecked, onChange, index) { const container = document.createElement('div'); Object.assign(container.style, { display: 'flex', alignItems: 'center', cursor: 'pointer', padding: '5px', width: 'fit-content', transition: 'background-color 0.2s ease', borderRadius: 'inherit' }); container.tabIndex = index; applyHoverFocusStyles(container, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)', ''); container.addEventListener('click', () => { checkbox.checked = !checkbox.checked; onChange(checkbox.checked); }); container.addEventListener('keydown', (event) => { if (event.key === ' ' || event.key === 'Enter') { event.preventDefault(); checkbox.checked = !checkbox.checked; onChange(checkbox.checked); } else if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') { event.preventDefault(); navigateDivs('up', container, index); } else if (event.key === 'ArrowDown' || event.key === 'ArrowRight') { event.preventDefault(); navigateDivs('down', container, index); } }); const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = isChecked; checkbox.style.cursor = 'pointer'; applyHoverFocusStyles(checkbox, '', '', '0 0 15px rgba(255, 124, 0, 1)', ''); checkbox.addEventListener('click', () => { checkbox.checked = !checkbox.checked; onChange(checkbox.checked); }); const label = document.createElement('label'); label.textContent = labelText; Object.assign(label.style, { color: 'black', padding: '0 10px', cursor: 'pointer' }); container.appendChild(label); container.appendChild(checkbox); return container; } function createInput(labelText, value, onChange, index) { const container = document.createElement('div'); Object.assign(container.style, { display: 'flex', alignItems: 'center', padding: '5px', width: 'fit-content', transition: 'background-color 0.2s ease', borderRadius: 'inherit', cursor: 'pointer' }); container.addEventListener('click', () => { if (document.activeElement !== input) { input.focus(); input.select(); } }); applyHoverFocusStyles(container, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)', ''); const input = document.createElement('input'); input.type = 'text'; input.value = value; input.tabIndex = index; input.style.width = '100%'; applyHoverFocusStyles(input, '', '', '0 0 15px rgba(255, 124, 0, 1)', '', container, '#ff640a', '', '0 0 15px rgba(255, 124, 0, 1)', ''); input.addEventListener('input', () => onChange(input.value)); input.addEventListener('keydown', (event) => { if (event.key === 'ArrowUp') { event.preventDefault(); navigateDivs('up', input, index); } else if (event.key === 'ArrowDown') { event.preventDefault(); navigateDivs('down', input, index); } }); const label = document.createElement('label'); label.textContent = labelText; Object.assign(label.style, { color: 'black', padding: '0 10px', cursor: 'pointer' }); container.appendChild(label); container.appendChild(input); return container; } function createButton(text, onClick, index) { const button = document.createElement('button'); Object.assign(button.style, { cursor: 'pointer', padding: '10px', margin: '3px', border: 'revert', borderRadius: 'inherit', backgroundColor: 'lightgrey', transition: 'background-color 0.2s ease' }); button.textContent = text; button.tabIndex = index; applyHoverFocusStyles(button, '#ff640a', 'lightgrey', '0 0 15px rgba(255, 124, 0, 1)', ''); button.addEventListener('click', onClick); button.addEventListener('keydown', (event) => { if (event.key === ' ' || event.key === 'Enter') { event.preventDefault(); document.activeElement.click(); } else if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') { event.preventDefault(); navigateDivs('up', button, index); } else if (event.key === 'ArrowDown' || event.key === 'ArrowRight') { event.preventDefault(); navigateDivs('down', button, index); } }); return button; } // Gérer les actions du formulaire function saveAndClose() { saveSettings(); hideSettingsWindow(); } function resetDefaults() { settings = defaultSettings; 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 = JSON.parse(localStorage.getItem("AutoSkipParameter")); } function navigateDivs(direction, currentDiv, index) { const allDivs = Array.from(document.querySelectorAll(`div[tabindex="${index}"], button[tabindex="${index}"], input[tabindex="${index}"]`)); const currentIndex = allDivs.indexOf(currentDiv); let nextIndex; if (index === 0 || index == null) return; if (direction === 'up') { nextIndex = (currentIndex - 1 + allDivs.length) % allDivs.length; } else if (direction === 'down') { nextIndex = (currentIndex + 1) % allDivs.length; } const nextDiv = allDivs[nextIndex]; if (nextDiv) { nextDiv.focus(); if (nextDiv.tagName === 'INPUT') { nextDiv.select(); } } } // Fonction pour sauvegarder les paramètres dans localStorage function saveSettings() { localStorage.setItem("AutoSkipParameter", JSON.stringify(settings)); waitForIframe(); } // Gérer le clic sur l'overlay function handleOverlayClick() { const UniqueLoadOverlay = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (UniqueLoadOverlay.OverlayAlertShow) { // Créer l'overlay const overlay = document.createElement('div'); overlay.id = 'customOverlay'; Object.assign(overlay.style, { position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', backgroundColor: 'rgba(0, 0, 0, 0.5)', zIndex: '9998' }); // Créer le conteneur pour l'alerte const alertDiv = document.createElement('div'); alertDiv.id = 'customAlert'; Object.assign(alertDiv.style, { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', padding: '20px', backgroundColor: '#fff', border: '1px solid #ccc', borderRadius: '10px', zIndex: '9999', boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.1)', color: '#000' }); alertDiv.addEventListener('mouseover', (event) => { const target = event.target; if (target === alertDiv) { alertDiv.focus(); } else if (alertDiv.contains(target) && target.tabIndex >= 0) { target.focus(); } }); // Ajouter le texte du message const message = document.createElement('p'); message.textContent = translations[userLanguage].confirmExit; alertDiv.appendChild(message); // Ajouter une checkbox avec le texte "Sauvegarder votre choix" let Toggle = false; const checkboxDiv = createToggle(translations[userLanguage].saveChoice, false, v => Toggle = v, 2) checkboxDiv.style.justifySelf = 'center'; // Ajouter les boutons Oui et Non const buttonContainer = document.createElement('div'); Object.assign(buttonContainer.style, { marginTop: '10px', display: 'flex', borderRadius: '10px', justifyContent: 'space-between' }); // Bouton Oui const yesButton = createButton(translations[userLanguage].yes, saveAndClose, 2); yesButton.onclick = function () { if (Toggle) { settings.OverlayAlertShow = false; } settings.OverlayAutoSave = true; saveSettings(); hideSettingsWindow(); closeAlert(); }; // Bouton Non const noButton = createButton(translations[userLanguage].no, hideSettingsWindow, 2); noButton.onclick = function () { const UniqueSettings = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (Toggle) { UniqueSettings.OverlayAlertShow = false; } UniqueSettings.OverlayAutoSave = false; localStorage.setItem("AutoSkipParameter", JSON.stringify(UniqueSettings)); hideSettingsWindow(); closeAlert(); // Rechargement des paramètres depuis le localStorage settings = JSON.parse(localStorage.getItem("AutoSkipParameter")); }; noButton.addEventListener('keydown', (event) => { if (event.key === 'Tab') { event.preventDefault(); checkboxDiv.focus(); } }); // Ajouter les boutons au conteneur buttonContainer.appendChild(yesButton); buttonContainer.appendChild(noButton); alertDiv.appendChild(checkboxDiv); alertDiv.appendChild(buttonContainer); // Ajouter la boîte de dialogue et l'overlay à la page document.body.appendChild(overlay); document.body.appendChild(alertDiv); checkboxDiv.focus(); addKeyboardNavigation(overlay, checkboxDiv); addKeyboardNavigation(alertDiv, checkboxDiv); function addKeyboardNavigation(element, focusTarget) { element.tabIndex = 0; element.addEventListener('keydown', (event) => { if (document.activeElement === element && ['Tab', 'ArrowUp', 'ArrowLeft', 'ArrowDown', 'ArrowRight'].includes(event.key)) { event.preventDefault(); if (focusTarget) focusTarget.focus(); } }); } function closeAlert() { document.body.removeChild(alertDiv); document.body.removeChild(overlay); } } else { if (UniqueLoadOverlay.OverlayAutoSave) { 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) { let noSkipButton = document.querySelector('#noSkipButton'); if (!noSkipButton) { noSkipButton = createButton(translations[userLanguage].AutoSkOff + ' [⬇]', toggleNoSkip, 0); noSkipButton.id = 'noSkipButton'; noSkipButton.value = '0'; const skipButtonSize = skipButton.querySelector('.css-1dbjc4n.r-1awozwy'); if (skipButtonSize) { const rect = skipButtonSize.getBoundingClientRect(); Object.assign(noSkipButton.style, { position: 'absolute', right: `${20 + rect.width}px`, bottom: '97px', height: '40px', zIndex: '1', fontWeight: 'bold', }); } skipButton.parentNode.insertBefore(noSkipButton, skipButton); // Observer les changements de style du bouton "Passer l'intro" const observerSkipButtAtt = new MutationObserver((mutations) => { mutations.forEach((mutation) => { Skip(observerSkipButtAtt); // Gérer l'affichage du bouton "no skip" const skipButt = document.querySelector('div[data-testid="skipButton"]'); if (skipButt.style.opacity === '0') { if (noSkipButton) { noSkipButton.style.display = 'none'; } } else { if (noSkipButton) { noSkipButton.style.display = 'block'; } } }); }); observerSkipButtAtt.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) { if (noSkipButton) { skipButtonRemovalObserver.disconnect(); noSkipButton.remove(); // Supprimer le bouton "No Skip" quand "skipButton" disparaît } } }); }); }); 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) { // Ajouter un MutationObserver pour surveiller les changements du style const observerSkipOpa = new MutationObserver(() => { // Vérifier et forcer l'affichage du bouton "skipButton" if (getComputedStyle(skipButton).opacity !== '1') { skipButton.style.opacity = '1'; // Forcer l'affichage } }); // Observer uniquement les modifications d'attributs de "skipButton" observerSkipOpa.observe(skipButton, { attributes: true, attributeFilter: ['style'] }); // Arrêter l'observation après un certain temps ou à la sortie de la souris noSkipButton.addEventListener('mouseout', () => { mutationObserverActive = true; // Réactiver l'observateur principal observerSkipOpa.disconnect(); // Arrêter l'observation if (skipButton) { skipButton.style.opacity = ''; // Rétablir l'état initial } }, { once: true }); } }); } } } function Skip(observerSkipButtAtt){ if (!mutationObserverActive) return; // Désactiver les mutations pendant le survol du bouton "No Skip" const skipButt = document.querySelector('div[data-testid="skipButton"]'); const innerButton = skipButt.querySelector('div[tabindex="0"]'); let noSkipButton = document.querySelector('#noSkipButton'); if (innerButton) { const UniqueLoadSkip = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (UniqueLoadSkip.AutoSkipActive && noSkipButton.value === "0") { const x = UniqueLoadSkip.AutoSkipDelay || 0; setTimeout(function() { if (noSkipButton.value === "0" && mutationObserverActive) { if (observerSkipButtAtt) { observerSkipButtAtt.disconnect(); } innerButton.click(); // Ne pas exécuter si "no skip" est activé } }, x); } } } function toggleNoSkip() { const noSkipButton = document.querySelector('#noSkipButton'); if (!noSkipButton) return; const newValue = noSkipButton.value === "0" ? "1" : "0"; noSkipButton.value = newValue; noSkipButton.textContent = newValue === "1" ? translations[userLanguage].AutoSkON + ' [⬇]' : translations[userLanguage].AutoSkOff + ' [⬇]'; sendMessageToParent({ type: 'noskip', value: noSkipButton.value }); } function sendMessageToParent(message) { window.parent.postMessage(message, '*'); } function sendValuesToIframe(iframe) { const UniqueLoadToIframe = JSON.parse(localStorage.getItem("AutoSkipParameter")); if (JSON.stringify(UniqueLoadToIframe) !== JSON.stringify(OrigineLoad) || firstLoad) { const message = { type: 'AutoSkipParameter', value: UniqueLoadToIframe }; iframe.contentWindow.postMessage(message, 'https://static.crunchyroll.com'); OrigineLoad = UniqueLoadToIframe; // Mettre à jour la valeur précédente firstLoad = false; } } function waitForIframe() { let iframe = document.querySelector('.video-player'); if (iframe && iframe.src.includes('https://static.crunchyroll.com')) { iframe.onload = function() { sendValuesToIframe(iframe); }; const intervalId = setInterval(function() { iframe = document.querySelector('.video-player'); if (iframe) { sendValuesToIframe(iframe); } else { clearInterval(intervalId); } }, 1000); } else { setTimeout(waitForIframe, 500); // Réessayer après 500 ms si l'iframe n'est pas trouvé } } function HistoryWatchlistButt(headerDiv) { if (!headerDiv.querySelector('button')) { let isExpanded = false; const collectionDiv = headerDiv.nextElementSibling; const history = collectionDiv.classList.contains('erc-history-collection'); const watchlist = collectionDiv.classList.contains('erc-watchlist-collection'); const button = createButton('▶', () => { if (collectionDiv && (history || watchlist)) { const items = collectionDiv.querySelectorAll('.collection-item'); isExpanded = !isExpanded; button.textContent = isExpanded ? '▼' : '▶'; items.forEach((item, index) => { if (index >= 5) { if (isExpanded) { Object.assign(item.style, { display: 'block', maxHeight: '0px', overflow: 'hidden', transition: 'max-height 1s' }); item.offsetHeight; item.style.maxHeight = '1000px'; } else { item.style.maxHeight = '0px'; } } }); } }, 0); // Bouton stylé en cercle Object.assign(button.style, { width: '40px', height: '40px', borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: '1.5rem', marginLeft: '10px', boxShadow: '0 0 15px rgba(255, 255, 255, 1)' }); button.tabIndex = '0'; button.id = history ? 'HistoryButton' : 'WatchlistButton'; // Styles au survol et au focus applyHoverFocusStyles(button, '#ff640a', 'white', '0 0 15px rgba(255, 124, 0, 1)', '0 0 15px rgba(255, 255, 255, 1)'); headerDiv.appendChild(button); } } function HisWatButton(AB, settingKey, buttonId) { if (AB && AB.previousElementSibling && AB.previousElementSibling.classList.contains('feed-header--ihqym')) { if (settings[settingKey]) { HistoryWatchlistButt(AB.previousElementSibling); } else { AB.previousElementSibling.querySelector(`#${buttonId}`)?.remove(); } } } // Lancer la fonction de vérification lorsque la page est complètement chargée window.addEventListener('load', waitForIframe); // Récupérer les données envoyées à l'iframe window.addEventListener('message', function(event) { if (event.origin !== 'https://www.crunchyroll.com') { return; } const receivedMessage = event.data; if (receivedMessage.type === 'AutoSkipParameter') { const AutoSkipParameter = receivedMessage.value; localStorage.setItem("AutoSkipParameter", JSON.stringify(AutoSkipParameter)); } }); if (window.location.hostname === "static.crunchyroll.com") { document.addEventListener("keydown", function(event) { const noSkipButton = document.querySelector("#noSkipButton"); const skipButt = document.querySelector('div[data-testid="skipButton"]'); const innerButton = skipButt?.querySelector('div[tabindex="0"]'); const settingsStatic = JSON.parse(localStorage.getItem("AutoSkipParameter")) || {}; if (noSkipButton && ((event.key === "ArrowLeft" && settingsStatic.ArrowLeftAutoSkip) || (event.key === "ArrowRight" && settingsStatic.ArrowRightAutoSkip))) { if (settingsStatic.AutoSkipActive && innerButton) { innerButton.click(); } } if (noSkipButton && (event.key === "ArrowDown")) { event.preventDefault(); event.stopPropagation(); toggleNoSkip(); } }, true); } //traduction const translations = { en: { HeadLabelTitle: "Auto Skip Parameter", AutoSkipActiveToggle: "Enable automatic skip", AutoSkipDelayInput: "Delay before skipping (ms)", ArrowAutoSkipToggle: "Enable arrow automatic skip", OverlayAlertShowToggle: "Show overlay alert", OverlayAutoSaveToggle: "Save when exiting overlay", HistoryButtonToggle: "Activate the button on the main page for more history", WatchlistButtonToggle: "Activate the button on the main page for more watchlist", 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: { HeadLabelTitle: "Paramètre du saut automatique", AutoSkipActiveToggle: "Activer le saut automatique", AutoSkipDelayInput: "Délai avant de sauter (ms)", ArrowAutoSkipToggle: "Activer le saut automatique avec les flèches", OverlayAlertShowToggle: "Afficher l'alerte en superposition", OverlayAutoSaveToggle: "Sauvegarder en quittant la superposition", HistoryButtonToggle: "Activer le bouton sur la page principale pour plus d'historique", WatchlistButtonToggle: "Activer le bouton sur la page principale pour plus de watchlist", saveButton: "Enregistrer", cancelButton: "Annuler", defaultButton: "Par défaut", confirmExit: "Voulez-vous quitter et enregistrer les paramètres ?", saveChoice: "Enregistrer votre choix", yes: "Oui", no: "Non", AutoSkOff: "Désactiver le saut automatique", AutoSkON: "Réactiver le saut automatique" }, ar: { HeadLabelTitle: "معلمة التخطي التلقائي", AutoSkipActiveToggle: "تمكين التخطي التلقائي", AutoSkipDelayInput: "التأخير قبل التخطي (مللي ثانية)", ArrowAutoSkipToggle: "تمكين التخطي التلقائي بالسهم", OverlayAlertShowToggle: "عرض تنبيه التراكب", OverlayAutoSaveToggle: "حفظ عند الخروج من التراكب", HistoryButtonToggle: "تفعيل الزر في الصفحة الرئيسية للمزيد من السجل", WatchlistButtonToggle: "تفعيل الزر في الصفحة الرئيسية للمزيد من قائمة المشاهدة", saveButton: "حفظ", cancelButton: "إلغاء", defaultButton: "افتراضي", confirmExit: "هل تريد الخروج وحفظ الإعدادات؟", saveChoice: "حفظ اختيارك", yes: "نعم", no: "لا", AutoSkOff: "تعطيل التخطي التلقائي", AutoSkON: "إعادة تمكين التخطي التلقائي" }, ca: { HeadLabelTitle: "Paràmetre de salt automàtic", AutoSkipActiveToggle: "Habilita el salt automàtic", AutoSkipDelayInput: "Retard abans de saltar (ms)", ArrowAutoSkipToggle: "Habilita el salt automàtic amb fletxes", OverlayAlertShowToggle: "Mostra l'alerta de superposició", OverlayAutoSaveToggle: "Desa en sortir de la superposició", HistoryButtonToggle: "Activa el botó a la pàgina principal per més historial", WatchlistButtonToggle: "Activa el botó a la pàgina principal per més llista de seguiment", saveButton: "Desa", cancelButton: "Cancel·la", defaultButton: "Per defecte", confirmExit: "Vols sortir i desar la configuració?", saveChoice: "Desa la teva elecció", yes: "Sí", no: "No", AutoSkOff: "Desactiva el salt automàtic", AutoSkON: "Torna a activar el salt automàtic" }, zh: { HeadLabelTitle: "自动跳过参数", AutoSkipActiveToggle: "启用自动跳过", AutoSkipDelayInput: "跳过前的延迟(毫秒)", ArrowAutoSkipToggle: "启用箭头自动跳过", OverlayAlertShowToggle: "显示叠加警报", OverlayAutoSaveToggle: "退出叠加时保存", HistoryButtonToggle: "在主页上启用按钮以查看更多历史记录", WatchlistButtonToggle: "在主页上启用按钮以查看更多观看列表", saveButton: "保存", cancelButton: "取消", defaultButton: "默认", confirmExit: "您想退出并保存设置吗?", saveChoice: "保存您的选择", yes: "是", no: "否", AutoSkOff: "禁用自动跳过", AutoSkON: "重新启用自动跳过" }, de: { HeadLabelTitle: "Automatischer Überspring-Parameter", AutoSkipActiveToggle: "Automatisches Überspringen aktivieren", AutoSkipDelayInput: "Verzögerung vor dem Überspringen (ms)", ArrowAutoSkipToggle: "Pfeil-Auto-Skip aktivieren", OverlayAlertShowToggle: "Overlay-Warnung anzeigen", OverlayAutoSaveToggle: "Beim Verlassen des Overlays speichern", HistoryButtonToggle: "Schaltfläche auf der Hauptseite für mehr Verlauf aktivieren", WatchlistButtonToggle: "Schaltfläche auf der Hauptseite für mehr Watchlist aktivieren", saveButton: "Speichern", cancelButton: "Abbrechen", defaultButton: "Standard", confirmExit: "Möchten Sie beenden und die Einstellungen speichern?", saveChoice: "Ihre Auswahl speichern", yes: "Ja", no: "Nein", AutoSkOff: "Automatisches Überspringen deaktivieren", AutoSkON: "Automatisches Überspringen wieder aktivieren" }, es: { HeadLabelTitle: "Parámetro de omisión automática", AutoSkipActiveToggle: "Habilitar salto automático", AutoSkipDelayInput: "Retraso antes de saltar (ms)", ArrowAutoSkipToggle: "Habilitar salto automático con flechas", OverlayAlertShowToggle: "Mostrar alerta superpuesta", OverlayAutoSaveToggle: "Guardar al salir de la superposición", HistoryButtonToggle: "Activar el botón en la página principal para más historial", WatchlistButtonToggle: "Activar el botón en la página principal para más lista de seguimiento", saveButton: "Guardar", cancelButton: "Cancelar", defaultButton: "Predeterminado", confirmExit: "¿Quieres salir y guardar la configuración?", saveChoice: "Guardar tu elección", yes: "Sí", no: "No", AutoSkOff: "Deshabilitar salto automático", AutoSkON: "Rehabilitar salto automático" }, hi: { HeadLabelTitle: "स्वचालित छोड़ने का पैरामीटर", AutoSkipActiveToggle: "स्वचालित स्किप सक्षम करें", AutoSkipDelayInput: "स्किप से पहले विलंब (मि.से.)", ArrowAutoSkipToggle: "तीर स्वचालित स्किप सक्षम करें", OverlayAlertShowToggle: "ओवरले अलर्ट दिखाएं", OverlayAutoSaveToggle: "ओवरले से बाहर निकलते समय सहेजें", HistoryButtonToggle: "अधिक इतिहास के लिए मुख्य पृष्ठ पर बटन सक्रिय करें", WatchlistButtonToggle: "अधिक वॉचलिस्ट के लिए मुख्य पृष्ठ पर बटन सक्रिय करें", saveButton: "सहेजें", cancelButton: "रद्द करें", defaultButton: "डिफ़ॉल्ट", confirmExit: "क्या आप बाहर निकलना और सेटिंग्स सहेजना चाहते हैं?", saveChoice: "अपनी पसंद सहेजें", yes: "हाँ", no: "नहीं", AutoSkOff: "स्वचालित स्किप अक्षम करें", AutoSkON: "स्वचालित स्किप पुनः सक्षम करें" }, id: { HeadLabelTitle: "Parameter Lewati Otomatis", AutoSkipActiveToggle: "Aktifkan lompatan otomatis", AutoSkipDelayInput: "Tunda sebelum melompat (ms)", ArrowAutoSkipToggle: "Aktifkan lompatan otomatis dengan panah", OverlayAlertShowToggle: "Tampilkan peringatan overlay", OverlayAutoSaveToggle: "Simpan saat keluar dari overlay", HistoryButtonToggle: "Aktifkan tombol di halaman utama untuk riwayat lebih lanjut", WatchlistButtonToggle: "Aktifkan tombol di halaman utama untuk daftar tontonan lebih lanjut", saveButton: "Simpan", cancelButton: "Batal", defaultButton: "Default", confirmExit: "Apakah Anda ingin keluar dan menyimpan pengaturan?", saveChoice: "Simpan pilihan Anda", yes: "Ya", no: "Tidak", AutoSkOff: "Nonaktifkan Lompatan Otomatis", AutoSkON: "Aktifkan kembali Lompatan Otomatis" }, it: { HeadLabelTitle: "Parametro di salto automatico", AutoSkipActiveToggle: "Abilita il salto automatico", AutoSkipDelayInput: "Ritardo prima di saltare (ms)", ArrowAutoSkipToggle: "Abilita il salto automatico con le frecce", OverlayAlertShowToggle: "Mostra avviso in sovrimpressione", OverlayAutoSaveToggle: "Salva quando si esce dalla sovrimpressione", HistoryButtonToggle: "Attiva il pulsante nella pagina principale per più cronologia", WatchlistButtonToggle: "Attiva il pulsante nella pagina principale per più lista di visione", saveButton: "Salva", cancelButton: "Annulla", defaultButton: "Predefinito", confirmExit: "Vuoi uscire e salvare le impostazioni?", saveChoice: "Salva la tua scelta", yes: "Sì", no: "No", AutoSkOff: "Disattiva il salto automatico", AutoSkON: "Riattiva il salto automatico" }, ja: { HeadLabelTitle: "自動スキップパラメータ", AutoSkipActiveToggle: "自動スキップを有効にする", AutoSkipDelayInput: "スキップ前の遅延(ミリ秒)", ArrowAutoSkipToggle: "矢印キーの自動スキップを有効にする", OverlayAlertShowToggle: "オーバーレイアラートを表示", OverlayAutoSaveToggle: "オーバーレイを終了するときに保存", HistoryButtonToggle: "メインページでボタンを有効にして履歴を表示", WatchlistButtonToggle: "メインページでボタンを有効にしてウォッチリストを表示", saveButton: "保存", cancelButton: "キャンセル", defaultButton: "デフォルト", confirmExit: "終了して設定を保存しますか?", saveChoice: "選択を保存", yes: "はい", no: "いいえ", AutoSkOff: "自動スキップを無効にする", AutoSkON: "自動スキップを再有効化する" }, ms: { HeadLabelTitle: "Parameter Langkau Automatik", AutoSkipActiveToggle: "Aktifkan langkau automatik", AutoSkipDelayInput: "Kelewatan sebelum melangkau (ms)", ArrowAutoSkipToggle: "Aktifkan langkau automatik dengan anak panah", OverlayAlertShowToggle: "Tunjukkan amaran lapisan atas", OverlayAutoSaveToggle: "Simpan apabila keluar dari lapisan atas", HistoryButtonToggle: "Aktifkan butang di halaman utama untuk sejarah tambahan", WatchlistButtonToggle: "Aktifkan butang di halaman utama untuk senarai tontonan tambahan", saveButton: "Simpan", cancelButton: "Batal", defaultButton: "Default", confirmExit: "Adakah anda ingin keluar dan menyimpan tetapan?", saveChoice: "Simpan pilihan anda", yes: "Ya", no: "Tidak", AutoSkOff: "Nyahaktifkan Langkau Automatik", AutoSkON: "Aktifkan semula Langkau Automatik" }, pl: { HeadLabelTitle: "Parametr automatycznego pomijania", AutoSkipActiveToggle: "Włącz automatyczne pomijanie", AutoSkipDelayInput: "Opóźnienie przed pominięciem (ms)", ArrowAutoSkipToggle: "Włącz automatyczne pomijanie strzałkami", OverlayAlertShowToggle: "Pokaż alert nakładki", OverlayAutoSaveToggle: "Zapisz po wyjściu z nakładki", HistoryButtonToggle: "Aktywuj przycisk na stronie głównej, aby zobaczyć więcej historii", WatchlistButtonToggle: "Aktywuj przycisk na stronie głównej, aby zobaczyć więcej listy obserwowanych", saveButton: "Zapisz", cancelButton: "Anuluj", defaultButton: "Domyślne", confirmExit: "Czy chcesz wyjść i zapisać ustawienia?", saveChoice: "Zapisz swój wybór", yes: "Tak", no: "Nie", AutoSkOff: "Wyłącz automatyczne pomijanie", AutoSkON: "Ponownie włącz automatyczne pomijanie" }, pt: { HeadLabelTitle: "Parâmetro de Pular Automático", AutoSkipActiveToggle: "Ativar pulo automático", AutoSkipDelayInput: "Atraso antes de pular (ms)", ArrowAutoSkipToggle: "Ativar pulo automático com setas", OverlayAlertShowToggle: "Mostrar alerta em sobreposição", OverlayAutoSaveToggle: "Salvar ao sair da sobreposição", HistoryButtonToggle: "Ativar botão na página principal para mais histórico", WatchlistButtonToggle: "Ativar botão na página principal para mais lista de observação", saveButton: "Salvar", cancelButton: "Cancelar", defaultButton: "Padrão", confirmExit: "Deseja sair e salvar as configurações?", saveChoice: "Salvar sua escolha", yes: "Sim", no: "Não", AutoSkOff: "Desativar Pulo Automático", AutoSkON: "Reativar Pulo Automático" }, ru: { HeadLabelTitle: "Параметр автоматического пропуска", AutoSkipActiveToggle: "Включить автоматическое пропускание", AutoSkipDelayInput: "Задержка перед пропуском (мс)", ArrowAutoSkipToggle: "Включить автоматический пропуск с помощью стрелок", OverlayAlertShowToggle: "Показать уведомление в оверлее", OverlayAutoSaveToggle: "Сохранить при выходе из оверлея", HistoryButtonToggle: "Активировать кнопку на главной странице для просмотра истории", WatchlistButtonToggle: "Активировать кнопку на главной странице для списка просмотра", saveButton: "Сохранить", cancelButton: "Отмена", defaultButton: "По умолчанию", confirmExit: "Вы хотите выйти и сохранить настройки?", saveChoice: "Сохранить ваш выбор", yes: "Да", no: "Нет", AutoSkOff: "Отключить автоматическое пропускание", AutoSkON: "Включить автоматическое пропускание" }, ta: { HeadLabelTitle: "தானியங்கும் தாண்டும் அளவுரு", AutoSkipActiveToggle: "தானியங்கி தவிர்க்கலை இயக்கவும்", AutoSkipDelayInput: "தவிர்க்கும் முன் தாமதம் (மில்லி விநாடிகள்)", ArrowAutoSkipToggle: "அம்பு தானியங்கி தவிர்க்கலை இயக்கவும்", OverlayAlertShowToggle: "மேலே இடப்படும் எச்சரிக்கையை காட்டு", OverlayAutoSaveToggle: "மேலே இடப்பட்டதை விட்டு வெளியேறும்போது சேமிக்கவும்", HistoryButtonToggle: "மேலும் வரலாற்றை காண முதன்மை பக்கத்தில் பொத்தானை செயல்படுத்தவும்", WatchlistButtonToggle: "மேலும் பார்வை பட்டியலை காண முதன்மை பக்கத்தில் பொத்தானை செயல்படுத்தவும்", saveButton: "சேமிக்கவும்", cancelButton: "ரத்துசெய்", defaultButton: "இயல்புநிலை", confirmExit: "நீங்கள் வெளியேறி அமைப்புகளைச் சேமிக்க விரும்புகிறீர்களா?", saveChoice: "உங்கள் தேர்வைச் சேமிக்கவும்", yes: "ஆம்", no: "இல்லை", AutoSkOff: "தானியங்கி தவிர்க்கலை முடக்கு", AutoSkON: "தானியங்கி தவிர்க்கலை மீண்டும் இயக்கு" }, te: { HeadLabelTitle: "ఆటో స్కిప్ పరామితి", AutoSkipActiveToggle: "ఆటో స్కిప్‌ను ప్రారంభించండి", AutoSkipDelayInput: "స్కిప్ చేసేముందు ఆలస్యం (మి.సె.)", ArrowAutoSkipToggle: "ఆరో స్కిప్‌ను ప్రారంభించండి", OverlayAlertShowToggle: "ఓవర్లే అలర్ట్‌ను చూపించండి", OverlayAutoSaveToggle: "ఓవర్లే నుండి బయటకు వచ్చినప్పుడు సేవ్ చేయండి", HistoryButtonToggle: "మరింత చరిత్ర కోసం ప్రధాన పేజీలో బటన్‌ను ప్రారంభించండి", WatchlistButtonToggle: "మరింత వీక్షణ జాబితా కోసం ప్రధాన పేజీలో బటన్‌ను ప్రారంభించండి", saveButton: "సేవ్", cancelButton: "రద్దు చేయండి", defaultButton: "అప్రమేయం", confirmExit: "మీరు నిష్క్రమించి సెట్టింగ్‌లను సేవ్ చేయాలనుకుంటున్నారా?", saveChoice: "మీ ఎంపికను సేవ్ చేయండి", yes: "అవును", no: "కాదు", AutoSkOff: "ఆటో స్కిప్‌ను నిలిపివేయి", AutoSkON: "ఆటో స్కిప్‌ను మళ్లీ ప్రారంభించండి" }, th: { HeadLabelTitle: "พารามิเตอร์ข้ามอัตโนมัติ", AutoSkipActiveToggle: "เปิดใช้งานการข้ามอัตโนมัติ", AutoSkipDelayInput: "หน่วงเวลาก่อนข้าม (มิลลิวินาที)", ArrowAutoSkipToggle: "เปิดใช้งานการข้ามอัตโนมัติด้วยลูกศร", OverlayAlertShowToggle: "แสดงการแจ้งเตือนแบบซ้อนทับ", OverlayAutoSaveToggle: "บันทึกเมื่อออกจากการซ้อนทับ", HistoryButtonToggle: "เปิดใช้งานปุ่มบนหน้าแรกเพื่อดูประวัติเพิ่มเติม", WatchlistButtonToggle: "เปิดใช้งานปุ่มบนหน้าแรกเพื่อดูรายการที่ต้องการ", saveButton: "บันทึก", cancelButton: "ยกเลิก", defaultButton: "ค่าเริ่มต้น", confirmExit: "คุณต้องการออกและบันทึกการตั้งค่าหรือไม่?", saveChoice: "บันทึกตัวเลือกของคุณ", yes: "ใช่", no: "ไม่", AutoSkOff: "ปิดการข้ามอัตโนมัติ", AutoSkON: "เปิดใช้งานการข้ามอัตโนมัติอีกครั้ง" }, tr: { HeadLabelTitle: "Otomatik Atlatma Parametresi", AutoSkipActiveToggle: "Otomatik geçişi etkinleştir", AutoSkipDelayInput: "Geçmeden önce gecikme (ms)", ArrowAutoSkipToggle: "Ok tuşlarıyla otomatik geçişi etkinleştir", OverlayAlertShowToggle: "Bindirme uyarısını göster", OverlayAutoSaveToggle: "Bindirmeden çıkarken kaydet", HistoryButtonToggle: "Daha fazla geçmiş için ana sayfada düğmeyi etkinleştir", WatchlistButtonToggle: "Daha fazla izleme listesi için ana sayfada düğmeyi etkinleştir", 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 geçişi devre dışı bırak", AutoSkON: "Otomatik geçişi yeniden etkinleştir" }, vi: { HeadLabelTitle: "Tham số bỏ qua tự động", AutoSkipActiveToggle: "Bật bỏ qua tự động", AutoSkipDelayInput: "Độ trễ trước khi bỏ qua (ms)", ArrowAutoSkipToggle: "Bật bỏ qua tự động bằng phím mũi tên", OverlayAlertShowToggle: "Hiển thị cảnh báo lớp phủ", OverlayAutoSaveToggle: "Lưu khi thoát lớp phủ", HistoryButtonToggle: "Bật nút trên trang chính để xem lịch sử nhiều hơn", WatchlistButtonToggle: "Bật nút trên trang chính để xem danh sách theo dõi nhiều hơn", saveButton: "Lưu", cancelButton: "Hủy", 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" } }; })();