Merge branch 'v4.1.0' into new_menu_issue680

This commit is contained in:
Mic 2026-04-19 22:22:25 +02:00 committed by GitHub
commit cccd3346a5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 1505 additions and 380 deletions

View file

@ -7,6 +7,17 @@
<ul>
<li>Antispam information are now permanently saved for each message [<a href="https://github.com/micz/ThunderAI/issues/675">#675</a>].</li>
<li><i>[All APIs]</i> A summary has been added above the mail content [<a href="https://github.com/micz/ThunderAI/issues/580">#580</a>].</li>
<li><i>[All APIs]</i> Added inline auto translation for emails [<a href="https://github.com/micz/ThunderAI/issues/247">#247</a>].</li>
<li>Now the popup menu closes immediatly and the working indicator is in the button icon [<a href="https://github.com/micz/ThunderAI/issues/247">#677</a>].</li>
<li><i>[Ollama API]</i> Added <i>format: json</i> option [<a href="https://github.com/micz/ThunderAI/issues/703">#703</a>].</li>
<li>Fix: The "Important Information" section in the options page now updates correctly when choosing an integration [<a href="https://github.com/micz/ThunderAI/issues/730">#730</a>].</li>
<li>In the options page now is visible if a special prompt is using a specific API integration [<a href="https://github.com/micz/ThunderAI/issues/676">#676</a>].</li>
<li>Added an antispam skip list to ensure messages from designated addresses are not forwarded to the AI [<a href="https://github.com/micz/ThunderAI/issues/743">#743</a>].</li>
<li>Fix: Correctly setting the end date for a new calendar event [<a href="https://github.com/micz/ThunderAI/issues/750">#750</a>].</li>
<li>Now it's possibile to use different date and time formats in the AI output when creating a calendar event [<a href="https://github.com/micz/ThunderAI/issues/737">#737</a>].</li>
<li>Added the <i>{%mail_full_headers%}</i> placeholder to retrieve all the email headers at once [<a href="https://github.com/micz/ThunderAI/issues/713">#713</a>].</li>
<li><i>[All APIs]</i> In the API webchat the status messages have different colors [<a href="https://github.com/micz/ThunderAI/issues/3">#3</a>].</li>
<li>Account exclusion lists for add tags and antispam are enforced only for automatic analysis of incoming emails and not for the context menu action that is always executed [<a href="https://github.com/micz/ThunderAI/issues/749">#749</a>].</li>
<li><i>[All APIs]</i> Inline auto translation for emails added [<a href="https://github.com/micz/ThunderAI/issues/247">#247</a>].</li>
<li>Custom menus configuration added. Now it's possibile to define which prompts show in the ThunderAI menu, which ones in the context menu and in which order [<a href="https://github.com/micz/ThunderAI/issues/49">#49</a>, <a href="https://github.com/micz/ThunderAI/issues/184">#184</a>, <a href="https://github.com/micz/ThunderAI/issues/680">#680</a>].</li>
<li>...</li>

View file

@ -395,9 +395,6 @@
"chatgpt_btn_model": {
"message": "Použít aktuální model"
},
"SendingPrompt": {
"message": "Odesílání výzvy..."
},
"AddTags_prompt_text_title": {
"message": "Aktuální text výzvy"
},
@ -719,9 +716,6 @@
"prefs_OptionText_owl_warning": {
"message": "Zdá se, že alespoň jeden z vašich účtů používá doplněk Owl for Exchange. Mezi Thunderbirdem a Owlem je známý problém, který se v současné době řeší. V tuto chvíli můžete používat ThunderAI při psaní e-mailů, ale ne při jejich čtení."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Kliknutím na hodnotu ji nastavíte."
},
"prompt_reply_full_text": {
"message": "Odpovězte na následující e-mail. Odpovězte pouze potřebným textem a bez dalších komentářů nebo jiného textu."
},
@ -795,7 +789,7 @@
"message": "Spravovat nastavení štítků"
},
"prompt_get_calendar_event_full_text": {
"message": "Z následujícího textu extrahuj všechny relevantní podrobnosti potřebné k vygenerování události kalendáře. Extrahované informace by měly zahrnovat:\n- Název události\n- Datum a čas zahájení (včetně časového pásma, pokud je uvedeno)\n- Datum a čas ukončení (včetně časového pásma, pokud je uvedeno)\n- Celý den (pokud je zmíněn)\n- Účastníci\nZajisti, aby byla data formátována jasně a konzistentně, aby je bylo možné přímo použít k vytvoření události kalendáře.\nPokud existují relativní časové odkazy, vezmi v úvahu, že datum a čas e-mailu jsou \"{%mail_datetime%}\". Vypočítej datum a čas zahájení na základě tohoto odkazu. Pokud jsou vypočítané datum a čas zahájení dřívější než \"{%current_datetime%}\", přepočti datum a čas zahájení pomocí \"{%current_datetime%}\" jako základu.\nPokud není zadána doba trvání, nastav ji na jednu hodinu.\nToto jsou účastníci: {%author%}, {%recipients%}, {%cc_list%}. Pokud je přítomna, nezahrnuj mou adresu: {%account_email_address%}.\nPokud nejsi schopen získat jednu nebo více požadovaných informací, odpověz prázdným řetězcem.\nVygeneruj odpověď pouze ve formátu JSON. Nezahrnuj žádný další text ani vysvětlení; poskytni pouze JSON. Zde je formát, který se má použít:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Zde je souhrn události kalendáře\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nZde je text:\"{%mail_text_body_or_selected%}\""
"message": "Z následujícího textu extrahuj všechny relevantní podrobnosti potřebné k vygenerování události kalendáře. Extrahované informace by měly zahrnovat:\n- Název události\n- Datum a čas zahájení (včetně časového pásma, pokud je uvedeno)\n- Datum a čas ukončení (včetně časového pásma, pokud je uvedeno)\n- Celý den (pokud je zmíněn)\n- Účastníci\nZajisti, aby byla data formátována jasně a konzistentně, aby je bylo možné přímo použít k vytvoření události kalendáře.\nPokud existují relativní časové odkazy, vezmi v úvahu, že datum a čas e-mailu jsou \"{%mail_datetime%}\". Vypočítej datum a čas zahájení na základě tohoto odkazu. Pokud jsou vypočítané datum a čas zahájení dřívější než \"{%current_datetime%}\", přepočti datum a čas zahájení pomocí \"{%current_datetime%}\" jako základu.\nPokud není zadána doba trvání, nastav ji na jednu hodinu.\nToto jsou účastníci: {%author%}, {%recipients%}, {%cc_list%}. Pokud je přítomna, nezahrnuj mou adresu: {%account_email_address%}.\nPokud se jedná o celodenní událost, musí být endDate jeden den po startDate s časem nastaveným na \"T000000\".\nPokud nejsi schopen získat jednu nebo více požadovaných informací, odpověz prázdným řetězcem.\nVygeneruj odpověď pouze ve formátu JSON. Nezahrnuj žádný další text ani vysvětlení; poskytni pouze JSON. Zde je formát, který se má použít:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Zde je souhrn události kalendáře\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nZde je text:\"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Přidat novou událost do kalendáře z vybraného textu"
@ -843,7 +837,7 @@
"message": "Vynutit existující štítky při automatickém označování nebo použití kontextového menu"
},
"prompt_spamfilter_full_text": {
"message": "Analyzuj následující e-mail a urči, zda se jedná o spam či nikoli. Zvaž faktory, jako jsou podezřelá klíčová slova, nadměrné propagační výrazy, zavádějící řádky předmětu, žádosti o osobní informace a neobvyklé adresy odesílatele.\nZadej hodnotu od 0 (není spam) do 100 (spam) a vysvětlení o maximálně 10 slovech. \nV případě chybějících údajů zprávy nastavte hodnotu na 0 (není spam) a uveďte důvod.\nVygeneruj odpověď pouze ve formátu JSON. Neuváděj žádný další text nebo vysvětlení; uveď pouze JSON. Zde je formát, který se má použít:\n{\n\"spamValue\": <celé číslo od 0 do 100>,\n\"explanation\": \"Stručné vysvětlení vašeho zdůvodnění\"\n}\nZde jsou informace o e-mailu:\nOdesílatel: \"{%author%}\"\nPředmět: \"{%mail_subject%}\"\nText HTML: \"{%mail_html_body%}\""
"message": "Analyzuj následující e-mail a urči, zda se jedná o spam či nikoli. Zvaž faktory, jako jsou podezřelá klíčová slova, nadměrné propagační výrazy, zavádějící řádky předmětu, žádosti o osobní informace a neobvyklé adresy odesílatele.\nZadej hodnotu od 0 (není spam) do 100 (spam) a vysvětlení o maximálně 10 slovech. \nV případě chybějících údajů zprávy nastavte hodnotu na 0 (není spam) a uveďte důvod.\nVygeneruj odpověď pouze ve formátu JSON. Neuváděj žádný další text nebo vysvětlení; uveď pouze JSON. Zde je formát, který se má použít:\n{\n\"explanation\": \"Stručné vysvětlení vašeho zdůvodnění\",\n\"spamValue\": <celé číslo od 0 do 100>\n}\nZde jsou informace o e-mailu:\nOdesílatel: \"{%author%}\"\nPředmět: \"{%mail_subject%}\"\nText HTML: \"{%mail_html_body%}\""
},
"context_menu_mzta-add-tags": {
"message": "Přidat štítky"

View file

@ -486,9 +486,6 @@
"chatgpt_btn_model": {
"message": "Aktuelles Modell verwenden"
},
"SendingPrompt": {
"message": "Sende Eingabe..."
},
"AllowedValues": {
"message": "Erlaubte Werte"
},
@ -504,9 +501,6 @@
"prefs_OptionText_owl_warning": {
"message": "Es scheint, dass mindestens eines Ihrer Konten das Add-on Eule für Exchange verwendet. Es gibt ein bekanntes Problem zwischen Thunderbird und Eule, das derzeit behoben wird. Derzeit können Sie ThunderAI beim Verfassen von E-Mails verwenden, jedoch nicht beim Lesen."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Klicken Sie auf einen Wert, um ihn festzulegen."
},
"prompt_reply_full_text": {
"message": "Antworten Sie auf die folgende E-Mail. Antworten Sie nur mit dem benötigten Text und ohne zusätzliche Kommentare oder andere Texte."
},
@ -697,7 +691,7 @@
"message": "Ein neues Kalenderevent hinzufügen"
},
"prompt_get_calendar_event_full_text": {
"message": "Extrahieren Sie alle relevanten Details, die erforderlich sind, um ein Kalenderevent aus dem folgenden Text zu erstellen. Die extrahierten Informationen sollten Folgendes enthalten:\n- Ereignistitel\n- Startdatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Enddatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Ganztägig (falls erwähnt)\n- Teilnehmer\nStellen Sie sicher, dass die Daten klar und konsistent formatiert sind, sodass sie direkt für die Erstellung eines Kalenderevents verwendet werden können.\nFalls relative Zeitangaben enthalten sind, beachten Sie, dass Datum und Uhrzeit der E-Mail \"{%mail_datetime%}\" sind. Berechnen Sie das Startdatum und die Startzeit basierend auf diesem Bezugspunkt. Falls das berechnete Startdatum und die Startzeit vor \"{%current_datetime%}\" liegen, berechnen Sie Startdatum und -zeit erneut, wobei Sie \"{%current_datetime%}\" als Grundlage verwenden.\nFalls keine Dauer angegeben ist, setzen Sie sie auf eine Stunde.\nDas sind die Teilnehmer: {%author%}, {%recipients%}, {%cc_list%}. Falls vorhanden, meine Adresse ausschließen: {%account_email_address%}.\nFalls Sie eine oder mehrere der erforderlichen Informationen nicht erhalten können, antworten Sie mit einem leeren String.\nErstellen Sie eine Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; geben Sie nur das JSON an. Verwenden Sie folgendes Format:\n{\n \"startDate\": \"YYYYMMDDTHHMMSS\",\n \"endDate\": \"YYYYMMDDTHHMMSS\",\n \"summary\": \"Zusammenfassung des Kalenderevents hier\",\n \"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHier ist der Text: \"{%mail_text_body_or_selected%}\""
"message": "Extrahieren Sie alle relevanten Details, die erforderlich sind, um ein Kalenderevent aus dem folgenden Text zu erstellen. Die extrahierten Informationen sollten Folgendes enthalten:\n- Ereignistitel\n- Startdatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Enddatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Ganztägig (falls erwähnt)\n- Teilnehmer\nStellen Sie sicher, dass die Daten klar und konsistent formatiert sind, sodass sie direkt für die Erstellung eines Kalenderevents verwendet werden können.\nFalls relative Zeitangaben enthalten sind, beachten Sie, dass Datum und Uhrzeit der E-Mail \"{%mail_datetime%}\" sind. Berechnen Sie das Startdatum und die Startzeit basierend auf diesem Bezugspunkt. Falls das berechnete Startdatum und die Startzeit vor \"{%current_datetime%}\" liegen, berechnen Sie Startdatum und -zeit erneut, wobei Sie \"{%current_datetime%}\" als Grundlage verwenden.\nFalls keine Dauer angegeben ist, setzen Sie sie auf eine Stunde.\nDas sind die Teilnehmer: {%author%}, {%recipients%}, {%cc_list%}. Falls vorhanden, meine Adresse ausschließen: {%account_email_address%}.\nWenn es sich um ein ganztägiges Ereignis handelt, muss endDate ein Tag nach startDate liegen und die Zeit auf \"T000000\" eingestellt sein.\nFalls Sie eine oder mehrere der erforderlichen Informationen nicht erhalten können, antworten Sie mit einem leeren String.\nErstellen Sie eine Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; geben Sie nur das JSON an. Verwenden Sie folgendes Format:\n{\n \"startDate\": \"YYYYMMDDTHHMMSS\",\n \"endDate\": \"YYYYMMDDTHHMMSS\",\n \"summary\": \"Zusammenfassung des Kalenderevents hier\",\n \"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHier ist der Text: \"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Ein neues Kalenderevent aus ausgewähltem Text hinzufügen"
@ -832,7 +826,7 @@
"message": "Wenn ausgewählt, wird ThunderAI Spam-E-Mails automatisch in den Spam-Ordner verschieben."
},
"prompt_spamfilter_full_text": {
"message": "Analysieren Sie die folgende E-Mail und bestimmen Sie, ob es sich um Spam handelt oder nicht. Berücksichtigen Sie Faktoren wie verdächtige Schlüsselwörter, übermäßige Werbesprache, irreführende Betreffzeilen, Anfragen nach persönlichen Informationen und ungewöhnliche Absenderadressen.\nGeben Sie einen Wert von 0 (kein Spam) bis 100 (Spam) und eine Erklärung mit maximal 10 Wörtern an.\nFalls Nachrichtendaten fehlen, setzen Sie den Wert auf 0 (kein Spam) und geben Sie den Grund an.\nGenerieren Sie die Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; liefern Sie nur das JSON. Hier ist das zu verwendende Format:\n{\n\"spamValue\": <Ganzzahl von 0 bis 100>,\n\"explanation\": \"Kurze Erklärung Ihrer Begründung\"\n}\nHier sind die Mail-Informationen:\nAbsender: \"{%author%}\"\nBetreff: \"{%mail_subject%}\"\nHTML-Inhalt: \"{%mail_html_body%}\""
"message": "Analysieren Sie die folgende E-Mail und bestimmen Sie, ob es sich um Spam handelt oder nicht. Berücksichtigen Sie Faktoren wie verdächtige Schlüsselwörter, übermäßige Werbesprache, irreführende Betreffzeilen, Anfragen nach persönlichen Informationen und ungewöhnliche Absenderadressen.\nGeben Sie einen Wert von 0 (kein Spam) bis 100 (Spam) und eine Erklärung mit maximal 10 Wörtern an.\nFalls Nachrichtendaten fehlen, setzen Sie den Wert auf 0 (kein Spam) und geben Sie den Grund an.\nGenerieren Sie die Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; liefern Sie nur das JSON. Hier ist das zu verwendende Format:\n{\n\"explanation\": \"Kurze Erklärung Ihrer Begründung\",\n\"spamValue\": <Ganzzahl von 0 bis 100>\n}\nHier sind die Mail-Informationen:\nAbsender: \"{%author%}\"\nBetreff: \"{%mail_subject%}\"\nHTML-Inhalt: \"{%mail_html_body%}\""
},
"prefs_OptionText_openai_comp_info_remote": {
"message": "Hier können Sie auch die Adresse eines entfernten Servers eingeben."

View file

@ -512,9 +512,6 @@
"chatgpt_btn_model": {
"message": "Χρησιμοποιήστε το τρέχον μοντέλο"
},
"SendingPrompt": {
"message": "Αποστολή προτροπής..."
},
"AllowedValues": {
"message": "Επιτρεπόμενες τιμές"
},
@ -533,9 +530,6 @@
"prefs_OptionText_owl_warning": {
"message": "Φαίνεται ότι τουλάχιστον ένας από τους λογαριασμούς σας χρησιμοποιεί το πρόσθετο Owl for Exchange. Υπάρχει ένα γνωστό πρόβλημα μεταξύ του Thunderbird και του Owl, το οποίο αντιμετωπίζεται αυτήν τη στιγμή. Προς το παρόν, μπορείτε να χρησιμοποιήσετε το ThunderAI κατά τη σύνταξη email, αλλά όχι κατά την ανάγνωσή τους."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Κάντε κλικ σε μια τιμή για να την ορίσετε."
},
"prompt_reply_full_text": {
"message": "Απαντήστε στο ακόλουθο μήνυμα ηλεκτρονικού ταχυδρομείου. Απαντήστε μόνο με το απαραίτητο κείμενο και χωρίς επιπλέον σχόλια ή άλλο κείμενο."
},
@ -564,7 +558,7 @@
"message": "Προσθήκη νέου συμβάντος ημερολογίου"
},
"prompt_get_calendar_event_full_text": {
"message": "Εξαγάγετε όλες τις σχετικές λεπτομέρειες που απαιτούνται για τη δημιουργία ενός συμβάντος ημερολογίου από το ακόλουθο κείμενο. Οι εξαγόμενες πληροφορίες θα πρέπει να περιλαμβάνουν:\n- Τίτλο συμβάντος\n- Ημερομηνία και ώρα έναρξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ημερομηνία και ώρα λήξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ολόκληρη ημέρα (εάν αναφέρεται)\n- Συμμετέχοντες\nΒεβαιωθείτε ότι τα δεδομένα έχουν μορφοποιηθεί με σαφήνεια και συνέπεια, ώστε να μπορούν να χρησιμοποιηθούν άμεσα για τη δημιουργία ενός συμβάντος ημερολογίου.\nΕάν υπάρχουν σχετικές χρονικές αναφορές, λάβετε υπόψη ότι η ημερομηνία και η ώρα του email είναι \"{%mail_datetime%}\". Υπολογίστε την ημερομηνία και την ώρα έναρξης με βάση αυτήν την αναφορά. Εάν η υπολογισμένη ημερομηνία και ώρα έναρξης είναι προγενέστερες από το \"{%current_datetime%}\", υπολογίστε ξανά την ημερομηνία και την ώρα έναρξης χρησιμοποιώντας το \"{%current_datetime%}\" ως βάση.\nΕάν η διάρκεια δεν έχει καθοριστεί, ορίστε την σε μία ώρα.\nΑυτοί είναι οι συμμετέχοντες: {%author%}, {%recipients%}, {%cc_list%}. Εάν υπάρχει, εξαιρέστε τη διεύθυνσή μου: {%account_email_address%}.\nΕάν δεν μπορείτε να λάβετε μία ή περισσότερες από τις απαιτούμενες πληροφορίες, απαντήστε με μια κενή συμβολοσειρά.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξηγήσεις. Δώστε μόνο το JSON. Η μορφή που θα χρησιμοποιηθεί είναι η εξής:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Σύνοψη συμβάντος ημερολογίου εδώ\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nΤο κείμενο είναι: \"{%mail_text_body_or_selected%}\""
"message": "Εξαγάγετε όλες τις σχετικές λεπτομέρειες που απαιτούνται για τη δημιουργία ενός συμβάντος ημερολογίου από το ακόλουθο κείμενο. Οι εξαγόμενες πληροφορίες θα πρέπει να περιλαμβάνουν:\n- Τίτλο συμβάντος\n- Ημερομηνία και ώρα έναρξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ημερομηνία και ώρα λήξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ολόκληρη ημέρα (εάν αναφέρεται)\n- Συμμετέχοντες\nΒεβαιωθείτε ότι τα δεδομένα έχουν μορφοποιηθεί με σαφήνεια και συνέπεια, ώστε να μπορούν να χρησιμοποιηθούν άμεσα για τη δημιουργία ενός συμβάντος ημερολογίου.\nΕάν υπάρχουν σχετικές χρονικές αναφορές, λάβετε υπόψη ότι η ημερομηνία και η ώρα του email είναι \"{%mail_datetime%}\". Υπολογίστε την ημερομηνία και την ώρα έναρξης με βάση αυτήν την αναφορά. Εάν η υπολογισμένη ημερομηνία και ώρα έναρξης είναι προγενέστερες από το \"{%current_datetime%}\", υπολογίστε ξανά την ημερομηνία και την ώρα έναρξης χρησιμοποιώντας το \"{%current_datetime%}\" ως βάση.\nΕάν η διάρκεια δεν έχει καθοριστεί, ορίστε την σε μία ώρα.\nΑυτοί είναι οι συμμετέχοντες: {%author%}, {%recipients%}, {%cc_list%}. Εάν υπάρχει, εξαιρέστε τη διεύθυνσή μου: {%account_email_address%}.\nΕάν το συμβάν είναι ολοήμερο, η ημερομηνία λήξης (endDate) πρέπει να είναι μία ημέρα μετά την ημερομηνία έναρξης (startDate) με την ώρα να έχει οριστεί σε \"T000000\".\nΕάν δεν μπορείτε να λάβετε μία ή περισσότερες από τις απαιτούμενες πληροφορίες, απαντήστε με μια κενή συμβολοσειρά.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξηγήσεις. Δώστε μόνο το JSON. Η μορφή που θα χρησιμοποιηθεί είναι η εξής:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Σύνοψη συμβάντος ημερολογίου εδώ\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nΤο κείμενο είναι: \"{%mail_text_body_or_selected%}\""
},
"prompt_get_task": {
"message": "Προσθήκη νέας εργασίας"
@ -723,7 +717,7 @@
"message": "Εντοπισμός ανεπιθύμητων μηνυμάτων ηλεκτρονικού ταχυδρομείου"
},
"prompt_spamfilter_full_text": {
"message": "Αναλύστε το ακόλουθο email και προσδιορίστε εάν είναι spam ή όχι. Λάβετε υπόψη παράγοντες όπως ύποπτες λέξεις-κλειδιά, υπερβολική διαφημιστική γλώσσα, παραπλανητικές γραμμές θέματος, αιτήματα για προσωπικά στοιχεία και ασυνήθιστες διευθύνσεις αποστολέα.\nΔώστε μια τιμή από 0 (όχι spam) έως 100 (spam) και μια εξήγηση που δεν υπερβαίνει τις 10 λέξεις.\nΣε περίπτωση που λείπουν δεδομένα μηνύματος, ορίστε την τιμή σε 0 (όχι spam) και δώστε τον λόγο.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξήγηση. Δώστε μόνο το JSON. Ακολουθεί η μορφή που θα χρησιμοποιηθεί:\n{\n\"spamValue\": <ακέραιος αριθμός από 0 έως 100>,\n\"explanation\": \"Σύντομη εξήγηση του συλλογισμού σας\"\n}\nΕδώ βρίσκονται οι πληροφορίες του email:\nΑποστολέας: \"{%author%}\"\nΘέμα: \"{%mail_subject%}\"\nΣώμα Html: \"{%mail_html_body%}\""
"message": "Αναλύστε το ακόλουθο email και προσδιορίστε εάν είναι spam ή όχι. Λάβετε υπόψη παράγοντες όπως ύποπτες λέξεις-κλειδιά, υπερβολική διαφημιστική γλώσσα, παραπλανητικές γραμμές θέματος, αιτήματα για προσωπικά στοιχεία και ασυνήθιστες διευθύνσεις αποστολέα.\nΔώστε μια τιμή από 0 (όχι spam) έως 100 (spam) και μια εξήγηση που δεν υπερβαίνει τις 10 λέξεις.\nΣε περίπτωση που λείπουν δεδομένα μηνύματος, ορίστε την τιμή σε 0 (όχι spam) και δώστε τον λόγο.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξήγηση. Δώστε μόνο το JSON. Ακολουθεί η μορφή που θα χρησιμοποιηθεί:\n{\n\"explanation\": \"Σύντομη εξήγηση του συλλογισμού σας\",\n\"spamValue\": <ακέραιος αριθμός από 0 έως 100>\n}\nΕδώ βρίσκονται οι πληροφορίες του email:\nΑποστολέας: \"{%author%}\"\nΘέμα: \"{%mail_subject%}\"\nΣώμα Html: \"{%mail_html_body%}\""
},
"SpamFilter_prompt_prefs_title": {
"message": "Επιλογές φίλτρου ανεπιθύμητης αλληλογραφίας"

View file

@ -672,6 +672,10 @@
"message": "Mail headers",
"description": ""
},
"placeholder_mail_full_headers": {
"message": "All mail headers",
"description": ""
},
"placeholder_selected_text": {
"message": "Selected text",
"description": ""
@ -780,10 +784,6 @@
"message": "It appears that at least one of your accounts is using the Owl for Exchange add-on. There is a known issue between Thunderbird and Owl, which is currently being addressed. At this time, you can use ThunderAI while composing emails, but not when reading them.",
"description": ""
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Click on a value to set it.",
"description": ""
},
"prompt_reply_full_text": {
"message": "Reply to the following email. Reply with only the needed text and with no extra comments or other text.",
"description": ""
@ -1069,7 +1069,7 @@
"description": ""
},
"prompt_get_calendar_event_full_text": {
"message": "Extract all relevant details required to generate a calendar event from the following text. The extracted information should include:\n- Event Title\n- Start Date and Time (including timezone, if specified)\n- End Date and Time (including timezone, if specified)\n- Full day (if mentioned)\n- Attendees\nEnsure the data is formatted clearly and consistently so that it can be directly used for creating a calendar event.\nIf there are relative time references, consider that the date and time of the email are \"{%mail_datetime%}\". Calculate the start date and time based on this reference. If the calculated start date and time are earlier than \"{%current_datetime%}\", recalculate the start date and time using \"{%current_datetime%}\" as the base.\nIf the duration is not specified, set it to one hour.\nThese are the attendees: {%author%}, {%recipients%}, {%cc_list%}. If present, exclude my address: {%account_email_address%}.\nIf you're not able to get one or more of the required information, please respond with an empty string.\nGenerate a response in JSON format only. Do not include any additional text or explanations; provide only the JSON. Here is the format to be used:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Calendar event summary here\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHere's the text:\"{%mail_text_body_or_selected%}\"",
"message": "Extract all relevant details required to generate a calendar event from the following text. The extracted information should include:\n- Event Title\n- Start Date and Time (including timezone, if specified)\n- End Date and Time (including timezone, if specified)\n- Full day (if mentioned)\n- Attendees\nEnsure the data is formatted clearly and consistently so that it can be directly used for creating a calendar event.\nIf there are relative time references, consider that the date and time of the email are \"{%mail_datetime%}\". Calculate the start date and time based on this reference. If the calculated start date and time are earlier than \"{%current_datetime%}\", recalculate the start date and time using \"{%current_datetime%}\" as the base.\nIf the duration is not specified, set it to one hour.\nThese are the attendees: {%author%}, {%recipients%}, {%cc_list%}. If present, exclude my address: {%account_email_address%}.\nIf the event is a full day event, endDate must be one day after startDate with time set to \"T000000\".\nIf you're not able to get one or more of the required information, please respond with an empty string.\nGenerate a response in JSON format only. Do not include any additional text or explanations; provide only the JSON. Here is the format to be used:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Calendar event summary here\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHere's the text:\"{%mail_text_body_or_selected%}\"",
"description": ""
},
"prompt_get_calendar_event_from_clipboard": {
@ -1109,7 +1109,7 @@
"description": ""
},
"prompt_summarize_full_text": {
"message": "You are an assistant that summarizes email conversations.\n\nGiven an email thread, produce a concise, accurate summary that captures:\n\n- The main topic or purpose of the conversation\n- Key decisions, conclusions, or agreements\n- Important questions, requests, or action items\n- Who is responsible for each action item (if stated)\n\nOmit greetings, signatures, quoted text, and redundant back-and-forth.\nDo not add assumptions or information not present in the emails.\n\nWrite the summary in clear, neutral language suitable for a busy professional.",
"message": "Provide a concise summary of the following email message(s). The summary should be 3-5 sentences maximum and capture the main points. Write in plain paragraphs without bullet points, lists, or markdown formatting:\n\n",
"description": ""
},
"prompt_summarize_email_template": {
@ -1381,7 +1381,7 @@
"description" : ""
},
"prompt_spamfilter_full_text" : {
"message" : "Analyze the following email and determine if it is spam or not. Consider factors such as suspicious keywords, excessive promotional language, misleading subject lines, requests for personal information, and unusual sender addresses.\nProvide a value from 0 (not spam) to 100 (spam) and an explanation of no more than 10 words.\nIn case of missing message data, set the value to 0 (not spam), and give the reason.\nGenerate a response in JSON format only. Do not include any additional text or explanation; provide only the JSON. Here is the format to be used:\n{\n\"spamValue\": <integer from 0 to 100>,\n\"explanation\": \"Brief explanation of your reasoning\"\n}\nHere there are the mail information:\nSender: \"{%author%}\"\nSubject: \"{%mail_subject%}\"\nHtml body: \"{%mail_html_body%}\"",
"message" : "Analyze the following email and determine if it is spam or not. Consider factors such as suspicious keywords, excessive promotional language, misleading subject lines, requests for personal information, and unusual sender addresses.\nProvide a value from 0 (not spam) to 100 (spam) and an explanation of no more than 10 words.\nIn case of missing message data, set the value to 0 (not spam), and give the reason.\nGenerate a response in JSON format only. Do not include any additional text or explanation; provide only the JSON. Here is the format to be used:\n{\n\"explanation\": \"Brief explanation of your reasoning\",\n\"spamValue\": <integer from 0 to 100>\n}\nHere there are the mail information:\nSender: \"{%author%}\"\nSubject: \"{%mail_subject%}\"\nHtml body: \"{%mail_html_body%}\"",
"description" : ""
},
"SpamFilter_prompt_prefs_title": {
@ -1436,6 +1436,42 @@
"message": "No messages have screened for spam yet. Here you'll find a list of the last 100 spam reports.",
"description": ""
},
"SpamFilter_skip_addresses_title": {
"message": "Email address skip list",
"description": ""
},
"SpamFilter_skip_addresses_infoline": {
"message": "Emails from these addresses will not be sent to the AI for spam filtering.",
"description": ""
},
"SpamFilter_skip_addresses_infoline2": {
"message": "Add one email address per line, or separated by a comma.",
"description": ""
},
"spamfilter_skip_addresses_explanation": {
"message": "The sender is in the email address antispam skip list.",
"description": ""
},
"prefs_OptionText_spamfilter_skip_addressbook": {
"message": "Skip address books addresses",
"description": ""
},
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
"message": "If checked, emails from senders in your address books will not be sent to the AI for spam filtering.",
"description": ""
},
"spamfilter_skip_addressbook_explanation": {
"message": "The sender is a contact in the address book.",
"description": ""
},
"addressbook_permission_denied": {
"message": "Address book permission was denied. Please enable the feature again to grant permission.",
"description": ""
},
"addressbook_permission_error": {
"message": "Error requesting address book permission. Please try again.",
"description": ""
},
"SpamReport_Title": {
"message": "Spam Filter Reports",
"description": ""
@ -1520,6 +1556,10 @@
"message": "Receiving data",
"description": ""
},
"apiwebchat_done": {
"message": "Done!",
"description": ""
},
"hyprland_warning": {
"message": "If you're having trouble opening the AI chat window, try setting the height and width values to 0. This issue can occur on linux in certain environments, for example, when using Hyprland.",
"description": ""
@ -1601,7 +1641,7 @@
"description": ""
},
"AccountSelector_Spamfilter": {
"message": "Choose the accounts where the spam filter is enabled",
"message": "Choose the accounts where the automatic spam filter is enabled",
"description": ""
},
"prefs_OptionText_chatgpt_web_project": {
@ -1887,7 +1927,7 @@
"description": ""
},
"prefs_specific_api_indicator": {
"message": "[Using $1]",
"message": "Using $1",
"description": "Indicator near settings button when a special prompt uses a specific API.",
"placeholders": {
"1": {
@ -2003,6 +2043,14 @@
"message": "Maximum number of characters to display in the inline summary. Set to 0 for no limit.",
"description": ""
},
"prefs_OptionText_summarize_strip_formatting": {
"message": "Strip formatting",
"description": ""
},
"prefs_OptionText_summarize_strip_formatting_Info": {
"message": "Remove HTML and Markdown formatting from the AI-generated summary, showing plain text only.",
"description": ""
},
"summarize_see_more": {
"message": "See more",
"description": ""

View file

@ -518,9 +518,6 @@
"chatgpt_btn_model": {
"message": "Usar el modelo actual"
},
"SendingPrompt": {
"message": "Enviando solicitud..."
},
"AllowedValues": {
"message": "Valores permitidos"
},
@ -539,9 +536,6 @@
"prefs_OptionText_owl_warning": {
"message": "Parece que al menos una de sus cuentas está usando el complemento Owl for Exchange. Hay un problema conocido entre Thunderbird y Owl, que se está abordando actualmente. Por el momento, puede usar ThunderAI al redactar correos electrónicos, pero no al leerlos."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Haz clic en un valor para establecerlo."
},
"prompt_reply_full_text": {
"message": "Responder al siguiente correo electrónico. Responder solo con el texto necesario y sin comentarios extra ni otro texto."
},
@ -573,7 +567,7 @@
"message": "Resume el siguiente correo electrónico en una lista de viñetas."
},
"prompt_translate_this_full_text": {
"message": "Traducir el siguiente correo electrónico en"
"message": "Traduce el correo electrónico a continuación a {%thunderai_translate_lang%}.\n\nReglas:\n- Traduce tanto el asunto como el cuerpo.\n- Devuelve el resultado como un objeto JSON con tres campos: \"subject\", \"body\" y \"status\".\n- Si la traducción se ha realizado, el estado es igual a 1.\n- Si el correo electrónico está escrito en uno de estos idiomas \"{%thunderai_translate_exclude_lang%}\" o en el idioma {%thunderai_translate_lang%}, devuelve una cadena vacía para el cuerpo y el asunto y establece el estado en -1.\n- No añadas explicaciones, notas o ningún texto fuera del JSON.\n\nAsunto del correo electrónico: {%mail_subject%}\n\nCuerpo del correo electrónico: {%mail_html_body%}\n\nGenera una respuesta solo en formato JSON. La salida debe ser solo un objeto JSON. Aquí hay un ejemplo del formato JSON a utilizar:\n{\n\"subject\": \"traducción del asunto\",\n\"body\": \"traducción del cuerpo\",\n\"status\": \"resultado del estado\"\n}"
},
"prompt_this_full_text": {
"message": "Responder solo con el texto necesario y sin comentarios extra ni otro texto."
@ -744,7 +738,7 @@
"message": "Agregar un nuevo evento de calendario"
},
"prompt_get_calendar_event_full_text": {
"message": "Extrae todos los detalles relevantes necesarios para generar un evento de calendario a partir del siguiente texto. La información extraída debe incluir:\n- Título del evento\n- Fecha y hora de inicio (incluyendo zona horaria, si se especifica)\n- Fecha y hora de fin (incluyendo zona horaria, si se especifica)\n- Día completo (si se menciona)\n- Asistentes\nAsegúrate de que los datos estén formateados de manera clara y consistente para que puedan usarse directamente en la creación de un evento de calendario.\nSi hay referencias de tiempo relativas, considera que la fecha y hora del correo son \"{%mail_datetime%}\". Calcula la fecha y hora de inicio basándote en esta referencia. Si la fecha y hora de inicio calculadas son anteriores a \"{%current_datetime%}\", recalcula la fecha y hora de inicio usando \"{%current_datetime%}\" como base.\nSi la duración no se especifica, establécela en una hora.\nEstos son los asistentes: {%author%}, {%recipients%}, {%cc_list%}. Si están presentes, excluye mi dirección: {%account_email_address%}.\nSi no puedes obtener uno o más de los datos requeridos, responde con una cadena vacía.\nGenera una respuesta solo en formato JSON. No incluyas texto adicional ni explicaciones; proporciona únicamente el JSON. El formato a usar es:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumen del evento de calendario aquí\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEste es el texto:\"{%mail_text_body_or_selected%}\""
"message": "Extrae todos los detalles relevantes necesarios para generar un evento de calendario a partir del siguiente texto. La información extraída debe incluir:\n- Título del evento\n- Fecha y hora de inicio (incluyendo zona horaria, si se especifica)\n- Fecha y hora de fin (incluyendo zona horaria, si se especifica)\n- Día completo (si se menciona)\n- Asistentes\nAsegúrate de que los datos estén formateados de manera clara y consistente para que puedan usarse directamente en la creación de un evento de calendario.\nSi hay referencias de tiempo relativas, considera que la fecha y hora del correo son \"{%mail_datetime%}\". Calcula la fecha y hora de inicio basándote en esta referencia. Si la fecha y hora de inicio calculadas son anteriores a \"{%current_datetime%}\", recalcula la fecha y hora de inicio usando \"{%current_datetime%}\" como base.\nSi la duración no se especifica, establécela en una hora.\nEstos son los asistentes: {%author%}, {%recipients%}, {%cc_list%}. Si están presentes, excluye mi dirección: {%account_email_address%}.\nSi el evento es de día completo, endDate debe ser un día después de startDate con la hora establecida en \"T000000\".\nSi no puedes obtener uno o más de los datos requeridos, responde con una cadena vacía.\nGenera una respuesta solo en formato JSON. No incluyas texto adicional ni explicaciones; proporciona únicamente el JSON. El formato a usar es:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumen del evento de calendario aquí\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEste es el texto:\"{%mail_text_body_or_selected%}\""
},
"prompt_get_task": {
"message": "Agregar una nueva tarea"
@ -906,7 +900,7 @@
"message": "Detectar correos spam"
},
"prompt_spamfilter_full_text": {
"message": "Analiza el siguiente correo electrónico y determina si es spam o no. Considera factores como palabras clave sospechosas, lenguaje promocional excesivo, líneas de asunto engañosas, solicitudes de información personal y direcciones de remitente inusuales. \nProporciona un valor de 0 (no es spam) a 100 (spam) y una explicación de no más de 10 palabras. \nEn caso de que falten datos del mensaje, establece el valor en 0 (no es spam) y da la razón. \nGenera una respuesta únicamente en formato JSON. No incluyas texto adicional ni explicación; proporciona solo el JSON. El formato a usar es: \n{\n\"spamValue\": <entero de 0 a 100>,\n\"explanation\": \"Breve explicación de tu razonamiento\"\n} \nAquí está la información del correo: \nRemitente: \"{%author%}\" \nAsunto: \"{%mail_subject%}\" \nCuerpo HTML: \"{%mail_html_body%}\""
"message": "Analiza el siguiente correo electrónico y determina si es spam o no. Considera factores como palabras clave sospechosas, lenguaje promocional excesivo, líneas de asunto engañosas, solicitudes de información personal y direcciones de remitente inusuales.\nProporciona un valor de 0 (no es spam) a 100 (spam) y una explicación de no más de 10 palabras.\nEn caso de que falten datos del mensaje, establece el valor en 0 (no es spam) y da la razón.\nGenera una respuesta únicamente en formato JSON. No incluyas texto adicional ni explicación; proporciona solo el JSON. El formato a usar es:\n{\n\"explanation\": \"Breve explicación de tu razonamiento\",\n\"spamValue\": <entero de 0 a 100>\n}\nAquí está la información del correo:\nRemitente: \"{%author%}\"\nAsunto: \"{%mail_subject%}\"\nCuerpo HTML: \"{%mail_html_body%}\""
},
"SpamFilter_prompt_prefs_title": {
"message": "Opciones del filtro de spam"
@ -930,7 +924,7 @@
"message": "¡El umbral de spam es cero! ¡Marcarás todos los correos como spam!"
},
"spamfilter_no_reports": {
"message": "No hay mensajes filtrados como spam todavía. Aquí encontrarás una lista de los últimos 100 informes de spam solo para la sesión actual."
"message": "Aún no se ha revisado ningún mensaje en busca de spam. Aquí encontrará una lista de los últimos 100 informes de spam."
},
"SpamReport_Title": {
"message": "Informes del filtro de spam"
@ -1047,7 +1041,7 @@
"message": "Cada cambio se guarda inmediatamente."
},
"AccountSelector_Spamfilter": {
"message": "Elige las cuentas donde el filtro de spam está habilitado"
"message": "Elige las cuentas donde el filtro de spam automático está activado"
},
"prefs_OptionText_chatgpt_web_project": {
"message": "Proyecto ChatGPT Web"
@ -1286,5 +1280,459 @@
},
"reset": {
"message": "Reiniciar"
},
"webchat_save_as_summary": {
"message": "Guardar como Resumen"
},
"prefs_storage_title": {
"message": "Almacenamiento"
},
"prefs_storage_info": {
"message": "El almacenamiento se utiliza para guardar información sobre la puntuación de spam, los resúmenes y las traducciones de cada mensaje."
},
"prefs_storage_size": {
"message": "Tamaño de almacenamiento"
},
"prefs_storage_clear_button": {
"message": "Borrar almacenamiento"
},
"prefs_storage_clear_confirm": {
"message": "¿Estás seguro de que quieres borrar todos los datos almacenados (resúmenes, informes de spam, traducciones)? Esta acción no se puede deshacer."
},
"prefs_storage_clear_done": {
"message": "Se eliminaron $COUNT$ registros.",
"placeholders": {
"count": {
"content": "$1"
}
}
},
"prefsInfoDesc_7": {
"message": "Para usar la API de Google Gemini, necesitas una clave de API de Google Gemini y debes elegir un modelo."
},
"prefsInfoDesc_8": {
"message": "Para usar la API de Claude, necesitas una clave de API de Anthropic Claude y debes elegir un modelo."
},
"placeholder_mail_full_headers": {
"message": "Todos los encabezados de correo"
},
"placeholder_mail_text_body_or_selected": {
"message": "Cuerpo del correo o texto seleccionado"
},
"placeholder_mail_html_body_or_selected": {
"message": "Cuerpo del correo o HTML seleccionado"
},
"prefs_OptionText_chatgpt_web_load_wait_time": {
"message": "Tiempo de espera para la carga de la página"
},
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
"message": "Tiempo en milisegundos para esperar a que la página de ChatGPT se cargue antes de cargar el contenido adicional. El valor predeterminado es de 1000ms. Si se define un GPT personalizado o un proyecto, se sumarán 1000ms adicionales a este valor."
},
"prefs_doc_title": {
"message": "Documentación"
},
"prefs_doc_setup_guide": {
"message": "Guías de configuración"
},
"prefs_doc_custom_prompt_tutorial": {
"message": "Tutorial de prompt personalizado"
},
"prefs_doc_open_welcome": {
"message": "Abrir la página de bienvenida"
},
"prompt_get_calendar_event_from_clipboard": {
"message": "Añadir evento de calendario desde portapapeles"
},
"clipboard_read_error": {
"message": "No se pudo leer el portapapeles. Por favor, verifica los permisos."
},
"clipboard_empty_error": {
"message": "El portapapeles está vacío. Por favor, copia algo de texto primero."
},
"clipboard_permission_denied": {
"message": "Se denegó el permiso del portapapeles. Por favor, habilita la función nuevamente en la configuración para conceder permiso."
},
"clipboard_permission_error": {
"message": "Error al solicitar permiso del portapapeles. Por favor, inténtalo de nuevo."
},
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
"message": "Mostrar un elemento de menú adicional para crear eventos de calendario a partir del contenido de texto del portapapeles."
},
"Summarize_prompt_prefs_title": {
"message": "Opciones de resumen"
},
"prompt_summarize": {
"message": "Resumir este correo electrónico o estos correos electrónicos"
},
"prompt_summarize_full_text": {
"message": "Proporcione un resumen conciso del siguiente mensaje(s) de correo electrónico. El resumen debe tener un máximo de 3 a 5 oraciones y capturar los puntos principales. Escriba en párrafos sencillos sin viñetas, listas o formato markdown:\n\n"
},
"prompt_summarize_email_template": {
"message": "Resumir plantilla de correo electrónico"
},
"prompt_summarize_email_template_full_text": {
"message": "De: {%author%}\nPara: {%recipients%}\nCC: {%cc_list%}\nAsunto: {%mail_subject%}\nFecha: {%mail_datetime%}\nArchivos adjuntos:\n{%mail_attachments_info%}\n\nCuerpo:\n{%mail_text_body%}"
},
"prompt_summarize_email_separator": {
"message": "Separador de correo electrónico"
},
"prompt_summarize_email_separator_full_text": {
"message": "\n\n---------- SIGUIENTE CORREO ----------\n\n"
},
"prefs_OptionText_Summarize_infoline2": {
"message": "Puedes cambiar el prompt como desees, el primer campo es el prompt principal, el segundo campo es la plantilla para un correo individual. La lista de correos electrónicos se adjuntará al prompt principal. Los correos electrónicos se separarán por el separador especificado en el tercer campo."
},
"prefs_OptionText_Summarize_main_prompt": {
"message": "El prompt principal que describe la tarea a realizar en todos los correos electrónicos seleccionados:"
},
"prefs_OptionText_Summarize_email_template": {
"message": "La plantilla para un correo electrónico individual:"
},
"prefs_OptionText_Summarize_email_separator": {
"message": "El separador entre correos electrónicos:"
},
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
"message": "Si está marcado, el Modelo y la API especificados a continuación se utilizarán para crear eventos de calendario, independientemente del que se elija en la página de opciones de ThunderAI."
},
"placeholder_thunderai_translate_lang": {
"message": "El idioma que se utilizará en las traducciones de correo."
},
"placeholder_thunderai_translate_exclude_lang": {
"message": "Los códigos de idioma que no se deben traducir cuando se encuentren."
},
"prefs_OptionText_summarize": {
"message": "Resumir correo electrónico"
},
"prefs_OptionText_summarize_use_specific_integration_Info": {
"message": "Si está marcado, el Modelo y la API especificados a continuación se utilizarán para resumir el(los) correo(s) electrónico(s), independientemente del que se elija en la página de opciones de ThunderAI."
},
"prefs_OptionText_summarize_Info": {
"message": "Si está marcado, añade una opción al menú contextual para resumir el(los) correo(s) electrónico(s)."
},
"prefs_OptionText_btnManageSummarizeInfo": {
"message": "Administrar configuración de resumen"
},
"Summarize_PageTitle": {
"message": "Administrar configuraciones de resumen"
},
"Summarize_info_default": {
"message": "En esta página puedes modificar el prompt predeterminado utilizado para resumir correos electrónicos."
},
"Summarize_prompt_text_title": {
"message": "Texto del prompt actual"
},
"prefs_OptionText_spamfilter_show_msg_panel": {
"message": "Mostrar panel de informe de spam"
},
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
"message": "Si está marcado, se mostrará un panel con el informe de spam encima del mensaje."
},
"SpamFilter_skip_addresses_title": {
"message": "Lista de salto de direcciones de correo electrónico"
},
"prefs_OptionText_get_calendar_event_from_clipboard": {
"message": "Obtener evento de calendario del portapapeles"
},
"SpamFilter_skip_addresses_infoline": {
"message": "Los correos electrónicos de estas direcciones no se enviarán a la IA para filtrar spam."
},
"SpamFilter_skip_addresses_infoline2": {
"message": "Agrega una dirección de correo electrónico por línea, o separada por una coma."
},
"spamfilter_skip_addresses_explanation": {
"message": "El remitente está en la lista de omisión antispam de la dirección de correo electrónico."
},
"prefs_OptionText_spamfilter_skip_addressbook": {
"message": "Omitir direcciones de la agenda"
},
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
"message": "Si está marcado, los correos electrónicos de remitentes en sus agendas no se enviarán a la IA para filtrar spam."
},
"spamfilter_skip_addressbook_explanation": {
"message": "El remitente es un contacto en la agenda."
},
"addressbook_permission_denied": {
"message": "Se denegó el permiso de la agenda. Por favor, habilite la función de nuevo para otorgar permiso."
},
"addressbook_permission_error": {
"message": "Error al solicitar el permiso de la agenda. Por favor, inténtelo de nuevo."
},
"Spam": {
"message": "Spam"
},
"Valid": {
"message": "Válido"
},
"context_menu_mzta-summarize": {
"message": "Resumir"
},
"context_menu_mzta-translate": {
"message": "Traducir"
},
"apiwebchat_done": {
"message": "¡Hecho!"
},
"CORS_alternative_2_new": {
"message": "Presione el botón de abajo para dar el permiso al host actual para evitar cualquier problema de CORS."
},
"CORS_give_host_perm": {
"message": "Dar permiso al host actual"
},
"CORS_localhost_warn": {
"message": "Si está usando localhost o 127.0.0.1 porque el servidor de IA está alojado en su PC, se requiere el permiso <all_urls>."
},
"prefs_ollama_format_json": {
"message": "Forzar salida JSON"
},
"prefs_ollama_format_json_Info": {
"message": "Si está marcado, Ollama se verá obligado a devolver una respuesta JSON válida. Esta opción solo funciona con modelos que admiten salida estructurada."
},
"prefs_specific_api_indicator": {
"message": "Usando $1",
"placeholders": {
"1": {
"content": "$1"
}
}
},
"prefs_OptionText_auto_summary": {
"message": "Habilitar el resumen automático de IA para previsualizaciones de mensajes"
},
"prefs_OptionText_auto_summary_Info": {
"message": "Si está marcado, ThunderAI generará y mostrará automáticamente resúmenes de IA encima de los mensajes de correo electrónico cuando se abran. Tenga en cuenta que esto significa que todos los mensajes que vea en vista previa se enviarán inmediatamente al servicio de IA configurado."
},
"auto_summary_title": {
"message": "Resumen de ThunderAI"
},
"auto_summary_generating": {
"message": "Generando resumen de IA..."
},
"auto_summary_failed": {
"message": "No se pudo generar el resumen de IA. Por favor, confirme su configuración e inténtelo de nuevo."
},
"customPrompts_export_include_api_settings": {
"message": "¿Desea incluir la configuración de la API en la exportación? ¡Tenga en cuenta que también se guardará la clave de API en el archivo!"
},
"prefs_OptionText_calendar_no_selection": {
"message": "No preguntar para seleccionar texto"
},
"prefs_OptionText_calendar_no_selection_Info": {
"message": "Si está marcado, no es necesario seleccionar texto. Se utilizará el cuerpo completo del mensaje para obtener el evento de calendario."
},
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
"message": "El prompt debe contener el marcador de posición {%mail_text_body_or_selected%} o {%mail_html_body_or_selected%} para habilitar esta opción. Por favor, añada uno de estos marcadores de posición al prompt o restablezca a la configuración predeterminada."
},
"customPrompts_btnCopy": {
"message": "Copiar"
},
"copy_text": {
"message": "Copiar"
},
"spam_check_in_progress": {
"message": "Comprobación de spam en curso..."
},
"prefs_OptionText_summarize_auto": {
"message": "Resumir automáticamente mensajes"
},
"prefs_OptionText_summarize_auto_Info": {
"message": "Elige si generar automáticamente resúmenes al ver mensajes. Requiere una conexión basada en API (no ChatGPT Web)."
},
"prefs_OptionText_summarize_display_mode": {
"message": "Mostrar resumen en"
},
"prefs_OptionText_summarize_display_mode_Info": {
"message": "Elige dónde se muestra el resultado del resumen. El modo en línea muestra un banner de resumen directamente en el panel de mensajes. El modo de ventana de chat abre la ventana de chat de IA."
},
"prefs_OptionText_summarize_max_display_length": {
"message": "Longitud máxima de visualización"
},
"prefs_OptionText_summarize_max_display_length_Info": {
"message": "Número máximo de caracteres para mostrar en el resumen en línea. Establecer en 0 para no tener límite."
},
"prefs_OptionText_summarize_strip_formatting": {
"message": "Eliminar formato"
},
"prefs_OptionText_summarize_strip_formatting_Info": {
"message": "Eliminar formato HTML y Markdown del resumen generado por IA, mostrando solo texto plano."
},
"summarize_see_more": {
"message": "Ver más"
},
"summarize_see_less": {
"message": "Ver menos"
},
"summarize_title": {
"message": "Resumen de ThunderAI"
},
"get_ai_summary": {
"message": "Resumen de IA"
},
"summarize_collapse": {
"message": "Colapsar resumen"
},
"summarize_generating": {
"message": "Generando resumen..."
},
"summarize_error": {
"message": "Fallo al generar el resumen"
},
"summarize_click_to_generate": {
"message": "Haz clic aquí para generar un resumen"
},
"summarize_chatgpt_web_not_supported": {
"message": "El resumen automático requiere una conexión basada en API. Por favor, configure una conexión API en la configuración de ThunderAI."
},
"summarize_refresh": {
"message": "Actualizar resumen"
},
"spamfilter_refresh": {
"message": "Actualizar informe de spam"
},
"spamfilter_delete": {
"message": "Eliminar informe de spam"
},
"summarize_delete": {
"message": "Eliminar resumen"
},
"prefs_OptionText_translate": {
"message": "Traducir correo electrónico"
},
"prefs_OptionText_translate_use_specific_integration_Info": {
"message": "Si está marcado, el Modelo y la API especificados a continuación se utilizarán para traducir el(los) correo(s), independientemente de la opción elegida en la página de opciones de ThunderAI."
},
"prefs_OptionText_translate_Info": {
"message": "Si está marcado, añade un botón de traducción en el cuerpo del mensaje."
},
"prefs_OptionText_btnManageTranslateInfo": {
"message": "Gestionar configuraciones de traducción"
},
"Translate_PageTitle": {
"message": "Gestionar configuraciones de traducción"
},
"Translate_info_default": {
"message": "En esta página puedes modificar el prompt predeterminado utilizado para traducir correos electrónicos."
},
"Translate_prompt_text_title": {
"message": "Texto del prompt actual"
},
"Translate_prompt_prefs_title": {
"message": "Opciones de traducción"
},
"prefs_OptionText_translate_auto": {
"message": "Traducir automáticamente mensajes"
},
"prefs_OptionText_action_auto_disabled": {
"message": "Desactivado"
},
"prefs_OptionText_action_auto_manual": {
"message": "Solo botón manual"
},
"prefs_OptionText_action_auto_automatic": {
"message": "Cuando se abre el correo electrónico"
},
"prefs_OptionText_translate_auto_Info": {
"message": "Elige cuándo traducir los mensajes: desactivado, solo al hacer clic en el botón o automáticamente al abrir un mensaje."
},
"prefs_OptionText_display_mode_inline": {
"message": "Panel de mensajes (en línea)"
},
"prefs_OptionText_display_mode_webchat": {
"message": "Ventana de chat"
},
"prefs_OptionText_translate_max_display_length_Info": {
"message": "Número máximo de caracteres que se muestran en la traducción en línea. 0 = sin límite. Al establecerlo, el texto más largo se trunca con un interruptor de \"Ver más\"."
},
"translate_see_more": {
"message": "Ver más"
},
"translate_see_less": {
"message": "Ver menos"
},
"prefs_OptionText_translate_lang": {
"message": "Idioma de destino de la traducción"
},
"prefs_OptionText_translate_lang_Info": {
"message": "Idioma al que traducir los correos electrónicos. Si está vacío, utiliza la configuración de idioma predeterminada."
},
"prefs_OptionText_translate_exclude_lang": {
"message": "Excluir idiomas"
},
"prefs_OptionText_translate_exclude_lang_Info": {
"message": "Lista separada por comas de códigos de idioma (por ejemplo, en, fr, it) para omitir en la traducción automática. Si el correo electrónico está en uno de estos idiomas, no se traducirá automáticamente ni se mostrará el botón manual."
},
"prefs_OptionText_Translate_main_prompt": {
"message": "El prompt que describe la tarea de traducción:"
},
"translate_generating": {
"message": "Traduciendo..."
},
"translate_click_to_generate": {
"message": "Haz clic aquí para traducir este correo electrónico"
},
"get_ai_translation": {
"message": "Traducción de IA"
},
"translate_chatgpt_web_not_supported": {
"message": "La traducción automática requiere una conexión basada en API. Por favor, configure una conexión API en la configuración de ThunderAI."
},
"translate_refresh": {
"message": "Actualizar traducción"
},
"translate_delete": {
"message": "Eliminar traducción"
},
"translate_banner_title": {
"message": "Traducción de IA"
},
"translate_error": {
"message": "Fallo la traducción."
},
"translate_no_language_configured": {
"message": "El idioma de traducción no está configurado. Por favor, establece un idioma en la configuración de Traducción o establece un idioma predeterminado en la configuración General."
},
"translate_skipped": {
"message": "Traducción omitida: Idioma excluido o idéntico al objetivo."
},
"antispam_by": {
"message": "Antispam por"
},
"spam_badge_tooltip": {
"message": "Puntuación de spam — Haz clic para ver la explicación"
},
"summary_by": {
"message": "Resumen por"
},
"translate_by": {
"message": "Traducción por"
},
"prefs_THStats_1": {
"message": "¿Quieres estadísticas bonitas sobre tus correos electrónicos?"
},
"prefs_THStats_2": {
"message": "¡Haz clic aquí! ¡Prueba ThunderStats!"
},
"prefs_OptionText_chatgpt_win_pos_text": {
"message": "Posición de la ventana de chat de IA"
},
"prefs_OptionText_chatgpt_win_top": {
"message": "Superior"
},
"prefs_OptionText_chatgpt_win_left": {
"message": "Izquierdo"
},
"prefs_chatgpt_win_save_position": {
"message": "Guardar automáticamente la posición de la ventana al usar el botón de cerrar."
},
"prefs_chatgpt_win_position_info": {
"message": "Déjalo vacío para usar la posición predeterminada."
},
"prefs_OptionText_action_auto_batch": {
"message": "Cuando se recibe el correo electrónico"
},
"placeholder_string": {
"message": "Marcador de posición"
},
"prefs_OptionText_translate_max_display_length": {
"message": "Longitud máxima de la traducción mostrada"
}
}

View file

@ -486,9 +486,6 @@
"chatgpt_btn_model": {
"message": "Utiliser le modèle actuel"
},
"SendingPrompt": {
"message": "Envoi de l'invite..."
},
"AllowedValues": {
"message": "Valeurs autorisées"
},
@ -504,9 +501,6 @@
"prefs_OptionText_owl_warning": {
"message": "Il semble qu'au moins un de vos comptes utilise le module complémentaire Chouette pour Exchange. Il existe un problème connu entre Thunderbird et Chouette, qui est en cours de résolution. Pour le moment, vous pouvez utiliser ThunderAI lors de la rédaction d'e-mails, mais pas lors de leur lecture."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Cliquez sur une valeur pour la définir."
},
"prompt_reply_full_text": {
"message": "Répondez au courriel suivant. Répondez uniquement avec le texte nécessaire, sans commentaires ou autre texte."
},
@ -697,7 +691,7 @@
"message": "Ajouter un nouvel événement au calendrier"
},
"prompt_get_calendar_event_full_text": {
"message": "Extrayez tous les détails pertinents nécessaires pour générer un événement de calendrier à partir du texte suivant. Les informations extraites doivent inclure :\n- Titre de l'événement\n- Date et heure de début (y compris le fuseau horaire, si spécifié)\n- Date et heure de fin (y compris le fuseau horaire, si spécifié)\n- Journée entière (si mentionnée)\n- Participants\nAssurez-vous que les données sont formatées clairement et de manière cohérente afin qu'elles puissent être utilisées directement pour créer un événement de calendrier.\nS'il y a des références temporelles relatives, considérez que la date et l'heure de l'email sont \"{%mail_datetime%}\". Calculez la date et l'heure de début sur cette base. Si la date et l'heure de début calculées sont antérieures à \"{%current_datetime%}\", recalculez-les en utilisant \"{%current_datetime%}\" comme base.\nSi la durée n'est pas spécifiée, définissez-la sur une heure.\nVoici les participants : {%author%}, {%recipients%}, {%cc_list%}. Si elle est présente, exclure mon adresse : {%account_email_address%}.\nSi vous n'êtes pas en mesure d'obtenir une ou plusieurs des informations requises, répondez avec une chaîne vide.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"startDate\" : \"YYYYMMDDTHHMMSS\",\n\"endDate\" : \"YYYYMMDDTHHMMSS\",\n\"summary\" : \"Résumé de l'événement du calendrier ici\",\n\"forceAllDay\" : false\n\"attendees\" : [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nVoici le texte : \"{%mail_text_body_or_selected%}\""
"message": "Extrayez tous les détails pertinents nécessaires pour générer un événement de calendrier à partir du texte suivant. Les informations extraites doivent inclure :\n- Titre de l'événement\n- Date et heure de début (y compris le fuseau horaire, si spécifié)\n- Date et heure de fin (y compris le fuseau horaire, si spécifié)\n- Journée entière (si mentionnée)\n- Participants\nAssurez-vous que les données sont formatées clairement et de manière cohérente afin qu'elles puissent être utilisées directement pour créer un événement de calendrier.\nS'il y a des références temporelles relatives, considérez que la date et l'heure de l'email sont \"{%mail_datetime%}\". Calculez la date et l'heure de début sur cette base. Si la date et l'heure de début calculées sont antérieures à \"{%current_datetime%}\", recalculez-les en utilisant \"{%current_datetime%}\" comme base.\nSi la durée n'est pas spécifiée, définissez-la sur une heure.\nVoici les participants : {%author%}, {%recipients%}, {%cc_list%}. Si elle est présente, exclure mon adresse : {%account_email_address%}.\nSi l'événement dure toute la journée, endDate doit être le lendemain de startDate avec l'heure définie sur \"T000000\".\nSi vous n'êtes pas en mesure d'obtenir une ou plusieurs des informations requises, répondez avec une chaîne vide.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"startDate\" : \"YYYYMMDDTHHMMSS\",\n\"endDate\" : \"YYYYMMDDTHHMMSS\",\n\"summary\" : \"Résumé de l'événement du calendrier ici\",\n\"forceAllDay\" : false\n\"attendees\" : [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nVoici le texte : \"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Ajouter un nouvel événement au calendrier à partir du texte sélectionné"
@ -835,7 +829,7 @@
"message": "Date du rapport"
},
"prompt_spamfilter_full_text": {
"message": "Analysez l'e-mail suivant et déterminez s'il s'agit d'un spam ou non. Prenez en compte des facteurs tels que des mots-clés suspects, un langage promotionnel excessif, des lignes d'objet trompeuses, des demandes d'informations personnelles et des adresses d'expéditeurs inhabituelles.\nFournissez une valeur de 0 (non spam) à 100 (spam) et une explication de 10 mots maximum.\nEn cas de données de message manquantes, définissez la valeur à 0 (non spam) et indiquez la raison.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"spamValue\" : <entier de 0 à 100>,\n\"explanation\" : \"Brève explication de votre raisonnement\"\n}\nVoici les informations de l'e-mail :\nExpéditeur : \"{%author%}\"\nObjet : \"{%mail_subject%}\"\nCorps HTML : \"{%mail_html_body%}\""
"message": "Analysez l'e-mail suivant et déterminez s'il s'agit d'un spam ou non. Prenez en compte des facteurs tels que des mots-clés suspects, un langage promotionnel excessif, des lignes d'objet trompeuses, des demandes d'informations personnelles et des adresses d'expéditeurs inhabituelles.\nFournissez une valeur de 0 (non spam) à 100 (spam) et une explication de 10 mots maximum.\nEn cas de données de message manquantes, définissez la valeur à 0 (non spam) et indiquez la raison.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"explanation\" : \"Brève explication de votre raisonnement\",\n\"spamValue\" : <entier de 0 à 100>\n}\nVoici les informations de l'e-mail :\nExpéditeur : \"{%author%}\"\nObjet : \"{%mail_subject%}\"\nCorps HTML : \"{%mail_html_body%}\""
},
"context_menu_mzta-add-tags": {
"message": "Ajouter des étiquettes"

View file

@ -486,9 +486,6 @@
"chatgpt_btn_model": {
"message": "Koristi trenutni model"
},
"SendingPrompt": {
"message": "Slanje upita..."
},
"AllowedValues": {
"message": "Dopuštene vrijednosti"
},
@ -504,9 +501,6 @@
"prefs_OptionText_owl_warning": {
"message": "Čini se da barem jedan od vaših računa koristi dodatak Owl for Exchange. Postoji poznati problem između Thunderbirda i Owl, koji se trenutno rješava. Trenutačno možete koristiti ThunderAI dok sastavljate e-poruke, ali ne i dok ih čitate."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Pritisnite vrijednost da biste je postavili."
},
"prompt_reply_full_text": {
"message": "Odgovori na sljedeću e-poruku. Odgovorit samo s potrebnim tekstom i bez dodatnih komentara ili drugog teksta."
},
@ -697,7 +691,7 @@
"message": "Dodaj novi kalendarski događaj"
},
"prompt_get_calendar_event_full_text": {
"message": "Izdvoji sve relevantne detalje potrebne za generiranje kalendarskog događaja iz sljedećeg teksta. Izdvojene informacije trebaju uključivati:\n- Naslov događaja\n- Datum i vrijeme početka (uključujući vremensku zonu, ako je navedeno)\n- Datum i vrijeme završetka (uključujući vremensku zonu, ako je navedeno)\n- Cijeli dan (ako je navedeno)\n- Sudionici\nOsiguraj da su podaci oblikovani jasno i dosljedno kako bi se mogli izravno koristiti za stvaranje kalendarskog događaja.\nAko postoje relativne vremenske napomene, smatraj da su datum i vrijeme e-poruke \"{%mail_datetime%}\". Izračunajte datum i vrijeme početka na temelju ove napomene. Ako su izračunati početni datum i vrijeme raniji od \"{%current_datetime%}\", ponovno izračunaj početni datum i vrijeme koristeći \"{%current_datetime%}\" kao osnovu.\nAko trajanje nije navedeno, postavi ga na jedan sat.\nOvo su sudionici: {%author%}, {%recipients%}, {%cc_list%}. Ako je prisutna, isključi moju adresu: {%account_email_address%}.\nAko ne možeš dobiti jednu ili više potrebnih informacija, odgovori praznim nizom.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenja; pruži samo JSON. Ovo je format koji će se koristiti:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Sažetak kalendarskih događaja ovdje\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOvo je tekst:\"{%mail_text_body_or_selected%}\""
"message": "Izdvoji sve relevantne detalje potrebne za generiranje kalendarskog događaja iz sljedećeg teksta. Izdvojene informacije trebaju uključivati:\n- Naslov događaja\n- Datum i vrijeme početka (uključujući vremensku zonu, ako je navedeno)\n- Datum i vrijeme završetka (uključujući vremensku zonu, ako je navedeno)\n- Cijeli dan (ako je navedeno)\n- Sudionici\nOsiguraj da su podaci oblikovani jasno i dosljedno kako bi se mogli izravno koristiti za stvaranje kalendarskog događaja.\nAko postoje relativne vremenske napomene, smatraj da su datum i vrijeme e-poruke \"{%mail_datetime%}\". Izračunajte datum i vrijeme početka na temelju ove napomene. Ako su izračunati početni datum i vrijeme raniji od \"{%current_datetime%}\", ponovno izračunaj početni datum i vrijeme koristeći \"{%current_datetime%}\" kao osnovu.\nAko trajanje nije navedeno, postavi ga na jedan sat.\nOvo su sudionici: {%author%}, {%recipients%}, {%cc_list%}. Ako je prisutna, isključi moju adresu: {%account_email_address%}.\nAko je događaj cjelodnevni, **endDate** mora biti jedan dan nakon **startDate** s vremenom postavljenim na **\"T000000\"**.\nAko ne možeš dobiti jednu ili više potrebnih informacija, odgovori praznim nizom.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenja; pruži samo JSON. Ovo je format koji će se koristiti:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Sažetak kalendarskih događaja ovdje\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOvo je tekst:\"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Dodaj novi kalendarski događaj iz odabranog teksta"
@ -784,7 +778,7 @@
"message": "Prepoznaj neželjenu poštu"
},
"prompt_spamfilter_full_text": {
"message": "Analiziraj sljedeću e-poruku i utvrdi je li neželjena ili ne. Razmotri čimbenike kao što su sumnjive ključne riječi, pretjerani promotivni jezik, zavaravajuće linije predmeta, zahtjevi za osobnim podacima i neobične adrese pošiljatelja.\nNavedi vrijednost od 0 (nije spam) do 100 (neželjena pošta) i objašnjenje od najviše 10 riječi.\nU slučaju nedostatka podataka poruke, postavite vrijednost na 0 (nije spam) i navedite razlog.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenje; pruži samo JSON. Ovdje je format koji treba koristiti:\n{\n\"spamValue\": <cijeli broj od 0 do 100>,\n\"explanation\": \"Kratko objašnjenje vašeg obrazloženja\"\n}\nOvdje su informacije o e-poruci:\nŠalje: \"{%author%}\"\nNaslov: \"{%mail_subject%}\"\nHtml tijelo: \"{%mail_html_body%}\""
"message": "Analiziraj sljedeću e-poruku i utvrdi je li neželjena ili ne. Razmotri čimbenike kao što su sumnjive ključne riječi, pretjerani promotivni jezik, zavaravajuće linije predmeta, zahtjevi za osobnim podacima i neobične adrese pošiljatelja.\nNavedi vrijednost od 0 (nije spam) do 100 (neželjena pošta) i objašnjenje od najviše 10 riječi.\nU slučaju nedostatka podataka poruke, postavite vrijednost na 0 (nije spam) i navedite razlog.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenje; pruži samo JSON. Ovdje je format koji treba koristiti:\n{\n\"explanation\": \"Kratko objašnjenje vašeg obrazloženja\",\n\"spamValue\": <cijeli broj od 0 do 100>\n}\nOvdje su informacije o e-poruci:\nŠalje: \"{%author%}\"\nNaslov: \"{%mail_subject%}\"\nHtml tijelo: \"{%mail_html_body%}\""
},
"SpamFilter_prompt_prefs_title": {
"message": "Mogućnosti filtera neželjene pošte"

View file

@ -486,9 +486,6 @@
"chatgpt_btn_model": {
"message": "Usa il modello corrente"
},
"SendingPrompt": {
"message": "Invio del prompt..."
},
"AllowedValues": {
"message": "Valori consentiti"
},
@ -504,9 +501,6 @@
"prefs_OptionText_owl_warning": {
"message": "Sembra che almeno uno dei tuoi account stia utilizzando il componente aggiuntivo Gufo per Exchange. Esiste un problema noto tra Thunderbird e Gufo, che è attualmente in fase di risoluzione. Al momento, puoi utilizzare ThunderAI durante la composizione delle email, ma non durante la loro lettura."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Fai clic su un valore per impostarlo."
},
"prompt_reply_full_text": {
"message": "Rispondi alla seguente email. Rispondi solo con il testo necessario, senza commenti o altro testo aggiuntivo."
},
@ -697,7 +691,7 @@
"message": "Aggiungi un nuovo evento al calendario"
},
"prompt_get_calendar_event_full_text": {
"message": "Estrai tutti i dettagli rilevanti necessari per generare un evento del calendario dal seguente testo. Le informazioni estratte devono includere:\n- Titolo dell'evento\n- Data e ora di inizio (incluso il fuso orario, se specificato)\n- Data e ora di fine (incluso il fuso orario, se specificato)\n- Giornata intera (se menzionato)\n- I partecipanti\nAssicurati che i dati siano formattati in modo chiaro e coerente in modo che possano essere utilizzati direttamente per creare un evento del calendario.\nSe ci sono riferimenti temporali relativi, considera che la data e l'ora dell'email sono \"{%mail_datetime%}\". Calcola la data e l'ora di inizio in base a questo riferimento. Se la data e l'ora di inizio calcolate sono precedenti a \"{%current_datetime%}\", ricalcolale utilizzando \"{%current_datetime%}\" come base.\nSe la durata non è specificata, impostala a un'ora.\nQuesti sono i partecipanti: {%author%}, {%recipients%}, {%cc_list%}. Se presente, escludi il mio indirizzo: {%account_email_address%}.\nSe non riesci a ottenere una o più delle informazioni richieste, rispondi con una stringa vuota.\nGenera una risposta solo in formato JSON. Non includere testo o spiegazioni aggiuntive; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Riassunto evento calendario qui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEcco il testo: \"{%mail_text_body_or_selected%}\""
"message": "Estrai tutti i dettagli rilevanti necessari per generare un evento del calendario dal seguente testo. Le informazioni estratte devono includere:\n- Titolo dell'evento\n- Data e ora di inizio (incluso il fuso orario, se specificato)\n- Data e ora di fine (incluso il fuso orario, se specificato)\n- Giornata intera (se menzionato)\n- I partecipanti\nAssicurati che i dati siano formattati in modo chiaro e coerente in modo che possano essere utilizzati direttamente per creare un evento del calendario.\nSe ci sono riferimenti temporali relativi, considera che la data e l'ora dell'email sono \"{%mail_datetime%}\". Calcola la data e l'ora di inizio in base a questo riferimento. Se la data e l'ora di inizio calcolate sono precedenti a \"{%current_datetime%}\", ricalcolale utilizzando \"{%current_datetime%}\" come base.\nSe la durata non è specificata, impostala a un'ora.\nQuesti sono i partecipanti: {%author%}, {%recipients%}, {%cc_list%}. Se presente, escludi il mio indirizzo: {%account_email_address%}.\nSe l'evento dura tutto il giorno, endDate deve essere il giorno successivo a startDate con l'orario impostato su \"T000000\".\nSe non riesci a ottenere una o più delle informazioni richieste, rispondi con una stringa vuota.\nGenera una risposta solo in formato JSON. Non includere testo o spiegazioni aggiuntive; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Riassunto evento calendario qui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEcco il testo: \"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Aggiungi un nuovo evento al calendario dal testo selezionato"
@ -826,7 +820,7 @@
"message": "Valore soglia per lo spam"
},
"prompt_spamfilter_full_text": {
"message": "Analizza la seguente email e determina se si tratta di spam o meno. Considera fattori come parole chiave sospette, linguaggio promozionale eccessivo, linee oggetto fuorvianti, richieste di informazioni personali e indirizzi del mittente insoliti.\nFornisci un valore da 0 (non spam) a 100 (spam) e una spiegazione di non più di 10 parole.\nIn caso di dati del messaggio mancanti, imposta il valore a 0 (non spam) e fornisci la motivazione.\nGenera una risposta esclusivamente in formato JSON. Non includere alcun testo o spiegazione aggiuntiva; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"spamValue\": <intero da 0 a 100>,\n\"explanation\": \"Breve spiegazione del tuo ragionamento\"\n}\nQui ci sono le informazioni sull'email:\nMittente: \"{%author%}\"\nOggetto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
"message": "Analizza la seguente email e determina se si tratta di spam o meno. Considera fattori come parole chiave sospette, linguaggio promozionale eccessivo, linee oggetto fuorvianti, richieste di informazioni personali e indirizzi del mittente insoliti.\nFornisci un valore da 0 (non spam) a 100 (spam) e una spiegazione di non più di 10 parole.\nIn caso di dati del messaggio mancanti, imposta il valore a 0 (non spam) e fornisci la motivazione.\nGenera una risposta esclusivamente in formato JSON. Non includere alcun testo o spiegazione aggiuntiva; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"explanation\": \"Breve spiegazione del tuo ragionamento\",\n\"spamValue\": <intero da 0 a 100>\n}\nQui ci sono le informazioni sull'email:\nMittente: \"{%author%}\"\nOggetto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
},
"prefs_OptionText_add_tags_auto_force_existing_Info": {
"message": "Se selezionato, l'IA aggiungerà solo i tag esistenti e non creerà nuovi tag."

View file

@ -521,9 +521,6 @@
"chatgpt_btn_model": {
"message": "現在のモデルを使用"
},
"SendingPrompt": {
"message": "プロンプトを送信中..."
},
"AllowedValues": {
"message": "許可される値"
},
@ -542,9 +539,6 @@
"prefs_OptionText_owl_warning": {
"message": "アカウントの少なくとも1つがOwl for Exchangeアドオンを使用しているようです。ThunderbirdとOwlの間には既知の問題があり、現在対処中です。現時点では、メール作成時にはThunderAIを使用できますが、閲覧時には使用できません。"
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "クリックして値を設定してください。"
},
"prompt_reply_full_text": {
"message": "以下のメールに返信してください。必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
},
@ -750,7 +744,7 @@
"message": "新しいカレンダーイベントを追加"
},
"prompt_get_calendar_event_full_text": {
"message": "以下のテキストからカレンダーイベントを生成するために必要なすべての関連詳細を抽出してください。抽出情報には以下を含めてください:\n- イベントタイトル\n- 開始日時(指定されている場合はタイムゾーンを含む)\n- 終了日時(指定されている場合はタイムゾーンを含む)\n- 終日(言及されている場合)\n- 出席者\nデータはカレンダーイベントの作成に直接使用できるよう、明確かつ一貫した形式にしてください。\n相対的な時間参照がある場合、メールの日時は「{%mail_datetime%}」であることを考慮してください。この参照に基づいて開始日時を計算してください。計算された開始日時が「{%current_datetime%}」より前の場合、「{%current_datetime%}」を基準として開始日時を再計算してください。\n期間が指定されていない場合は、1時間に設定してください。\n出席者{%author%}、{%recipients%}、{%cc_list%}。存在する場合、私のアドレス{%account_email_address%}を除外してください。\n必要な情報の1つ以上を取得できない場合は、空の文字列で応答してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"カレンダーイベントの概要をここに\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nテキスト「{%mail_text_body_or_selected%}」"
"message": "以下のテキストからカレンダーイベントを生成するために必要なすべての関連詳細を抽出してください。抽出情報には以下を含めてください:\n- イベントタイトル\n- 開始日時(指定されている場合はタイムゾーンを含む)\n- 終了日時(指定されている場合はタイムゾーンを含む)\n- 終日(言及されている場合)\n- 出席者\nデータはカレンダーイベントの作成に直接使用できるよう、明確かつ一貫した形式にしてください。\n相対的な時間参照がある場合、メールの日時は「{%mail_datetime%}」であることを考慮してください。この参照に基づいて開始日時を計算してください。計算された開始日時が「{%current_datetime%}」より前の場合、「{%current_datetime%}」を基準として開始日時を再計算してください。\n期間が指定されていない場合は、1時間に設定してください。\n出席者{%author%}、{%recipients%}、{%cc_list%}。存在する場合、私のアドレス{%account_email_address%}を除外してください。\n終日イベントの場合、endDateはstartDateの翌日に設定し、時刻を「T000000」とする必要があります。\n必要な情報の1つ以上を取得できない場合は、空の文字列で応答してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"カレンダーイベントの概要をここに\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nテキスト「{%mail_text_body_or_selected%}」"
},
"prompt_get_task": {
"message": "新しいタスクを追加"
@ -909,7 +903,7 @@
"message": "スパムメールを検出"
},
"prompt_spamfilter_full_text": {
"message": "以下のメールを分析し、スパムかどうかを判断してください。不審なキーワード、過度な宣伝文句、誤解を招く件名、個人情報の要求、不審な送信者アドレスなどの要素を考慮してください。\n0スパムではないから100スパムまでの値と、10語以内の説明を提供してください。\nメッセージデータが欠落している場合は、値を0スパムではないに設定し、理由を示してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式\n{\n\"spamValue\": <0から100の整数>,\n\"explanation\": \"判断理由の簡単な説明\"\n}\n以下がメール情報です\n送信者「{%author%}」\n件名「{%mail_subject%}」\nHTML本文「{%mail_html_body%}」"
"message": "以下のメールを分析し、スパムかどうかを判断してください。不審なキーワード、過度な宣伝文句、誤解を招く件名、個人情報の要求、不審な送信者アドレスなどの要素を考慮してください。\n0スパムではないから100スパムまでの値と、10語以内の説明を提供してください。\nメッセージデータが欠落している場合は、値を0スパムではないに設定し、理由を示してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式\n{\n\"explanation\": \"判断理由の簡単な説明\",\n\"spamValue\": <0から100の整数>\n}\n以下がメール情報です\n送信者「{%author%}」\n件名「{%mail_subject%}」\nHTML本文「{%mail_html_body%}」"
},
"SpamFilter_prompt_prefs_title": {
"message": "スパムフィルターオプション"

View file

@ -486,9 +486,6 @@
"chatgpt_btn_model": {
"message": "Użyj bieżącego modelu"
},
"SendingPrompt": {
"message": "Wysyłanie polecenia..."
},
"AllowedValues": {
"message": "Dozwolone wartości"
},
@ -504,9 +501,6 @@
"prefs_OptionText_owl_warning": {
"message": "Wygląda na to, że przynajmniej jedno z Twoich kont używa dodatku Owl for Exchange. Istnieje znany problem między Thunderbirdem a Owl, który jest obecnie rozwiązywany. Na ten moment możesz używać ThunderAI podczas pisania e-maili, ale nie podczas ich czytania."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Kliknij na wartość, aby ją ustawić."
},
"prompt_reply_full_text": {
"message": "Odpowiedz na poniższy e-mail. Odpowiedz wyłącznie wymaganym tekstem, bez dodatkowych komentarzy ani innego tekstu."
},
@ -688,7 +682,7 @@
"message": "Dodaj nowe wydarzenie w kalendarzu"
},
"prompt_get_calendar_event_full_text": {
"message": "Wyodrębnij wszystkie istotne szczegóły wymagane do wygenerowania wydarzenia w kalendarzu z poniższego tekstu. Wyodrębnione informacje powinny obejmować:\n- Tytuł wydarzenia\n- Datę i godzinę rozpoczęcia (w tym strefę czasową, jeśli została określona)\n- Datę i godzinę zakończenia (w tym strefę czasową, jeśli została określona)\n- Cały dzień (jeśli jest podany)\n- Uczestnicy\nUpewnij się, że dane są sformatowane w sposób jasny i spójny, tak aby można go bezpośrednio wykorzystać do utworzenia wydarzenia w kalendarzu.\nJeśli istnieją odniesienia do czasu względnego, pamiętaj, że data i godzina wysłania wiadomości e-mail to „{%mail_datetime%}”. Oblicz datę i godzinę rozpoczęcia na podstawie tego odniesienia. Jeśli obliczona data i godzina rozpoczęcia są wcześniejsze niż „{%current_datetime%}”, oblicz ponownie datę i godzinę rozpoczęcia, stosując jako podstawę „{%current_datetime%}”.\nJeśli czas trwania nie jest określony, ustaw go na jedną godzinę.\nOto uczestnicy: {%author%}, {%recipients%}, {%cc_list%}. Jeśli jest obecny, wyklucz mój adres: {%account_email_address%}.\nJeśli nie możesz uzyskać co najmniej jednej z wymaganych informacji, w odpowiedzi wpisz pusty ciąg znaków.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dołączaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, którego należy użyć:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Tutaj podsumowanie wydarzenia w kalendarzu\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOto tekst:\"{%mail_text_body_or_selected%}\""
"message": "Wyodrębnij wszystkie istotne szczegóły wymagane do wygenerowania wydarzenia w kalendarzu z poniższego tekstu. Wyodrębnione informacje powinny obejmować:\n- Tytuł wydarzenia\n- Datę i godzinę rozpoczęcia (w tym strefę czasową, jeśli została określona)\n- Datę i godzinę zakończenia (w tym strefę czasową, jeśli została określona)\n- Cały dzień (jeśli jest podany)\n- Uczestnicy\nUpewnij się, że dane są sformatowane w sposób jasny i spójny, tak aby można go bezpośrednio wykorzystać do utworzenia wydarzenia w kalendarzu.\nJeśli istnieją odniesienia do czasu względnego, pamiętaj, że data i godzina wysłania wiadomości e-mail to „{%mail_datetime%}”. Oblicz datę i godzinę rozpoczęcia na podstawie tego odniesienia. Jeśli obliczona data i godzina rozpoczęcia są wcześniejsze niż „{%current_datetime%}”, oblicz ponownie datę i godzinę rozpoczęcia, stosując jako podstawę „{%current_datetime%}”.\nJeśli wydarzenie jest całodniowe, data zakończenia (endDate) musi przypadać na dzień po dacie rozpoczęcia (startDate), a godzina musi być ustawiona na \"T000000\".\nJeśli czas trwania nie jest określony, ustaw go na jedną godzinę.\nOto uczestnicy: {%author%}, {%recipients%}, {%cc_list%}. Jeśli jest obecny, wyklucz mój adres: {%account_email_address%}.\nJeśli nie możesz uzyskać co najmniej jednej z wymaganych informacji, w odpowiedzi wpisz pusty ciąg znaków.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dołączaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, którego należy użyć:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Tutaj podsumowanie wydarzenia w kalendarzu\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOto tekst:\"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Dodaj nowe wydarzenie w kalendarzu z zaznaczonego tekstu"
@ -829,7 +823,7 @@
"message": "Zarządzaj ustawieniami filtra spamu"
},
"prompt_spamfilter_full_text": {
"message": "Przeanalizuj poniższy e-mail i określ, czy jest to spam, czy nie. Weź pod uwagę takie czynniki jak podejrzane słowa kluczowe, nadmierny język promocyjny, wprowadzające w błąd tematy, prośby o podanie danych osobowych i nietypowe adresy nadawców.\nPodaj wartość od 0 (nie spam) do 100 (spam) oraz wyjaśnienie nie dłuższe niż 10 słów.\nW przypadku braku danych wiadomości ustaw wartość na 0 (nie spam) i podaj powód.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dodawaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, który należy użyć:\n{\n\"spamValue\": <liczba całkowita od 0 do 100>,\n\"explanation\": \"Krótkie wyjaśnienie twojego rozumowania\"\n}\nOto informacje o e-mailu:\nNadawca: \"{%author%}\"\nTemat: \"{%mail_subject%}\"\nTreść HTML: \"{%mail_html_body%}\""
"message": "Przeanalizuj poniższy e-mail i określ, czy jest to spam, czy nie. Weź pod uwagę takie czynniki jak podejrzane słowa kluczowe, nadmierny język promocyjny, wprowadzające w błąd tematy, prośby o podanie danych osobowych i nietypowe adresy nadawców.\nPodaj wartość od 0 (nie spam) do 100 (spam) oraz wyjaśnienie nie dłuższe niż 10 słów.\nW przypadku braku danych wiadomości ustaw wartość na 0 (nie spam) i podaj powód.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dodawaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, który należy użyć:\n{\n\"explanation\": \"Krótkie wyjaśnienie twojego rozumowania\",\n\"spamValue\": <liczba całkowita od 0 do 100>\n}\nOto informacje o e-mailu:\nNadawca: \"{%author%}\"\nTemat: \"{%mail_subject%}\"\nTreść HTML: \"{%mail_html_body%}\""
},
"prefs_OptionText_spamfilter_threshold_Info": {
"message": "Jeśli wartość zwrócona przez AI przekroczy ten próg, e-mail zostanie przeniesiony do folderu spamu."

View file

@ -486,9 +486,6 @@
"chatgpt_btn_model": {
"message": "Usar o modelo atual"
},
"SendingPrompt": {
"message": "Enviando prompt..."
},
"AllowedValues": {
"message": "Valores permitidos"
},
@ -504,9 +501,6 @@
"prefs_OptionText_owl_warning": {
"message": "Parece que pelo menos uma das suas contas está usando o complemento Coruja para Exchange. Existe um problema conhecido entre Thunderbird e Coruja, que está sendo resolvido no momento. Por enquanto, você pode usar o ThunderAI ao redigir e-mails, mas não ao lê-los."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Clique em um valor para defini-lo."
},
"prompt_reply_full_text": {
"message": "Responda ao e-mail a seguir. Responda apenas com o texto necessário e sem comentários adicionais ou outros textos."
},
@ -697,7 +691,7 @@
"message": "Adicionar um novo evento ao calendário"
},
"prompt_get_calendar_event_full_text": {
"message": "Extraia todos os detalhes relevantes necessários para gerar um evento de calendário a partir do texto a seguir. As informações extraídas devem incluir:\n- Título do evento\n- Data e hora de início (incluindo fuso horário, se especificado)\n- Data e hora de término (incluindo fuso horário, se especificado)\n- Dia inteiro (se mencionado)\n- Participantes\nCertifique-se de que os dados estejam formatados de maneira clara e consistente para que possam ser usados diretamente para criar um evento de calendário.\nSe houver referências de tempo relativas, considere que a data e a hora do e-mail são \"{%mail_datetime%}\". Calcule a data e a hora de início com base nessa referência. Se a data e a hora de início calculadas forem anteriores a \"{%current_datetime%}\", recalcule a data e a hora de início usando \"{%current_datetime%}\" como base.\nSe a duração não for especificada, defina-a como uma hora.\nEstes são os participantes: {%author%}, {%recipients%}, {%cc_list%}. Se estiver presente, exclua meu endereço: {%account_email_address%}.\nSe você não conseguir obter uma ou mais informações necessárias, responda com uma string vazia.\nGere uma resposta apenas no formato JSON. Não inclua texto ou explicações adicionais; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumo do evento do calendário aqui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nAqui está o texto: \"{%mail_text_body_or_selected%}\""
"message": "Extraia todos os detalhes relevantes necessários para gerar um evento de calendário a partir do texto a seguir. As informações extraídas devem incluir:\n- Título do evento\n- Data e hora de início (incluindo fuso horário, se especificado)\n- Data e hora de término (incluindo fuso horário, se especificado)\n- Dia inteiro (se mencionado)\n- Participantes\nCertifique-se de que os dados estejam formatados de maneira clara e consistente para que possam ser usados diretamente para criar um evento de calendário.\nSe houver referências de tempo relativas, considere que a data e a hora do e-mail são \"{%mail_datetime%}\". Calcule a data e a hora de início com base nessa referência. Se a data e a hora de início calculadas forem anteriores a \"{%current_datetime%}\", recalcule a data e a hora de início usando \"{%current_datetime%}\" como base.\nSe a duração não for especificada, defina-a como uma hora.\nEstes são os participantes: {%author%}, {%recipients%}, {%cc_list%}. Se estiver presente, exclua meu endereço: {%account_email_address%}.\nSe o evento for de dia inteiro, o campo endDate deve ser o dia seguinte ao startDate com o horário definido como \"T000000\".\nSe você não conseguir obter uma ou mais informações necessárias, responda com uma string vazia.\nGere uma resposta apenas no formato JSON. Não inclua texto ou explicações adicionais; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumo do evento do calendário aqui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nAqui está o texto: \"{%mail_text_body_or_selected%}\""
},
"prefs_OptionText_get_calendar_event": {
"message": "Adicionar um novo evento ao calendário a partir do texto selecionado"
@ -814,7 +808,7 @@
"message": "Filtro de spam automático"
},
"prompt_spamfilter_full_text": {
"message": "Analise o seguinte e-mail e determine se é spam ou não. Considere fatores como palavras-chave suspeitas, linguagem promocional excessiva, linhas de assunto enganosas, solicitações de informações pessoais e endereços de remetentes incomuns.\nForneça um valor de 0 (não é spam) a 100 (spam) e uma explicação de no máximo 10 palavras.\nEm caso de ausência de dados da mensagem, defina o valor como 0 (não é spam) e informe o motivo.\nGere uma resposta apenas no formato JSON. Não inclua nenhum texto ou explicação adicional; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"spamValue\": <inteiro de 0 a 100>,\n\"explanation\": \"Breve explicação do seu raciocínio\"\n}\nAqui estão as informações do e-mail:\nRemetente: \"{%author%}\"\nAssunto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
"message": "Analise o seguinte e-mail e determine se é spam ou não. Considere fatores como palavras-chave suspeitas, linguagem promocional excessiva, linhas de assunto enganosas, solicitações de informações pessoais e endereços de remetentes incomuns.\nForneça um valor de 0 (não é spam) a 100 (spam) e uma explicação de no máximo 10 palavras.\nEm caso de ausência de dados da mensagem, defina o valor como 0 (não é spam) e informe o motivo.\nGere uma resposta apenas no formato JSON. Não inclua nenhum texto ou explicação adicional; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"explanation\": \"Breve explicação do seu raciocínio\",\n\"spamValue\": <inteiro de 0 a 100>\n}\nAqui estão as informações do e-mail:\nRemetente: \"{%author%}\"\nAssunto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
},
"prefs_OptionText_spamfilter_threshold_Info": {
"message": "Se o valor retornado pela IA estiver acima deste limite, o e-mail será movido para a pasta de spam."

View file

@ -512,9 +512,6 @@
"chatgpt_btn_model": {
"message": "Использовать текущую модель"
},
"SendingPrompt": {
"message": "Отправка запроса..."
},
"AllowedValues": {
"message": "Разрешенные значения"
},
@ -533,9 +530,6 @@
"prefs_OptionText_owl_warning": {
"message": "Похоже, что по крайней мере одна из ваших учетных записей использует дополнение Owl for Exchange. Существует известная проблема между Thunderbird и Owl, которая в настоящее время решается. На данный момент вы можете использовать ThunderAI при составлении писем, но не при их чтении."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Нажмите на значение, чтобы установить его."
},
"prompt_reply_full_text": {
"message": "Ответьте на следующее письмо. В ответе указывайте только необходимый текст, без лишних комментариев и прочего."
},
@ -735,7 +729,7 @@
"message": "Добавьте новое событие календаря"
},
"prompt_get_calendar_event_full_text": {
"message": "Извлеките из следующего текста все необходимые сведения, необходимые для создания календарного события. Извлеченная информация должна включать:\n- Название события\n- Дата и время начала (включая часовой пояс, если он указан)\n- Дата и время окончания (включая часовой пояс, если он указан)\n- Полный день (если указано)\n- Участники\nУбедитесь, что данные отформатированы четко и последовательно, чтобы их можно было напрямую использовать для создания календарного события.\nЕсли есть относительные временные ссылки, считайте, что дата и время письма - это \"{%mail_datetime%}\". Рассчитайте дату и время начала на основе этой ссылки. Если вычисленные дата и время начала раньше, чем \"{%current_datetime%}\", пересчитайте дату и время начала, взяв за основу \"{%current_datetime%}\".\nЕсли продолжительность не указана, установите ее равной одному часу.\nК ним относятся: {%author%}, {%recipients%}, {%cc_list%}. Если присутствует, исключите мой адрес: {%account_email_address%}.\nЕсли вы не можете получить одну или несколько требуемых данных, ответьте пустой строкой.\nГенерируйте ответ только в формате JSON. Не включайте никаких дополнительных текстов или пояснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"startDate\": \"ГГГГММДДДХММССС\",\n\"endDate\": \"ГГГГММДДДХММССС\",\n\"summary\": \"Здесь выводится краткое описание события календаря\",\n\"forceAllDay\": false,\n\"attendees\": [участник1@example.com,участник2@example.com,участник3@example.com]\n}\nВот текст: \"{%mail_text_body_or_selected%}\""
"message": "Извлеките из следующего текста все необходимые сведения, необходимые для создания календарного события. Извлеченная информация должна включать:\n- Название события\n- Дата и время начала (включая часовой пояс, если он указан)\n- Дата и время окончания (включая часовой пояс, если он указан)\n- Полный день (если указано)\n- Участники\nУбедитесь, что данные отформатированы четко и последовательно, чтобы их можно было напрямую использовать для создания календарного события.\nЕсли есть относительные временные ссылки, считайте, что дата и время письма - это \"{%mail_datetime%}\". Рассчитайте дату и время начала на основе этой ссылки. Если вычисленные дата и время начала раньше, чем \"{%current_datetime%}\", пересчитайте дату и время начала, взяв за основу \"{%current_datetime%}\".\nЕсли продолжительность не указана, установите ее равной одному часу.\nК ним относятся: {%author%}, {%recipients%}, {%cc_list%}. Если присутствует, исключите мой адрес: {%account_email_address%}.\nЕсли это полнодневное событие, endDate должен быть на один день позже startDate с указанием времени \"T000000\".\nЕсли вы не можете получить одну или несколько требуемых данных, ответьте пустой строкой.\nГенерируйте ответ только в формате JSON. Не включайте никаких дополнительных текстов или пояснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"startDate\": \"ГГГГММДДДХММССС\",\n\"endDate\": \"ГГГГММДДДХММССС\",\n\"summary\": \"Здесь выводится краткое описание события календаря\",\n\"forceAllDay\": false,\n\"attendees\": [участник1@example.com,участник2@example.com,участник3@example.com]\n}\nВот текст: \"{%mail_text_body_or_selected%}\""
},
"prompt_get_task": {
"message": "Добавить новую задачу"
@ -876,7 +870,7 @@
"message": "Обнаружение спама в эл. почте"
},
"prompt_spamfilter_full_text": {
"message": "Проанализируйте следующее письмо и определите, является ли оно спамом или нет. Учитывайте такие факторы, как подозрительные ключевые слова, излишняя рекламная лексика, вводящие в заблуждение тематические строки, запросы личной информации и необычные адреса отправителей.\nУкажите значение от 0 (не спам) до 100 (спам) и объяснение, состоящее не более чем из 10 слов.\nВ случае отсутствия данных о сообщении установите значение 0 (не спам) и укажите причину.\nГенерируйте ответ только в формате JSON. Не включайте никаких доп. текстов или объяснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"spamValue\": <целое число от 0 до 100>,\n\"explanation\": \"Краткое объяснение ваших рассуждений\"\n}\nЗдесь находится информация о почте:\nОтправитель: \"{%author%}\"\nТема: \"{%mail_subject%}\"\nHtml-тело: \"{%mail_html_body%}\""
"message": "Проанализируйте следующее письмо и определите, является ли оно спамом или нет. Учитывайте такие факторы, как подозрительные ключевые слова, излишняя рекламная лексика, вводящие в заблуждение тематические строки, запросы личной информации и необычные адреса отправителей.\nУкажите значение от 0 (не спам) до 100 (спам) и объяснение, состоящее не более чем из 10 слов.\nВ случае отсутствия данных о сообщении установите значение 0 (не спам) и укажите причину.\nГенерируйте ответ только в формате JSON. Не включайте никаких доп. текстов или объяснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"explanation\": \"Краткое объяснение ваших рассуждений\",\n\"spamValue\": <целое число от 0 до 100>\n}\nЗдесь находится информация о почте:\nОтправитель: \"{%author%}\"\nТема: \"{%mail_subject%}\"\nHtml-тело: \"{%mail_html_body%}\""
},
"SpamFilter_prompt_prefs_title": {
"message": "Параметры спам-фильтра"

View file

@ -593,9 +593,6 @@
"chatgpt_btn_model": {
"message": "Använd den nuvarande modellen"
},
"SendingPrompt": {
"message": "Skickar prompt..."
},
"AllowedValues": {
"message": "Tillåtna värden"
},
@ -614,9 +611,6 @@
"prefs_OptionText_owl_warning": {
"message": "Det verkar som att minst ett av dina konton använder tillägget Owl for Exchange. Det finns ett känt problem mellan Thunderbird och Owl, vilket för närvarande åtgärdas. För närvarande kan du använda ThunderAI när du skriver e-postmeddelanden, men inte när du läser dem."
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "Klicka på ett värde för att ställa in det."
},
"prompt_reply_full_text": {
"message": "Svara på följande e-postmeddelande. Svara endast med den text som behövs och utan extra kommentarer eller annan text."
},
@ -645,7 +639,7 @@
"message": "Sammanfatta följande e-postmeddelande i en punktlista."
},
"prompt_translate_this_full_text": {
"message": "Översätt följande e-postmeddelande till"
"message": "Översätt e-postmeddelandet nedan till {%thunderai_translate_lang%}.\n\nRegler:\n- Översätt både ämnet och brödtexten.\n- Returnera resultatet som ett JSON-objekt med tre fält: \"subject\", \"body\" och \"status\".\n- Om översättningen har gjorts är statusen lika med 1.\n- Om e-postmeddelandet är skrivet på ett av dessa språk \"{%thunderai_translate_exclude_lang%}\" eller på språket {%thunderai_translate_lang%}, returnera en tom sträng för brödtexten och ämnet och sätt statusen till -1.\n- Lägg inte till förklaringar, anteckningar eller någon text utanför JSON.\n\nE-postämne: {%mail_subject%}\n\nE-postbrödtext: {%mail_html_body%}\n\nGenerera ett svar endast i JSON-format. Utdata ska endast vara ett JSON-objekt. Här är ett exempel på JSON-formatet som ska användas:\n{\n\"subject\": \"ämnesöversättning\",\n\"body\": \"översättning av brödtext\",\n\"status\": \"statusresultat\"\n}"
},
"prompt_this_full_text": {
"message": "Svara endast med den text som behövs och utan extra kommentarer eller annan text."
@ -1213,7 +1207,7 @@
"message": "Varje ändring sparas omedelbart."
},
"AccountSelector_Spamfilter": {
"message": "Välj de konton där skräppostfiltret är aktiverat"
"message": "Välj de konton där det automatiska skräppostfiltret är aktiverat"
},
"prefs_OptionText_chatgpt_web_project": {
"message": "ChatGPT webbprojekt"
@ -1279,13 +1273,13 @@
"message": "Citerad text i meddelandets brödtext"
},
"prompt_get_calendar_event_full_text": {
"message": "Extrahera all relevant information som krävs för att generera en kalenderhändelse från följande text. Den extraherade informationen bör innehålla:\n- Händelsetitel\n- Startdatum och tid (inklusive tidszon, om angiven)\n- Slutdatum och tid (inklusive tidszon, om angiven)\n- Heldag (om angiven)\n- Deltagare\nSe till att informationen är tydligt och konsekvent formaterad så att den kan användas direkt för att skapa en kalenderhändelse.\nOm det finns relativa tidsreferenser, tänk på att datum och tid för e-postmeddelandet är \"{%mail_datetime%}\". Beräkna startdatum och tid baserat på denna referens. Om det beräknade startdatumet och tiden är tidigare än \"{%current_datetime%}\", beräkna om startdatumet och tiden med \"{%current_datetime%}\" som bas.\nOm varaktigheten inte anges, sätt den till en timme.\nDessa är deltagarna: {%author%}, {%recipients%}, {%cc_list%}. Om det finns, exkludera min adress: {%account_email_address%}.\nOm du inte kan få en eller flera av de obligatoriska uppgifterna, vänligen svara med en tom sträng.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaringar; ange endast JSON. Här är formatet som ska användas:\n{\n\"startDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"endDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"summary\": \"Sammanfattning av kalenderhändelse här\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHär är texten: \"{%mail_text_body_or_selected%}\""
"message": "Extrahera all relevant information som krävs för att generera en kalenderhändelse från följande text. Den extraherade informationen bör innehålla:\n- Händelsetitel\n- Startdatum och tid (inklusive tidszon, om angiven)\n- Slutdatum och tid (inklusive tidszon, om angiven)\n- Heldag (om angiven)\n- Deltagare\nSe till att informationen är tydligt och konsekvent formaterad så att den kan användas direkt för att skapa en kalenderhändelse.\nOm det finns relativa tidsreferenser, tänk på att datum och tid för e-postmeddelandet är \"{%mail_datetime%}\". Beräkna startdatum och tid baserat på denna referens. Om det beräknade startdatumet och tiden är tidigare än \"{%current_datetime%}\", beräkna om startdatumet och tiden med \"{%current_datetime%}\" som bas.\nOm varaktigheten inte anges, sätt den till en timme.\nDessa är deltagarna: {%author%}, {%recipients%}, {%cc_list%}. Om det finns, exkludera min adress: {%account_email_address%}.\nOm händelsen är en heldagshändelse måste endDate vara en dag efter startDate med tiden inställd på \"T000000\".\nOm du inte kan få en eller flera av de obligatoriska uppgifterna, vänligen svara med en tom sträng.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaringar; ange endast JSON. Här är formatet som ska användas:\n{\n\"startDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"endDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"summary\": \"Sammanfattning av kalenderhändelse här\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHär är texten: \"{%mail_text_body_or_selected%}\""
},
"prompt_get_task_full_text": {
"message": "Extrahera alla relevanta detaljer som krävs för att generera en uppgift från följande text. Den extraherade informationen bör innehålla:\n- Förfallodatum och tid (inklusive tidszon, om angiven)\n- Uppgiftssammanfattning\n- Initialt datum och tid (inklusive tidszon, om angiven)\nSe till att informationen är tydligt och konsekvent formaterad så att den kan användas direkt för att skapa en uppgift.\nOm det finns relativa tidsreferenser, tänk på att datum och tid för e-postmeddelandet är \"{%mail_datetime%}\". Beräkna startdatum och tid baserat på denna referens. Om det beräknade startdatumet och tiden är tidigare än \"{%current_datetime%}\", beräkna om startdatumet och tiden med \"{%current_datetime%}\" som bas.\nOm du inte kan få en eller flera av de obligatoriska uppgifterna, vänligen svara med en tom sträng.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaringar; ange endast JSON. Här är formatet som ska användas:\n{\n\"InitialDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"dueDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"summary\": \"Uppgiftssammanfattning här\"\n}\nOm det inte finns någon information om datumen, ta bort dem.\nHär är texten: \"{%selected_text%}\""
},
"prompt_spamfilter_full_text": {
"message": "Analysera följande e-postmeddelande och avgör om det är skräppost eller inte. Tänk på faktorer som misstänkta sökord, överdrivet reklamspråk, vilseledande ämnesrader, förfrågningar om personlig information och ovanliga avsändaradresser.\nAnge ett värde från 0 (inte skräppost) till 100 (skräppost) och en förklaring på högst 10 ord.\nOm meddelandedata saknas, sätt värdet till 0 (inte skräppost) och ange orsaken.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaring; ange endast JSON. Här är formatet som ska användas:\n{\n\"spamValue\": <heltal från 0 till 100>,\n\"explanation\": \"Kort förklaring av ditt resonemang\"\n}\nHär är e-postinformationen:\nAvsändare: \"{%author%}\"\nÄmne: \"{%mail_subject%}\"\nHtml-text: \"{%mail_html_body%}\""
"message": "Analysera följande e-postmeddelande och avgör om det är skräppost eller inte. Tänk på faktorer som misstänkta sökord, överdrivet reklamspråk, vilseledande ämnesrader, förfrågningar om personlig information och ovanliga avsändaradresser.\nAnge ett värde från 0 (inte skräppost) till 100 (skräppost) och en förklaring på högst 10 ord.\nOm meddelandedata saknas, sätt värdet till 0 (inte skräppost) och ange orsaken.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaring; ange endast JSON. Här är formatet som ska användas:\n{\n\"explanation\": \"Kort förklaring av ditt resonemang\",\n\"spamValue\": <heltal från 0 till 100>\n}\nHär är e-postinformationen:\nAvsändare: \"{%author%}\"\nÄmne: \"{%mail_subject%}\"\nHtml-text: \"{%mail_html_body%}\""
},
"Summarize_prompt_prefs_title": {
"message": "Sammanfattningsalternativ"
@ -1294,7 +1288,7 @@
"message": "Sammanfatta det här e-postmeddelandet eller dessa e-postmeddelanden"
},
"prompt_summarize_full_text": {
"message": "Du är en assistent som sammanfattar e-postkonversationer.\n\nMed tanke på en e-posttråd, skapa en kortfattad och korrekt sammanfattning som fångar:\n\n- Konversationens huvudämne eller syfte\n- Viktiga beslut, slutsatser eller överenskommelser\n- Viktiga frågor, förfrågningar eller åtgärdspunkter\n- Vem som är ansvarig för varje åtgärdspunkt (om det anges)\n\nUteslut hälsningar, signaturer, citat och överflödig fram-och-tillbaka-text.\nLägg inte till antaganden eller information som inte finns i e-postmeddelandena.\n\nSkriv sammanfattningen på ett tydligt och neutralt språk som passar en upptagen yrkesperson."
"message": "Ge en kortfattad sammanfattning av följande e-postmeddelanden. Sammanfattningen bör vara högst 35 meningar lång och fånga huvudpunkterna. Skriv i enkla stycken utan punktlistor, listor eller markdownformatering:\n\n"
},
"prompt_summarize_email_template": {
"message": "Sammanfattningsmall för e-post"
@ -1462,7 +1456,7 @@
"message": "Spara som sammanfattning"
},
"prefs_storage_title": {
"message": "Ytterligare informationslagring"
"message": "Lagring"
},
"prefs_storage_size": {
"message": "Lagringsstorlek"
@ -1558,5 +1552,187 @@
},
"prefs_OptionText_action_auto_batch": {
"message": "När e-postmeddelandet tas emot"
},
"prefs_storage_info": {
"message": "Lagringen används för att spara information om skräppostpoäng, sammanfattningar och översättningar av varje meddelande."
},
"placeholder_thunderai_translate_lang": {
"message": "Språket som ska användas i e-postöversättningarna."
},
"placeholder_thunderai_translate_exclude_lang": {
"message": "Språkkoden ska inte översättas när den hittas."
},
"context_menu_mzta-translate": {
"message": "Översätt"
},
"prefs_OptionText_translate": {
"message": "Översätt e-post"
},
"prefs_OptionText_translate_use_specific_integration_Info": {
"message": "Om markerat kommer modellen och API:et som anges nedan att användas för att översätta e-postmeddelanden, oavsett vilket som valts på ThunderAI-alternativsidan."
},
"prefs_OptionText_translate_Info": {
"message": "Om markerad läggs en översättningsknapp till i meddelandetexten."
},
"prefs_OptionText_btnManageTranslateInfo": {
"message": "Hantera översättningsinställningar"
},
"Translate_PageTitle": {
"message": "Hantera översättningsinställningar"
},
"Translate_info_default": {
"message": "På den här sidan kan du ändra standardprompten som används för att översätta e-postmeddelanden."
},
"Translate_prompt_text_title": {
"message": "Aktuell prompttext"
},
"Translate_prompt_prefs_title": {
"message": "Översättningsalternativ"
},
"prefs_OptionText_translate_auto": {
"message": "Översätt meddelanden automatiskt"
},
"prefs_OptionText_action_auto_disabled": {
"message": "Inaktiverad"
},
"prefs_OptionText_action_auto_manual": {
"message": "Endast manuell knapp"
},
"prefs_OptionText_action_auto_automatic": {
"message": "När e-postmeddelandet öppnas"
},
"prefs_OptionText_translate_auto_Info": {
"message": "Välj när meddelanden ska översättas: inaktiverad, endast när du klickar på knappen eller automatiskt när du öppnar ett meddelande."
},
"prefs_OptionText_display_mode_inline": {
"message": "Meddelandepanel (inbäddad)"
},
"prefs_OptionText_display_mode_webchat": {
"message": "Chattfönster"
},
"prefs_OptionText_translate_max_display_length": {
"message": "Maximal längd på visad översättning"
},
"prefs_OptionText_translate_max_display_length_Info": {
"message": "Maximalt antal tecken som visas i den inbäddade översättningen. 0 = ingen gräns. När den är inställd avkortas längre text med en \"Visa mer\"-knapp."
},
"translate_see_more": {
"message": "Visa mer"
},
"translate_see_less": {
"message": "Visa mindre"
},
"prefs_OptionText_translate_lang": {
"message": "Översättningens målspråk"
},
"prefs_OptionText_translate_lang_Info": {
"message": "Språk att översätta e-postmeddelanden till. Om tomt används standardspråkinställningen."
},
"prefs_OptionText_translate_exclude_lang": {
"message": "Uteslut språk"
},
"prefs_OptionText_translate_exclude_lang_Info": {
"message": "Kommaavgränsad lista med språkkoder (t.ex. en, fr, it) som ska hoppas över för automatisk översättning. Om e-postmeddelandet är på ett av dessa språk kommer det inte att översättas automatiskt eller så visas inte den manuella knappen."
},
"prefs_OptionText_Translate_main_prompt": {
"message": "Prompten som beskriver översättningsuppgiften:"
},
"translate_generating": {
"message": "Översätter..."
},
"translate_click_to_generate": {
"message": "Klicka här för att översätta detta e-postmeddelande"
},
"get_ai_translation": {
"message": "AI-översättning"
},
"translate_chatgpt_web_not_supported": {
"message": "Automatisk översättning kräver en API-baserad anslutning. Konfigurera en API-anslutning i ThunderAI-inställningarna."
},
"translate_refresh": {
"message": "Uppdatera översättning"
},
"translate_delete": {
"message": "Ta bort översättning"
},
"translate_banner_title": {
"message": "AI-översättning"
},
"translate_error": {
"message": "Översättning misslyckades."
},
"translate_no_language_configured": {
"message": "Översättningsspråket är inte konfigurerat. Ange ett språk i översättningsinställningarna eller ange ett standardspråk i de allmänna inställningarna."
},
"translate_skipped": {
"message": "Översättning hoppas över: Språk uteslutet eller identiskt med målet."
},
"spam_badge_tooltip": {
"message": "Skräppostpoäng — Klicka för att se förklaring"
},
"translate_by": {
"message": "Översättning av"
},
"placeholder_string": {
"message": "Platshållare"
},
"prefsInfoDesc_7": {
"message": "För att använda Google Gemini API behöver du en Google Gemini API-nyckel och måste välja en modell."
},
"prefs_ollama_format_json": {
"message": "Tvinga fram JSON-utdata"
},
"prefs_ollama_format_json_Info": {
"message": "Om markerat kommer Ollama att tvingas returnera ett giltigt JSON-svar. Det här alternativet fungerar bara med modeller som stöder strukturerad utdata."
},
"prefs_specific_api_indicator": {
"message": "Använder $1",
"placeholders": {
"1": {
"content": "$1"
}
}
},
"prefsInfoDesc_8": {
"message": "För att använda Claude API behöver du en Anthropic Claude API-nyckel och måste välja en modell."
},
"prefs_OptionText_summarize_strip_formatting": {
"message": "Strimla formatering"
},
"prefs_OptionText_summarize_strip_formatting_Info": {
"message": "Ta bort HTML och Markdown formatering från den AI-genererade sammanfattningen, så att endast vanlig text visas."
},
"SpamFilter_skip_addresses_title": {
"message": "Lista över e-postadresser att hoppa över"
},
"SpamFilter_skip_addresses_infoline": {
"message": "E-postmeddelanden från dessa adresser kommer inte att skickas till AI:n för skräppostfiltrering."
},
"SpamFilter_skip_addresses_infoline2": {
"message": "Lägg till en e-postadress per rad, eller separera med kommatecken."
},
"prefs_OptionText_spamfilter_skip_addressbook": {
"message": "Hoppa över adressböckernas adresser"
},
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
"message": "Om markerat kommer e-postmeddelanden från avsändare i dina adressböcker inte att skickas till AI:n för skräppostfiltrering."
},
"spamfilter_skip_addressbook_explanation": {
"message": "Avsändaren är en kontakt i adressboken."
},
"addressbook_permission_denied": {
"message": "Adressboksbehörighet nekades. Aktivera funktionen igen för att ge behörighet."
},
"addressbook_permission_error": {
"message": "Fel vid begäran om behörighet till adressboken. Försök igen."
},
"apiwebchat_done": {
"message": "Klar!"
},
"placeholder_mail_full_headers": {
"message": "Alla e-postrubriker"
},
"spamfilter_skip_addresses_explanation": {
"message": "Avsändaren finns i listan över e-postadresser som inte ska skickas med skräppost."
}
}

View file

@ -107,9 +107,6 @@
"chatgpt_btn_model": {
"message": "使用当前模型"
},
"SendingPrompt": {
"message": "正在发送提示词..."
},
"AllowedValues": {
"message": "允许的值"
},
@ -489,7 +486,7 @@
"message": "如果在 ThunderAI 窗口中遇到登录问题,请使用右侧的按钮在新标签页中打开 ChatGPT完成登录后关闭该标签页然后继续使用 ThunderAI。"
},
"prompt_translate_this_full_text": {
"message": "将以下电子邮件翻译成"
"message": "将以下电子邮件翻译成 {%thunderai_translate_lang%}。\n\n规则\n- 翻译主题和正文。\n- 以包含三个字段“subject”、“body”和“status”的 JSON 对象形式返回结果。\n- 如果翻译已完成,则状态等于 1。\n- 如果电子邮件是以这些语言“{%thunderai_translate_exclude_lang%}”之一或 {%thunderai_translate_lang%} 语言编写的,请为主体和主题返回空字符串,并将状态设置为 -1。\n- 请勿在 JSON 之外添加解释、注释或任何文本。\n\n邮件主题{%mail_subject%}\n\n邮件正文{%mail_html_body%}\n\n仅以 JSON 格式生成响应。输出应仅为一个 JSON 对象。以下是要使用的 JSON 格式示例:\n\n{\n\n\"subject\": \"主题翻译\",\n\"body\": \"正文翻译\",\n\"status\": \"状态结果\"\n}"
},
"prompt_add_tags": {
"message": "为这封电子邮件添加标签"
@ -557,9 +554,6 @@
"placeholder_cc_list": {
"message": "抄送列表"
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "单击一个值进行设置。"
},
"prefs_OpenAIComp_ForceModel": {
"message": "手动填入模型"
},
@ -624,7 +618,7 @@
"message": "单击此处,只需一分钟!"
},
"prompt_add_tags_full_text": {
"message": "请分析以下电子邮件文本,并生成一个 JSON 数组的标签,总结其内容。请使用主题、关键话题和相关描述词作为标签。确保标签简洁且与邮件内容密切相关。\n邮件文本{%mail_text_body%}\n考虑以下细节以获取上下文\n- 发件人:{%author%}\n- 收件人:{%recipients%}\n- 抄送列表:{%cc_list%}\n- 邮件主题:{%mail_subject%}\n请仅根据邮件正文和上下文生成标签,忽略无关信息或琐碎细节。\n请仅以 JSON 格式生成回复。输出应仅包含标签的 JSON 数组,不包含任何额外注释或文本。以下是需使用的 JSON 格式示例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
"message": "分析以下邮件正文,并生成一个总结其内容的 JSON 标签数组。使用主题、关键话题和相关描述符作为标签。确保标签简洁且与邮件内容相关。\n邮件正文{%mail_text_body%}\n考虑以下背景详情\n- 发件人:{%author%}\n- 收件人:{%recipients%}\n- 抄送列表:{%cc_list%}\n- 邮件主题:{%mail_subject%}\n请根据邮件的正文和背景信息生成标签,忽略不必要的信息或琐碎的细节。\n仅以 JSON 格式生成响应。输出应仅为标签的 JSON 数组,不含任何额外注释或文本。以下是要使用的 JSON 格式示例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_full_list": {
"message": "现有标签"
@ -765,7 +759,7 @@
"message": "管理垃圾邮件过滤器设置"
},
"prompt_get_calendar_event_full_text": {
"message": "从以下文本中提取生成日历事件所需的所有相关细节。提取的信息应包括:\n- 事件标题\n- 开始日期和时间(如果指定时区,则包括时区)\n- 结束日期和时间(如果指定时区,则包括时区)\n- 全天事件(如果提及)\n- 参与者 \n确保数据格式清晰且一致以便可以直接用于创建日历事件。\n如果存在相对时间的引用请注意邮件的日期和时间为“{%mail_datetime%}”。基于此参考计算开始日期和时间。如果计算出的开始日期和时间早于“{%current_datetime%}”,则使用“{%current_datetime%}”作为基准重新计算开始日期和时间。\n如果未指定持续时间请将其设置为一小时。\n以下是参与者{%author%}, {%recipients%}, {%cc_list%}。如有,请排除我的地址:{%account_email_address%}。\n如果无法获取一个或多个所需信息,请以空字符串响应。\n仅以 JSON 格式生成响应。不要包含任何额外的文本或说明,仅提供 JSON。以下是使用的格式\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日历事件摘要\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\n以下是文本“{%mail_text_body_or_selected%}”"
"message": "从以下文本中提取生成日历事件所需的所有相关细节。提取的信息应包括:\n- 事件标题\n- 开始日期和时间(如果指定时区,则包括时区)\n- 结束日期和时间(如果指定时区,则包括时区)\n- 全天事件(如果提及)\n- 参与者 \n确保数据格式清晰且一致以便可以直接用于创建日历事件。\n如果存在相对时间的引用请注意邮件的日期和时间为“{%mail_datetime%}”。基于此参考计算开始日期和时间。如果计算出的开始日期和时间早于“{%current_datetime%}”,则使用“{%current_datetime%}”作为基准重新计算开始日期和时间。\n如果未指定持续时间请将其设置为一小时。\n以下是参与者{%author%}, {%recipients%}, {%cc_list%}。如有,请排除我的地址:{%account_email_address%}。\n如果该活动为全天活动endDate 必须为 startDate 的后一天,且时间设置为 \"T000000\"。\n如果无法获取一个或多个所需信息,请以空字符串响应。\n仅以 JSON 格式生成响应。不要包含任何额外的文本或说明,仅提供 JSON。以下是使用的格式\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日历事件摘要\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\n以下是文本“{%mail_text_body_or_selected%}”"
},
"prefs_OptionText_get_calendar_event": {
"message": "从所选文本添加新日历事件"
@ -810,7 +804,7 @@
"message": "获取日历事件数据时出错"
},
"prompt_spamfilter_full_text": {
"message": "分析以下邮件并判断它是否为垃圾邮件。考虑因素包括可疑关键词、过多的宣传语言、误导性的主题行、索取个人信息的请求以及异常的发件人地址。\n提供一个从 0非垃圾邮件到 100垃圾邮件的值并附上不超过 10 个单词的解释。\n如果消息数据缺失将数值设为0非垃圾邮件并说明原因。\n仅以 JSON 格式生成响应。不要包含任何额外文本或解释;仅提供 JSON。以下是使用的格式\n{\n\"spamValue\": <0 到 100 的整数>,\n\"explanation\": \"简要说明您的判断理由\"\n}\n以下是邮件信息\n发件人“{%author%}”\n主题“{%mail_subject%}”\nHTML 正文:“{%mail_html_body%}”"
"message": "分析以下邮件并判断它是否为垃圾邮件。考虑因素包括可疑关键词、过多的宣传语言、误导性的主题行、索取个人信息的请求以及异常的发件人地址。\n提供一个从 0非垃圾邮件到 100垃圾邮件的值并附上不超过 10 个单词的解释。\n如果消息数据缺失将数值设为0非垃圾邮件并说明原因。\n仅以 JSON 格式生成响应。不要包含任何额外文本或解释;仅提供 JSON。以下是使用的格式\n{\n\"explanation\": \"简要说明您的判断理由\",\n\"spamValue\": <0 到 100 的整数>\n}\n以下是邮件信息\n发件人“{%author%}”\n主题“{%mail_subject%}”\nHTML 正文:“{%mail_html_body%}”"
},
"prefs_OptionText_spamfilter_threshold_Info": {
"message": "如果 AI 返回的值高于此阈值,电子邮件将被移至垃圾邮件文件夹。"
@ -910,5 +904,232 @@
},
"placeholder_selected_html": {
"message": "已选中的 HTML"
},
"webchat_save_as_summary": {
"message": "另存为摘要"
},
"prefs_storage_title": {
"message": "存储"
},
"prefs_storage_info": {
"message": "该存储用于保存每条消息的垃圾邮件分数、摘要和翻译。"
},
"prefs_storage_size": {
"message": "存储容量"
},
"prefs_storage_clear_button": {
"message": "清除存储"
},
"prefs_storage_clear_confirm": {
"message": "您确定要清除所有已存储的数据(包含:摘要、垃圾邮件报告、翻译等)吗?此操作无法撤销。"
},
"prefs_storage_clear_done": {
"message": "清除存储后显示的消息",
"placeholders": {
"count": {
"content": "$1"
}
}
},
"prefsInfoDesc_7": {
"message": "要使用 Google Gemini API您需要一个 Google Gemini API 密钥,并且必须选择一个模型。"
},
"prefsInfoDesc_8": {
"message": "要使用 Claude API您需要一个 Anthropic Claude API 密钥,并且必须选择一个模型。"
},
"placeholder_mail_text_body_or_selected": {
"message": "邮件正文或选定文本"
},
"placeholder_mail_html_body_or_selected": {
"message": "邮件正文或选定的 HTML"
},
"prefs_OptionText_chatgpt_web_load_wait_time": {
"message": "页面加载等待时间"
},
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
"message": "在加载附加内容之前等待 ChatGPT 页面加载的时间(以毫秒为单位)。默认值为 1000 毫秒。如果定义了自定义 GPT 或项目,则该值将额外增加 1000 毫秒。"
},
"sign_msg_as": {
"message": "使用以下身份签名"
},
"prompt_reply_custom_command_full_text": {
"message": "请回复以下邮件 \"{%mail_text_body%}\"。{%additional_text%}。仅回复所需文本,不要包含额外的评论或其他文字。"
},
"prompt_proofread_this": {
"message": "校对这封邮件"
},
"prompt_proofread_this_full_text": {
"message": "请校对以下电子邮件,并纠正任何拼写或语法错误。仅回复更正后的文本,不要包含任何额外评论或其他文字。\n\n“{%mail_typed_text%}”"
},
"reset": {
"message": "重置"
},
"prefs_doc_title": {
"message": "文档"
},
"prefs_doc_setup_guide": {
"message": "设置指南"
},
"prefs_doc_custom_prompt_tutorial": {
"message": "自定义提示词教程"
},
"prefs_doc_open_welcome": {
"message": "打开欢迎页面"
},
"prompt_add_tags_force_lang": {
"message": "标签必须用以下方式编写:"
},
"placeholder_mail_quoted_text": {
"message": "邮件正文中的引用文本"
},
"prompt_get_calendar_event_from_clipboard": {
"message": "从剪贴板添加日历事件"
},
"clipboard_read_error": {
"message": "无法读取剪贴板。请检查权限。"
},
"clipboard_empty_error": {
"message": "剪贴板为空。请先复制一些文本。"
},
"clipboard_permission_denied": {
"message": "剪贴板权限被拒绝。请在设置中重新启用该功能以授予权限。"
},
"clipboard_permission_error": {
"message": "请求剪贴板权限时出错,请重试。"
},
"prefs_OptionText_get_calendar_event_from_clipboard": {
"message": "从剪贴板获取日历事件"
},
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
"message": "显示一个额外的菜单项,用于根据剪贴板文本内容创建日历事件。"
},
"Summarize_prompt_prefs_title": {
"message": "摘要选项"
},
"prompt_summarize": {
"message": "总结这封或这些邮件"
},
"prompt_summarize_full_text": {
"message": "请提供以下电子邮件的简明摘要。摘要应不超过 3-5 句话,并概括要点。请使用纯段落格式,不要使用项目符号、列表或 Markdown 格式。\n\n"
},
"prompt_summarize_email_template": {
"message": "邮件模板摘要"
},
"prompt_summarize_email_template_full_text": {
"message": "发件人:{%author%} \n收件人{%recipients%} \n抄送{%cc_list%} \n主题{%mail_subject%} \n日期{%mail_datetime%} \n附件 {%mail_attachments_info%} \n\n正文\n{%mail_text_body%}"
},
"prompt_summarize_email_separator": {
"message": "电子邮件分隔符"
},
"prompt_summarize_email_separator_full_text": {
"message": "\n\n----------下一封邮件----------\n\n"
},
"prompt_get_task": {
"message": "添加新任务"
},
"prompt_get_task_full_text": {
"message": "从以下文本中提取生成任务所需的所有相关详细信息。提取的信息应包括:\n- 截止日期和时间(如果指定,包括时区)\n- 任务摘要\n- 开始日期和时间(如果指定,包括时区)\n- 确保数据格式清晰且一致,以便直接用于创建任务。\n如果存在相对时间引用请认为电子邮件的日期和时间为“{%mail_datetime%}”。根据此参考计算开始日期和时间。如果计算出的开始日期和时间早于“{%current_datetime%}”,请使用“{%current_datetime%}”作为基准重新计算开始日期和时间。\n如果您无法获取一项或多项所需信息请回复空字符串。\n仅以 JSON 格式生成响应。不要包含任何额外的文本或说明;仅提供 JSON。以下是要使用的格式\n{\n\"InitialDate\": \"YYYYMMDDTHHMMSS\",\n\"dueDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"在此处填写任务摘要\"\n}\n如果没有关于日期的信息请将其删除。\n以下是文本“{%selected_text%}”"
},
"prefs_OptionText_get_task": {
"message": "从选定文本添加新任务"
},
"prefs_OptionText_get_task_Info": {
"message": "如果选中,则会在菜单中添加一个项目,以便从选定的文本获取任务信息。"
},
"get_task_prompt_prefs_title": {
"message": "任务选项"
},
"prefs_OptionText_Summarize_infoline2": {
"message": "您可以根据需要更改提示词,第一个字段是主提示词,第二个字段是单封邮件的模板。邮件列表将附加到主提示词中。邮件将由第三个字段中指定的间隔符分隔。"
},
"prefs_OptionText_Summarize_main_prompt": {
"message": "针对所有选定电子邮件,描述要执行的任务的主要提示:"
},
"prefs_OptionText_Summarize_email_template": {
"message": "单封邮件的模板:"
},
"prefs_OptionText_Summarize_email_separator": {
"message": "电子邮件地址之间的分隔符:"
},
"prefs_OptionText_get_calendar_event_Sparks_wrong_version": {
"message": "要使用日历事件和任务功能,请安装最新版本的 ThunderAI Sparks 插件。"
},
"GetTask_PageTitle": {
"message": "管理任务设置"
},
"GetTask_info_default": {
"message": "在此页面中,您可以修改用于从选定文本获取任务的默认提示。"
},
"prefs_OptionText_btnManageTaskInfo": {
"message": "管理任务设置"
},
"task_getting_data_error": {
"message": "获取任务数据时出错"
},
"task_opening_dialog_error": {
"message": "打开任务对话框时出错"
},
"no_valid_data_received": {
"message": "未收到来自 AI 的有效数据。"
},
"prefs_OptionText_add_tags_auto_Info2": {
"message": "请在页面底部选择要为其激活此功能的帐户。"
},
"prefs_OptionText_add_tags_auto_uselist": {
"message": "仅使用这些标签"
},
"prefs_OptionText_add_tags_auto_uselist_Info": {
"message": "如果选中此项AI 将仅添加以下列表中的标签。"
},
"prefs_OptionText_add_tags_auto_uselist_list_Info": {
"message": "列表中必须至少包含一个标签。每行添加一个标签,标签之间用逗号分隔。"
},
"prompt_add_tags_use_list": {
"message": "仅使用此逗号分隔列表中的标签"
},
"prefs_OptionText_add_tags_use_specific_integration_Info": {
"message": "如果选中此项,则无论在 ThunderAI 选项页面中选择哪个模型和 API都将使用下面指定的模型和 API 向电子邮件添加标签。"
},
"SpamFilter_skip_addresses_infoline2": {
"message": "每行添加一个电子邮件地址,或用逗号分隔。"
},
"spamfilter_skip_addresses_explanation": {
"message": "发件人已在反垃圾邮件跳过列表中。"
},
"Valid": {
"message": "有效的"
},
"context_menu_mzta-summarize": {
"message": "总结"
},
"context_menu_mzta-translate": {
"message": "翻译"
},
"hyprland_warning": {
"message": "如果您在打开 AI 聊天窗口时遇到问题,请尝试将高度和宽度值设置为 0。此问题可能在某些 Linux 环境下出现,例如在使用 Hyprland 时。"
},
"remember_CORS": {
"message": "记住,您需要在服务器上设置 CORS 设置!"
},
"maybe_CORS_openai_comp": {
"message": "使用 OpenAI 兼容 API 可能需要在服务器上设置 CORS 设置。"
},
"CORS_alternative_1": {
"message": "CORS设置有问题吗"
},
"CORS_alternative_2_new": {
"message": "点击下方按钮授予当前主机权限,以避免任何 CORS 问题。"
},
"CORS_give_host_perm": {
"message": "授予当前主机权限"
},
"CORS_localhost_warn": {
"message": "如果您使用 localhost 或 127.0.0.1,因为 AI 服务器托管在您的 PC 上,则需要 <all_urls> 权限。"
},
"prefs_OptionText_composing_plain_text": {
"message": "以纯文本编写"
},
"prefs_OptionText_composing_plain_text_Info": {
"message": "如果您以纯文本格式编写电子邮件,请选中此选项。"
}
}

