Greasy Fork is available in English.

ChatGPT Infinity ∞

Generate endless answers from all-knowing ChatGPT (in any language!)

2023-05-10 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

// ==UserScript==
// @name                ChatGPT Infinity ∞
// @name:ar             ChatGPT إنفينيتي ∞
// @name:bg             ChatGPT Безкрайност ∞
// @name:bn             চ্যাটজিপিটি ইনফিনিটি ∞
// @name:cs             ChatGPT Nekonečno ∞
// @name:da             ChatGPT Uendelighed ∞
// @name:de             ChatGPT Unendlichkeit ∞
// @name:el             ChatGPT Άπειρο ∞
// @name:eo             ChatGPT Senfina ∞
// @name:es             ChatGPT Infinito ∞
// @name:fi             ChatGPT Äärettömyys ∞
// @name:fr             ChatGPT Infini ∞
// @name:fr-CA          ChatGPT Infini ∞
// @name:gu             ચેટજીપીટી અનંત ∞
// @name:hi             चैटजीपीटी अनंत ∞
// @name:hu             ChatGPT Végtelen ∞
// @name:in             ChatGPT Tak Terhingga ∞
// @name:it             ChatGPT Infinito ∞
// @name:iw             צ'אטגפט אינסוף ∞
// @name:ja             ChatGPT 無限大 ∞
// @name:ka             ChatGPT უსასი ∞
// @name:kn             ಚಾಟ್ಜಿಪಿಟಿ ಅನಂತ ∞
// @name:ko             ChatGPT 무한대 ∞
// @name:ku             ChatGPT Bêdawî ∞
// @name:ml             ചാറ്റ്‌ജിപിടി അനന്തതയും ∞
// @name:mr             चॅटजीपीटी अनंत ∞
// @name:ms             ChatGPT Tak Terhingga ∞
// @name:my             ChatGPT အများကြီး ∞
// @name:nl             ChatGPT Oneindigheid ∞
// @name:no             ChatGPT Uendelighet ∞
// @name:or             ଚାଟଜିପିଟି ଅନନ୍ତ ∞
// @name:pa             ਚੈਟਜੀਪੀਟੀ ਅਨੰਤ ∞
// @name:pl             ChatGPT Nieskończoność ∞
// @name:pt             ChatGPT Infinito ∞
// @name:pt-BR          ChatGPT Infinito ∞
// @name:ro             ChatGPT Infinit ∞
// @name:ru             ChatGPT Бесконечность ∞
// @name:sk             ChatGPT Nekonečno ∞
// @name:sr             ChatGPT Бесконачност ∞
// @name:ta             சாட் ஜிபிடி முழுமையான ∞
// @name:th             ChatGPT ความไม่สิ้นสุด ∞
// @name:tr             ChatGPT Sonsuzluk ∞
// @name:uk             ChatGPT Нескінченність ∞
// @name:ur             چیٹ جی پی ٹی بے انتہا ∞
// @name:vi             ChatGPT Vô Hạn ∞
// @name:zh-CN          ChatGPT 无限 ∞
// @name:zh-HK          ChatGPT 無限 ∞
// @name:zh-SG          ChatGPT 无限 ∞
// @name:zh-TW          ChatGPT 無限 ∞
// @version             2023.5.10
// @description         Generate endless answers from all-knowing ChatGPT (in any language!)
// @description:ar      احصل على إجابات لا حصر لها من ChatGPT الذي يعرف الجميع (بأي لغة!)
// @description:bg      Генерирайте безкрайни отговори от всезнаещия ChatGPT (на всеки език!)
// @description:bn      সর্বজনবিদিত ChatGPT থেকে অবিরাম উত্তর তৈরি করুন (যেকোন ভাষায়!)
// @description:cs      Generujte nekonečné odpovědi ze vševědoucího ChatGPT (v jakémkoli jazyce!)
// @description:da      Generer endeløse svar fra alvidende ChatGPT (på ethvert sprog!)
// @description:de      Generieren Sie endlose Antworten aus dem allwissenden ChatGPT (in jeder Sprache!)
// @description:el      Δημιουργήστε ατελείωτες απαντήσεις από το παντογνώστη ChatGPT (σε οποιαδήποτε γλώσσα!)
// @description:eo      Generu senfinajn respondojn de ĉioscia ChatGPT (en iu ajn lingvo!)
// @description:es      Genera infinitas respuestas desde ChatGPT que todo lo sabe (¡en cualquier idioma!)
// @description:fi      Luo loputtomasti vastauksia kaikkitietävästä ChatGPT:stä (millä tahansa kielellä!)
// @description:fr      Générez des réponses sans fin à partir de ChatGPT qui sait tout (dans n'importe quelle langue!)
// @description:fr-CA   Générez des réponses sans fin à partir de ChatGPT qui sait tout (dans n'importe quelle langue!)
// @description:gu      સર્વજ્ઞાની ChatGPT (કોઈપણ ભાષામાં!) તરફથી અનંત જવાબો બનાવો
// @description:hi      सभी जानकार ChatGPT से अंतहीन उत्तर उत्पन्न करें (किसी भी भाषा में!)
// @description:hu      Generáljon végtelen válaszokat a mindent tudó ChatGPT segítségével (bármilyen nyelven!)
// @description:in      Hasilkan jawaban tanpa akhir dari ChatGPT yang serba tahu (dalam bahasa apa pun!)
// @description:it      Genera risposte infinite da ChatGPT onnisciente (in qualsiasi lingua!)
// @description:iw      הפק תשובות אינסופיות מ-ChatGPT היודע הכל (בכל שפה!)
// @description:ja      すべてを知っている ChatGPT から無限の回答を生成します (任意の言語で!)
// @description:ka      შექმენით გაუთავებელი პასუხები ყოვლისმომცველი ChatGPT-დან (ნებისმიერ ენაზე!)
// @description:kn      すべてを知っている ChatGPT から無限の回答を生成します (任意の言語で!)
// @description:ko      모든 것을 아는 ChatGPT에서 끝없는 답변 생성(모든 언어로!)
// @description:ku      Bersivên bêdawî ji ChatGPT-a-zana (bi her zimanî!)
// @description:ml      എല്ലാം അറിയുന്ന ChatGPT-ൽ നിന്ന് അനന്തമായ ഉത്തരങ്ങൾ സൃഷ്ടിക്കുക (ഏത് ഭാഷയിലും!)
// @description:mr      सर्वज्ञात ChatGPT (कोणत्याही भाषेत!) कडून अंतहीन उत्तरे व्युत्पन्न करा.
// @description:ms      Hasilkan jawapan yang tidak berkesudahan daripada ChatGPT yang serba tahu (dalam mana-mana bahasa!)
// @description:my      အားလုံးသိသော ChatGPT (မည်သည့်ဘာသာစကားဖြင့်မဆို) မှ အဆုံးမဲ့အဖြေများကို ဖန်တီးပါ။
// @description:nl      Genereer eindeloze antwoorden van alwetende ChatGPT (in elke taal!)
// @description:no      Generer endeløse svar fra allvitende ChatGPT (på hvilket som helst språk!)
// @description:or      ସମସ୍ତ ଜାଣିବା ChatGPT ରୁ ଅସୀମ ଉତ୍ତର ସୃଷ୍ଟି କରନ୍ତୁ (ଯେକ language ଣସି ଭାଷାରେ!)
// @description:pa      ਸਭ-ਜਾਣਨ ਵਾਲੇ ਚੈਟਜੀਪੀਟੀ (ਕਿਸੇ ਵੀ ਭਾਸ਼ਾ ਵਿੱਚ!) ਤੋਂ ਬੇਅੰਤ ਜਵਾਬ ਤਿਆਰ ਕਰੋ
// @description:pl      Generuj niekończące się odpowiedzi z wszechwiedzącego ChatGPT (w dowolnym języku!)
// @description:pt      Gere respostas infinitas do onisciente ChatGPT (em qualquer idioma!)
// @description:pt-BR   Gere respostas infinitas do onisciente ChatGPT (em qualquer idioma!)
// @description:ro      Generați răspunsuri nesfârșite de la atotștiutorul ChatGPT (în orice limbă!)
// @description:ru      Создавайте бесконечные ответы от всезнающего ChatGPT (на любом языке!)
// @description:sk      Generujte nekonečné odpovede od vševediaceho ChatGPT (v akomkoľvek jazyku!)
// @description:sr      Генеришите бескрајне одговоре од свезнајућег ЦхатГПТ-а (на било ком језику!)
// @description:sv      Generera oändliga svar från allvetande ChatGPT (på vilket språk som helst!)
// @description:ta      அனைத்தையும் அறிந்த ChatGPT இலிருந்து முடிவற்ற பதில்களை உருவாக்கவும் (எந்த மொழியிலும்!)
// @description:th      สร้างคำตอบไม่รู้จบจาก ChatGPT ที่รอบรู้ (ในภาษาใดก็ได้!)
// @description:tr      Her şeyi bilen ChatGPT'den sonsuz cevaplar oluşturun (herhangi bir dilde!)
// @description:uk      Генеруйте нескінченні відповіді від всезнаючого ChatGPT (будь-якою мовою!)
// @description:ur      تمام جاننے والے ChatGPT سے لامتناہی جوابات تیار کریں (کسی بھی زبان میں!)
// @description:vi      Tạo vô số câu trả lời từ ChatGPT toàn năng (bằng bất kỳ ngôn ngữ nào!)
// @description:zh-CN   从无所不知的 ChatGPT 生成无穷无尽的答案 (用任何语言!)
// @description:zh-HK   從無所不知的 ChatGPT 生成無窮無盡的答案 (用任何語言!)
// @description:zh-SG   从无所不知的 ChatGPT 生成无穷无尽的答案 (用任何语言!)
// @description:zh-TW   從無所不知的 ChatGPT 生成無窮無盡的答案 (用任何語言!)
// @author              Adam Lui
// @namespace           https://github.com/adamlui
// @license             MIT
// @match               https://chat.openai.com/*
// @icon                https://raw.githubusercontent.com/adamlui/userscripts/master/chatgpt/media/icons/openai-favicon48.png
// @icon64              https://raw.githubusercontent.com/adamlui/userscripts/master/chatgpt/media/icons/openai-favicon64.png
// @compatible          chrome
// @compatible          firefox
// @compatible          edge
// @compatible          opera
// @compatible          brave
// @compatible          vivaldi
// @compatible          waterfox
// @compatible          librewolf
// @compatible          ghost
// @compatible          qq
// @require             https://cdn.jsdelivr.net/gh/chatgptjs/chatgpt.js@51dc48d5bff8e5539e8cee273032360d0691c6a6/dist/chatgpt-1.6.5.min.js
// @grant               GM_setValue
// @grant               GM_getValue
// @grant               GM_registerMenuCommand
// @grant               GM_unregisterMenuCommand
// @noframes
// @homepageURL         https://chatgptevo.com/infinity
// @supportURL          https://chatgptevo.com/infinity/support
// ==/UserScript==

