// ==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"
}
};
})();