View file

@ -429,9 +429,6 @@
"prefs_API_Host_Info": {
"message": "類似於"
},
"SendingPrompt": {
"message": "送出提示中..."
},
"context_menu_mzta-add-tags": {
"message": "新增標籤"
},
@ -1014,9 +1011,6 @@
"spamfilter_threshold_zero": {
"message": "垃圾郵件閾值為零!您將把所有郵件標記為垃圾郵件!"
},
"prefs_OptionText_chatgpt_web_model_tooltip": {
"message": "點擊一個值來設定它。"
},
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
"message": "如果勾選,選單中的提示將按字母順序排列。"
},
@ -1075,7 +1069,7 @@
"message": "您尚未選擇 ChatGPT API 的模型。請在選項頁面中選擇一個。"
},
"prompt_get_calendar_event_full_text": {
"message": "從以下文字中提取所有需要生成日曆事件的相關資訊。 提取的資訊應包含:\n- 事件名稱\n- 起始日期和時間(包含時區,如果指定)\n- 結束日期和時間(包含時間區,如果指定)\n- 整天事件(如果提及\n- 參與者\n確保數據以清晰一致的方式格式化以便直接用於創建日曆事件。\n如果有相對時間參考請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。 如果計算出的起日期和時間早於「{%current_datetime%}」,則使用「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果持續時間沒有指定則設定為一小時。\n參與者{%author%}, {%recipients%}, {%cc_list%}。如果存在,請排除我的地址:{%account_email_address%}。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不要包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日曆事件摘要在此\",\n\"forceAllDay\": false,\n\"attendees\": [\"attendee1@example.com \",\"attendee2@example.com \",\"attendee3@example.com \"]\n}\n這裡是文字「{%mail_text_body_or_selected%}」"
"message": "從以下文字中提取所有需要生成日曆事件的相關資訊。 提取的資訊應包含:\n- 事件名稱\n- 起始日期和時間(包含時區,如果指定)\n- 結束日期和時間(包含時間區,如果指定)\n- 整天事件(如果提及\n- 參與者\n確保數據以清晰一致的方式格式化以便直接用於創建日曆事件。\n如果有相對時間參考請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。 如果計算出的起日期和時間早於「{%current_datetime%}」,則使用「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果持續時間沒有指定則設定為一小時。\n參與者{%author%}, {%recipients%}, {%cc_list%}。如果存在,請排除我的地址:{%account_email_address%}。\n如果該活動為全天活動endDate 必須為 startDate 的後一天,且時間設置為 \"T000000\"。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不要包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日曆事件摘要在此\",\n\"forceAllDay\": false,\n\"attendees\": [\"attendee1@example.com \",\"attendee2@example.com \",\"attendee3@example.com \"]\n}\n這裡是文字「{%mail_text_body_or_selected%}」"
},
"TranslateText": {
"message": "您願意幫忙翻譯這個附加元件嗎?"
@ -1096,7 +1090,7 @@
"message": "ChatGPT 網頁介面可能會發生一些變化,導致附加元件無法正常運作。請查看此頁面底部連結的「服務狀態」頁面。另外,請記住,首次使用 ThunderAI 時,您需要登入 ChatGPT。"
},
"prompt_spamfilter_full_text": {
"message": "分析以下 Email 並判斷是否為垃圾郵件。 考慮因素包括可疑關鍵字、過度推銷性語言、誤導性主旨、要求個人資訊以及異常的寄件人地址。\n提供一個 0 (非垃圾郵件) 到 100 (垃圾郵件) 的分數,並提供一段不超過 10 字的說明。\n如果缺少訊息資料則設定分數為 0 (非垃圾郵件),並說明原因。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。以下是將要使用的格式\n{\n\"spamValue\": <由 0 到 100 的整數>,\n\"explanation\": \"簡短說明您的理由\"\n}\n以下是郵件資訊\n寄件人「{%author%}」\n主旨「{%mail_subject%}」\nHTML 內容:「{%mail_html_body%}」"
"message": "分析以下 Email 並判斷是否為垃圾郵件。 考慮因素包括可疑關鍵字、過度推銷性語言、誤導性主旨、要求個人資訊以及異常的寄件人地址。\n提供一個 0 (非垃圾郵件) 到 100 (垃圾郵件) 的分數,並提供一段不超過 10 字的說明。\n如果缺少訊息資料則設定分數為 0 (非垃圾郵件),並說明原因。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。以下是將要使用的格式\n{\n\"explanation\": \"簡短說明您的理由\",\n\"spamValue\": <由 0 到 100 的整數>\n}\n以下是郵件資訊\n寄件人「{%author%}」\n主旨「{%mail_subject%}」\nHTML 內容:「{%mail_html_body%}」"
},
"task_getting_data_error": {
"message": "取得取得任務資料時出錯"

View file

@ -244,7 +244,7 @@ worker.onmessage = async function(event) {
break;
case 'error':
messagesArea.appendBotMessage(payload,'error');
messageInput.enableInput();
messageInput.enableInput(false);
break;
default:
console.error('[ThunderAI] Unknown event type from API worker:', type);
@ -292,7 +292,7 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
break;
case "api_error":
messagesArea.appendBotMessage(message.error,'error');
messageInput.enableInput();
messageInput.enableInput(false);
break;
}
});