// NOTE: This script relies on the powerful chatgpt.js library @ https://chatgpt.js.org (c) 2023 Adam Lui, chatgpt.js & contributors under the MIT license.

(async () => {

    // Initialize settings
    var config = { userLanguage: navigator.languages[0] || navigator.language || '',
                   isActive: false, sent: false, infinityMode: false }
    var configKeyPrefix = 'chatGPTinf_', messages = {}
    loadSetting('toggleHidden', 'autoScrollDisabled', 'replyLanguage', 'replyInterval')
    if (!config.replyLanguage) saveSetting('replyLanguage', navigator.languages[0] || navigator.language || '') // init reply language
    if (!config.replyInterval) saveSetting('replyInterval', 7) // init refresh interval to 7 secs if unset

    // Define messages
    switch (config.userLanguage) {

        case 'ar': // Arabic
            messages = {
                menuLabels: {
                    infinityMode: 'وضع اللانهاية', toggleVisibility: 'تبديل الرؤية', autoScroll: 'لف تلقائي',
                    replyLanguage: 'لغة الرد', replyInterval: 'الفاصل الزمني للرد' },
                prompts: {
                    updateReplyLang: 'تحديث لغة الرد', updateReplyInt: 'تحديث الفاصل الزمني للرد (5 ثوان على الأقل)' },
                alerts: {
                    willReplyIn: 'سترد ChatGPT Infinity بتنسيق', yourSysLang: 'لغة نظامك',
                    willReplyEvery: 'سيقوم ChatGPT Infinity بالرد على كل', seconds: 'ثواني' },
                states: { enabled: 'ممكن', disabled: 'عاجز' }
            } ; break
             
        case 'bg': // Bulgarian
            messages = {
                menuLabels: {
                    infinityMode: 'Режим безкрайност', toggleVisibility: 'Превключване на видимостта', autoScroll: 'Автоматично превъртане',
                    replyLanguage: 'Език за отговор', replyInterval: 'Интервал за отговор' },
                prompts: {
                    updateReplyLang: 'Актуализирайте езика за отговор', updateReplyInt: 'Актуализирайте интервала за отговор (минимум 5 секунди)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity ще отговори', yourSysLang: 'вашия системен език',
                    willReplyEvery: 'ChatGPT Infinity ще отговаря на всеки', seconds: 'секунди' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'bn': // Bengali
            messages = {
                menuLabels: {
                    infinityMode: 'ইনফিনিটি মোড', toggleVisibility: 'দৃশ্যমানতা টগল করুন', autoScroll: 'অটো স্ক্রল',
                    replyLanguage: 'উত্তরের ভাষা', replyInterval: 'উত্তরের ব্যবধান' },
                prompts: {
                    updateReplyLang: 'উত্তরের ভাষা আপডেট করুন', updateReplyInt: 'উত্তরের ব্যবধান আপডেট করুন (ন্যূনতম 5 সেকেন্ড)' },
                alerts: {
                    willReplyIn: 'চ্যাটজিপিটি ইনফিনিটি উত্তর দেবে', yourSysLang: 'আপনার সিস্টেমের ভাষা',
                    willReplyEvery: 'চ্যাটজিপিটি ইনফিনিটি প্রতি উত্তর দেবে', seconds: 'সেকেন্ড' },
                states: { enabled: 'সক্রিয়', disabled: 'অক্ষম' }
            } ; break
            
        case 'cs': // Czech
            messages = {
                menuLabels: {
                    infinityMode: 'Režim nekonečna', toggleVisibility: 'Přepnout viditelnost', autoScroll: 'Automatické rolování',
                    replyLanguage: 'Jazyk odpovědi', replyInterval: 'Interval odpovědi' },
                prompts: {
                    updateReplyLang: 'Aktualizujte jazyk odpovědi', updateReplyInt: 'Aktualizovat interval odpovědi (minimálně 5 sekund)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity odpoví', yourSysLang: 'jazyk vašeho systému',
                    willReplyEvery: 'ChatGPT Infinity odpoví každý', seconds: 'sekundy' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'da': // Danish
            messages = {
                menuLabels: {
                    infinityMode: 'Infinity Mode', toggleVisibility: 'Slå synlighed til/fra', autoScroll: 'Auto-rul',
                    replyLanguage: 'Svar Sprog', replyInterval: 'Svarinterval' },
                prompts: {
                    updateReplyLang: 'Opdater svarsprog', updateReplyInt: 'Opdater svarinterval (minimum 5 sekunder)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity vil svare ind', yourSysLang: 'dit systemsprog',
                    willReplyEvery: 'ChatGPT Infinity vil svare hver', seconds: 'sekunder' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'de': // German
            messages = {
                menuLabels: {
                    infinityMode: 'Infinity-Modus', toggleVisibility: 'Sichtbarkeit umschalten', autoScroll: 'Auto-Scroll',
                    replyLanguage: 'Antwortsprache', replyInterval: 'Antwortintervall' },
                prompts: {
                    updateReplyLang: 'Antwortsprache aktualisieren', updateReplyInt: 'Antwortintervall aktualisieren (mindestens 5 Sekunden)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity antwortet', yourSysLang: 'Ihre Systemsprache',
                    willReplyEvery: 'ChatGPT Infinity antwortet alle', seconds: 'Sekunden' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'el': // Greek
            messages = {
                menuLabels: {
                    infinityMode: 'Λειτουργία Infinity', toggleVisibility: 'Εναλλαγή ορατότητας', autoScroll: 'Αυτόματη κύλιση',
                    replyLanguage: 'Γλώσσα απάντησης', replyInterval: 'Διάστημα απαντήσεων' },
                prompts: {
                    updateReplyLang: 'Ενημέρωση γλώσσας απάντησης', updateReplyInt: 'Ενημέρωση διαστήματος απαντήσεων (τουλάχιστον 5 δευτερόλεπτα)' },
                alerts: {
                    willReplyIn: 'Το ChatGPT Infinity θα απαντήσει', yourSysLang: 'τη γλώσσα του συστήματός σας',
                    willReplyEvery: 'Το ChatGPT Infinity θα απαντά κάθε', seconds: 'δευτερόλεπτα' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'eo': // Esperanto
            messages = {
                menuLabels: {
                    infinityMode: 'Senfineca Reĝimo', toggleVisibility: 'Ŝaltigu Videblecon', autoScroll: 'Aŭtomata rulumo',
                    replyLanguage: 'Responda Lingvo', replyInterval: 'Intervalo de Respondo' },
                prompts: {
                    updateReplyLang: 'Ĝisdatigu respondlingvon', updateReplyInt: 'Ĝisdatigu respondintervalon (minimume 5 sekundoj)' },
                alerts: {
                    willReplyIn: 'ChatGPT Senfineco respondos', yourSysLang: 'via sistema lingvo',
                    willReplyEvery: 'ChatGPT Senfineco respondos ĉiun', seconds: 'sekundoj' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'es': // Spanish
            messages = {
                menuLabels: {
                    infinityMode: 'Modo infinito', toggleVisibility: 'Alternar visibilidad', autoScroll: 'Desplazamiento automático',
                    replyLanguage: 'Idioma de respuesta', replyInterval: 'Intervalo de respuesta' },
                prompts: {
                    updateReplyLang: 'Actualizar idioma de respuesta', updateReplyInt: 'Intervalo de respuesta de actualización (mínimo 5 segundos)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinito responderá en', yourSysLang: 'el idioma de tu sistema',
                    willReplyEvery: 'ChatGPT Infinito responderá cada', seconds: 'segundos' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'fi': // Finnish
            messages = {
                menuLabels: {
                    infinityMode: 'Infinity-tila', toggleVisibility: 'Näkyvyys päälle/pois', autoScroll: 'Automaattinen vieritys',
                    replyLanguage: 'Vastauskieli', replyInterval: 'Vastausväli' },
                prompts: {
                    updateReplyLang: 'Päivitä vastauskieli', updateReplyInt: 'Päivitä vastausväli (vähintään 5 sekuntia)' },
                alerts: {
                    willReplyIn: 'ChatGPT Äärettömyys vastaa', yourSysLang: 'järjestelmäkielesi',
                    willReplyEvery: 'ChatGPT Äärettömyys vastaa joka kerta', seconds: 'sekuntia' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'fr' : case 'fr-CA' : // French
            messages = {
                menuLabels: {
                    infinityMode: 'Mode infini', toggleVisibility: 'Basculer la visibilité', autoScroll: 'Défilement automatique',
                    replyLanguage: 'Langue de la réponse', replyInterval: 'Intervalle de réponse' },
                prompts: {
                    updateReplyLang: 'Mettre à jour la langue de réponse', updateReplyInt: 'Mettre à jour l\'intervalle de réponse (minimum 5 secondes)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infini répondra dans', yourSysLang: 'la langue de votre système',
                    willReplyEvery: 'ChatGPT Infini répondra tous les', seconds: 'secondes' },
                states: { enabled: 'activé', disabled: 'désactivé' }
            } ; break
            
        case 'gu': // Gujarati
            messages = {
                menuLabels: {
                    infinityMode: 'અનંત મોડ', toggleVisibility: 'દૃશ્યતા ટૉગલ કરો', autoScroll: 'ઓટો-સ્ક્રોલ',
                    replyLanguage: 'જવાબની ભાષા', replyInterval: 'જવાબ અંતરાલ' },
                prompts: {
                    updateReplyLang: 'જવાબની ભાષા અપડેટ કરો', updateReplyInt: 'જવાબ અંતરાલ અપડેટ કરો (ઓછામાં ઓછી 5 સેકન્ડ)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity જવાબ આપશે', yourSysLang: 'તમારી સિસ્ટમ ભાષા',
                    willReplyEvery: 'ChatGPT Infinity દરેક જવાબ આપશે', seconds: 'સેકન્ડ' },
                states: { enabled: 'સક્ષમ', disabled: 'અક્ષમ' }
            } ; break
            
        case 'hi': // Hindi
            messages = {
                menuLabels: {
                    infinityMode: 'इन्फिनिटी मोड', toggleVisibility: 'दृश्यता टॉगल करें', autoScroll: 'स्वतः स्क्रॉल',
                    replyLanguage: 'उत्तर भाषा', replyInterval: 'उत्तर अंतराल' },
                prompts: {
                    updateReplyLang: 'जवाब की भाषा अपडेट करें', updateReplyInt: 'उत्तर अंतराल अपडेट करें (न्यूनतम 5 सेकंड)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity में उत्तर देगा', yourSysLang: 'आपकी सिस्टम भाषा',
                    willReplyEvery: 'चैटजीपीटी इन्फिनिटी हर जवाब देगी', seconds: 'सेकंड' },
                states: { enabled: 'सक्रिय', disabled: 'अक्षम' }
            } ; break
            
        case 'hu': // Hungarian
            messages = {
                menuLabels: {
                    infinityMode: 'Végtelen mód', toggleVisibility: 'Kapcsolja be a láthatóságot', autoScroll: 'Automatikus görgetés',
                    replyLanguage: 'Válasz nyelve', replyInterval: 'Válasz intervallum' },
                prompts: {
                    updateReplyLang: 'Frissítse a válasz nyelvét', updateReplyInt: 'Válaszidőköz frissítése (minimum 5 másodperc)' },
                alerts: {
                    willReplyIn: 'A ChatGPT Infinity válaszol', yourSysLang: 'a rendszer nyelve',
                    willReplyEvery: 'A ChatGPT Infinity minden alkalommal válaszol', seconds: 'másodpercig' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'in': // Indonesian
            messages = {
                menuLabels: {
                    infinityMode: 'Modus Tak Terhingga', toggleVisibility: 'Alihkan Visibilitas', autoScroll: 'Gulir Otomatis',
                    replyLanguage: 'Bahasa Balas', replyInterval: 'Interval balasan' },
                prompts: {
                    updateReplyLang: 'Perbarui bahasa balasan', updateReplyInt: 'Perbarui interval balasan (minimal 5 detik)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity akan membalas', yourSysLang: 'bahasa sistem Anda',
                    willReplyEvery: 'ChatGPT Infinity akan membalas setiap', seconds: 'detik' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'it': // Italian
            messages = {
                menuLabels: {
                    infinityMode: 'Modalità Infinito', toggleVisibility: 'Attiva/disattiva visibilità', autoScroll: 'Scorrimento automatico',
                    replyLanguage: 'Lingua di risposta', replyInterval: 'Intervallo di risposta' },
                prompts: {
                    updateReplyLang: 'Aggiorna la lingua di risposta', updateReplyInt: 'Intervallo di risposta dell\'aggiornamento (minimo 5 secondi)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity risponderà', yourSysLang: 'la tua lingua di sistema',
                    willReplyEvery: 'ChatGPT Infinity risponderà ogni', seconds: 'secondi' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'iw': // Hebrew
            messages = {
                menuLabels: {
                    infinityMode: 'מצב אינסוף', toggleVisibility: 'החלף נראות', autoScroll: 'גלילה אוטומטית',
                    replyLanguage: 'שפה תשובה', replyInterval: 'מרווח תשובות' },
                prompts: {
                    updateReplyLang: 'עדכן את שפת התשובה', updateReplyInt: 'עדכון מרווח תשובות (מינימום 5 שניות)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity יענה', yourSysLang: 'שפת המערכת שלך',
                    willReplyEvery: 'ChatGPT Infinity יענה כל', seconds: 'שניות' },
                states: { enabled: 'מופעל', disabled: 'נָכֶה' }
            } ; break
            
        case 'ja': // Japanese
            messages = {
                menuLabels: {
                    infinityMode: 'インフィニティモード', toggleVisibility: '可視性の切り替え', autoScroll: '自動スクロール',
                    replyLanguage: '返信言語', replyInterval: '返信間隔' },
                prompts: {
                    updateReplyLang: '返信言語を更新する', updateReplyInt: '更新応答間隔 (最小 5 秒)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity が返信します', yourSysLang: 'システム言語',
                    willReplyEvery: 'ChatGPT Infinity は次の間隔で返信します', seconds: '秒' },
                states: { enabled: '有効', disabled: '無効' }
            } ; break
            
        case 'ka': // Georgian
            messages = {
                menuLabels: {
                    infinityMode: 'უსასრულობის რეჟიმი', toggleVisibility: 'ხილვადობის გადართვა', autoScroll: 'ავტომატური გადახვევა',
                    replyLanguage: 'პასუხის ენა', replyInterval: 'პასუხის ინტერვალი' },
                prompts: {
                    updateReplyLang: 'განაახლეთ პასუხის ენა', updateReplyInt: 'განაახლეთ პასუხების ინტერვალი (მინიმუმ 5 წამი)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity გიპასუხებთ', yourSysLang: 'თქვენი სისტემის ენა',
                    willReplyEvery: 'ChatGPT Infinity უპასუხებს ყველა', seconds: 'წამი' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'kn': // Kannada
            messages = {
                menuLabels: {
                    infinityMode: 'ಇನ್ಫಿನಿಟಿ ಮೋಡ್', toggleVisibility: 'ಗೋಚರತೆಯನ್ನು ಟಾಗಲ್ ಮಾಡಿ', autoScroll: 'ಸ್ವಯಂ-ಸ್ಕ್ರೋಲ್',
                    replyLanguage: 'ಪ್ರತ್ಯುತ್ತರ ಭಾಷೆ', replyInterval: 'ಪ್ರತ್ಯುತ್ತರ ಮಧ್ಯಂತರ' },
                prompts: {
                    updateReplyLang: 'ಪ್ರತ್ಯುತ್ತರ ಭಾಷೆಯನ್ನು ನವೀಕರಿಸಿ', updateReplyInt: 'ಪ್ರತ್ಯುತ್ತರ ಮಧ್ಯಂತರವನ್ನು ನವೀಕರಿಸಿ (ಕನಿಷ್ಠ 5 ಸೆಕೆಂಡುಗಳು)' },
                alerts: {
                    willReplyIn: 'ChatGPT ಇನ್ಫಿನಿಟಿ ಪ್ರತ್ಯುತ್ತರಿಸುತ್ತದೆ', yourSysLang: 'ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ಭಾಷೆ',
                    willReplyEvery: 'ChatGPT ಇನ್ಫಿನಿಟಿ ಪ್ರತಿ ಪ್ರತ್ಯುತ್ತರ ನೀಡುತ್ತದೆ', seconds: 'ಸೆಕೆಂಡುಗಳು' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'ko': // Korean
            messages = {
                menuLabels: {
                    infinityMode: '인피니티 모드', toggleVisibility: '가시성 전환', autoScroll: '자동 스크롤',
                    replyLanguage: '응답 언어', replyInterval: '응답 간격' },
                prompts: {
                    updateReplyLang: '답장 언어 업데이트', updateReplyInt: '응답 간격 업데이트(최소 5초)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity는', yourSysLang: '시스템 언어',
                    willReplyEvery: 'ChatGPT Infinity는 매 회신합니다.', seconds: '초' },
                states: { enabled: '가능', disabled: '장애가 있는' }
            } ; break
            
        case 'ku': // Kurdish
            messages = {
                menuLabels: {
                    infinityMode: 'Mode Bêdawî', toggleVisibility: 'Veguhastina Dîtinê', autoScroll: 'Auto-Scroll',
                    replyLanguage: 'Zimanê bersivê', replyInterval: 'Navbera bersivê' },
                prompts: {
                    updateReplyLang: 'Zimanê bersivê nûve bikin', updateReplyInt: 'Navbera bersivê nûve bike (kêmtirîn 5 saniye)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity dê bersivê bide', yourSysLang: 'zimanê pergala te',
                    willReplyEvery: 'ChatGPT Infinity dê her bersivê bide', seconds: 'seconds' },
                states: { enabled: 'enabled', disabled: 'bêmecel' }
            } ; break
            
        case 'ml': // Malayalam
            messages = {
                menuLabels: {
                    infinityMode: 'ഇൻഫിനിറ്റി മോഡ്', toggleVisibility: 'ദൃശ്യപരത ടോഗിൾ ചെയ്യുക', autoScroll: 'സ്വയമേവ സ്ക്രോൾ ചെയ്യുക',
                    replyLanguage: 'മറുപടി ഭാഷ', replyInterval: 'മറുപടി ഇടവേള' },
                prompts: {
                    updateReplyLang: 'മറുപടി ഭാഷ അപ്ഡേറ്റ് ചെയ്യുക', updateReplyInt: 'മറുപടി ഇടവേള അപ്ഡേറ്റ് ചെയ്യുക (കുറഞ്ഞത് 5 സെക്കൻഡ്)' },
                alerts: {
                    willReplyIn: 'ChatGPT ഇൻഫിനിറ്റി മറുപടി നൽകും', yourSysLang: 'നിങ്ങളുടെ സിസ്റ്റം ഭാഷ',
                    willReplyEvery: 'ChatGPT ഇൻഫിനിറ്റി ഓരോന്നിനും മറുപടി നൽകും', seconds: 'സെക്കന്റുകൾ' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'mr': // Marathi
            messages = {
                menuLabels: {
                    infinityMode: 'अनंत मोड', toggleVisibility: 'दृश्यमानता टॉगल करा', autoScroll: 'स्वयं स्क्रोल',
                    replyLanguage: 'प्रत्युत्तर भाषा', replyInterval: 'उत्तर मध्यांतर' },
                prompts: {
                    updateReplyLang: 'उत्तराची भाषा अपडेट करा', updateReplyInt: 'उत्तर मध्यांतर अपडेट करा (किमान 5 सेकंद)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity उत्तर देईल', yourSysLang: 'तुमची प्रणाली भाषा',
                    willReplyEvery: 'ChatGPT Infinity प्रत्येकाला उत्तर देईल', seconds: 'सेकंद' },
                states: { enabled: 'सक्षम', disabled: 'अक्षम' }
            } ; break
            
        case 'ms': // Malay
            messages = {
                menuLabels: {
                    infinityMode: 'Mod Infiniti', toggleVisibility: 'Togol Keterlihatan', autoScroll: 'Auto-Tatal',
                    replyLanguage: 'Bahasa Balas', replyInterval: 'Selang Balas' },
                prompts: {
                    updateReplyLang: 'Kemas kini bahasa balasan', updateReplyInt: 'Kemas kini selang balasan (minimum 5 saat)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity akan membalas masuk', yourSysLang: 'bahasa sistem anda',
                    willReplyEvery: 'ChatGPT Infinity akan membalas setiap', seconds: 'detik' },
                states: { enabled: 'didayakan', disabled: 'kurang upaya' }
            } ; break
            
        case 'my': // Burmese
            messages = {
                menuLabels: {
                    infinityMode: 'Infinity မုဒ်', toggleVisibility: 'မြင်နိုင်စွမ်းကို ပြောင်းပါ။', autoScroll: 'အလိုအလျောက်ဆွဲချ',
                    replyLanguage: 'ဘာသာစကားကို ပြန်ကြားပါ။', replyInterval: 'ကြားကာလ' },
                prompts: {
                    updateReplyLang: 'ပြန်စာဘာသာစကားကို အပ်ဒိတ်လုပ်ပါ။', updateReplyInt: 'အကြောင်းပြန်ကြားကာလကို အပ်ဒိတ်လုပ်ပါ (အနည်းဆုံး 5 စက္ကန့်)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity မှ စာပြန်ပါမည်။', yourSysLang: 'သင်၏စနစ်ဘာသာစကား',
                    willReplyEvery: 'ChatGPT Infinity သည်တိုင်းကို အကြောင်းပြန်ပါမည်။', seconds: 'စက္ကန့်' },
                states: { enabled: 'ဖွင့်ထားသည်။', disabled: 'မသန်စွမ်း' }
            } ; break
            
        case 'nl': // Dutch
            messages = {
                menuLabels: {
                    infinityMode: 'Infinity-modus', toggleVisibility: 'Zichtbaarheid wisselen', autoScroll: 'Automatisch scrollen',
                    replyLanguage: 'Antwoordtaal', replyInterval: 'Antwoordinterval' },
                prompts: {
                    updateReplyLang: 'Antwoordtaal updaten', updateReplyInt: 'Update antwoordinterval (minimaal 5 seconden)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity zal antwoorden', yourSysLang: 'uw systeemtaal',
                    willReplyEvery: 'ChatGPT Infinity zal elke beantwoorden', seconds: 'seconden' },
                states: { enabled: 'ingeschakeld', disabled: 'gehandicapt' }
            } ; break
            
        case 'no': // Norwegian
            messages = {
                menuLabels: {
                    infinityMode: 'Uendelig modus', toggleVisibility: 'Slå på synlighet', autoScroll: 'Auto-rulling',
                    replyLanguage: 'Svar Språk', replyInterval: 'Svarintervall' },
                prompts: {
                    updateReplyLang: 'Oppdater svarspråk', updateReplyInt: 'Oppdater svarintervall (minimum 5 sekunder)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity vil svare inn', yourSysLang: 'systemspråket ditt',
                    willReplyEvery: 'ChatGPT Infinity vil svare hver', seconds: 'sekunder' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'or': // Oriya
            messages = {
                menuLabels: {
                    infinityMode: 'ଅସୀମ ମୋଡ୍ |', toggleVisibility: 'ଭିଜିବିଲିଟି ଟୋଗଲ୍ କରନ୍ତୁ |', autoScroll: 'ଅଟୋ-ସ୍କ୍ରୋଲ୍ |',
                    replyLanguage: 'ଭାଷା ଉତ୍ତର ଦିଅ |', replyInterval: 'ଉତ୍ତର ବ୍ୟବଧାନ' },
                prompts: {
                    updateReplyLang: 'ଉତ୍ତର ଭାଷା ଅଦ୍ୟତନ କରନ୍ତୁ |', updateReplyInt: 'ଉତ୍ତର ବ୍ୟବଧାନ ଅଦ୍ୟତନ କରନ୍ତୁ (ସର୍ବନିମ୍ନ 5 ସେକେଣ୍ଡ)' },
                alerts: {
                    willReplyIn: 'ChatGPT ଅସୀମତା ଉତ୍ତର ଦେବ |', yourSysLang: 'ତୁମର ସିଷ୍ଟମ୍ ଭାଷା',
                    willReplyEvery: 'ChatGPT ଅସୀମତା ପ୍ରତ୍ୟେକଙ୍କୁ ଉତ୍ତର ଦେବ |', seconds: 'ସେକେଣ୍ଡ୍ |' },
                states: { enabled: 'ସକ୍ଷମ', disabled: 'ଅକ୍ଷମ' }
            } ; break
            
        case 'pa': // Punjabi
            messages = {
                menuLabels: {
                    infinityMode: 'ਅਨੰਤ ਮੋਡ', toggleVisibility: 'ਦਿਖਣਯੋਗਤਾ ਨੂੰ ਟੌਗਲ ਕਰੋ', autoScroll: 'ਆਟੋ-ਸਕ੍ਰੌਲ ਕਰੋ',
                    replyLanguage: 'ਜਵਾਬ ਭਾਸ਼ਾ', replyInterval: 'ਜਵਾਬ ਅੰਤਰਾਲ' },
                prompts: {
                    updateReplyLang: 'ਜਵਾਬ ਦੀ ਭਾਸ਼ਾ ਅੱਪਡੇਟ ਕਰੋ', updateReplyInt: 'ਜਵਾਬ ਅੰਤਰਾਲ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ (ਘੱਟੋ-ਘੱਟ 5 ਸਕਿੰਟ)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity ਜਵਾਬ ਦੇਵੇਗਾ', yourSysLang: 'ਤੁਹਾਡੀ ਸਿਸਟਮ ਭਾਸ਼ਾ',
                    willReplyEvery: 'ChatGPT Infinity ਹਰ ਜਵਾਬ ਦੇਵੇਗਾ', seconds: 'ਸਕਿੰਟ' },
                states: { enabled: 'ਸਮਰੱਥ', disabled: 'ਅਯੋਗ' }
            } ; break
            
        case 'pl': // Polish
            messages = {
                menuLabels: {
                    infinityMode: 'Tryb nieskończoności', toggleVisibility: 'Przełącz widoczność', autoScroll: 'Auto-Scroll',
                    replyLanguage: 'Język odpowiedzi', replyInterval: 'Interwał odpowiedzi' },
                prompts: {
                    updateReplyLang: 'Zaktualizuj język odpowiedzi', updateReplyInt: 'Zaktualizuj interwał odpowiedzi (minimum 5 sekund)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity odpowie', yourSysLang: 'Twój język systemowy',
                    willReplyEvery: 'ChatGPT Infinity odpowie co', seconds: 'sekundy' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'pt' : case 'pt-BR' : // Portuguese
            messages = {
                menuLabels: {
                    infinityMode: 'Modo Infinito', toggleVisibility: 'Alternar visibilidade', autoScroll: 'Auto rolagem',
                    replyLanguage: 'Idioma de resposta', replyInterval: 'intervalo de resposta' },
                prompts: {
                    updateReplyLang: 'Atualizar idioma de resposta', updateReplyInt: 'Atualizar intervalo de resposta (mínimo 5 segundos)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity responderá em', yourSysLang: 'idioma do seu sistema',
                    willReplyEvery: 'O ChatGPT Infinity responderá a cada', seconds: 'segundos' },
                states: { enabled: 'habilitado', disabled: 'desabilitado' }
            } ; break
            
        case 'ro': // Romanian
            messages = {
                menuLabels: {
                    infinityMode: 'Modul infinit', toggleVisibility: 'Comutați Vizibilitatea', autoScroll: 'Defilare automată',
                    replyLanguage: 'Limba răspunsului', replyInterval: 'Interval de răspuns' },
                prompts: {
                    updateReplyLang: 'Actualizați limba de răspuns', updateReplyInt: 'Actualizați intervalul de răspuns (minim 5 secunde)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity va răspunde în', yourSysLang: 'limba sistemului dvs',
                    willReplyEvery: 'ChatGPT Infinity va răspunde la fiecare', seconds: 'secunde' },
                states: { enabled: 'activat', disabled: 'dezactivat' }
            } ; break
            
        case 'ru': // Russian
            messages = {
                menuLabels: {
                    infinityMode: 'Бесконечный режим', toggleVisibility: 'Переключить видимость', autoScroll: 'Автопрокрутка',
                    replyLanguage: 'Язык ответа', replyInterval: 'Интервал ответа' },
                prompts: {
                    updateReplyLang: 'Обновить язык ответа', updateReplyInt: 'Интервал обновления ответа (минимум 5 секунд)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity ответит через', yourSysLang: 'ваш системный язык',
                    willReplyEvery: 'ChatGPT Infinity будет отвечать каждый', seconds: 'секунды' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'sk': // Slovak
            messages = {
                menuLabels: {
                    infinityMode: 'Režim nekonečna', toggleVisibility: 'Prepnúť viditeľnosť', autoScroll: 'Automatické posúvanie',
                    replyLanguage: 'Jazyk odpovede', replyInterval: 'Interval odpovede' },
                prompts: {
                    updateReplyLang: 'Aktualizovať jazyk odpovede', updateReplyInt: 'Aktualizovať interval odpovede (minimálne 5 sekúnd)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity odpovie', yourSysLang: 'jazyk vášho systému',
                    willReplyEvery: 'ChatGPT Infinity odpovie každý', seconds: 'sekúnd' },
                states: { enabled: 'povolené', disabled: 'blokovaný' }
            } ; break
            
        case 'sr': // Serbian
            messages = {
                menuLabels: {
                    infinityMode: 'Инфинити Моде', toggleVisibility: 'Пребаци видљивост', autoScroll: 'Ауто-Сцролл',
                    replyLanguage: 'Језик одговора', replyInterval: 'Интервал одговора' },
                prompts: {
                    updateReplyLang: 'Ажурирајте језик одговора', updateReplyInt: 'Ажурирај интервал одговора (минимум 5 секунди)' },
                alerts: {
                    willReplyIn: 'ЦхатГПТ Инфинити ће одговорити', yourSysLang: 'ваш системски језик',
                    willReplyEvery: 'ЦхатГПТ Инфинити ће одговорити на сваки', seconds: 'секунди' },
                states: { enabled: 'омогућено', disabled: 'онеспособљени' }
            } ; break
            
        case 'ta': // Tamil
            messages = {
                menuLabels: {
                    infinityMode: 'முடிவிலி பயன்முறை', toggleVisibility: 'தெரிவுநிலையை நிலைமாற்று', autoScroll: 'தானாக உருட்டும்',
                    replyLanguage: 'பதில் மொழி', replyInterval: 'பதில் இடைவேளை' },
                prompts: {
                    updateReplyLang: 'பதில் மொழியைப் புதுப்பிக்கவும்', updateReplyInt: 'பதில் இடைவெளியைப் புதுப்பிக்கவும் (குறைந்தபட்சம் 5 வினாடிகள்)' },
                alerts: {
                    willReplyIn: 'ChatGPT இன்ஃபினிட்டி பதிலளிக்கும்', yourSysLang: 'உங்கள் கணினி மொழி',
                    willReplyEvery: 'ChatGPT இன்ஃபினிட்டி ஒவ்வொருவருக்கும் பதிலளிக்கும்', seconds: 'வினாடிகள்' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'th': // Thai
            messages = {
                menuLabels: {
                    infinityMode: 'โหมดอินฟินิตี้', toggleVisibility: 'สลับการมองเห็น', autoScroll: 'เลื่อนอัตโนมัติ',
                    replyLanguage: 'ภาษาตอบกลับ', replyInterval: 'ช่วงเวลาตอบกลับ' },
                prompts: {
                    updateReplyLang: 'อัปเดตภาษาตอบกลับ', updateReplyInt: 'อัปเดตช่วงเวลาตอบกลับ (ขั้นต่ำ 5 วินาที)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity จะตอบกลับมา', yourSysLang: 'ภาษาของระบบของคุณ',
                    willReplyEvery: 'ChatGPT Infinity จะตอบกลับทุกๆ', seconds: 'วินาที' },
                states: { enabled: 'เปิดใช้งาน', disabled: 'พิการ' }
            } ; break
            
        case 'tr': // Turkish
            messages = {
                menuLabels: {
                    infinityMode: 'Sonsuzluk Modu', toggleVisibility: 'Görünürlüğü Değiştir', autoScroll: 'Otomatik kaydırma',
                    replyLanguage: 'Yanıt Dili', replyInterval: 'Yanıt Aralığı' },
                prompts: {
                    updateReplyLang: 'Yanıt dilini güncelle', updateReplyInt: 'Güncelleme cevap aralığı (minimum 5 saniye)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity yanıt verecek', yourSysLang: 'sistem diliniz',
                    willReplyEvery: 'ChatGPT Infinity, her', seconds: 'saniye' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'uk': // Ukrainian
            messages = {
                menuLabels: {
                    infinityMode: 'Режим нескінченності', toggleVisibility: 'Перемкнути видимість', autoScroll: 'Автопрокручування',
                    replyLanguage: 'Мова відповіді', replyInterval: 'Інтервал відповідей' },
                prompts: {
                    updateReplyLang: 'Оновіть мову відповіді', updateReplyInt: 'Оновити інтервал відповіді (мінімум 5 секунд)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity відповість', yourSysLang: 'мова вашої системи',
                    willReplyEvery: 'ChatGPT Infinity відповість кожному', seconds: 'секунд' },
                states: { enabled: '', disabled: '' } // too long for sidebar
            } ; break
            
        case 'ur': // Urdu
            messages = {
                menuLabels: {
                    infinityMode: 'انفینٹی موڈ', toggleVisibility: 'مرئیت کو ٹوگل کریں۔', autoScroll: 'آٹو سکرول',
                    replyLanguage: 'جوابی زبان', replyInterval: 'جوابی وقفہ' },
                prompts: {
                    updateReplyLang: 'جوابی زبان کو اپ ڈیٹ کریں۔', updateReplyInt: 'جوابی وقفہ کو اپ ڈیٹ کریں (کم از کم 5 سیکنڈ)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity جواب دے گا۔', yourSysLang: 'آپ کے سسٹم کی زبان',
                    willReplyEvery: 'ChatGPT Infinity ہر ایک کا جواب دے گا۔', seconds: 'سیکنڈ' },
                states: { enabled: 'فعال', disabled: 'معذور' }
            } ; break
            
        case 'vi': // Vietnamese
            messages = {
                menuLabels: {
                    infinityMode: 'Chế độ vô cực', toggleVisibility: 'Chuyển đổi chế độ hiển thị', autoScroll: 'Tự động cuộn',
                    replyLanguage: 'Trả lời ngôn ngữ', replyInterval: 'Khoảng thời gian trả lời' },
                prompts: {
                    updateReplyLang: 'Cập nhật ngôn ngữ trả lời', updateReplyInt: 'Cập nhật khoảng thời gian trả lời (tối thiểu 5 giây)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity sẽ trả lời trong', yourSysLang: 'ngôn ngữ hệ thống của bạn',
                    willReplyEvery: 'ChatGPT Infinity sẽ trả lời mọi', seconds: 'giây' },
                states: { enabled: 'kích hoạt', disabled: 'tàn tật' }
            } ; break

        case 'zh' : case 'zh-CN' : case 'zh-SG' : // Simplified Chinese
            messages = {
                menuLabels: {
                    infinityMode: '无限模式', toggleVisibility: '切换可见性', autoScroll: '自动滚屏',
                    replyLanguage: '回复语言', replyInterval: '回复间隔' },
                prompts: {
                    updateReplyLang: '更新回复语言', updateReplyInt: '更新回复间隔(最少 5 秒)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity 将回复', yourSysLang: '你的系统语言',
                    willReplyEvery: 'ChatGPT Infinity 将回复每', seconds: '秒' },
                states: { enabled: '启用', disabled: '禁用' }
            } ; break

        case 'zh-HK' : case 'zh-TW' : // Traditional Chinese
            messages = {
                menuLabels: {
                    infinityMode: '無限模式', toggleVisibility: '切換可見性', autoScroll: '自動滾屏',
                    replyLanguage: '回复語言', replyInterval: '回复間隔' },
                prompts: {
                    updateReplyLang: '更新回复語言', updateReplyInt: '更新回复間隔(最少 5 秒)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity 將回复', yourSysLang: '你的系統語言',
                    willReplyEvery: 'ChatGPT Infinity 將回复每', seconds: '秒' },
                states: { enabled: '啟用', disabled: '禁用' }
            } ; break

        default: // English
            messages = {
                menuLabels: {
                    infinityMode: 'Infinity Mode', toggleVisibility: 'Toggle Visibility', autoScroll: 'Auto-Scroll',
                    replyLanguage: 'Reply Language', replyInterval: 'Reply Interval' },
                prompts: {
                    updateReplyLang: 'Update reply language', updateReplyInt: 'Update reply interval (minimum 5 secs)' },
                alerts: {
                    willReplyIn: 'ChatGPT Infinity will reply in', yourSysLang: 'your system language',
                    willReplyEvery: 'ChatGPT Infinity will reply every', seconds: 'seconds' },
                states: { enabled: 'enabled', disabled: 'disabled' }
            }
    }

    // Init/register menu
    var menuIDs = [], stateSymbol = ['✔️', '❌'], stateWord = ['ON', 'OFF'] // initialize menu vars
    registerMenu() // create browser toolbar menu

    await chatgpt.isLoaded()

    // Stylize toggle switch
    var switchStyle = document.createElement('style')
    switchStyle.innerHTML = `/* Stylize switch */
        .switch { position:absolute ; left:208px ; width:34px ; height:18px }
        .switch input { opacity:0 ; width:0 ; height:0 } /* hide checkbox */
        .slider { position:absolute ; cursor:pointer ; top:0 ; left:0 ; right:0 ; bottom:0 ; background-color:#ccc ; -webkit-transition:.4s ; transition:.4s ; border-radius:28px }
        .slider:before { position:absolute ; content:"" ; height:14px ; width:14px ; left:3px; bottom:2px ; background-color:white ; -webkit-transition:.4s ; transition:.4s ; border-radius:28px }

        /* Position/color ON-state */
        input:checked { position:absolute ; right:3px }
        input:checked + .slider { background-color:#42B4BF }
        input:checked + .slider:before {
            -webkit-transform: translateX(14px) translateY(1px) ;
            -ms-transform: translateX(14px) translateY(1px) ;
            transform: translateX(14px) }`

    document.head.appendChild(switchStyle)

    // Create toggle label, add listener/classes/HTML
    var toggleLabel = document.createElement('div') // create label div
    toggleLabel.addEventListener('click', function() {
        var toggleInput = document.querySelector('#infinityToggle')
        toggleInput.click() ; infinityMode.toggle()
    })
    for (var link of document.querySelectorAll('a')) { // inspect sidebar links for classes
        if (link.innerHTML.includes('New chat')) { // focus on 'New chat'
            toggleLabel.setAttribute('class', link.classList) // borrow its classes
            break // stop looping since class assignment is done
        }
    } updateToggleHTML()

    // Insert full toggle on page load + during navigation // 在导航期间插入页面加载 + 的完整切换
    insertToggle()
    var navObserver = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.type === 'childList' && mutation.addedNodes.length) {
                insertToggle()
    }})})
    navObserver.observe(document.documentElement, { childList: true, subtree: true })

    // Define SCRIPT functions

    function registerMenu() {
        menuIDs = [] // empty to store newly registered cmds for removal while preserving order
        var stateSeparator = getUserscriptManager() === 'Tampermonkey' ? ' — ' : ': '

        // Add command to toggle Infinity Mode
        var imLabel = stateSymbol[+!config.infinityMode] + ' ' + messages.menuLabels.infinityMode
            + stateSeparator + stateWord[+!config.infinityMode]
        menuIDs.push(GM_registerMenuCommand(imLabel, function() {
            document.querySelector('#infinityToggle').click()
        }))

        // Add command to toggle visibility of toggle
        var tvLabel = stateSymbol[+config.toggleHidden] + ' ' + messages.menuLabels.toggleVisibility
            + stateSeparator + stateWord[+config.toggleHidden]
        menuIDs.push(GM_registerMenuCommand(tvLabel, function() {
            saveSetting('toggleHidden', !config.toggleHidden)
            toggleLabel.style.display = config.toggleHidden ? 'none' : 'flex' // toggle visibility
            if (!config.notifHidden) {
                chatgpt.notify('∞ ' + messages.menuLabels.toggleVisibility + ': '+ stateWord[+config.toggleHidden],
                    '', '', chatgpt.isDarkMode() ? '' : 'shadow')
            } for (var id of menuIDs) GM_unregisterMenuCommand(id) ; registerMenu() // refresh menu
        }))

        // Add command to toggle auto-scroll
        var asLabel = stateSymbol[+config.autoScrollDisabled] + ' ' + messages.menuLabels.autoScroll
            + stateSeparator + stateWord[+config.autoScrollDisabled]
        menuIDs.push(GM_registerMenuCommand(asLabel, function() {
            saveSetting('autoScrollDisabled', !config.autoScrollDisabled)
            if (!config.notifHidden) {
                chatgpt.notify('∞ ' + messages.menuLabels.autoScroll + ': '+ stateWord[+config.autoScrollDisabled],
                    '', '', chatgpt.isDarkMode() ? '' : 'shadow')
            } for (var id of menuIDs) GM_unregisterMenuCommand(id) ; registerMenu() // refresh menu
        }))

        // Add command to set language
        var rlLabel = '🌐 ' + messages.menuLabels.replyLanguage + stateSeparator
                    + ( config.replyLanguage ? config.replyLanguage : 'English' )
        menuIDs.push(GM_registerMenuCommand(rlLabel, async function() {
            while (true) {
                var replyLanguage = prompt(`${ messages.prompts.updateReplyLang }:`, config.replyLanguage)
                if (replyLanguage === null) break // user cancelled so do nothing
                else if (!/\d/.test(replyLanguage)) {
                    saveSetting('replyLanguage', replyLanguage)
                    alert(`${ messages.alerts.willReplyIn } ${ replyLanguage ? replyLanguage : messages.alerts.yourSysLang }.`)
                    if (config.infinityMode) { // restart session using new reply language
                        chatgpt.stop() ; infinityMode.deactivate() ; infinityMode.toggle() }
                    for (var id of menuIDs) GM_unregisterMenuCommand(id) ; registerMenu() // refresh menu
                    break
        }}}))

        // Add command to change reply interval
        var riLabel = '⌚ ' + messages.menuLabels.replyInterval + stateSeparator + config.replyInterval + 's'
        menuIDs.push(GM_registerMenuCommand(riLabel, async function() {
            while (true) {
                var replyInterval = prompt(`${ messages.prompts.updateReplyInt }:`, config.replyInterval)
                if (replyInterval === null) break // user cancelled so do nothing
                else if (!isNaN(parseInt(replyInterval)) && parseInt(replyInterval) > 4) { // valid int set
                    saveSetting('replyInterval', parseInt(replyInterval))
                    alert(`${ messages.alerts.willReplyEvery } ${ replyInterval } ${ messages.alerts.seconds }.`)
                    if (config.infinityMode) { // reset reply interval w/o ending session
                        clearTimeout(config.isActive) ; await chatgpt.isIdle()
                        config.isActive = setTimeout(infinityMode.continue, parseInt(config.replyInterval) * 1000)
                    }
                    for (var id of menuIDs) GM_unregisterMenuCommand(id) ; registerMenu() // refresh menu
                    break
        }}}))
    }

    function getUserscriptManager() { try { return GM_info.scriptHandler } catch(error) { return 'other' }}

    function loadSetting() {
        var keys = [].slice.call(arguments)
        keys.forEach(function(key) {
            config[key] = GM_getValue(configKeyPrefix + key, false)
    })}

    function saveSetting(key, value) {
        GM_setValue(configKeyPrefix + key, value) // save to browser
        config[key] = value // and memory
    }

    // Define TOGGLE functions

    function insertToggle() {
        var firstMenu = document.querySelector('nav')
        if (!firstMenu.contains(toggleLabel)) { // check if label exists first // 检查标签是否首先存在
            firstMenu.insertBefore(toggleLabel, firstMenu.childNodes[0]) // insert before 'New chat'// 在"新聊天"之前插入
    }}

    function updateToggleHTML() {
        toggleLabel.innerHTML = `
            <img width="18px" src="https://raw.githubusercontent.com/adamlui/chatgpt-infinity/main/media/images/icons/infinity-navicon-light-80.png">
            ${ messages.menuLabels.infinityMode } ${config.infinityMode ? messages.states.enabled : messages.states.disabled }
            <label class="switch" ><input id="infinityToggle" type="checkbox"
                ${ config.infinityMode ? 'checked="true"' : '' } >
                <span class="slider"></span></label>`
        toggleLabel.style.display = config.toggleHidden ? 'none' : 'flex'
    }

    var infinityMode = {

        activate: async function() {
            if (!config.notifHidden) {
                chatgpt.notify('∞ ' + messages.menuLabels.infinityMode + ': ON', '', '', chatgpt.isDarkMode() ? '' : 'shadow')
            }
            document.querySelector('nav > a').click()
            setTimeout(function() {
                chatgpt.send('generate a single random q&a' + ( config.replyLanguage ? ( ' in ' + config.replyLanguage ) : ''  )
                                                            + '. don\'t type anything else') }, 500)
            config.sent = true ; await chatgpt.isIdle()
            if (config.infinityMode && !config.isActive) { // double-check in case de-activated before scheduled
                config.isActive = setTimeout(infinityMode.continue, parseInt(config.replyInterval) * 1000)
            }
        },

        continue: async function() {
            chatgpt.send('do it again')
            if (!config.autoScrollDisabled) try { chatgpt.scrollToBottom() } catch(error) {}
            await chatgpt.isIdle() // before starting delay till next iteration
            if (config.isActive) config.isActive = setTimeout(infinityMode.continue, parseInt(config.replyInterval) * 1000)
        },

        deactivate: function() {
            clearTimeout(config.isActive) ; config.isActive = null, config.sent = null
            if (!config.notifHidden) {
                chatgpt.notify('∞ ' + messages.menuLabels.infinityMode + ': OFF', '', '', chatgpt.isDarkMode() ? '' : 'shadow')
            }
        },

        toggle: async function() {
            var toggleInput = document.querySelector('#infinityToggle')
            setTimeout(updateToggleHTML, 200) // sync label change w/ switch movement
            config.infinityMode = toggleInput.checked
            for (var i = 0 ; i < menuIDs.length ; i++) GM_unregisterMenuCommand(menuIDs[i]) ; registerMenu() // refresh menu
            chatgpt.stop()
            if (config.infinityMode && !config.sent) infinityMode.activate()
            else if (!config.infinityMode && config.sent) infinityMode.deactivate()
        }
    }

})()