View file

@ -3,7 +3,6 @@
<head>
<!-- Other meta tags and stylesheets -->
<link rel="stylesheet" type="text/css" href="styles.css">
<title>ThunderAI Assistant</title>
</head>
<body>
<!-- Use the custom tags directly -->

View file

@ -74,6 +74,26 @@ messagesInputStyle.textContent = `
display: none;
vertical-align: middle;
}
#statusLoggerText{
font-weight: 600;
}
#statusLogger.status-working{
border-color: #2196F3;
background: #E3F2FD;
color: #1565C0;
}
#statusLogger.status-done{
border-color: #4CAF50;
background: #E8F5E9;
color: #2E7D32;
}
@keyframes statusFadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
#statusLogger.status-fadeout{
animation: statusFadeOut 0.5s ease-out forwards;
}
#mzta-custom_text{
padding:10px;
width:50%;
@ -134,6 +154,16 @@ messagesInputStyle.textContent = `
background: #212121;
color: #ffffff;
}
#statusLogger.status-working{
border-color: #64B5F6;
background: #1A3A5C;
color: #90CAF9;
}
#statusLogger.status-done{
border-color: #81C784;
background: #1B3D1E;
color: #A5D6A7;
}
}
`;
messageInputTemplate.content.appendChild(messagesInputStyle);
@ -228,6 +258,7 @@ messageInputTemplate.content.appendChild(customDiv);
class MessageInput extends HTMLElement {
model = '';
_doneTimeout = null;
_customTextArray = [];
_currentCustomTextIndex = 0;
@ -285,7 +316,7 @@ class MessageInput extends HTMLElement {
this._messageInputField.value = '';
}
enableInput() {
enableInput(showDone = true) {
// console.log("[ThunderAI] enableInput");
this._messageInputField.value = '';
this._messageInputField.removeAttribute('disabled');
@ -294,21 +325,56 @@ class MessageInput extends HTMLElement {
this._stopButton.setAttribute('disabled', 'disabled');
this._stopButton.style.display = 'none';
this._stopButton.title = browser.i18n.getMessage("chagpt_api_send_button") + ": " + this.model;
if (showDone) {
this.showDoneStatus();
} else {
this.hideStatusMessage();
this.setStatusMessage('');
}
}
setStatusMessage(message) {
this._statusLoggerText.textContent = message;
}
showStatusMessage() {
showStatusMessage(state = 'working') {
if (this._doneTimeout) {
clearTimeout(this._doneTimeout);
this._doneTimeout = null;
}
this._setStatusClass('status-' + state);
this._statusLogger.style.display = 'flex';
}
hideStatusMessage() {
this._statusLogger.style.display = 'none';
this._statusLoggerImg.style.display = 'none';
this._setStatusClass(null);
}
_setStatusClass(className) {
this._statusLogger.classList.remove('status-working', 'status-done', 'status-fadeout');
if (className) {
this._statusLogger.classList.add(className);
}
}
showDoneStatus() {
if (this._doneTimeout) {
clearTimeout(this._doneTimeout);
}
this._statusLoggerImg.style.display = 'none';
this.setStatusMessage(browser.i18n.getMessage('apiwebchat_done'));
this._setStatusClass('status-done');
this._statusLogger.style.display = 'flex';
this._doneTimeout = setTimeout(() => {
this._statusLogger.classList.add('status-fadeout');
this._doneTimeout = setTimeout(() => {
this.hideStatusMessage();
this.setStatusMessage('');
}, 500);
}, 1500);
}
_handleKeyDown(event) {

View file

@ -171,7 +171,7 @@ taTranslationStore.saveTranslation()
| `js/mzta-summarystore.js` | Summary-specific storage wrapper (`taSummaryStore` class) with caching, truncation, and processing-state tracking |
| `js/mzta-translationstore.js` | Translation-specific storage wrapper (`taTranslationStore` class) with caching, truncation, and processing-state tracking |
| `js/mzta-working-status.js` | Visual status indicator during AI processing |
| `js/mzta-addatags-exclusion-list.js` | Tag exclusion list management |
| `js/mzta-addtags-exclusion-list.js` | Tag exclusion list management |
| `js/mzta-placeholders-autocomplete.js` | Autocomplete for placeholders in prompt editor |
## API Modules (`js/api/`)

View file

@ -43,6 +43,7 @@ Example in a prompt: `"Summarize this email: {%mail_text_body_or_selected%}"`
| `identity_signature` | Current identity signature | 0 |
| `additional_text[id]` | User input field (dynamic, shows input in popup) | 0 |
| `mail_header:name` | Any email header by name (dynamic) | 1 |
| `mail_full_headers` | All mail headers (key: value format, newline-separated) | 1 |
## Dynamic Placeholders

View file

@ -98,6 +98,7 @@ These are generated programmatically at the bottom of `mzta-options-default.js`
| `summarize_auto` | `1` | Auto-summarize mode: `0` = disabled, `1` = manual (show "click to generate" button), `2` = automatic (generate on message open), `3` = generate on email receive (background pre-cache via `onNewMailReceived`, no UI during generation) |
| `summarize_display_mode` | `'inline'` | Where to display summaries: `'inline'` = message pane banner, `'webchat'` = AI chat window. Note: `summarize_auto = 2` and `summarize_auto = 3` always use inline regardless of this setting. |
| `summarize_max_display_length` | `0` | Maximum characters shown in inline summary before truncation. `0` = no limit (show full text). When set, text is truncated at a word boundary and a "See more"/"See less" toggle link is shown. |
| `summarize_strip_formatting` | `false` | Strip HTML and Markdown formatting from AI-generated summaries, showing plain text only. |
| `translate` | `true` | Enable email translation |
| `translate_auto` | `0` | Auto-translate mode: `0` = disabled, `1` = manual (show button), `2` = automatic (translate on message open), `3` = generate on email receive (background pre-cache via `onNewMailReceived`, no UI during generation) |
| `translate_max_display_length` | `0` | Maximum characters shown in inline translation before truncation. `0` = no limit (show full text). When set, text is truncated at a word boundary and a "See more"/"See less" toggle link is shown. |
@ -117,7 +118,8 @@ The summarize settings page provides:
- `'webchat'` — opens the AI chat window
- Note: `summarize_auto = 2` always generates inline regardless of this setting. Context menu summarize with multiple messages always falls back to webchat.
4. **Max display length** (`summarize_max_display_length`) — number input, limits inline summary text to N characters. `0` = no limit. When truncated, a "See more"/"See less" toggle link is appended.
5. **Three editable prompts** (used by context menu summarize and webchat mode):
5. **Strip formatting** (`summarize_strip_formatting`) — checkbox, removes HTML/Markdown formatting from AI summary responses, displaying plain text only. Default: off.
6. **Three editable prompts** (used by context menu summarize and webchat mode):
- Summarize instruction prompt (`prompt_summarize`)
- Email template prompt (`prompt_summarize_email_template`)
- Email separator prompt (`prompt_summarize_email_separator`)

View file

@ -83,7 +83,7 @@ function _ensureContainer() {
const toolbar = document.createElement('div');
toolbar.id = 'mzta-toolbar';
toolbar.style.cssText = `display: none; align-items: center; gap: 8px; padding: 6px 0.5rem; background-color: ${colors.toolbar.bg}; border-bottom: 1px solid ${colors.toolbar.border}; font-size: 13px; color: ${colors.toolbar.text};`;
toolbar.style.cssText = `display: none; align-items: flex-start; gap: 8px; padding: 4px 0.2rem;; background-color: ${colors.toolbar.bg}; border-bottom: 1px solid ${colors.toolbar.border}; font-size: 13px; color: ${colors.toolbar.text};`;
container.appendChild(toolbar);
const panels = document.createElement('div');
@ -580,7 +580,7 @@ switch (message.command) {
case "getTags":
// console.log(">>>>>>>>>>>>>> getTags: " + JSON.stringify(message.tags));
// ===== These methods are also defined in the file /js/mzta-addatags-exclusion-list.js
// ===== These methods are also defined in the file /js/mzta-addtags-exclusion-list.js
async function addTags_getExclusionList() {
let prefs_excluded_tags = await browser.storage.local.get({add_tags_exclusions: []});
// console.log(">>>>>>>>>>>>>>> addTags_getExclusionList prefs_excluded_tags: " + JSON.stringify(prefs_excluded_tags));
@ -903,44 +903,44 @@ switch (message.command) {
const colors = _getThemeColors(data.spamValue, data.SpamThreshold);
const sc = colors.spam;
// Spam badge in toolbar (clickable to toggle explanation panel)
const explanationText = data.spamValue == -999
? data.explanation
: browser.i18n.getMessage("Explanation") + ": " + data.explanation;
// Single toolbar item: score + truncated explanation + chevron + branding + menu
// Outer wrapper: flex-direction column, but initially only topRow is visible (no height from brandingRow)
const badge = document.createElement('div');
badge.title = browser.i18n.getMessage("spam_badge_tooltip");
badge.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; border: 1px solid ${sc.border}; border-radius: 4px; padding: 2px 8px; font-size: 12px; font-weight: bold; display: inline-flex; align-items: center; gap: 4px; cursor: pointer; white-space: nowrap; transition: opacity 0.2s;`;
badge.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; border: 1px solid ${sc.border}; border-radius: 4px; padding: 4px 8px; font-size: 12px; font-weight: bold; display: inline-flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; box-sizing: border-box; align-self: stretch;`;
// Top row (always visible): score + text + chevron + branding + menu
const topRow = document.createElement('div');
topRow.style.cssText = 'display: flex; align-items: center; gap: 4px; width: 100%; min-width: 0;';
const scoreSpan = document.createElement('span');
scoreSpan.style.cssText = 'white-space: nowrap; flex-shrink: 0;';
if (data.spamValue == -999) {
badge.textContent = browser.i18n.getMessage("apiwebchat_error");
scoreSpan.textContent = browser.i18n.getMessage("apiwebchat_error");
} else {
badge.textContent = ((data.spamValue >= (data.SpamThreshold || 50)) ? "\u26A0\uFE0F " + browser.i18n.getMessage("Spam") : "\uD83D\uDEE1\uFE0F " + browser.i18n.getMessage("Valid")) + " [" + data.spamValue + "/100]";
scoreSpan.textContent = ((data.spamValue >= (data.SpamThreshold || 50)) ? "\u26A0\uFE0F " + browser.i18n.getMessage("Spam") : "\uD83D\uDEE1\uFE0F " + browser.i18n.getMessage("Valid")) + " [" + data.spamValue + "/100]";
}
topRow.appendChild(scoreSpan);
const badgeText = document.createElement('span');
badgeText.style.cssText = 'overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0; font-weight: normal;';
badgeText.textContent = explanationText;
topRow.appendChild(badgeText);
// Chevron: expands once, then disappears
const chevron = document.createElement('span');
chevron.textContent = ' \u25BC';
chevron.style.cssText = 'font-size: 10px; transition: transform 0.2s; transform: rotate(-90deg);';
badge.appendChild(chevron);
chevron.textContent = '\u25BC';
chevron.style.cssText = 'font-size: 10px; flex-shrink: 0; cursor: pointer;';
topRow.appendChild(chevron);
let spamExpanded = false;
badge.onclick = () => {
const panel = document.getElementById('mzta-spam-report-banner');
if (panel) {
spamExpanded = !spamExpanded;
panel.style.display = spamExpanded ? 'flex' : 'none';
chevron.style.transform = spamExpanded ? '' : 'rotate(-90deg)';
}
};
badge.onmouseover = () => { badge.style.opacity = '0.8'; };
badge.onmouseout = () => { badge.style.opacity = '1'; };
_addToolbarItem('mzta-toolbar-spam', badge);
// Explanation panel (collapsed by default)
const panel = document.createElement('div');
panel.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; border: 1px solid ${sc.border}; border-radius: 4px; padding: 8px 0.5rem; font-size: 13px; display: none; align-items: center; gap: 15px; width: 100%; box-sizing: border-box;`;
const reasonText = document.createElement('span');
if (data.spamValue == -999) {
reasonText.textContent = data.explanation;
} else {
reasonText.textContent = browser.i18n.getMessage("Explanation") + ": " + data.explanation;
}
const branding = document.createElement('span');
branding.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5; white-space: nowrap; flex-shrink: 0; font-weight: normal; display: none;';
branding.textContent = browser.i18n.getMessage("antispam_by") + " ThunderAI";
topRow.appendChild(branding);
const spamMenu = createThreeDotsMenu(colors.isDark, [
{
@ -963,19 +963,56 @@ switch (message.command) {
}
}
], { bg: sc.bg, border: sc.border, text: sc.text });
spamMenu.style.fontWeight = 'normal';
spamMenu.style.display = 'none';
topRow.appendChild(spamMenu);
const rightGroup = document.createElement('span');
rightGroup.style.cssText = 'margin-left: auto; display: flex; align-items: center; gap: 5px;';
const branding = document.createElement('span');
branding.textContent = browser.i18n.getMessage("antispam_by") + " ThunderAI";
branding.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5;';
rightGroup.appendChild(branding);
rightGroup.appendChild(spamMenu);
badge.appendChild(topRow);
panel.appendChild(reasonText);
panel.appendChild(rightGroup);
// Bottom row (only when expanded): branding right-aligned, hidden via zero height
const brandingRow = document.createElement('div');
brandingRow.style.cssText = 'display: flex; justify-content: flex-end; width: 100%; overflow: hidden; max-height: 0; opacity: 0; transition: max-height 0.3s ease, opacity 0.3s ease;';
const brandingExpanded = document.createElement('span');
brandingExpanded.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5; font-weight: normal;';
brandingExpanded.textContent = browser.i18n.getMessage("antispam_by") + " ThunderAI";
brandingRow.appendChild(brandingExpanded);
badge.appendChild(brandingRow);
chevron.onclick = (e) => {
e.stopPropagation();
_spamResizeObserver.disconnect();
badgeText.style.whiteSpace = 'normal';
badgeText.style.overflow = 'hidden';
badgeText.style.textOverflow = 'unset';
topRow.style.alignItems = 'flex-start';
spamMenu.style.display = '';
chevron.style.display = 'none';
brandingRow.style.maxHeight = '2em';
brandingRow.style.opacity = '1';
};
badge.onmouseover = () => { badge.style.opacity = '0.8'; };
badge.onmouseout = () => { badge.style.opacity = '1'; };
_addToolbarItem('mzta-toolbar-spam', badge);
const _updateSpamVisibility = () => {
if (badgeText.style.whiteSpace === 'normal') return; // already expanded, don't interfere
if (badgeText.scrollWidth > badgeText.clientWidth) {
chevron.style.display = 'inline';
branding.style.display = 'none';
spamMenu.style.display = 'none';
} else {
chevron.style.display = 'none';
branding.style.display = '';
spamMenu.style.display = '';
}
};
requestAnimationFrame(_updateSpamVisibility);
const _spamResizeObserver = new ResizeObserver(_updateSpamVisibility);
_spamResizeObserver.observe(badge);
_addPanel('mzta-spam-report-banner', panel);
return Promise.resolve(true);
}
@ -1019,7 +1056,6 @@ switch (message.command) {
const summaryRightGroup = document.createElement('span');
summaryRightGroup.style.cssText = 'display: flex; align-items: center; gap: 5px; float: right; margin-left: 10px;';
summaryRightGroup.appendChild(summaryBranding);
summaryRightGroup.appendChild(summaryMenu);
const summaryIcon = document.createElement('img');
@ -1032,7 +1068,7 @@ switch (message.command) {
const summaryText = document.createElement('div');
summaryText.className = 'thunderai-summary-content';
const hasHtml = !!summaryData.summary_html;
const hasHtml = !!summaryData.summary_html && !summaryData.stripFormatting;
function setSummaryHtml(element, html) {
element.textContent = '';
@ -1098,7 +1134,13 @@ switch (message.command) {
}
expanded = !expanded;
});
summaryTextWrapper.appendChild(toggleLink);
const toggleContainer = document.createElement('div');
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-top: 8px; justify-content: space-between;';
toggleContainer.appendChild(toggleLink);
toggleContainer.appendChild(summaryBranding);
summaryBranding.style.marginRight = '0px';
summaryBranding.style.marginBottom = '0px';
summaryTextWrapper.appendChild(toggleContainer);
} else {
const collapsedMaxHeight = '4.2em';
summaryText.style.maxHeight = collapsedMaxHeight;
@ -1123,13 +1165,30 @@ switch (message.command) {
requestAnimationFrame(() => {
if (summaryText.scrollHeight > summaryText.clientHeight) {
summaryTextWrapper.appendChild(toggleLink);
const toggleContainer = document.createElement('div');
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: -6px; justify-content: space-between;';
toggleContainer.appendChild(toggleLink);
toggleContainer.appendChild(summaryBranding);
summaryBranding.style.marginRight = '-4px';
summaryBranding.style.marginBottom = '-6px';
summaryTextWrapper.appendChild(toggleContainer);
} else {
summaryText.style.maxHeight = '';
summaryText.style.overflow = '';
// No toggle, branding goes directly after text
const brandingContainer = document.createElement('div');
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
brandingContainer.appendChild(summaryBranding);
summaryTextWrapper.appendChild(brandingContainer);
}
});
}
} else {
// No truncation, branding goes directly after text
const brandingContainer = document.createElement('div');
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
brandingContainer.appendChild(summaryBranding);
summaryTextWrapper.appendChild(brandingContainer);
}
const summaryBody = document.createElement('div');
@ -1256,7 +1315,6 @@ switch (message.command) {
translationHeader.appendChild(translationIcon);
translationHeader.appendChild(translationTitleSpan);
translationHeader.appendChild(translationBranding);
translationHeader.appendChild(translationMenu);
translationContainer.appendChild(translationHeader);
@ -1321,10 +1379,21 @@ switch (message.command) {
requestAnimationFrame(() => {
if (translationText.scrollHeight > translationText.clientHeight) {
translationTextWrapper.appendChild(toggleLink);
const toggleContainer = document.createElement('div');
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: -6px; justify-content: space-between;';
toggleContainer.appendChild(toggleLink);
toggleContainer.appendChild(translationBranding);
translationBranding.style.marginRight = '-4px';
translationBranding.style.marginBottom = '-6px';
translationTextWrapper.appendChild(toggleContainer);
} else {
translationText.style.maxHeight = '';
translationText.style.overflow = '';
// No toggle, branding goes directly after text
const brandingContainer = document.createElement('div');
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
brandingContainer.appendChild(translationBranding);
translationTextWrapper.appendChild(brandingContainer);
}
});
} else {
@ -1360,8 +1429,20 @@ switch (message.command) {
}
expanded = !expanded;
});
translationTextWrapper.appendChild(toggleLink);
const toggleContainer = document.createElement('div');
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: -6px; justify-content: space-between;';
toggleContainer.appendChild(toggleLink);
toggleContainer.appendChild(translationBranding);
translationBranding.style.marginRight = '-4px';
translationBranding.style.marginBottom = '-6px';
translationTextWrapper.appendChild(toggleContainer);
}
} else {
// No truncation, branding goes directly after text
const brandingContainer = document.createElement('div');
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
brandingContainer.appendChild(translationBranding);
translationTextWrapper.appendChild(brandingContainer);
}
translationContainer.appendChild(translationTextWrapper);

View file

@ -31,6 +31,7 @@ import {
getMailSubject,
getTagsList,
extractJsonObject,
normalizeDateTimeString,
convertNewlinesToBr,
cleanupNewlines,
checkIfTagLabelExists,
@ -333,6 +334,13 @@ export class mzta_Menus {
taWorkingStatus.stopWorking();
return {ok:'0'};
}
// Normalize date strings returned by the LLM
if (calendar_event_data_obj.startDate) {
calendar_event_data_obj.startDate = normalizeDateTimeString(calendar_event_data_obj.startDate);
}
if (calendar_event_data_obj.endDate) {
calendar_event_data_obj.endDate = normalizeDateTimeString(calendar_event_data_obj.endDate);
}
// Timezone management
calendar_event_data_obj.use_timezone = false;
if(prefs_at.calendar_enforce_timezone){
@ -405,10 +413,17 @@ export class mzta_Menus {
let task_data_obj = {};
try{
task_data_obj = extractJsonObject(task_data);
if (!task_data_obj.dueDate || isNaN(Date.parse(task_data_obj.dueDate)) || task_data_obj.dueDate == '' ) {
// Normalize date strings returned by the LLM
if (task_data_obj.dueDate) {
task_data_obj.dueDate = normalizeDateTimeString(task_data_obj.dueDate);
}
if (task_data_obj.InitialDate) {
task_data_obj.InitialDate = normalizeDateTimeString(task_data_obj.InitialDate);
}
if (!task_data_obj.dueDate) {
delete task_data_obj.dueDate;
}
if (!task_data_obj.InitialDate || isNaN(Date.parse(task_data_obj.InitialDate)) || task_data_obj.InitialDate == '' ) {
if (!task_data_obj.InitialDate) {
delete task_data_obj.InitialDate;
}
}catch(err){

View file

@ -127,6 +127,15 @@ const defaultPlaceholders = [
is_dynamic: "1",
enabled: 1,
},
{
id: 'mail_full_headers',
name: "__MSG_placeholder_mail_full_headers__",
default_value: "",
type: 1,
is_default: "1",
is_dynamic: "0",
enabled: 1,
},
{
id: 'selected_text',
name: "__MSG_placeholder_selected_text__",
@ -568,6 +577,9 @@ export const placeholdersUtils = {
case 'mail_headers':
finalSubs['mail_headers:' + currPH.custom_value] = placeholdersUtils.failSafePlaceholders(sanitizeMailHeaders(await getMailHeader(curr_message, currPH.custom_value)));
break;
case 'mail_full_headers':
finalSubs['mail_full_headers'] = placeholdersUtils.failSafePlaceholders(sanitizeMailHeaders(await getMailHeader(curr_message)));
break;
case 'selected_text':
finalSubs['selected_text'] = placeholdersUtils.failSafePlaceholders(selection_text);
break;

View file

@ -24,7 +24,6 @@ import {
import { customMenuIconsPath } from '../pages/menu_order/mzta-custom-menu-icons.js'
const sparks_min = '1.2.0'; // Minimum version of ThunderAI-Sparks required for the add-on to work
export const ChatGPTWeb_models = ['gpt-5','gpt-5-instant','gpt-5-t-mini','gpt-5-thinking']; // List of models available in ChatGPT Web
const MICZ_IT_LOCALIZED_LANGS = ['es', 'de', 'fr', 'it'];
export const getMenuContextCompose = () => 'compose_action_menu';
@ -192,38 +191,52 @@ export async function getMailSubject(tab){
}
function extractTextParts(fullMessage) {
const textParts = [];
const textParts = []
function walkParts(parts) {
for (const part of parts) {
if (part.parts && part.parts.length > 0) {
// Recursively walk through sub-parts
walkParts(part.parts);
} else {
// Check if contentType starts with "text/"
if (part.contentType && part.contentType.startsWith("text/")) {
textParts.push(part);
walkParts(part.parts)
}
// console.log(">>>>>>>>>>>> extractTextParts: part.contentType: " + part.contentType + ", part.decryptionStatus: " + part.decryptionStatus + ", part.body: " + part.body);
if (part.contentType && part.contentType.startsWith('text/')) {
textParts.push(part)
}
}
}
}
if (fullMessage.parts && fullMessage.parts.length > 0) {
walkParts(fullMessage.parts);
walkParts(fullMessage.parts)
}
return textParts;
return textParts
}
export function getMailBody(fullMessage){
function smartDecode(buf) {
try {
return new TextDecoder('utf-8', { fatal: true }).decode(buf);
} catch (e) {
return new TextDecoder('windows-1252').decode(buf);
}
}
export async function getMailBody(fullMessage, messageId) {
const textParts = extractTextParts(fullMessage);
let text = "";
let html = "";
// console.log(">>>>>>>>>>>>>> getMailBody: textParts: " + JSON.stringify(textParts));
// console.log(">>>>>>>>>>>>>> getMailBody: fullMessage: " + JSON.stringify(fullMessage));
for (const part of textParts) {
let body = part.body;
if ((body === undefined || body === "") && messageId && part.partName) {
const file = await browser.messages.getAttachmentFile(messageId, part.partName);
const buf = await file.arrayBuffer();
//const buf = new TextDecoder('utf-8').decode(buf);
body = smartDecode(buf);
}
if (part.contentType === "text/plain") {
text += part.body;
// console.log(">>>>>>>>>>>>>> getMailBody: part.body (TEXT): " + body);
text += body ?? "";
} else if (part.contentType === "text/html") {
html += part.body;
// console.log(">>>>>>>>>>>>>> getMailBody: part.body (HTML): " + (body ? body.substring(0, 80) : body));
html += body ?? "";
}
}
if(html === "") {
@ -261,14 +274,22 @@ export async function replaceBody(tabId, replyHtml) {
await messenger.compose.setComposeDetails(tabId, {body: fullBody});
}
export async function getMailHeader(curr_message, mail_header_id) {
export async function getMailHeader(curr_message, mail_header_id = false) {
let mail_header_value = "";
let full_message = await browser.messages.getFull(curr_message.id);
// console.log(">>>>>>>>>>>> getMailHeader full_message: " + JSON.stringify(full_message));
if(full_message.hasOwnProperty("headers") && Object.keys(full_message.headers).some(header => header.toLowerCase() === mail_header_id.toLowerCase())){
if(full_message.hasOwnProperty("headers")) {
if(mail_header_id) {
if(Object.keys(full_message.headers).some(header => header.toLowerCase() === mail_header_id.toLowerCase())){
const raw_value = full_message.headers[Object.keys(full_message.headers).find(header => header.toLowerCase() === mail_header_id.toLowerCase())];
mail_header_value = Array.isArray(raw_value) ? raw_value.join(", ") : raw_value;
}
} else {
mail_header_value = Object.entries(full_message.headers)
.map(([key, value]) => key + ": " + (Array.isArray(value) ? value.join(", ") : value))
.join("\n");
}
}
// console.log(">>>>>>>>>>>> getMailHeader mail_header_value: " + mail_header_value)
return mail_header_value;
}
@ -384,46 +405,6 @@ export function getGPTWebModelString(model) {
}
}
export function getChatGPTWebModelsList_HTML(values, targetRowId) {
const rowElement = document.getElementById(targetRowId);
if (!rowElement) return;
// Clears any existing td elements
rowElement.innerHTML = '';
// First TD: label
const labelTd = document.createElement('td');
const label = document.createElement('i');
label.className = 'small_info';
const labelNobr = document.createElement('nobr');
labelNobr.textContent = browser.i18n.getMessage("AllowedValues") + ":";
label.appendChild(labelNobr);
labelTd.appendChild(label);
// Second TD: values
const valuesTd = document.createElement('td');
const valuesContainer = document.createElement('i');
valuesContainer.className = 'small_info';
values.forEach(value => {
const nbspBefore = document.createTextNode(' \u00A0 '); // " &nbsp; "
const valueNobr = document.createElement('nobr');
valueNobr.className = 'conntype_chatgpt_web_option';
valueNobr.textContent = value;
const nbspAfter = document.createTextNode(' \u00A0 ');
valuesContainer.appendChild(nbspBefore);
valuesContainer.appendChild(valueNobr);
valuesContainer.appendChild(nbspAfter);
});
valuesTd.appendChild(valuesContainer);
// Adds the td elements to the row
rowElement.appendChild(labelTd);
rowElement.appendChild(valuesTd);
}
export function openTab(url){
// check if the tab is already there
browser.tabs.query({url: browser.runtime.getURL(url)}).then((tabs) => {
@ -741,6 +722,16 @@ export function extractJsonObject(inputString) {
}
}
export function normalizeDateTimeString(str) {
if (!str || typeof str !== 'string') return null;
str = str.trim();
// Accept any non-digit separator (or none) between date/time components
const match = str.match(/^(\d{4})\D?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})\D?(\d{2})(Z?)$/);
if (!match) return null;
const [, y, mo, d, h, mi, s, z] = match;
return `${y}${mo}${d}T${h}${mi}${s}${z}`;
}
export function isAPIKeyValue(id){
return id.endsWith('_api_key');
}

View file

@ -2,7 +2,7 @@
"manifest_version": 2,
"name": "ThunderAI",
"description": "__MSG_extensionDescription__",
"version": "4.1.0pre1",
"version": "4.1.0pre3",
"author": "Mic (m@micz.it)",
"homepage_url": "https://micz.it/thunderbird-addon-thunderai/",
"browser_specific_settings": {
@ -34,6 +34,7 @@
"messagesTagsList"
],
"optional_permissions": [
"addressBooks",
"clipboardRead",
"messagesTags",
"messagesUpdate",

View file

@ -63,7 +63,7 @@ import { taWorkingStatus } from './js/mzta-working-status.js';
import {
addTags_getExclusionList,
checkExcludedTag
} from './js/mzta-addatags-exclusion-list.js';
} from './js/mzta-addtags-exclusion-list.js';
browser.runtime.onInstalled.addListener(({ reason, previousVersion }) => {
// console.log(">>>>>>>>>>> onInstalled: " + JSON.stringify(reason) + ", previousVersion: " + previousVersion);
@ -242,7 +242,7 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
async function _initSummary() {
try {
let tabId = sender.tab.id;
let prefs = await browser.storage.sync.get({ summarize: prefs_default.summarize, summarize_auto: prefs_default.summarize_auto, summarize_display_mode: prefs_default.summarize_display_mode, summarize_max_display_length: prefs_default.summarize_max_display_length });
let prefs = await browser.storage.sync.get({ summarize: prefs_default.summarize, summarize_auto: prefs_default.summarize_auto, summarize_display_mode: prefs_default.summarize_display_mode, summarize_max_display_length: prefs_default.summarize_max_display_length, summarize_strip_formatting: prefs_default.summarize_strip_formatting });
if (!prefs.summarize) return;
@ -252,7 +252,7 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
// Always show cached summary if available, regardless of summarize_auto
let cachedSummary = await summaryStore.loadSummary(message.headerMessageId);
if (cachedSummary && !cachedSummary.error) {
browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length } });
browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length, stripFormatting: prefs.summarize_strip_formatting } });
return;
}
@ -331,12 +331,13 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
};
await summaryStore.saveSummary(summaryData, msg.headerMessageId);
let prefs_summary = await browser.storage.sync.get({
summarize_max_display_length: prefs_default.summarize_max_display_length
summarize_max_display_length: prefs_default.summarize_max_display_length,
summarize_strip_formatting: prefs_default.summarize_strip_formatting
});
try {
browser.tabs.sendMessage(msg.tabId, {
command: "showSummary",
data: { ...summaryData, maxDisplayLength: prefs_summary.summarize_max_display_length }
data: { ...summaryData, maxDisplayLength: prefs_summary.summarize_max_display_length, stripFormatting: prefs_summary.summarize_strip_formatting }
});
} catch (e) {
taLog.error("Error sending showSummary to tab: " + e);
@ -623,12 +624,13 @@ async function _generateSummaryForMessage(headerMessageId, tabId = null, options
do_debug: prefs_default.do_debug,
default_chatgpt_lang: prefs_default.default_chatgpt_lang,
summarize_max_display_length: prefs_default.summarize_max_display_length,
summarize_strip_formatting: prefs_default.summarize_strip_formatting,
...getDynamicSettingsDefaults(['use_specific_integration', 'connection_type'])
});
let cachedSummary = await summaryStore.loadSummary(headerMessageId);
if (cachedSummary && !cachedSummary.error) {
if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length } });
if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...cachedSummary, maxDisplayLength: prefs.summarize_max_display_length, stripFormatting: prefs.summarize_strip_formatting } });
return;
}
@ -689,7 +691,7 @@ async function _generateSummaryForMessage(headerMessageId, tabId = null, options
headerMessageId: headerMessageId
};
await summaryStore.saveSummary(summaryData, headerMessageId);
if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...summaryData, maxDisplayLength: prefs.summarize_max_display_length } });
if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { ...summaryData, maxDisplayLength: prefs.summarize_max_display_length, stripFormatting: prefs.summarize_strip_formatting } });
taWorkingStatus.stopWorking();
} catch (error) {
@ -834,13 +836,74 @@ async function _generateSpamReportForMessage(headerMessageId, options = {}) {
}
message = messageResult.messages[0];
curr_fullMessage = await browser.messages.getFull(message.id);
msg_text = getMailBody(curr_fullMessage);
msg_text = await getMailBody(curr_fullMessage);
body_text = htmlBodyToPlainText(msg_text.html);
if (body_text.length == 0) {
body_text = msg_text.text.replace(/\s+/g, ' ').trim();
}
}
// Extract sender email for skip checks
let senderEmail = (message.author.match(/[\w.-]+@[\w.-]+\.\w+/) || [''])[0].toLowerCase();
// Check if sender is in the skip addresses list
let skip_addresses = options.skip_addresses || (await browser.storage.sync.get({spamfilter_skip_addresses: prefs_default.spamfilter_skip_addresses})).spamfilter_skip_addresses;
if (skip_addresses.length > 0) {
if (senderEmail && skip_addresses.includes(senderEmail)) {
taLog.log("Sender " + senderEmail + " is in the skip addresses list, skipping spam filter.");
let report_data = {};
report_data.report_date = new Date();
report_data.headerMessageId = headerMessageId;
report_data.spamValue = 0;
report_data.explanation = browser.i18n.getMessage('spamfilter_skip_addresses_explanation');
report_data.subject = curr_fullMessage.headers.subject;
report_data.from = curr_fullMessage.headers.from;
report_data.message_date = new Date(message.date);
report_data.moved = false;
report_data.SpamThreshold = prefs.spamfilter_threshold || prefs_init.spamfilter_threshold;
spamReport.saveReportData(report_data, headerMessageId);
await updateSpamPanel(headerMessageId, "showSpamReport", report_data);
return { success: true };
}
}
// Check if sender is in any address book
let skip_addressbook = options.skip_addressbook !== undefined
? options.skip_addressbook
: (await browser.storage.sync.get({spamfilter_skip_addressbook: prefs_default.spamfilter_skip_addressbook})).spamfilter_skip_addressbook;
if (skip_addressbook && senderEmail) {
try {
let hasPermission = await browser.permissions.contains({ permissions: ["addressBooks"] });
if (hasPermission) {
let matchingContacts = await browser.contacts.quickSearch({ searchString: senderEmail });
let isInAddressBook = matchingContacts.some(contact => {
let props = contact.properties;
return (props.PrimaryEmail && props.PrimaryEmail.toLowerCase() === senderEmail) ||
(props.SecondEmail && props.SecondEmail.toLowerCase() === senderEmail);
});
if (isInAddressBook) {
taLog.log("Sender " + senderEmail + " is in the address book, skipping spam filter.");
let report_data = {};
report_data.report_date = new Date();
report_data.headerMessageId = headerMessageId;
report_data.spamValue = 0;
report_data.explanation = browser.i18n.getMessage('spamfilter_skip_addressbook_explanation');
report_data.subject = curr_fullMessage.headers.subject;
report_data.from = curr_fullMessage.headers.from;
report_data.message_date = new Date(message.date);
report_data.moved = false;
report_data.SpamThreshold = prefs.spamfilter_threshold || prefs_init.spamfilter_threshold;
spamReport.saveReportData(report_data, headerMessageId);
await updateSpamPanel(headerMessageId, "showSpamReport", report_data);
return { success: true };
}
}
} catch (err) {
taLog.error("Error checking address book for sender: " + err);
// Fail open — continue with normal spam check
}
}
let curr_prompt_spamfilter = await getSpamFilterPrompt();
let chatgpt_lang = await taPromptUtils.getDefaultLang(curr_prompt_spamfilter);
let specialFullPrompt_spamfilter = await taPromptUtils.preparePrompt({
@ -1639,7 +1702,8 @@ const newEmailListener = (folder, messagesList) => {
addTagsAuto: add_tags_auto_enabled,
spamFilter: prefs_init.spamfilter,
summarizeOnReceive: prefs_init.summarize && prefs_init.summarize_auto === 3,
translateOnReceive: prefs_init.translate && prefs_init.translate_auto === 3
translateOnReceive: prefs_init.translate && prefs_init.translate_auto === 3,
isAutoMode: true,
});
if(prefs_init.spamfilter){
@ -1675,7 +1739,8 @@ async function processEmails(args) {
summarize = false,
summarizeOnReceive = false,
translateOnReceive = false,
translate = false
translate = false,
isAutoMode = false,
} = args;
taWorkingStatus.startWorking();
@ -1695,10 +1760,15 @@ async function processEmails(args) {
add_tags_auto_uselist: prefs_default.add_tags_auto_uselist,
add_tags_auto_uselist_list: prefs_default.add_tags_auto_uselist_list,
spamfilter_enabled_accounts: prefs_default.spamfilter_enabled_accounts,
spamfilter_skip_addresses: prefs_default.spamfilter_skip_addresses,
spamfilter_skip_addressbook: prefs_default.spamfilter_skip_addressbook,
...getDynamicSettingsDefaults(['use_specific_integration', 'connection_type']),
do_debug: prefs_default.do_debug,
});
// console.log(">>>>>>>>>>>>>>>> prefs_aats: " + JSON.stringify(prefs_aats));
let spamfilter_skip_addresses = prefs_aats.spamfilter_skip_addresses;
let spamfilter_skip_addressbook = prefs_aats.spamfilter_skip_addressbook;
for await (let message of messages) {
let curr_fullMessage = null;
let msg_text = null;
@ -1706,7 +1776,7 @@ async function processEmails(args) {
if (addTagsAuto || spamFilter) {
curr_fullMessage = await browser.messages.getFull(message.id);
msg_text = getMailBody(curr_fullMessage);
msg_text = await getMailBody(curr_fullMessage);
taLog.log("Starting from the HTML body if present and converting to plain text...");
body_text = htmlBodyToPlainText(msg_text.html);
if( body_text.length == 0 ){
@ -1716,13 +1786,15 @@ async function processEmails(args) {
}
if (addTagsAuto) {
if(prefs_aats.add_tags_enabled_accounts.length > 0){
let skipAddTags = false;
if(isAutoMode && prefs_aats.add_tags_enabled_accounts.length > 0){
let accountId = message.folder.accountId;
if(!prefs_aats.add_tags_enabled_accounts.includes(accountId)){
taLog.log("Account " + accountId + " not enabled for add_tags, skipping...");
continue;
skipAddTags = true;
}
}
if (!skipAddTags) {
let specialFullPrompt_add_tags = '';
let curr_prompt_add_tags = menus.allPrompts.find(p => p.id === 'prompt_add_tags');
let tags_full_list = await getTagsList();
@ -1759,24 +1831,28 @@ async function processEmails(args) {
let _data = { messageId: message.id, tags: tags_current_email };
_assign_tags(_data, !prefs_aats.add_tags_auto_force_existing, prefs_aats.add_tags_exclusions_exact_match);
}
}
if (spamFilter) {
if(prefs_aats.spamfilter_enabled_accounts.length > 0){
let skipSpamFilter = false;
if(isAutoMode && prefs_aats.spamfilter_enabled_accounts.length > 0){
let accountId = message.folder.accountId;
if(!prefs_aats.spamfilter_enabled_accounts.includes(accountId)){
taLog.log("Account " + accountId + " not enabled for spamfilter, skipping...");
continue;
skipSpamFilter = true;
}
}
let result = await _generateSpamReportForMessage(
if (!skipSpamFilter) {
await _generateSpamReportForMessage(
message.headerMessageId,
{
messageData: { message, fullMessage: curr_fullMessage, body_text, msg_text },
prefs: prefs_aats,
autoMove: true
autoMove: true,
skip_addresses: spamfilter_skip_addresses,
skip_addressbook: spamfilter_skip_addressbook
});
if (!result.success) continue;
}
}
if (summarizeOnReceive) {

View file

@ -137,10 +137,13 @@ export const prefs_default = {
spamfilter: false,
spamfilter_threshold: 70,
spamfilter_enabled_accounts: [],
spamfilter_skip_addresses: [],
spamfilter_skip_addressbook: false,
summarize: false,
summarize_auto: 1, // 0: disabled, 1: manual button, 2: automatic on message open, 3: generate on email receive
summarize_display_mode: 'inline', // 'inline' or 'webchat'
summarize_max_display_length: 0, // 0 = no limit, otherwise max chars shown inline
summarize_strip_formatting: false, // strip HTML/markdown formatting from AI summary
translate: true,
translate_auto: 0, // 0: disabled, 1: manual button, 2: automatic on message open, 3: generate on email receive
translate_max_display_length: 0, // 0 = no limit, otherwise max chars shown inline

View file

@ -39,10 +39,6 @@ table#miczPrefs td.nt{
border-top: none;
}
tr#chatgpt_web_models_list td{
border: none;
}
div#miczRelNotes{
position:absolute;
right: 0px;
@ -104,7 +100,8 @@ div#miczTranslate{
display: none;
font-size: 0.75em;
margin-left: 0.5em;
padding: 0.15em 0.5em;
margin-top: 3px;
padding: 0.35em 0.5em;
border-radius: 0.8em;
}

View file

@ -172,7 +172,7 @@
<tr class="add_tags_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_add_tags__</span>
<br><button id="btnManageTagsInfo" class="btn_small">__MSG_prefs_OptionText_btnManageTagsInfo__</button>
<span class="specific_api_indicator" id="add_tags_specific_api_indicator"></span></td>
<br><span class="specific_api_indicator" id="add_tags_specific_api_indicator"></span></td>
<td>
<label>
<input type="checkbox" id="add_tags" name="add_tags" class="option-input" />
@ -184,7 +184,7 @@
<tr class="spamfilter_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_spamfilter__</span>
<br><button id="btnManageSpamFilterInfo" class="btn_small">__MSG_prefs_OptionText_btnManageSpamFilterInfo__</button>
<span class="specific_api_indicator" id="spamfilter_specific_api_indicator"></span></td>
<br><span class="specific_api_indicator" id="spamfilter_specific_api_indicator"></span></td>
<td>
<label>
<input type="checkbox" id="spamfilter" name="spamfilter" class="option-input" />
@ -196,7 +196,7 @@
<tr class="summarize_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_summarize__</span>
<br><button id="btnManageSummarizeInfo" class="btn_small">__MSG_prefs_OptionText_btnManageSummarizeInfo__</button>
<span class="specific_api_indicator" id="summarize_specific_api_indicator"></span></td>
<br><span class="specific_api_indicator" id="summarize_specific_api_indicator"></span></td>
<td>
<label>
<input type="checkbox" id="summarize" name="summarize" class="option-input" />
@ -208,7 +208,7 @@
<tr class="translate_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_translate__</span>
<br><button id="btnManageTranslateInfo" class="btn_small">__MSG_prefs_OptionText_btnManageTranslateInfo__</button>
<span class="specific_api_indicator" id="translate_specific_api_indicator"></span></td>
<br><span class="specific_api_indicator" id="translate_specific_api_indicator"></span></td>
<td>
<label>
<input type="checkbox" id="translate" name="translate" class="option-input" />
@ -220,7 +220,7 @@
<tr class="get_calendar_event_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_get_calendar_event__</span>
<br><button id="btnManageCalendarEventInfo" class="btn_small">__MSG_prefs_OptionText_btnManageCalendarEventInfo__</button>
<span class="specific_api_indicator" id="get_calendar_event_specific_api_indicator"></span></td>
<br><span class="specific_api_indicator" id="get_calendar_event_specific_api_indicator"></span></td>
<td>
<label>
<input type="checkbox" id="get_calendar_event" name="get_calendar_event" class="option-input" />
@ -231,7 +231,7 @@
<tr class="get_task_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_get_task__</span>
<br><button id="btnManageTaskInfo" class="btn_small">__MSG_prefs_OptionText_btnManageTaskInfo__</button>
<span class="specific_api_indicator" id="get_task_specific_api_indicator"></span></td>
<br><span class="specific_api_indicator" id="get_task_specific_api_indicator"></span></td>
<td>
<label>
<input type="checkbox" id="get_task" name="get_task" class="option-input" />

View file

@ -24,10 +24,8 @@ import {
} from './mzta-options-default.js';
import { taLogger } from '../js/mzta-logger.js';
import {
ChatGPTWeb_models,
checkSparksPresence,
openTab,
getChatGPTWebModelsList_HTML,
isAPIKeyValue,
getConnectionType,
setTomSelectBorder,
@ -440,7 +438,6 @@ document.addEventListener('DOMContentLoaded', async () => {
openTab('/pages/get-task/mzta-get-task.html');
});
getChatGPTWebModelsList_HTML(ChatGPTWeb_models, 'chatgpt_web_models_list');
document.querySelectorAll(".conntype_chatgpt_web_option").forEach(element => {
element.addEventListener("click", () => {
let el = document.getElementById("chatgpt_web_model");

View file

@ -11,6 +11,17 @@
<ul>
<li>Antispam information are now permanently saved for each message [<a href="https://github.com/micz/ThunderAI/issues/675">#675</a>].</li>
<li><i>[All APIs]</i> A summary has been added above the mail content [<a href="https://github.com/micz/ThunderAI/issues/580">#580</a>].</li>
<li><i>[All APIs]</i> Added inline auto translation for emails [<a href="https://github.com/micz/ThunderAI/issues/247">#247</a>].</li>
<li>Now the popup menu closes immediatly and the working indicator is in the button icon [<a href="https://github.com/micz/ThunderAI/issues/247">#677</a>].</li>
<li><i>[Ollama API]</i> Added <i>format: json</i> option [<a href="https://github.com/micz/ThunderAI/issues/703">#703</a>].</li>
<li>Fix: The "Important Information" section in the options page now updates correctly when choosing an integration [<a href="https://github.com/micz/ThunderAI/issues/730">#730</a>].</li>
<li>In the options page now is visible if a special prompt is using a specific API integration [<a href="https://github.com/micz/ThunderAI/issues/676">#676</a>].</li>
<li>Added an antispam skip list to ensure messages from designated addresses are not forwarded to the AI [<a href="https://github.com/micz/ThunderAI/issues/743">#743</a>].</li>
<li>Fix: Correctly setting the end date for a new calendar event [<a href="https://github.com/micz/ThunderAI/issues/750">#750</a>].</li>
<li>Now it's possibile to use different date and time formats in the AI output when creating a calendar event [<a href="https://github.com/micz/ThunderAI/issues/737">#737</a>].</li>
<li>Added the <i>{%mail_full_headers%}</i> placeholder to retrieve all the email headers at once [<a href="https://github.com/micz/ThunderAI/issues/713">#713</a>].</li>
<li><i>[All APIs]</i> In the API webchat the status messages have different colors [<a href="https://github.com/micz/ThunderAI/issues/3">#3</a>].</li>
<li>Account exclusion lists for add tags and antispam are enforced only for automatic analysis of incoming emails and not for the context menu action that is always executed [<a href="https://github.com/micz/ThunderAI/issues/749">#749</a>].</li>
<li><i>[All APIs]</i> Inline auto translation for emails added [<a href="https://github.com/micz/ThunderAI/issues/247">#247</a>].</li>
<li>Custom menus configuration added. Now it's possibile to define which prompts show in the ThunderAI menu, which ones in the context menu and in which order [<a href="https://github.com/micz/ThunderAI/issues/49">#49</a>, <a href="https://github.com/micz/ThunderAI/issues/184">#184</a>, <a href="https://github.com/micz/ThunderAI/issues/680">#680</a>].</li>
<li>...</li>

View file

@ -104,7 +104,6 @@ export async function injectConnectionUI({
<tr class="conntype_chatgpt_web${tr_class ? ` ${tr_class}` : ''}">
<td><label>
<span class="opt_title">__MSG_prefs_OptionText_chatgpt_web_model__</span>
<br><table title="__MSG_prefs_OptionText_chatgpt_web_model_tooltip__"><tr id="chatgpt_web_models_list"></tr></table>
</label></td>
<td>
<label>

View file

@ -30,7 +30,7 @@ import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js
import {
addTags_getExclusionList,
addTags_setExclusionList
} from "../../js/mzta-addatags-exclusion-list.js";
} from "../../js/mzta-addtags-exclusion-list.js";
import {
getAccountsList,
normalizeStringList,

View file

@ -238,19 +238,6 @@ label, .id_show, .text_show, .name_show, .type_show, .action_show{
display:none;
}
.chatgpt_web_models_list_table{
background-color: rgb(255, 209, 183);
border:0;
}
.chatgpt_web_models_list_table *{
border:0;
}
.chatgpt_web_models_list_table td{
padding:2px;
}
#chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_toggle{
cursor: pointer;
}
@ -353,7 +340,7 @@ label:has(input[type="checkbox"]) {
background-color: #4c4e58;
}
#chatgpt_web_additional_info, #chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info, .chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_show, .chatgpt_web_models_list_table{
#chatgpt_web_additional_info, #chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info, .chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_show{
background-color: rgb(39, 11, 0);
color: rgb(182, 182, 182);
}

View file

@ -233,19 +233,6 @@ label, .id_show, .text_show, .name_show, .type_show, .action_show{
display:none;
}
.chatgpt_web_models_list_table{
background-color: rgb(255, 209, 183);
border:0;
}
.chatgpt_web_models_list_table *{
border:0;
}
.chatgpt_web_models_list_table td{
padding:2px;
}
#chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_toggle{
cursor: pointer;
}
@ -388,7 +375,7 @@ dialog.export{
background-color: #4c4e58;
}
#chatgpt_web_additional_info, #chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info, .chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_show, .chatgpt_web_models_list_table{
#chatgpt_web_additional_info, #chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info, .chatgpt_web_additional_info_toggle, .chatgpt_web_additional_info_show{
background-color: rgb(39, 11, 0);
}

View file

@ -94,7 +94,6 @@
<label for="chatGPTWebModelNew" class="field_title">__MSG_prefs_OptionText_chatgpt_web_model__:</label>
<br>
<input type="text" id="chatGPTWebModelNew" name="chatGPTWebModelNew" class="input_new input_additional" tabindex="10">
<table class="chatgpt_web_models_list_table" title="__MSG_prefs_OptionText_chatgpt_web_model_tooltip__"><tr id="chatgpt_web_models_list"></tr></table>
<br><br>
<label for="chatGPTWebProjectNew" class="field_title">__MSG_prefs_OptionText_chatgpt_web_project__:</label>
<br>

View file

@ -33,11 +33,9 @@ import {
updateWarnings
} from "../../pages/_lib/connection-ui.js";
import {
ChatGPTWeb_models,
getLocalStorageUsedSpace,
sanitizeHtml,
validateCustomData_ChatGPTWeb,
getChatGPTWebModelsList_HTML,
openTab,
setTomSelectBorder
} from "../../js/mzta-utils.js";
@ -514,28 +512,6 @@ document.addEventListener('DOMContentLoaded', async () => {
toggleApiPropertiesShow(element.closest('tr'));
});
getChatGPTWebModelsList_HTML(ChatGPTWeb_models, 'chatgpt_web_models_list');
let formNewWebModelList = document.getElementById('chatgpt_web_models_list');
formNewWebModelList.querySelectorAll('.conntype_chatgpt_web_option').forEach(element => {
element.addEventListener("click", () => {
let el = document.getElementById("chatGPTWebModelNew");
el.value = element.textContent;
el.dispatchEvent(new Event('change'), { bubbles: true });
});
});
document.querySelectorAll('.id_output').forEach(element => {
getChatGPTWebModelsList_HTML(ChatGPTWeb_models, 'chatgpt_web_models_list_' + element.value);
let formWebModelList = document.getElementById('chatgpt_web_models_list_' + element.value);
formWebModelList.querySelectorAll('.conntype_chatgpt_web_option').forEach(element2 => {
element2.addEventListener("click", () => {
let el = document.getElementById("chatgpt_web_model_output_" + element.value);
el.value = element2.textContent;
el.dispatchEvent(new Event('change'), { bubbles: true });
});
});
});
}, { once: true });
document.getElementById('btnManageCustomDataPH').addEventListener('click', () => {
@ -1107,7 +1083,6 @@ function loadPromptsList(values){
<span class="field_title_us">__MSG_prefs_OptionText_chatgpt_web_model__:</span>
<br>
<input type="text" id="chatgpt_web_model_output_` + values.id + `" class="input_additional chatgpt_web_model_output" tabindex="10" value="` + values.chatgpt_web_model + `">
<table class="chatgpt_web_models_list_table" title="__MSG_prefs_OptionText_chatgpt_web_model_tooltip__"><tr id="chatgpt_web_models_list_` + values.id + `"></tr></table>
<br><br>
<span class="field_title_us">__MSG_prefs_OptionText_chatgpt_web_project__:</span>
<br>

View file

@ -131,6 +131,15 @@ label:has(input[type="checkbox"]) {
cursor: pointer;
}
#spamfilter_skip_addresses_container{
width: 90%;
margin: 40px auto;
}
#spamfilter_skip_addresses{
width: 30em;
}
@media (prefers-color-scheme: dark) {
body {
background-color: #1C1B22;

View file

@ -65,6 +65,14 @@
<button type="button" id="accounts_select_all">__MSG_SelectAll__</button>
<button type="button" id="accounts_deselect_all">__MSG_DeselectAll__</button>
</div>
<div id="spamfilter_skip_addresses_container">
<span class="section_title">__MSG_SpamFilter_skip_addresses_title__</span><span id="skip_addresses_unsaved" class="unsaved hidden"> __MSG_customPrompts_unsaved_changes__</span>
<br><span class="infoline">__MSG_SpamFilter_skip_addresses_infoline__
<br>__MSG_SpamFilter_skip_addresses_infoline2__</span>
<br><textarea id="spamfilter_skip_addresses" rows="7"></textarea>
<div class="btn_div"><button id="btn_save_skip_addresses" disabled>__MSG_save__</button></div>
<br><label><input type="checkbox" id="spamfilter_skip_addressbook" name="spamfilter_skip_addressbook" /> <span class="opt_title">__MSG_prefs_OptionText_spamfilter_skip_addressbook__</span><br>__MSG_prefs_OptionText_spamfilter_skip_addressbook_Info__</label>
</div>
<div id="spamfitler_reports_container">
<div><span class="section_title">__MSG_SpamReport_Title__</span></div>
<table id="report_data">

View file

@ -34,6 +34,7 @@ import { taSpamReport } from '../../js/mzta-spamreport.js';
import {
getAccountsList,
isAPIKeyValue,
normalizeStringList,
setTomSelectBorder
} from "../../js/mzta-utils.js";
import {
@ -130,6 +131,58 @@ document.addEventListener('DOMContentLoaded', async () => {
autocompleteSuggestions = (await getPlaceholders(true)).filter(p => !(p.id === 'additional_text')).map(mapPlaceholderToSuggestion);
textareaAutocomplete(spamfilter_textarea, autocompleteSuggestions, 1); // type_value = 1, only when reading an email
// Skip addresses list
let skip_addresses_textarea = document.getElementById('spamfilter_skip_addresses');
let skip_addresses_save_btn = document.getElementById('btn_save_skip_addresses');
let skip_addresses_value = await spamfilter_getSkipAddresses();
let skip_addresses_string = skip_addresses_value.join('\n');
skip_addresses_textarea.value = skip_addresses_string;
skip_addresses_textarea.addEventListener('input', (event) => {
skip_addresses_save_btn.disabled = (event.target.value === skip_addresses_string);
if(skip_addresses_save_btn.disabled){
document.getElementById('skip_addresses_unsaved').classList.add('hidden');
} else {
document.getElementById('skip_addresses_unsaved').classList.remove('hidden');
}
});
skip_addresses_save_btn.addEventListener('click', () => {
let skip_array_new = normalizeStringList(skip_addresses_textarea.value, 2);
spamfilter_setSkipAddresses(skip_array_new);
skip_addresses_save_btn.disabled = true;
skip_addresses_string = skip_array_new.join('\n');
skip_addresses_textarea.value = skip_addresses_string;
document.getElementById('skip_addresses_unsaved').classList.add('hidden');
});
// Address book skip option
let skip_addressbook_checkbox = document.getElementById('spamfilter_skip_addressbook');
let prefs_skip_ab = await browser.storage.sync.get({ spamfilter_skip_addressbook: prefs_default.spamfilter_skip_addressbook });
skip_addressbook_checkbox.checked = prefs_skip_ab.spamfilter_skip_addressbook;
skip_addressbook_checkbox.addEventListener('change', async (event) => {
if (event.target.checked) {
try {
const granted = await browser.permissions.request({ permissions: ["addressBooks"] });
if (granted) {
await browser.storage.sync.set({ spamfilter_skip_addressbook: true });
} else {
event.target.checked = false;
alert(browser.i18n.getMessage("addressbook_permission_denied"));
}
} catch (err) {
taLog.error("Error requesting addressBooks permission:", err);
event.target.checked = false;
alert(browser.i18n.getMessage("addressbook_permission_error"));
}
} else {
await browser.storage.sync.set({ spamfilter_skip_addressbook: false });
}
});
//Accounts manager
let accounts = await getAccountsList();
const accountsContainer = document.getElementById('account_selector_checkboxes');
@ -374,3 +427,12 @@ async function restoreOptions() {
setCurrentChoice(getting);
}
async function spamfilter_getSkipAddresses() {
let prefs = await browser.storage.sync.get({spamfilter_skip_addresses: []});
return prefs.spamfilter_skip_addresses;
}
function spamfilter_setSkipAddresses(spamfilter_skip_addresses) {
browser.storage.sync.set({spamfilter_skip_addresses: spamfilter_skip_addresses});
}

View file

@ -61,6 +61,15 @@
</label>
</td>
</tr>
<tr class="summarize_tr">
<td><span class="opt_title">__MSG_prefs_OptionText_summarize_strip_formatting__</span></td>
<td>
<label>
<input type="checkbox" id="summarize_strip_formatting" name="summarize_strip_formatting" class="option-input" />
__MSG_prefs_OptionText_summarize_strip_formatting_Info__
</label>
</td>
</tr>
</table>
<!-- PROMPTS -->