diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index b17d5088..5cd2e185 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -36,7 +36,7 @@ body:
attributes:
label: Which version of Thunderbird are you using?
description: >
- Thunderbird version like 115.14.0 or 128.1.
+ Thunderbird version like 140.0 or 147.0.1.
- type: input
id: version
validations:
diff --git a/.github/workflows/prerelease_comment_issue.yml b/.github/workflows/prerelease_comment_issue.yml
index d82226b3..aca32a21 100644
--- a/.github/workflows/prerelease_comment_issue.yml
+++ b/.github/workflows/prerelease_comment_issue.yml
@@ -4,13 +4,17 @@ on:
release:
types: [published, edited]
+concurrency:
+ group: ${{ github.workflow }}
+ cancel-in-progress: false
+
permissions:
contents: read
issues: write
jobs:
comment-milestone-issues:
- # consenti il run manuale per test; in produzione resta solo prerelease
+ # allow manual run for testing; in production, only prerelease
if: ${{ github.event.release.prerelease == true }}
runs-on: ubuntu-latest
steps:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dbad26b5..eed3a920 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,32 @@
-
Version 3.8.0 - ??/??/2026
+Version 4.0.0 - ??/??/2026
+
+ - ThunderAI is now compatible only with Thunderbird 140 and later [#616].
+ - [All APIs] It's now possibile to define a specific API integration for calendar and task recognition [#498].
+ - Added a new model selector with a search functionality to dynamically filter the list [#603].
+ - [All APIs] Added a special prompt to summarize one or more emails, using a context menu command [#615]. Thanks to Guido Kraemer for his great work on this feature.
+ - [All APIs] "Analyze for spam" and "Add tags" context menu items are always shown when the corresponding feature is enabled [#609].
+ - [OpenAI Comp API][Ollama API] Asking for the single host for permission to avoid CORS errors, instead of all_urls, as requested by the Thunderbird Review Team [#524].
+ - Fix: Using also the mail folder owner to search for the right identity to use when composing a reply [#627].
+ - Context menu items are always ordered alfabetically [#630].
+ - ...
+
+Version 3.8.3 - 22/01/2026
+
+ - Fix: Correctly saving the API settings in new custom prompts [#623].
+ - Japanese (ja) translation added, thanks to Taichi Ito.
+
+Version 3.8.2 - 20/01/2026
+
+ - Fix: Correctly saving the enabled status in custom prompts [#621].
+
+Version 3.8.1 - 20/01/2026
+
+ - [OpenAI API] Fix: Correctly sending the prompt after opening the chat window [#620].
+
+Version 3.8.0 - 16/01/2026
- [All APIs] Now it is possible to define an API and its settings for any custom prompt. This allows anyone to use different AI providers for different prompts [#102].
- [All APIs] When using special prompts (like automatically adding tags or the spam filter) with a specific API integration, all the settings for that integration can be specific. In this way you can use different api keys for the same integration, or different system prompt or temperature [#590].
@@ -16,7 +41,10 @@
- Spanish (es) translation added, thanks to Gerardo Sobarzo, Andrés Rendón Hernández, Erick Limon.
- Swedish (sv) translation added, thanks to Andreas Pettersson.
- Various fixes.
- - ...
+
+Version 3.7.9 - 06/01/2026
+
+ - [ChatGPT Web] Fix: Correctly getting the job completion [#607].
Version 3.7.8 - 18/12/2025
@@ -59,8 +87,9 @@
- [All APIs] It's now possibile to define a list of tags to be used when autotagging received emails [#436]. The tags are are now shown in the information header in the AI API chat [#289].
- [All APIs] The prompt id and name are now shown in the information header in the AI API chat [#436].
+ - [All APIs] It's now possibile to define a specific API integration for spamfilter and auto tagging [#438].
- Added the {%mail_attachments_info%} placeholder to retrieve the name, type and file size of the mail attachments [#446].
- - [Google Gemini API]Support for the thinkingBudget parameter has been added [#494].
+ - [Google Gemini API] Support for the thinkingBudget parameter has been added [#494].
- [OpenAI Comp API] Added DeepSeek configuration [#486].
- [ChatGPT Web] Added a message to explain to click on "Force completion" if the ChatGPT job is not done after 7 seconds [#419].
- Anthropic API renamed to Claude API [#510].
@@ -394,7 +423,7 @@
- Added a better error message when there is an error fetching models.
- When selecting a correct model in the options page, the field is no more highlighted in red [#100].
- When using the ChatGPT API, the double quotes at the beginning and end of the response are removed [#99].
- - [ChatGPT Web]"Keep formatting" option removed.
+ - [ChatGPT Web] "Keep formatting" option removed.
Version 2.0.1 - 09/08/2024
diff --git a/GEMINI.md b/GEMINI.md
new file mode 100644
index 00000000..1eb93734
--- /dev/null
+++ b/GEMINI.md
@@ -0,0 +1,36 @@
+# ThunderAI Project Agent Context
+
+## Project Overview
+ThunderAI is a Mozilla Thunderbird add-on that integrates Large Language Models (LLMs) such as ChatGPT, Gemini, Claude, and Ollama for advanced email management. It allows users to analyze, draft, correct, tag, and create calendar events directly from the email client.
+
+## Technical Stack
+- **Languages:** JavaScript (ES6+), HTML5, CSS3.
+- **Environment:** Thunderbird MailExtension API (based on WebExtensions).
+- **Core Logic:** Primarily located in `background.js` and UI-specific scripts.
+- **API Integrations:** Specific logic is contained within dedicated API provider files (e.g., `api_openai.js`, `api_google_gemini.js`).
+
+## Development Rules & Style Guide
+- **Code Style:** Use modern JavaScript. Prefer `async/await` over chained Promises.
+- **Naming Conventions:** Use `camelCase` for variables and functions.
+- **Security:** - Never hardcode API keys in the source code.
+ - Use `messenger.storage.local` for data persistence.
+ - Strictly adhere to CORS policies for external API calls.
+- **i18n:**
+ - The project supports multiple languages via `_locales/`. When adding UI strings, always use `messenger.i18n.getMessage()`.
+ - When you need to modify language file, modify only the english version.
+
+## Files & Directories Structure
+- `manifest.json`: Extension entry point and permission definitions.
+- `api_*.js`: Modules for integration with different AI providers.
+- `options/`: Configuration and settings pages.
+- `_locales/`: Translation files (JSON format).
+- `graphics/`: Visual assets and icons.
+
+## Important Commands & Workflow
+- **Testing:** Since this is a Thunderbird add-on, testing is performed by loading the extension as a "Temporary Add-on" via Thunderbird's `Debug Add-ons` menu.
+- **Build:** The project does not use complex build tools (no Webpack/Vite by default); it is a "pure" MailExtension.
+
+## Agent Instructions
+1. **Context Awareness:** When modifying API-related files, ensure compatibility with the existing placeholder system (e.g., `{%mail_body%}`, `{%additional_text%}`).
+2. **Permission Review:** Before modifying `manifest.json`, verify that any new permissions requested are strictly necessary for the feature.
+3. **Compatibility:** Ensure code is compatible with the latest Thunderbird ESR (Extended Support Release) versions.
\ No newline at end of file
diff --git a/LANG.md b/LANG.md
index 48e6e12d..73a39f9a 100644
--- a/LANG.md
+++ b/LANG.md
@@ -6,6 +6,7 @@ es
fr
hr
it
+ja
pl
pt-br
ru
diff --git a/README.md b/README.md
index 0c2500ed..847034c6 100644
--- a/README.md
+++ b/README.md
@@ -82,13 +82,15 @@ Are you using this addon in your Thunderbird?
## Attributions
### Translations
-- Chinese (Simplified): [jeklau](https://github.com/jeklau)
-- Chinese (Traditional): [evez](https://github.com/evez)
+- Chinese (Simplified) (zh_Hans): [jeklau](https://github.com/jeklau)
+- Chinese (Traditional) (zh_Hant): [evez](https://github.com/evez)
+- Croatian (hr): Petar Jedvaj
- Czech (cs): [Fjuro](https://hosted.weblate.org/user/Fjuro/), [Jaroslav Staněk](https://hosted.weblate.org/user/jaroush/)
- French (fr): Generated automatically, [Noam](https://github.com/noam-sc)
- German (de): Generated automatically
- Greek (el): [ChristosK.](https://github.com/christoskaterini)
- Italian (it): [Mic](https://github.com/micz)
+- Japanese (ja): [Taichi Ito](https://github.com/watya1)
- Polski (pl): [neexpl](https://github.com/neexpl), [makkacprzak](https://github.com/makkacprzak)
- Português Brasileiro (pt-br): Bruno Pereira de Souza
- Russian (ru): [Maksim](https://hosted.weblate.org/user/law820314/)
@@ -109,6 +111,7 @@ _The language status represents the percentage of translated strings in the late
- [JessiGue](https://www.flaticon.com/authors/jessigue) for the show/hide icon for api key fields
- [Iconka.com](https://www.iconarchive.com/artist/iconka.html) for the autotag context menu icon
- [Icojam](https://www.iconarchive.com/artist/icojam.html) for the spam filter context menu icon
+- [Roundicons](https://www.flaticon.com/authors/roundicons) for the summarize context menu icon
diff --git a/VENDORS.md b/VENDORS.md
index e58bb72e..c47d117d 100644
--- a/VENDORS.md
+++ b/VENDORS.md
@@ -1,5 +1,8 @@
file: pages\_lib\list.js
source: https://raw.githubusercontent.com/javve/list.js/v2.3.1/dist/list.js
+file: pages\_lib\tom-select.base.js
+source: https://cdn.jsdelivr.net/npm/tom-select@2.4.4/dist/js/tom-select.base.js
+
file: js\lib\diff.js
source: https://cdnjs.cloudflare.com/ajax/libs/jsdiff/7.0.0/diff.js
\ No newline at end of file
diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json
index 3586bea0..90f4e6b6 100644
--- a/_locales/cs/messages.json
+++ b/_locales/cs/messages.json
@@ -296,9 +296,6 @@
"chatgpt_empty_model": {
"message": "Nevybrali jste model pro ChatGPT API. Vyberte jej prosím na stránce s možnostmi."
},
- "chagpt_api_connecting": {
- "message": "Pokouším se připojit k OpenAI ChatGPT pomocí poskytnutého klíče API"
- },
"chagpt_api_send_button": {
"message": "Používám model"
},
@@ -335,12 +332,6 @@
"ollama_empty_model": {
"message": "Nevybrali jste model pro Ollama API. Prosím, vyberte jej na stránce s nastavením."
},
- "ollama_api_connecting": {
- "message": "Pokouším se připojit k lokálnímu serveru Ollama pomocí hostitele"
- },
- "andModel": {
- "message": "a model"
- },
"error_connection_interrupted": {
"message": "Spojení se serverem bylo neočekávaně přerušeno"
},
@@ -368,9 +359,6 @@
"OpenAIComp_empty_model": {
"message": "Nevybrali jste model pro API kompatibilní s OpenAI. Prosím, vyberte jej na stránce s nastavením."
},
- "OpenAIComp_api_connecting": {
- "message": "Pokouším se připojit k lokálnímu serveru API kompatibilního s OpenAI pomocí hostitele"
- },
"OpenAIComp_api_request_failed": {
"message": "Požadavek na OpenAI Comp API selhal"
},
@@ -479,7 +467,7 @@
"Spam_Value": {
"message": "Hodnota spamu"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Ne"
},
"prefsInfoDesc_4": {
@@ -539,7 +527,7 @@
"Date": {
"message": "Datum"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Ano"
},
"Report_Date": {
@@ -590,9 +578,6 @@
"GoogleGemini_Models_Fetch": {
"message": "Aktualizovat seznam modelů Google Gemini"
},
- "google_gemini_api_connecting": {
- "message": "Probíhá pokus o připojení ke Google Gemini pomocí zadaného API klíče"
- },
"google_gemini_empty_apikey": {
"message": "Nezadali jste API klíč pro Google Gemini API. Vložte jej na stránce možností."
},
@@ -848,9 +833,6 @@
"calendar_opening_dialog_error": {
"message": "Chyba při otevírání dialogu události kalendáře"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks není nainstalován!"
- },
"prefs_OptionText_add_tags_auto": {
"message": "Přidávat štítky automaticky"
},
@@ -869,18 +851,6 @@
"context_menu_mzta-spamfilter": {
"message": "Analýza spamu"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Zobrazit v nabídce položku „Přidat štítky“"
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Zobrazit v nabídce položku „Analýza spamu“"
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Po zaškrtnutí bude po kliknutí pravým tlačítkem na e-mail v seznamu zpráv v kontextové nabídce zobrazena položka „Analýza spamu“."
- },
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Po zaškrtnutí bude po kliknutí pravým tlačítkem na e-mail v seznamu zpráv v kontextové nabídce zobrazena položka „Přidat štítky“."
- },
"get_calendar_event_prompt_prefs_title": {
"message": "Možnosti události kalendáře"
},
@@ -1125,12 +1095,6 @@
"CORS_alternative_1": {
"message": "Problémy s nastavením CORS?"
},
- "CORS_alternative_2": {
- "message": "Stiskněte tlačítko níže a udělte oprávnění , abyste se vyhnuli jakýmkoli problémům s CORS."
- },
- "CORS_give_allurls_perm": {
- "message": "Udělit oprávnění \"všechny URL\""
- },
"maybe_CORS_openai_comp": {
"message": "Používání API kompatibilního s OpenAI může vyžadovat nastavení CORS na serveru."
},
diff --git a/_locales/de/messages.json b/_locales/de/messages.json
index 2a5ec296..298a1081 100644
--- a/_locales/de/messages.json
+++ b/_locales/de/messages.json
@@ -327,9 +327,6 @@
"chagpt_api_send_button": {
"message": "Modell wird verwendet"
},
- "chagpt_api_connecting": {
- "message": "Versuch, eine Verbindung zu OpenAI ChatGPT mit dem bereitgestellten API-Schlüssel herzustellen"
- },
"Debug": {
"message": "Debuggen"
},
@@ -363,12 +360,6 @@
"ollama_empty_model": {
"message": "Sie haben kein Modell für die Ollama API ausgewählt. Bitte wählen Sie eines auf der Optionsseite aus."
},
- "ollama_api_connecting": {
- "message": "Versuch, eine Verbindung zum Ollama-Lokalserver über den Host herzustellen"
- },
- "andModel": {
- "message": "und Modell"
- },
"error_connection_interrupted": {
"message": "Die Verbindung zum Server wurde unerwartet unterbrochen"
},
@@ -399,9 +390,6 @@
"OpenAIComp_empty_model": {
"message": "Sie haben kein Modell für die OpenAI-kompatible API ausgewählt. Bitte wählen Sie eines auf der Optionsseite aus."
},
- "OpenAIComp_api_connecting": {
- "message": "Versuche, eine Verbindung zum OpenAI-kompatiblen lokalen API-Server über den Host herzustellen"
- },
"OpenAIComp_api_request_failed": {
"message": "OpenAI-kompatible API-Anfrage fehlgeschlagen"
},
@@ -681,9 +669,6 @@
"google_gemini_api_request_failed": {
"message": "Google Gemini API-Anfrage fehlgeschlagen"
},
- "google_gemini_api_connecting": {
- "message": "Versuch, eine Verbindung zu Google Gemini mit dem bereitgestellten API-Schlüssel herzustellen"
- },
"google_gemini_empty_apikey": {
"message": "Sie haben keinen API-Schlüssel für die Google Gemini API hinzugefügt. Bitte fügen Sie einen auf der Optionsseite ein."
},
@@ -825,18 +810,15 @@
"Report_Date": {
"message": "Berichtsdatum"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Ja"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Nein"
},
"spamfilter_threshold_too_low": {
"message": "Der Spam-Schwellenwert ist zu niedrig! Sie werden wahrscheinlich zu viele E-Mails als Spam markieren!"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks nicht installiert!"
- },
"prefs_OptionText_add_tags_auto_force_existing_Info": {
"message": "Wenn aktiviert, fügt die KI nur vorhandene Tags hinzu und erstellt keine neuen Tags."
},
@@ -855,12 +837,6 @@
"prefs_OptionText_openai_comp_info_remote": {
"message": "Hier können Sie auch die Adresse eines entfernten Servers eingeben."
},
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Wenn aktiviert, wird beim Rechtsklick auf eine E-Mail in der Nachrichtenliste der Eintrag \"Tags hinzufügen\" angezeigt."
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Wenn aktiviert, wird beim Rechtsklick auf eine E-Mail in der Nachrichtenliste der Eintrag \"Auf Spam analysieren\" angezeigt."
- },
"prefs_OptionText_calendar_enforce_timezone": {
"message": "Erzwinge die angegebene Zeitzone"
},
@@ -882,12 +858,6 @@
"prefs_OptionText_calendar_enforce_timezone_Info": {
"message": "Wenn aktiviert, wird die angegebene Zeitzone für die Kalendereinträge und Aufgaben erzwungen."
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "\"Tags hinzufügen\" im Kontextmenü anzeigen"
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "\"Auf Spam analysieren\" im Kontextmenü anzeigen"
- },
"apiwebchat_you": {
"message": "Du"
},
@@ -930,12 +900,6 @@
"CORS_alternative_1": {
"message": "Probleme beim Einrichten von CORS?"
},
- "CORS_alternative_2": {
- "message": "Drücke den Button unten, um die Berechtigung zu erteilen und CORS-Probleme zu vermeiden."
- },
- "CORS_give_allurls_perm": {
- "message": "Gib die Berechtigung für \"alle URLs\""
- },
"remember_CORS": {
"message": "Denk daran, du musst die CORS-Einstellungen auf dem Server konfigurieren!"
},
diff --git a/_locales/el/messages.json b/_locales/el/messages.json
index 974568f2..5b1118a8 100644
--- a/_locales/el/messages.json
+++ b/_locales/el/messages.json
@@ -773,10 +773,10 @@
"Report_Date": {
"message": "Ημερομηνία αναφοράς"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Ναί"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Οχι"
},
"context_menu_mzta-add-tags": {
@@ -785,18 +785,6 @@
"context_menu_mzta-spamfilter": {
"message": "Ανάλυση για ανεπιθύμητα μηνύματα"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Εμφάνιση του στοιχείου μενού \"Προσθήκη ετικετών\""
- },
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Εάν είναι επιλεγμένο, το στοιχείο μενού \"Προσθήκη ετικετών\" θα εμφανίζεται όταν κάνετε δεξί κλικ σε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη λίστα μηνυμάτων."
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Εμφάνιση του στοιχείου μενού \"Ανάλυση για ανεπιθύμητα μηνύματα\""
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Εάν είναι επιλεγμένο, το στοιχείο μενού \"Ανάλυση για ανεπιθύμητα μηνύματα\" θα εμφανίζεται όταν κάνετε δεξί κλικ σε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη λίστα μηνυμάτων."
- },
"noActiveCalendar": {
"message": "Δεν βρέθηκε επεξεργάσιμο ημερολόγιο!"
},
@@ -836,12 +824,6 @@
"CORS_alternative_1": {
"message": "Προβλήματα με τη ρύθμιση του CORS;"
},
- "CORS_alternative_2": {
- "message": "Πατήστε το παρακάτω κουμπί για να δώσετε στο την άδεια να αποφύγει οποιοδήποτε πρόβλημα CORS."
- },
- "CORS_give_allurls_perm": {
- "message": "Δώστε άδεια σε \"όλες τις διευθύνσεις URL\""
- },
"prefs_OptionText_composing_plain_text": {
"message": "Σύνταξη σε απλό κείμενο"
},
@@ -942,7 +924,7 @@
"message": "ΑΠΑΙΤΕΙΤΑΙ. Μην αλλάξετε αυτήν την τιμή εκτός αν γνωρίζετε τι κάνετε. Περισσότερες πληροφορίες στη διεύθυνση:"
},
"prefs_OptionText_anthropic_max_tokens": {
- "message": "Claude Μέγιστα Tokens"
+ "message": "Μέγιστα Tokens"
},
"prefs_OptionText_anthropic_max_tokens_Info": {
"message": "Ο μέγιστος αριθμός διακριτικών που θα δημιουργηθούν κατά την ολοκλήρωση. Ο αριθμός διακριτικών της προτροπής σας συν το max_tokens δεν μπορεί να υπερβαίνει το μήκος περιβάλλοντος του μοντέλου."
@@ -1298,5 +1280,29 @@
},
"reset": {
"message": "Επαναφορά"
+ },
+ "prompt_string": {
+ "message": "Εντολή"
+ },
+ "placeholder_mail_headers": {
+ "message": "Κεφαλίδες αλληλογραφίας"
+ },
+ "prefs_chatgpt_api_temperature_Info": {
+ "message": "Ποια θερμοκρασία δειγματοληψίας να χρησιμοποιηθεί, μεταξύ 0 και 2. Υψηλότερες τιμές όπως 0,8 θα κάνουν την έξοδο πιο τυχαία, ενώ χαμηλότερες τιμές όπως 0,2 θα την κάνουν πιο εστιασμένη και ντετερμινιστική."
+ },
+ "prefs_ollama_temperature_Info": {
+ "message": "Η θερμοκρασία του μοντέλου. Η αύξηση της θερμοκρασίας θα κάνει το μοντέλο να απαντά πιο δημιουργικά. Η προεπιλεγμένη τιμή είναι 0,8. Συνιστάται η χρήση τιμών μεταξύ 0 και 1."
+ },
+ "prefs_api_temperature": {
+ "message": "Θερμοκρασία"
+ },
+ "prefs_openai_comp_temperature_Info": {
+ "message": "Ποια θερμοκρασία δειγματοληψίας να χρησιμοποιηθεί, μεταξύ 0 και 2. Υψηλότερες τιμές όπως 0,8 θα κάνουν την έξοδο πιο τυχαία, ενώ χαμηλότερες τιμές όπως 0,2 θα την κάνουν πιο εστιασμένη και ντετερμινιστική."
+ },
+ "prefs_google_gemini_temperature_Info": {
+ "message": "Αυτή η παράμετρος πρέπει να είναι ένας αριθμός μεταξύ 0,0 και 2,0. Ελέγχει την τυχαιότητα της εξόδου. Η προεπιλεγμένη τιμή ποικίλλει ανάλογα με το μοντέλο. Αφήστε την κενή για να αποφύγετε τον ορισμό της παραμέτρου στην κλήση API."
+ },
+ "prefs_anthropic_temperature_Info": {
+ "message": "Ποσότητα τυχαιότητας που εισάγεται στην απόκριση. Προεπιλογή 1,0. Εύρος από 0,0 έως 1,0. Χρησιμοποιήστε θερμοκρασία πιο κοντά στο 0,0 για αναλυτική ανάλυση."
}
}
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 4a7e3984..89f7ee3a 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -1003,6 +1003,34 @@
"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:\"{%selected_text%}\"",
"description": ""
},
+ "Summarize_prompt_prefs_title": {
+ "message": "Add Summarization Options",
+ "description": ""
+ },
+ "prompt_summarize": {
+ "message": "Summarize this email or these emails",
+ "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.",
+ "description": ""
+ },
+ "prompt_summarize_email_template": {
+ "message": "Summarize email template",
+ "description": ""
+ },
+ "prompt_summarize_email_template_full_text": {
+ "message": "From: {%author%}\nTo: {%recipients%}\nCC: {%cc_list%}\nSubject: {%mail_subject%}\nDate: {%mail_datetime%}\nAttachments:\n{%mail_attachments_info%}\n\nBody:\n{%mail_text_body%}",
+ "description": ""
+ },
+ "prompt_summarize_email_separator": {
+ "message": "Email separator",
+ "description": ""
+ },
+ "prompt_summarize_email_separator_full_text": {
+ "message": "\n\n---------- NEXT EMAIL ----------\n\n",
+ "description": ""
+ },
"prompt_get_task": {
"message": "Add a new task",
"description": ""
@@ -1067,6 +1095,22 @@
"message": "You can change the prompt as you wish, but the response received from the AI must be in JSON format as specified in the default prompt!",
"description": ""
},
+ "prefs_OptionText_Summarize_infoline2": {
+ "message": "You can change the prompt as you wish, the first field is the main prompt, the second field is the template for a single mail. The list of emails will be appended to the main prompt. Emails will be separated by the separator specified in the third field.",
+ "description": ""
+ },
+ "prefs_OptionText_Summarize_main_prompt": {
+ "message": "The main prompt describing the task to be performed on all selected emails:",
+ "description": ""
+ },
+ "prefs_OptionText_Summarize_email_template": {
+ "message": "The template for a single email:",
+ "description": ""
+ },
+ "prefs_OptionText_Summarize_email_separator": {
+ "message": "The separator between emails:",
+ "description": ""
+ },
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
"message": "To use the calendar event and task features, please install the ThunderAI Sparks addon.",
"description": ""
@@ -1167,6 +1211,10 @@
"message": "If checked, the Model and API specified below will be used for adding tags to emails, regardless the one choosen in the ThunderAI options page.",
"description": ""
},
+ "prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
+ "message": "If checked, the Model and API specified below will be used for creating calendar events, regardless the one choosen in the ThunderAI options page.",
+ "description": ""
+ },
"placeholder_thunderai_def_sign": {
"message": "Default signature as defined in ThunderAI options.",
"description": ""
@@ -1195,6 +1243,22 @@
"message": "Manage spam filter settings",
"description": ""
},
+ "prefs_OptionText_summarize": {
+ "message": "Summarize mail",
+ "description": ""
+ },
+ "prefs_OptionText_summarize_use_specific_integration_Info": {
+ "message": "If checked, the Model and API specified below will be used for summarizing email(s), regardless the one choosen in the ThunderAI options page.",
+ "description": ""
+ },
+ "prefs_OptionText_summarize_Info": {
+ "message": "If checked, adds an option to context menu to summarize mail.",
+ "description": ""
+ },
+ "prefs_OptionText_btnManageSummarizeInfo": {
+ "message": "Manage summarize settings",
+ "description": ""
+ },
"SpamFilter_PageTitle": {
"message": "Manage Spam Filter Settings",
"description": ""
@@ -1219,6 +1283,18 @@
"message": "Spam Filter Options",
"description": ""
},
+ "Summarize_PageTitle": {
+ "message": "Manage Summarize Settings",
+ "description": ""
+ },
+ "Summarize_info_default": {
+ "message": "In this page you can modify the default prompt used to summarize emails.",
+ "description": ""
+ },
+ "Summarize_prompt_text_title": {
+ "message": "Current prompt text",
+ "description": ""
+ },
"prefs_OptionText_use_specific_integration": {
"message": "Use specific Model and API",
"description": ""
@@ -1279,11 +1355,11 @@
"message": "Report Date",
"description": ""
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Yes",
"description": ""
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "No",
"description": ""
},
@@ -1295,20 +1371,8 @@
"message": "Analyze for spam",
"description": ""
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Show the \"Add tags\" context menu item",
- "description": ""
- },
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "If checked, the \"Add tags\" context menu item will be shown when right-clicking on an email in the messages list.",
- "description": ""
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Show the \"Analyze for spam\" context menu item",
- "description": ""
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "If checked, the \"Analyze for spam\" context menu item will be shown when right-clicking on an email in the messages list.",
+ "context_menu_mzta-summarize": {
+ "message": "Summarize",
"description": ""
},
"noActiveCalendar": {
@@ -1363,12 +1427,16 @@
"message": "Problems setting CORS?",
"description": ""
},
- "CORS_alternative_2": {
- "message": "Press the button below to give the permission to avoid any CORS problem.",
+ "CORS_alternative_2_new": {
+ "message": "Press the button below to give the permission to the current host to avoid any CORS problem.",
"description": ""
},
- "CORS_give_allurls_perm": {
- "message": "Give \"all URLs\" permission",
+ "CORS_give_host_perm": {
+ "message": "Give permission to the current host",
+ "description": ""
+ },
+ "CORS_localhost_warn": {
+ "message": "If you are using localhost or 127.0.0.1 because the AI server is hosted on your PC, the permission is required.",
"description": ""
},
"prefs_OptionText_composing_plain_text": {
@@ -1754,5 +1822,9 @@
},
"auto_summary_prompt": {
"message": "Please provide a concise summary of the following email message. The summary should be 3-5 sentences maximum and capture the main points:\n\n"
+ },
+ "customPrompts_export_include_api_settings": {
+ "message": "Do you want to include the API settings in the export? Be aware that also the API Key will be saved in the file!",
+ "description": ""
}
}
diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json
index 036ad476..123f9bf6 100644
--- a/_locales/eo/messages.json
+++ b/_locales/eo/messages.json
@@ -38,7 +38,7 @@
"From": {
"message": "De"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Ne"
},
"apiwebchat_stopping": {
@@ -122,7 +122,7 @@
"Explanation": {
"message": "Klarigo"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Jes"
},
"apiwebchat_you": {
diff --git a/_locales/es/messages.json b/_locales/es/messages.json
index 17d756ec..347292fd 100644
--- a/_locales/es/messages.json
+++ b/_locales/es/messages.json
@@ -956,10 +956,10 @@
"Report_Date": {
"message": "Fecha del informe"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Si"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "No"
},
"context_menu_mzta-add-tags": {
@@ -968,18 +968,6 @@
"context_menu_mzta-spamfilter": {
"message": "Analizar el spam"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Mostrar el elemento del menú contextual “Añadir etiquetas”"
- },
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Si está marcado, el elemento del menú contextual “Añadir etiquetas” se mostrará al hacer clic derecho en un correo electrónico de la lista de mensajes."
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Mostrar el elemento del menú contextual “Analizar el spam”"
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Si está marcado, el elemento del menú contextual “Analizar el spam” se mostrará al hacer clic derecho en un correo electrónico de la lista de mensajes."
- },
"noActiveCalendar": {
"message": "¡No se encontró un calendario editable!"
},
@@ -1019,12 +1007,6 @@
"CORS_alternative_1": {
"message": "¿Problemas al configurar CORS?"
},
- "CORS_alternative_2": {
- "message": "Presiona el botón a continuación para otorgar el permiso y evitar cualquier problema de CORS."
- },
- "CORS_give_allurls_perm": {
- "message": "Otorgar permiso “all URLs”"
- },
"prefs_OptionText_composing_plain_text": {
"message": "Redactando en texto plano"
},
diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json
index f33054d7..8992efe2 100644
--- a/_locales/fr/messages.json
+++ b/_locales/fr/messages.json
@@ -327,9 +327,6 @@
"chagpt_api_send_button": {
"message": "Utilisation du modèle"
},
- "chagpt_api_connecting": {
- "message": "Tentative de connexion à OpenAI ChatGPT en utilisant la clé API fournie"
- },
"Debug": {
"message": "Debug"
},
@@ -363,12 +360,6 @@
"ollama_empty_model": {
"message": "Vous n'avez pas choisi de modèle pour l'API Ollama. Veuillez en choisir un sur la page des options."
},
- "ollama_api_connecting": {
- "message": "Tentative de connexion au serveur local Ollama en utilisant l'hôte"
- },
- "andModel": {
- "message": "et le modèle"
- },
"error_connection_interrupted": {
"message": "La connexion au serveur a été interrompue de manière inattendue"
},
@@ -399,9 +390,6 @@
"OpenAIComp_empty_model": {
"message": "Vous n'avez pas choisi de modèle pour l'API compatible OpenAI. Veuillez en choisir un dans la page des options."
},
- "OpenAIComp_api_connecting": {
- "message": "Tentative de connexion au serveur local de l'API compatible OpenAI en utilisant l'hôte"
- },
"OpenAIComp_api_request_failed": {
"message": "La requête de l'API compatible OpenAI a échoué"
},
@@ -681,9 +669,6 @@
"google_gemini_api_request_failed": {
"message": "La requête API Google Gemini a échoué"
},
- "google_gemini_api_connecting": {
- "message": "Tentative de connexion à Google Gemini en utilisant la clé API fournie"
- },
"google_gemini_empty_apikey": {
"message": "Vous n'avez pas ajouté de clé API pour l'API Google Gemini. Veuillez en insérer une dans la page des options."
},
@@ -792,7 +777,7 @@
"Moved_to_Spam": {
"message": "Déplacé dans le spam"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Non"
},
"spamfilter_no_reports": {
@@ -801,9 +786,6 @@
"SpamFilter_PageTitle": {
"message": "Gérer les paramètres du filtre anti-spam"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks non installé !"
- },
"SpamFilter_info_default": {
"message": "Sur cette page, vous pouvez modifier l'invite par défaut utilisée pour détecter les e-mails indésirables."
},
@@ -816,7 +798,7 @@
"SpamReport_Title": {
"message": "Rapports du filtre anti-spam"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Oui"
},
"prefs_OptionText_add_tags_auto_Info": {
@@ -858,12 +840,6 @@
"context_menu_mzta-add-tags": {
"message": "Ajouter des étiquettes"
},
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Afficher l'option \"Analyser comme spam\" dans le menu contextuel"
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Si coché, l'option \"Analyser comme spam\" apparaîtra lors d’un clic droit sur un e-mail dans la liste des messages."
- },
"noActiveCalendar": {
"message": "Aucun calendrier modifiable trouvé !"
},
@@ -879,9 +855,6 @@
"prefs_OptionText_calendar_enforce_timezone": {
"message": "Forcer le fuseau horaire spécifié"
},
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Si coché, l'option \"Ajouter des étiquettes\" apparaîtra lors d’un clic droit sur un e-mail dans la liste des messages."
- },
"chatgpt_win_diff_title": {
"message": "Différences entre le texte original et le texte modifié"
},
@@ -897,9 +870,6 @@
"apiwebchat_error": {
"message": "Erreur"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Afficher l'option \"Ajouter des étiquettes\" dans le menu contextuel"
- },
"apiwebchat_use_this_answer": {
"message": "Utiliser cette réponse"
},
@@ -930,12 +900,6 @@
"CORS_alternative_1": {
"message": "Des problèmes pour configurer le CORS ?"
},
- "CORS_alternative_2": {
- "message": "Appuie sur le bouton ci-dessous pour accorder la permission afin d'éviter tout problème lié au CORS."
- },
- "CORS_give_allurls_perm": {
- "message": "Accorde la permission \"tous les URLs\""
- },
"remember_CORS": {
"message": "N'oublie pas, tu dois configurer les paramètres CORS sur le serveur !"
},
diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json
index eda8e3a1..5ed1d8db 100644
--- a/_locales/hr/messages.json
+++ b/_locales/hr/messages.json
@@ -327,9 +327,6 @@
"chagpt_api_send_button": {
"message": "Korištenje modela"
},
- "chagpt_api_connecting": {
- "message": "Pokušaj povezivanja na OpenAI ChatGPT pomoću dostavljenog API ključa"
- },
"Debug": {
"message": "Otklanjanje pogrešaka"
},
@@ -363,12 +360,6 @@
"ollama_empty_model": {
"message": "Niste odabrali model za Ollama API. Odaberite jedan na stranici s mogućnostima."
},
- "ollama_api_connecting": {
- "message": "Pokušaj povezivanja na Ollama lokalni poslužitelj pomoću glavnog računala"
- },
- "andModel": {
- "message": "i model"
- },
"error_connection_interrupted": {
"message": "Veza s poslužiteljem je neočekivano prekinuta"
},
@@ -399,9 +390,6 @@
"OpenAIComp_empty_model": {
"message": "Niste odabrali model za OpenAI kompatibilan API. Odaberite jedan na stranici s opcijama."
},
- "OpenAIComp_api_connecting": {
- "message": "Pokušaj povezivanja s OpenAI kompatibilnim API lokalnim poslužiteljem pomoću glavnog računala"
- },
"OpenAIComp_api_request_failed": {
"message": "OpenAI Comp API zahtjev nije uspio"
},
@@ -681,9 +669,6 @@
"google_gemini_api_request_failed": {
"message": "Google Gemini API zahtjev nije uspio"
},
- "google_gemini_api_connecting": {
- "message": "Pokušaj povezivanja na Google Gemini pomoću dostavljenog API ključa"
- },
"google_gemini_empty_apikey": {
"message": "Niste dodali API ključ za Google Gemini API. Unesite jedan na stranicu s mogućnostima."
},
@@ -753,9 +738,6 @@
"calendar_opening_dialog_error": {
"message": "Pogreška pri otvaranju dijaloškog okvira kalendarskog događaja"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks nije instaliran!"
- },
"prefs_OptionText_add_tags_auto": {
"message": "Dodajte oznake automatski"
},
@@ -846,10 +828,10 @@
"Report_Date": {
"message": "Datum izvješća"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Da"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Ne"
},
"prefs_OptionText_openai_comp_info_remote": {
diff --git a/_locales/it/messages.json b/_locales/it/messages.json
index 01ba7654..96a1a8ba 100644
--- a/_locales/it/messages.json
+++ b/_locales/it/messages.json
@@ -327,9 +327,6 @@
"chagpt_api_send_button": {
"message": "Modello utilizzato"
},
- "chagpt_api_connecting": {
- "message": "Tentativo di connessione a OpenAI ChatGPT utilizzando la chiave API fornita"
- },
"Debug": {
"message": "Debug"
},
@@ -363,12 +360,6 @@
"ollama_empty_model": {
"message": "Non hai scelto un modello per l'API Ollama. Per favore, scegline uno nella pagina delle opzioni."
},
- "ollama_api_connecting": {
- "message": "Tentativo di connettersi al server locale Ollama usando l'host"
- },
- "andModel": {
- "message": "e il modello"
- },
"error_connection_interrupted": {
"message": "La connessione al server è stata interrotta inaspettatamente"
},
@@ -399,9 +390,6 @@
"OpenAIComp_empty_model": {
"message": "Non hai scelto un modello per l'API compatibile con OpenAI. Scegline uno nella pagina delle opzioni."
},
- "OpenAIComp_api_connecting": {
- "message": "Tentativo di connessione al server locale dell'API compatibile con OpenAI utilizzando l'host"
- },
"OpenAIComp_api_request_failed": {
"message": "Richiesta all'API compatibile con OpenAI fallita"
},
@@ -681,9 +669,6 @@
"google_gemini_api_request_failed": {
"message": "La richiesta all'API Google Gemini è fallita"
},
- "google_gemini_api_connecting": {
- "message": "Tentativo di connessione a Google Gemini utilizzando la chiave API fornita"
- },
"google_gemini_empty_apikey": {
"message": "Non hai aggiunto una chiave API per l'API Google Gemini. Inseriscine una nella pagina delle opzioni."
},
@@ -753,9 +738,6 @@
"calendar_opening_dialog_error": {
"message": "Errore durante l'apertura della finestra di dialogo dell'evento del calendario"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks non installato!"
- },
"Subject": {
"message": "Oggetto"
},
@@ -789,7 +771,7 @@
"Moved_to_Spam": {
"message": "Spostato nello spam"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "No"
},
"From": {
@@ -798,7 +780,7 @@
"prefs_OptionText_btnManageSpamFilterInfo": {
"message": "Gestisci le impostazioni del filtro antispam"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Sì"
},
"SpamReport_Title": {
@@ -879,9 +861,6 @@
"btn_show_differences": {
"message": "Mostra le differenze"
},
- "apiwebchat_show_differences": {
- "message": "Mostra le differenze"
- },
"apiwebchat_error": {
"message": "Errore"
},
@@ -894,21 +873,9 @@
"prefs_OptionText_calendar_enforce_timezone": {
"message": "Forza il fuso orario specificato"
},
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Se selezionato, la voce \"Aggiungi etichette\" verrà mostrata facendo clic con il pulsante destro del mouse su un'email nell'elenco dei messaggi."
- },
"apiwebchat_use_this_answer": {
"message": "Usa questa risposta"
},
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Se selezionato, la voce \"Analizza come spam\" verrà mostrata facendo clic con il pulsante destro del mouse su un'email nell'elenco dei messaggi."
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Mostra la voce \"Analizza come spam\" nel menu contestuale"
- },
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Mostra la voce \"Aggiungi etichette\" nel menu contestuale"
- },
"apiwebchat_info": {
"message": "Informazioni"
},
@@ -933,12 +900,6 @@
"CORS_alternative_1": {
"message": "Problemi con la configurazione di CORS?"
},
- "CORS_alternative_2": {
- "message": "Premi il pulsante qui sotto per concedere il permesso ed evitare qualsiasi problema legato a CORS."
- },
- "CORS_give_allurls_perm": {
- "message": "Concedi il permesso \"tutti gli URL\""
- },
"remember_CORS": {
"message": "Ricorda, devi configurare le impostazioni CORS sul server!"
},
diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json
new file mode 100644
index 00000000..fc4d9eb1
--- /dev/null
+++ b/_locales/ja/messages.json
@@ -0,0 +1,1290 @@
+{
+ "extensionDescription": {
+ "message": "ChatGPT、Google Gemini、Claude、Ollama を使ってメールを強化しましょう!"
+ },
+ "menu_title": {
+ "message": "AI"
+ },
+ "prompt_lang": {
+ "message": "返信する"
+ },
+ "prompt_reply": {
+ "message": "このメールに返信"
+ },
+ "prompt_reply_advanced": {
+ "message": "このスレッドに返信"
+ },
+ "prompt_reply_custom_command": {
+ "message": "コマンドで返信"
+ },
+ "prompt_rewrite_polite": {
+ "message": "丁寧に書き直す"
+ },
+ "prompt_rewrite_formal": {
+ "message": "フォーマルに書き直す"
+ },
+ "prompt_classify": {
+ "message": "分類する"
+ },
+ "prompt_summarize_this": {
+ "message": "要約する"
+ },
+ "prompt_translate_this": {
+ "message": "翻訳する"
+ },
+ "prompt_this": {
+ "message": "プロンプトを実行"
+ },
+ "prompt_selection_needed": {
+ "message": "続行するには、テキストを選択してください!"
+ },
+ "customPrompts_managePrompts": {
+ "message": "プロンプトを管理"
+ },
+ "more_info_string": {
+ "message": "詳細情報"
+ },
+ "prompt_string": {
+ "message": "プロンプト"
+ },
+ "customPrompts_managePrompts_info_default": {
+ "message": "デフォルトのプロンプトは編集できません。無効にしてから、プロンプトのテキストをコピーし、新しいプロンプトに貼り付けて変更版を作成できます。"
+ },
+ "customPrompts_managePrompts_info_default_2": {
+ "message": "プロンプトのインポートとエクスポートができます。同じIDの既存プロンプトは上書きされます。新しいIDのプロンプトは追加されます。"
+ },
+ "customPrompts_managePrompts_info_default_3": {
+ "message": "すべて正しければ、インポート後に「すべて保存」ボタンをクリックしてください。"
+ },
+ "customPrompts_start_saving": {
+ "message": "プロンプトを保存中..."
+ },
+ "customPrompts_reindexing_list": {
+ "message": "リストを再インデックス中..."
+ },
+ "customPrompts_filtering_prompts": {
+ "message": "プロンプトをフィルタリング中..."
+ },
+ "customPrompts_saving_default_prompts": {
+ "message": "デフォルトプロンプトを保存中..."
+ },
+ "customPrompts_saving_custom_prompts": {
+ "message": "カスタムプロンプトを保存中..."
+ },
+ "customPrompts_reloading_menus": {
+ "message": "メニューを再読み込み中..."
+ },
+ "customPrompts_saved": {
+ "message": "プロンプトを保存しました!"
+ },
+ "customPrompts_form_label_ID": {
+ "message": "ID"
+ },
+ "customPrompts_form_label_ID_rules": {
+ "message": "一意で、小文字、スペースなしである必要があります"
+ },
+ "customPrompts_form_label_Name": {
+ "message": "名前"
+ },
+ "customPrompts_form_label_Text": {
+ "message": "プロンプトテキスト"
+ },
+ "customPrompts_form_label_Action": {
+ "message": "アクション"
+ },
+ "customPrompts_form_label_need_selected": {
+ "message": "テキスト選択が必要"
+ },
+ "customPrompts_form_label_need_signature": {
+ "message": "常に署名を追加する"
+ },
+ "customPrompts_form_label_need_custom_text": {
+ "message": "追加テキストを要求する"
+ },
+ "customPrompts_form_label_enabled": {
+ "message": "有効"
+ },
+ "customPrompts_form_label_use_diff_viewer": {
+ "message": "テキスト比較ビューアを有効にする"
+ },
+ "customPrompts_form_label_use_diff_viewer_title": {
+ "message": "テキスト比較ビューアは、アクションが「テキストを置換」に設定されている場合に選択できます。"
+ },
+ "customPrompts_form_required_fields": {
+ "message": "必須フィールド"
+ },
+ "customPrompts_btnEdit": {
+ "message": "編集"
+ },
+ "customPrompts_btnCancel": {
+ "message": "キャンセル"
+ },
+ "customPrompts_btnOK": {
+ "message": "OK"
+ },
+ "customPrompts_btnDelete": {
+ "message": "削除"
+ },
+ "customPrompts_btnDelete_confirmText": {
+ "message": "このアイテムを削除してもよろしいですか?"
+ },
+ "customPrompts_unsaved_changes": {
+ "message": "保存されていない変更があります!"
+ },
+ "btnSaveAll_string": {
+ "message": "すべて保存"
+ },
+ "btnNew_string": {
+ "message": "新規追加"
+ },
+ "customPrompts_btnAddNewCommit": {
+ "message": "プロンプトを追加"
+ },
+ "customPrompts_add_to_menu": {
+ "message": "メニューに追加"
+ },
+ "customPrompts_add_to_menu_always": {
+ "message": "常に"
+ },
+ "customPrompts_add_to_menu_reading": {
+ "message": "メール閲覧時"
+ },
+ "customPrompts_add_to_menu_composing": {
+ "message": "メール作成時"
+ },
+ "customPrompts_close_button": {
+ "message": "閉じるボタン"
+ },
+ "customPrompts_do_reply": {
+ "message": "返信する"
+ },
+ "customPrompts_substitute_text": {
+ "message": "テキストを置換"
+ },
+ "chatgpt_win_working": {
+ "message": "処理中..."
+ },
+ "chatgpt_win_job_completed": {
+ "message": "完了!"
+ },
+ "chatgpt_win_job_completed_select": {
+ "message": "使用するテキストを選択してボタンをクリックしてください。"
+ },
+ "chatgpt_win_get_answer": {
+ "message": "選択した回答を使用"
+ },
+ "chatgpt_win_close": {
+ "message": "閉じる"
+ },
+ "chatgpt_textarea_not_found_error": {
+ "message": "ChatGPTページの読み込みに時間がかかっているようです。読み込みが完了したら、右のボタンをクリックしてください。問題が続く場合は、サービスの状態を確認してください。"
+ },
+ "chatgpt_btn_retry": {
+ "message": "再試行"
+ },
+ "chatgpt_sendbutton_not_found_error": {
+ "message": "送信ボタンをクリックしてプロンプトを送信してください。"
+ },
+ "chatgpt_user_not_logged_in": {
+ "message": "ChatGPTにログインしていません。認証情報でログインし、ChatGPTウィンドウを閉じてから、再度操作を行ってください。その後はログイン状態が維持されます。"
+ },
+ "chatgpt_win_model_warning": {
+ "message": "何らかの理由で、正しいモデルが読み込まれているか確認できません。今のところ、青いボタンを押して続行できます。"
+ },
+ "chatgpt_win_custom_text": {
+ "message": "プロンプト用の追加テキストをここに入力してください。"
+ },
+ "chatgpt_win_send": {
+ "message": "送信"
+ },
+ "chatgpt_force_completion": {
+ "message": "強制完了"
+ },
+ "chatgpt_force_completion_title": {
+ "message": "ChatGPTが処理を完了したのにボタンが表示されない場合は、ここをクリックして「最後の回答を使用」ボタンを表示してください。"
+ },
+ "msg_prompt_too_long": {
+ "message": "入力したテキストが長すぎます。短くしてください。"
+ },
+ "prefs_OptionText_release_notes": {
+ "message": "リリースノート"
+ },
+ "prefs_status_page": {
+ "message": "サービス状態"
+ },
+ "prefs_OptionText_chatgpt_win_text": {
+ "message": "AIチャットウィンドウのサイズ"
+ },
+ "prefs_OptionText_chatgpt_win_height": {
+ "message": "高さ"
+ },
+ "prefs_OptionText_chatgpt_win_width": {
+ "message": "幅"
+ },
+ "prefs_OptionText_default_sign_name": {
+ "message": "デフォルトの署名名"
+ },
+ "prefs_OptionText_default_chatgpt_lang": {
+ "message": "返信のデフォルト言語"
+ },
+ "prefs_OptionText_reply_all": {
+ "message": "全員に返信"
+ },
+ "prefs_OptionText_reply_sender": {
+ "message": "送信者に返信"
+ },
+ "prefs_OptionText_reply_type": {
+ "message": "返信タイプ"
+ },
+ "prefs_OptionText_reply_type_Info": {
+ "message": "これはメールに返信する際に使用されるデフォルトの返信タイプです。返信ダイアログで後から変更できます。"
+ },
+ "prefs_OptionText_btnManagePrompts": {
+ "message": "プロンプトを管理する"
+ },
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "message": "データプレースホルダーを管理する"
+ },
+ "prefsInfoTitle": {
+ "message": "重要な情報"
+ },
+ "prefsInfoDesc_1": {
+ "message": "ChatGPTのWebインターフェースが変更され、アドオンが動作しなくなる可能性があります。このページの下部にある「サービス状態」ページを確認してください。また、ThunderAIを初めて使用する際はChatGPTへのログインが必要です。"
+ },
+ "prefsInfoDesc_2": {
+ "message": "ChatGPT APIを使用するには、OpenAI ChatGPT APIキーが必要で、モデルを選択する必要があります。"
+ },
+ "prefsInfoDesc_3": {
+ "message": "Ollamaとの連携を使用するには、ローカルのOllamaサーバーを設定する必要があります。サーバーが起動したら、アプリケーション内の指定フィールドにアドレスを入力してください。ThunderAIとOllamaサーバー間の適切な通信を確保するため、OLLAMA_ORIGINS=moz-extension://*を設定してください。"
+ },
+ "prefsInfoDesc_4": {
+ "message": "この連携を使用するには、LM StudioなどのOpenAI API互換のローカルサーバーを設定する必要があります。サーバーが起動したら、アプリケーション内の指定フィールドにアドレスを入力してください。ThunderAIとローカルサーバー間の適切な通信を確保するため、CORS設定を正しく行ってください。"
+ },
+ "prefsInfoDesc_5": {
+ "message": "キーボードショートカットCTRL+ALT+AでThunderAIメニューを開けることを覚えておいてください。"
+ },
+ "prefsInfoDesc_6": {
+ "message": "このページの右上にある歯車アイコンをクリックし、「拡張機能のショートカットを管理」を選択してショートカットを変更できます。"
+ },
+ "prefsDonation_1": {
+ "message": "このアドオンは気に入りましたか?"
+ },
+ "prefsDonation_2": {
+ "message": "寄付をご検討ください!"
+ },
+ "backToOptionsText": {
+ "message": "オプション"
+ },
+ "TranslateText": {
+ "message": "このアドオンの翻訳を手伝いませんか?"
+ },
+ "TranslateLink": {
+ "message": "方法を確認!"
+ },
+ "customPrompts_ExportAll": {
+ "message": "すべてのプロンプトをエクスポート"
+ },
+ "customPrompts_Import": {
+ "message": "新しいプロンプトをインポート"
+ },
+ "importPrompts_confirmText": {
+ "message": "新しいプロンプトをインポートしようとしています。"
+ },
+ "customPrompts_start_import": {
+ "message": "カスタムプロンプトのインポートを開始中..."
+ },
+ "customPrompts_import_completed": {
+ "message": "カスタムプロンプトのインポートが完了しました!「すべて保存」ボタンをクリックして変更を保存してください。"
+ },
+ "importPrompts_invalidFile": {
+ "message": "インポートしようとしているファイルは有効なカスタムプロンプトファイルではありません。"
+ },
+ "importPrompts_invalidPrompts": {
+ "message": "インポートしようとしているファイルには有効なプロンプトが含まれていません。"
+ },
+ "currently_used_prompt": {
+ "message": "現在使用中のプロンプト名"
+ },
+ "customprompts_form_label_define_response_lang": {
+ "message": "プロンプトで返信言語を定義する"
+ },
+ "prefs_Connection_type": {
+ "message": "接続タイプ"
+ },
+ "prefs_Connection_type_ChatGPT_Web": {
+ "message": "ChatGPT Webインターフェース"
+ },
+ "prefs_Connection_type_ChatGPT_API": {
+ "message": "ChatGPT OpenAI API"
+ },
+ "prefs_ChatGPT_API_Key": {
+ "message": "ChatGPT APIキー"
+ },
+ "ChatGPT_Models": {
+ "message": "ChatGPTモデル"
+ },
+ "ChatGPT_Models_Fetch": {
+ "message": "ChatGPTモデルリストを更新"
+ },
+ "ChatGPT_Models_Error_fetching": {
+ "message": "ChatGPTモデルの取得中にエラー"
+ },
+ "Loading": {
+ "message": "読み込み中..."
+ },
+ "error": {
+ "message": "ThunderAI エラー!"
+ },
+ "chatgpt_empty_apikey": {
+ "message": "ChatGPT APIのAPIキーが設定されていません。オプションページで設定してください。"
+ },
+ "chatgpt_empty_model": {
+ "message": "ChatGPT APIのモデルが選択されていません。オプションページで選択してください。"
+ },
+ "chagpt_api_send_button": {
+ "message": "使用モデル"
+ },
+ "Debug": {
+ "message": "デバッグ"
+ },
+ "prefs_OptionText_do_debug_info": {
+ "message": "デバッグシステムを有効にする"
+ },
+ "prefs_Connection_type_Ollama_API": {
+ "message": "Ollama API(ローカルLLM)"
+ },
+ "prefs_Connection_type_OpenAI_Comp_API": {
+ "message": "OpenAI互換API"
+ },
+ "prefs_API_Host": {
+ "message": "ホストアドレス"
+ },
+ "Ollama_Models": {
+ "message": "Ollamaモデル"
+ },
+ "Ollama_Models_Fetch": {
+ "message": "Ollamaモデルリストを更新"
+ },
+ "Ollama_Models_Error_fetching": {
+ "message": "Ollamaモデルの取得中にエラー"
+ },
+ "API_Models_Error_NoModels": {
+ "message": "モデルが見つかりません"
+ },
+ "ollama_empty_host": {
+ "message": "Ollama APIのホストアドレスが設定されていません。オプションページで設定してください。"
+ },
+ "ollama_empty_model": {
+ "message": "Ollama APIのモデルが選択されていません。オプションページで選択してください。"
+ },
+ "error_connection_interrupted": {
+ "message": "サーバーへの接続が予期せず中断されました"
+ },
+ "ollama_api_request_failed": {
+ "message": "Ollama APIリクエストが失敗しました"
+ },
+ "chatgpt_api_request_failed": {
+ "message": "OpenAI ChatGPT APIリクエストが失敗しました"
+ },
+ "WaitingServerResponse": {
+ "message": "サーバーの応答を待っています"
+ },
+ "prefs_API_Host_Info": {
+ "message": "例:"
+ },
+ "OpenAIComp_Models": {
+ "message": "OpenAI互換APIモデル"
+ },
+ "OpenAIComp_Models_Fetch": {
+ "message": "OpenAI互換APIモデルリストを更新"
+ },
+ "OpenAIComp_Models_Error_fetching": {
+ "message": "OpenAI互換APIモデルの取得中にエラー"
+ },
+ "OpenAIComp_empty_host": {
+ "message": "OpenAI互換APIのホストアドレスが設定されていません。オプションページで設定してください。"
+ },
+ "OpenAIComp_empty_model": {
+ "message": "OpenAI互換APIのモデルが選択されていません。オプションページで選択してください。"
+ },
+ "OpenAIComp_api_request_failed": {
+ "message": "OpenAI互換APIリクエストが失敗しました"
+ },
+ "prefs_OpenAIComp_ChatName": {
+ "message": "チャット名"
+ },
+ "prefs_OpenAIComp_ChatName_Info": {
+ "message": "AIチャットで使用される名前です。"
+ },
+ "StorageSpace": {
+ "message": "使用中のストレージ容量"
+ },
+ "SearchPrompt": {
+ "message": "プロンプトを検索"
+ },
+ "prefs_OptionText_dynamic_menu_force_enter": {
+ "message": "メニュー:即時プロンプト送信"
+ },
+ "prefs_OptionText_dynamic_menu_force_enter_info": {
+ "message": "チェックすると、キーボードショートカットCTRL+ALT+Aでメニューから選択したプロンプトが自動的に送信されます。チェックしない場合、プロンプト名が表示され、送信するにはEnterキーを再度押す必要があります。"
+ },
+ "prefs_OptionText_dynamic_menu_order_alphabet": {
+ "message": "メニュー:アルファベット順に並べる"
+ },
+ "prefs_OptionText_dynamic_menu_order_alphabet_info": {
+ "message": "チェックすると、メニュー内のプロンプトがアルファベット順に並べられます。"
+ },
+ "prefs_OptionText_chatgpt_win_dims_info": {
+ "message": "ウィンドウサイズを指定しない場合は0を設定してください。"
+ },
+ "prefs_OpenAIComp_API_Key": {
+ "message": "OpenAI互換APIキー"
+ },
+ "Optional": {
+ "message": "オプション"
+ },
+ "OpenChatGPTTab": {
+ "message": "ChatGPTタブを開く"
+ },
+ "OpenChatGPTTab_Info": {
+ "message": "ThunderAIウィンドウでログインの問題が発生した場合は、右のボタンで新しいタブにChatGPTを開き、ログインしてからタブを閉じ、ThunderAIの使用を続けてください。"
+ },
+ "OpenChatGPTTab_Info2": {
+ "message": "ここからChatGPT Webを開くと、モデル、プロジェクト、カスタムGPTの設定が適用されます。"
+ },
+ "placeholder_mail_text_body": {
+ "message": "メール本文"
+ },
+ "placeholder_mail_html_body": {
+ "message": "HTMLメール本文"
+ },
+ "placeholder_mail_subject": {
+ "message": "メール件名"
+ },
+ "placeholder_folder_name": {
+ "message": "フォルダー名"
+ },
+ "placeholder_folder_path": {
+ "message": "フォルダーパス"
+ },
+ "placeholder_mail_headers": {
+ "message": "メールヘッダー"
+ },
+ "placeholder_selected_text": {
+ "message": "選択テキスト"
+ },
+ "placeholder_selected_html": {
+ "message": "選択HTML"
+ },
+ "placeholder_additional_text": {
+ "message": "追加テキスト"
+ },
+ "placeholder_junk_score": {
+ "message": "迷惑メールスコア"
+ },
+ "placeholder_recipients": {
+ "message": "宛先"
+ },
+ "placeholder_cc_list": {
+ "message": "CCリスト"
+ },
+ "placeholder_author": {
+ "message": "送信者"
+ },
+ "placeholder_account_email_address": {
+ "message": "アカウントのメールアドレス"
+ },
+ "prefs_OptionText_placeholders_use_default_value": {
+ "message": "プレースホルダー:デフォルト値を使用"
+ },
+ "prefs_OptionText_placeholders_use_default_value_info": {
+ "message": "チェックすると、値が指定されていない場合にプレースホルダーにデフォルト値が入力されます。チェックしない場合、プレースホルダーはそのまま残ります。"
+ },
+ "prefs_OptionText_max_prompt_length": {
+ "message": "最大プロンプト長"
+ },
+ "prefs_OptionText_max_prompt_length_Info": {
+ "message": "プロンプトで使用できる最大文字数です。超過するとエラーメッセージが表示されます。ChatGPT Webインターフェースでは値を編集できません。チェックを無効にするには0を設定してください。"
+ },
+ "prefs_OptionText_chatgpt_web_model": {
+ "message": "ChatGPT Webモデル"
+ },
+ "prefs_OptionText_chatgpt_web_model_info": {
+ "message": "ChatGPT Webインターフェースで強制されるモデルです。指定されていないか不正な場合、Webページ上でChatGPTによりデフォルトモデルが設定されます。この設定はChatGPT無料アカウントでは機能しません。"
+ },
+ "prefs_OptionText_chatgpt_web_tempchat": {
+ "message": "ChatGPT Web一時チャット"
+ },
+ "prefs_OptionText_chatgpt_web_tempchat_info": {
+ "message": "チェックすると、ChatGPT Webインターフェースで一時チャットが使用されます。"
+ },
+ "chatgpt_btn_model": {
+ "message": "現在のモデルを使用"
+ },
+ "SendingPrompt": {
+ "message": "プロンプトを送信中..."
+ },
+ "AllowedValues": {
+ "message": "許可される値"
+ },
+ "prefs_OptionText_btnManagePrompts_infoline": {
+ "message": "追加のデータプレースホルダーを使用できます。"
+ },
+ "prefs_OptionText_openai_comp_use_v1": {
+ "message": "「v1」互換性を維持する"
+ },
+ "prefs_OptionText_openai_comp_use_v1_info": {
+ "message": "チェックすると、APIコールのパスに「v1」セグメントが維持されます(例:「http://localhost:1234/v1/chat/completions」)。"
+ },
+ "prefs_OptionText_openai_comp_info_remote": {
+ "message": "ここにリモートサーバーのアドレスも入力できます。"
+ },
+ "prefs_OptionText_owl_warning": {
+ "message": "アカウントの少なくとも1つがOwl for Exchangeアドオンを使用しているようです。ThunderbirdとOwlの間には既知の問題があり、現在対処中です。現時点では、メール作成時にはThunderAIを使用できますが、閲覧時には使用できません。"
+ },
+ "prefs_OptionText_chatgpt_web_model_tooltip": {
+ "message": "クリックして値を設定してください。"
+ },
+ "prompt_reply_full_text": {
+ "message": "以下のメールに返信してください。必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prompt_reply_additional_text": {
+ "message": "返信に件名を含めないでください。"
+ },
+ "reply_same_lang": {
+ "message": "同じ言語で返信してください。"
+ },
+ "sign_msg_as": {
+ "message": "署名名:"
+ },
+ "prompt_reply_advanced_full_text": {
+ "message": "以下のメール「{%selected_text%}」に返信してください。これはメールスレッド全体「{%mail_html_body%}」を考慮しています。必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prompt_reply_custom_command_full_text": {
+ "message": "以下のメール「{%mail_text_body%}」に返信してください。{%additional_text%}。必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prompt_rewrite_full_text": {
+ "message": "以下のテキストをより丁寧に書き直してください。書き直したテキストのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prompt_rewrite_formal_full_text": {
+ "message": "以下のテキストをよりフォーマルに書き直してください。書き直したテキストのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prompt_classify_full_text": {
+ "message": "以下のテキストを丁寧さ、温かさ、フォーマルさ、自己主張、攻撃性の観点から分類し、各カテゴリのパーセンテージを示してください。カテゴリとスコアのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prompt_summarize_this_full_text": {
+ "message": "以下のメールを箇条書きリストに要約してください。"
+ },
+ "prompt_translate_this_full_text": {
+ "message": "以下のメールを次の言語に翻訳してください:"
+ },
+ "prompt_this_full_text": {
+ "message": "必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
+ },
+ "prefs_OptionText_add_tags": {
+ "message": "メールにタグを追加"
+ },
+ "prefs_OptionText_add_tags_Info": {
+ "message": "チェックすると、メールにタグを適用するアイテムがメニューに追加されます。"
+ },
+ "prompt_add_tags": {
+ "message": "このメールにタグを追加"
+ },
+ "prompt_add_tags_full_text": {
+ "message": "以下のメールテキストを分析し、その内容を要約するタグのJSON配列を生成してください。テーマ、主要なトピック、関連する説明をタグとして使用してください。タグは簡潔でメールの内容に関連するものにしてください。\nメールテキスト:{%mail_text_body%}\nコンテキストのために以下の詳細を考慮してください:\n- 送信者:{%author%}\n- 宛先:{%recipients%}\n- CCリスト:{%cc_list%}\n- メール件名:{%mail_subject%}\nメールのテキストとコンテキストに基づいてタグを作成し、不要な情報や些細な詳細は無視してください。\nJSON形式のみで応答を生成してください。出力は追加のコメントやテキストなしのタグのJSON配列のみにしてください。使用するJSONフォーマットの例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
+ },
+ "prompt_proofread_this": {
+ "message": "このメールを校正"
+ },
+ "prompt_proofread_this_full_text": {
+ "message": "以下のメールを校正し、スペルや文法の誤りを修正してください。修正したテキストのみで、余分なコメントや他のテキストなしで返信してください。\n\n「{%mail_typed_text%}」"
+ },
+ "placeholder_tags_current_email": {
+ "message": "メールタグ"
+ },
+ "placeholder_tags_full_list": {
+ "message": "既存のタグ"
+ },
+ "prefs_OptionText_add_tags_maxnum": {
+ "message": "最大タグ数"
+ },
+ "prefs_OptionText_add_tags_maxnum_Info": {
+ "message": "AIが提案するタグの最大数。タグ数を制限しない場合は0を設定してください。"
+ },
+ "prompt_add_tags_maxnum": {
+ "message": "タグ数を次に制限:"
+ },
+ "prefs_OptionText_add_tags_hide_exclusions": {
+ "message": "除外タグを非表示"
+ },
+ "prefs_OptionText_add_tags_hide_exclusions_Info": {
+ "message": "チェックすると、除外リストにあるタグが確認ダイアログで非表示になります。"
+ },
+ "prefs_OptionText_btnManageTagsInfo": {
+ "message": "タグ設定を管理"
+ },
+ "AddTags_PageTitle": {
+ "message": "タグ設定の管理"
+ },
+ "AddTags_info_default": {
+ "message": "このページでは、メールにタグを追加するためのデフォルトプロンプトの変更と除外リストの管理ができます。"
+ },
+ "AddTags_prompt_text_title": {
+ "message": "現在のプロンプトテキスト"
+ },
+ "AddTags_excl_list_title": {
+ "message": "除外リスト"
+ },
+ "AddTags_excl_list_infoline": {
+ "message": "メールに追加できないタグのリストです。"
+ },
+ "save": {
+ "message": "保存"
+ },
+ "addtags_info_additional_statements": {
+ "message": "この文はプロンプトの最後に追加されます:"
+ },
+ "reset_default": {
+ "message": "デフォルトにリセット"
+ },
+ "reset": {
+ "message": "リセット"
+ },
+ "addtags_excl_list_infoline2": {
+ "message": "1行に1語、またはカンマ区切りで追加してください。"
+ },
+ "addtags_dialog_title": {
+ "message": "メールにタグを追加"
+ },
+ "addtags_exclude_tag": {
+ "message": "タグを除外"
+ },
+ "addtags_no_tags_received": {
+ "message": "AIからタグを受信できませんでした。"
+ },
+ "addtags_no_valid_tags": {
+ "message": "除外リストでフィルタリング後、有効なタグが見つかりませんでした。"
+ },
+ "thunderai_error_title": {
+ "message": "ThunderAI エラー"
+ },
+ "thunderai_warning_title": {
+ "message": "ThunderAI 警告"
+ },
+ "prefs_OptionText_add_tags_first_uppercase": {
+ "message": "最初の文字を大文字に"
+ },
+ "prefs_OptionText_add_tags_first_uppercase_Info": {
+ "message": "チェックすると、タグのラベルは最初の文字のみ大文字で、残りは小文字になります。"
+ },
+ "AddTags_prompt_prefs_title": {
+ "message": "タグ追加オプション"
+ },
+ "prefs_SurveyLinkText": {
+ "message": "フィードバックを共有してThunderAIの改善にご協力ください!"
+ },
+ "prefs_SurveyLinkText2": {
+ "message": "ここをクリック、1分で完了!"
+ },
+ "prefs_OpenAIComp_ForceModel": {
+ "message": "モデルを手動で入力"
+ },
+ "OpenAIComp_force_model_ask": {
+ "message": "使用するモデル名をここに入力してください。"
+ },
+ "prefs_OptionText_add_tags_force_lang": {
+ "message": "言語を強制する"
+ },
+ "prefs_OptionText_add_tags_force_lang_Info": {
+ "message": "チェックすると、タグの言語がThunderAIオプションページで指定された言語に強制されます。"
+ },
+ "prompt_add_tags_force_lang": {
+ "message": "タグは次の言語で書く必要があります:"
+ },
+ "prefs_Connection_type_Google_Gemini_API": {
+ "message": "Google Gemini API"
+ },
+ "prefs_GoogleGemini_API_Key": {
+ "message": "APIキー"
+ },
+ "GoogleGemini_Models": {
+ "message": "Google Gemini APIモデル"
+ },
+ "GoogleGemini_Models_Fetch": {
+ "message": "Google Geminiモデルリストを更新"
+ },
+ "GoogleGemini_Models_Error_fetching": {
+ "message": "Google Geminiモデルの取得中にエラー"
+ },
+ "google_gemini_api_request_failed": {
+ "message": "Google Gemini APIリクエストが失敗しました"
+ },
+ "google_gemini_empty_apikey": {
+ "message": "Google Gemini APIのAPIキーが設定されていません。オプションページで設定してください。"
+ },
+ "google_gemini_empty_model": {
+ "message": "Google Gemini APIのモデルが選択されていません。オプションページで選択してください。"
+ },
+ "GoogleGemini_SystemInstruction": {
+ "message": "システム指示"
+ },
+ "GoogleGemini_SystemInstruction_Info": {
+ "message": "システム指示を設定すると、モデルにタスクを理解するための追加コンテキストを提供し、よりカスタマイズされた応答を提供し、送信されるプロンプトに対して特定のガイドラインに従わせることができます。"
+ },
+ "ChatGPT_Developer_Messages": {
+ "message": "開発者メッセージ"
+ },
+ "ChatGPT_Developer_Messages_Info": {
+ "message": "開発者メッセージを設定すると、モデルにタスクを理解するための追加コンテキストを提供し、よりカスタマイズされた応答を提供し、送信されるプロンプトに対して特定のガイドラインに従わせることができます。"
+ },
+ "prefs_OptionText_btnManagePrompts_infoline3": {
+ "message": "プロンプトで{%tags_full_list%}データプレースホルダーを使用して、使用可能なタグをリストできます。適切なプロンプトを使用すると、既存のタグリストからのみタグを選択させることができます。"
+ },
+ "placeholder_mail_typed_text": {
+ "message": "引用メール本文の前に入力されたテキスト"
+ },
+ "placeholder_mail_quoted_text": {
+ "message": "メール本文の引用テキスト"
+ },
+ "prompt_get_calendar_event": {
+ "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テキスト:「{%selected_text%}」"
+ },
+ "prompt_get_task": {
+ "message": "新しいタスクを追加"
+ },
+ "prompt_get_task_full_text": {
+ "message": "以下のテキストからタスクを生成するために必要なすべての関連詳細を抽出してください。抽出情報には以下を含めてください:\n- 期限日時(指定されている場合はタイムゾーンを含む)\n- タスクの概要\n- 開始日時(指定されている場合はタイムゾーンを含む)\nデータはタスクの作成に直接使用できるよう、明確かつ一貫した形式にしてください。\n相対的な時間参照がある場合、メールの日時は「{%mail_datetime%}」であることを考慮してください。この参照に基づいて開始日時を計算してください。計算された開始日時が「{%current_datetime%}」より前の場合、「{%current_datetime%}」を基準として開始日時を再計算してください。\n必要な情報の1つ以上を取得できない場合は、空の文字列で応答してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式:\n{\n\"InitialDate\": \"YYYYMMDDTHHMMSS\",\n\"dueDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"タスクの概要をここに\"\n}\n日付に関する情報がない場合は、それらを削除してください。\nテキスト:「{%selected_text%}」"
+ },
+ "prefs_OptionText_get_calendar_event": {
+ "message": "選択テキストから新しいカレンダーイベントを追加"
+ },
+ "prefs_OptionText_get_calendar_event_Info": {
+ "message": "チェックすると、選択テキストからカレンダーイベント情報を取得するアイテムがメニューに追加されます。"
+ },
+ "get_calendar_event_prompt_prefs_title": {
+ "message": "カレンダーイベントオプション"
+ },
+ "prefs_OptionText_get_task": {
+ "message": "選択テキストから新しいタスクを追加"
+ },
+ "prefs_OptionText_get_task_Info": {
+ "message": "チェックすると、選択テキストからタスク情報を取得するアイテムがメニューに追加されます。"
+ },
+ "get_task_prompt_prefs_title": {
+ "message": "タスクオプション"
+ },
+ "Select_your_timezone": {
+ "message": "タイムゾーンを選択"
+ },
+ "prefs_OptionText_calendar_enforce_timezone": {
+ "message": "指定したタイムゾーンを強制"
+ },
+ "prefs_OptionText_calendar_enforce_timezone_Info": {
+ "message": "チェックすると、指定したタイムゾーンがカレンダーイベントとタスクに強制されます。"
+ },
+ "prefs_OptionText_btnManageCalendarEventInfo": {
+ "message": "カレンダーイベント設定を管理"
+ },
+ "GetCalendarEvent_PageTitle": {
+ "message": "カレンダーイベント設定の管理"
+ },
+ "GetCalendarEvent_info_default": {
+ "message": "このページでは、選択テキストからカレンダーイベントを取得するためのデフォルトプロンプトを変更できます。"
+ },
+ "GetCalendarEvent_prompt_text_title": {
+ "message": "現在のプロンプトテキスト"
+ },
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
+ "message": "プロンプトは自由に変更できますが、AIからの応答はデフォルトプロンプトで指定されたJSON形式である必要があります!"
+ },
+ "prefs_OptionText_get_calendar_event_Sparks_not_present": {
+ "message": "カレンダーイベントとタスク機能を使用するには、ThunderAI Sparksアドオンをインストールしてください。"
+ },
+ "prefs_OptionText_get_calendar_event_Sparks_wrong_version": {
+ "message": "カレンダーイベントとタスク機能を使用するには、ThunderAI Sparksアドオンの更新版をインストールしてください。"
+ },
+ "GetTask_PageTitle": {
+ "message": "タスク設定の管理"
+ },
+ "GetTask_info_default": {
+ "message": "このページでは、選択テキストからタスクを取得するためのデフォルトプロンプトを変更できます。"
+ },
+ "prefs_OptionText_btnManageTaskInfo": {
+ "message": "タスク設定を管理"
+ },
+ "prefs_OptionText_download_now": {
+ "message": "今すぐThunderAI Sparksをダウンロード!"
+ },
+ "placeholder_mail_datetime": {
+ "message": "メールの日時"
+ },
+ "placeholder_current_datetime": {
+ "message": "現在の日時"
+ },
+ "calendar_getting_data_error": {
+ "message": "カレンダーイベントデータの取得エラー"
+ },
+ "calendar_opening_dialog_error": {
+ "message": "カレンダーイベントダイアログを開く際のエラー"
+ },
+ "task_getting_data_error": {
+ "message": "タスクデータの取得エラー"
+ },
+ "task_opening_dialog_error": {
+ "message": "タスクダイアログを開く際のエラー"
+ },
+ "no_valid_data_received": {
+ "message": "AIから有効なデータを受信できませんでした。"
+ },
+ "prefs_OptionText_add_tags_auto": {
+ "message": "タグを自動追加"
+ },
+ "prefs_OptionText_add_tags_auto_Info": {
+ "message": "チェックすると、AIが新着メールに自動的にタグを追加します。"
+ },
+ "prefs_OptionText_add_tags_auto_Info2": {
+ "message": "このページの下部で、この機能を有効にするアカウントを選択してください。"
+ },
+ "prefs_OptionText_add_tags_auto_force_existing": {
+ "message": "既存のタグを強制"
+ },
+ "prefs_OptionText_add_tags_auto_force_existing_Info": {
+ "message": "チェックすると、AIは既存のタグのみを追加し、新しいタグは作成しません。"
+ },
+ "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": "リストには少なくとも1つのタグが必要です。1行に1タグ、またはカンマ区切りで追加してください。"
+ },
+ "prompt_add_tags_use_list": {
+ "message": "このカンマ区切りリストのタグのみを使用"
+ },
+ "prefs_OptionText_add_tags_auto_only_inbox": {
+ "message": "受信トレイのメールにのみタグを追加"
+ },
+ "prefs_OptionText_add_tags_auto_only_inbox_Info": {
+ "message": "チェックすると、AIは受信トレイフォルダーで受信したメールにのみタグを追加します。"
+ },
+ "prefs_OptionText_add_tags_use_specific_integration_Info": {
+ "message": "チェックすると、ThunderAIオプションページで選択されたものに関わらず、以下で指定されたモデルとAPIがメールへのタグ追加に使用されます。"
+ },
+ "placeholder_thunderai_def_sign": {
+ "message": "ThunderAIオプションで定義されたデフォルトの署名。"
+ },
+ "thunderai_def_lang": {
+ "message": "ThunderAIオプションで定義されたデフォルト言語。"
+ },
+ "placeholder_mail_attachments_info": {
+ "message": "メール内の添付ファイルに関する情報"
+ },
+ "empty": {
+ "message": "このプレースホルダーはテキストを追加しませんが、メール本文がプロンプトの最後に自動的に追加されるのを防ぎます。"
+ },
+ "prefs_OptionText_spamfilter": {
+ "message": "自動スパムフィルター"
+ },
+ "prefs_OptionText_spamfilter_Info": {
+ "message": "チェックすると、ThunderAIがスパムメールを自動的にスパムフォルダーに移動します。"
+ },
+ "prefs_OptionText_btnManageSpamFilterInfo": {
+ "message": "スパムフィルター設定を管理"
+ },
+ "SpamFilter_PageTitle": {
+ "message": "スパムフィルター設定の管理"
+ },
+ "SpamFilter_info_default": {
+ "message": "このページでは、スパムメールを検出するためのデフォルトプロンプトを変更できます。"
+ },
+ "SpamFilter_prompt_text_title": {
+ "message": "現在のプロンプトテキスト"
+ },
+ "prompt_spamfilter": {
+ "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%}」"
+ },
+ "SpamFilter_prompt_prefs_title": {
+ "message": "スパムフィルターオプション"
+ },
+ "prefs_OptionText_use_specific_integration": {
+ "message": "特定のモデルとAPIを使用"
+ },
+ "prefs_OptionText_spamfilter_use_specific_integration_Info": {
+ "message": "チェックすると、ThunderAIオプションページで選択されたものに関わらず、以下で指定されたモデルとAPIがスパムフィルターに使用されます。"
+ },
+ "prefs_OptionText_spamfilter_threshold": {
+ "message": "スパムしきい値"
+ },
+ "prefs_OptionText_spamfilter_threshold_Info": {
+ "message": "AIが返す値がこのしきい値を超えた場合、メールはスパムフォルダーに移動されます。"
+ },
+ "spamfilter_threshold_too_low": {
+ "message": "スパムしきい値が低すぎます!多くのメールがスパムと判定される可能性があります!"
+ },
+ "spamfilter_threshold_zero": {
+ "message": "スパムしきい値がゼロです!すべてのメールがスパムと判定されます!"
+ },
+ "spamfilter_no_reports": {
+ "message": "まだスパムスクリーニングされたメッセージはありません。ここには現在のセッションの最新100件のスパムレポートが表示されます。"
+ },
+ "SpamReport_Title": {
+ "message": "スパムフィルターレポート"
+ },
+ "Date": {
+ "message": "日付"
+ },
+ "From": {
+ "message": "送信者"
+ },
+ "Subject": {
+ "message": "件名"
+ },
+ "Spam_Value": {
+ "message": "スパム値"
+ },
+ "Moved_to_Spam": {
+ "message": "スパムに移動"
+ },
+ "Explanation": {
+ "message": "説明"
+ },
+ "Report_Date": {
+ "message": "レポート日"
+ },
+ "yes_string": {
+ "message": "はい"
+ },
+ "no_string": {
+ "message": "いいえ"
+ },
+ "context_menu_mzta-add-tags": {
+ "message": "タグを追加"
+ },
+ "context_menu_mzta-spamfilter": {
+ "message": "スパムを分析"
+ },
+ "noActiveCalendar": {
+ "message": "編集可能なカレンダーが見つかりません!"
+ },
+ "btn_show_differences": {
+ "message": "差分を表示"
+ },
+ "chatgpt_win_diff_title": {
+ "message": "元のテキストと変更後のテキストの差分"
+ },
+ "apiwebchat_you": {
+ "message": "あなた"
+ },
+ "apiwebchat_info": {
+ "message": "情報"
+ },
+ "apiwebchat_error": {
+ "message": "エラー"
+ },
+ "apiwebchat_use_this_answer": {
+ "message": "この回答を使用"
+ },
+ "apiwebchat_stopping": {
+ "message": "停止中"
+ },
+ "apiwebchat_receiving_data": {
+ "message": "データ受信中"
+ },
+ "hyprland_warning": {
+ "message": "AIチャットウィンドウを開く際に問題が発生した場合は、高さと幅の値を0に設定してみてください。この問題は、Hyprlandを使用している場合など、特定の環境のLinuxで発生することがあります。"
+ },
+ "remember_CORS": {
+ "message": "サーバーでCORS設定を行う必要があることを忘れないでください!"
+ },
+ "maybe_CORS_openai_comp": {
+ "message": "OpenAI互換APIを使用するには、サーバーでCORS設定が必要な場合があります。"
+ },
+ "CORS_alternative_1": {
+ "message": "CORS設定に問題がありますか?"
+ },
+ "prefs_OptionText_composing_plain_text": {
+ "message": "プレーンテキストで作成"
+ },
+ "prefs_OptionText_composing_plain_text_Info": {
+ "message": "メールをプレーンテキスト形式で作成している場合は、このオプションをチェックしてください。"
+ },
+ "Replace_No_Selected_Text": {
+ "message": "テキストが選択されていません。AIの応答をメールの先頭に挿入しますか?"
+ },
+ "prefs_ollama_num_ctx": {
+ "message": "コンテキストトークン数"
+ },
+ "prefs_ollama_num_ctx_Info": {
+ "message": "Ollama APIで使用するコンテキストトークンの数。サーバーにパラメーターとして渡したくない場合は0を設定してください。"
+ },
+ "ask_chatgptweb_permission_1": {
+ "message": "ChatGPT Web連携を使用するには、必要な権限を付与する必要があります。"
+ },
+ "ask_anthropic_api_permission_1": {
+ "message": "Claude API連携を使用するには、必要な権限を付与する必要があります。"
+ },
+ "ask_openai_api_permission_1": {
+ "message": "OpenAI API連携を使用するには、必要な権限を付与する必要があります。"
+ },
+ "ask_integration_permission_2_popup": {
+ "message": "ここをクリックして新しいタブを開き、指示に従ってください。"
+ },
+ "ask_integration_permission_2": {
+ "message": "ここをクリックして続行してください。"
+ },
+ "ask_integration_permission_ok": {
+ "message": "権限が付与されました。ここをクリックしてこのタブを閉じ、メインウィンドウに戻ることができます。"
+ },
+ "AccountSelector_AutoTags": {
+ "message": "自動タグ付けを有効にするアカウントを選択"
+ },
+ "AccountSelector_AutoTags_infoline": {
+ "message": "各変更は即座に保存されます。"
+ },
+ "AccountSelector_Spamfilter": {
+ "message": "スパムフィルターを有効にするアカウントを選択"
+ },
+ "prefs_OptionText_chatgpt_web_project": {
+ "message": "ChatGPT Webプロジェクト"
+ },
+ "prefs_OptionText_chatgpt_web_project_info": {
+ "message": "ChatGPT Webインターフェースで強制されるプロジェクトです。"
+ },
+ "prefs_OptionText_chatgpt_web_custom_gpt": {
+ "message": "ChatGPT WebカスタムGPT"
+ },
+ "prefs_OptionText_chatgpt_web_custom_gpt_info": {
+ "message": "ChatGPT Webインターフェースで強制されるカスタムGPTです。"
+ },
+ "prefs_OptionText_chatgpt_web_custom_data_info": {
+ "message": "次の形式である必要があります:"
+ },
+ "prefs_OptionText_chatgpt_web_custom_data_info2": {
+ "message": "関連するChatGPTページを開いたときに、ブラウザのURLフィールドで正しい値を確認できます。"
+ },
+ "customPrompts_Properties": {
+ "message": "プロパティ"
+ },
+ "customPrompts_show_additional_info": {
+ "message": "追加プロパティを表示"
+ },
+ "customPrompts_hide_additional_info": {
+ "message": "追加プロパティを非表示"
+ },
+ "customPrompts_show_additional_info_show": {
+ "message": "追加プロパティ"
+ },
+ "prefs_OptionText_CustomGPT_Warn": {
+ "message": "オプションまたはプロンプトでプロジェクトが指定されている場合、カスタムGPT設定が上書きされます。"
+ },
+ "prefs_OptionText_Project_No_temporary_chat_warn": {
+ "message": "オプションまたはプロンプトでプロジェクトが指定されている場合、一時チャットは使用されません。"
+ },
+ "prefs_Anthropic_API_Key": {
+ "message": "Claude APIキー"
+ },
+ "prefs_Connection_type_Anthropic_API": {
+ "message": "Claude API"
+ },
+ "Anthropic_Models": {
+ "message": "Claudeモデル"
+ },
+ "Anthropic_Models_Fetch": {
+ "message": "Claudeモデルリストを更新"
+ },
+ "Anthropic_Models_Error_fetching": {
+ "message": "Claudeモデルの取得中にエラー"
+ },
+ "Anthropic_Version": {
+ "message": "Claude APIバージョン"
+ },
+ "Anthropic_Version_Info": {
+ "message": "必須。何をしているか分からない限り、この値を変更しないでください。詳細:"
+ },
+ "prefs_OptionText_anthropic_max_tokens": {
+ "message": "最大トークン数"
+ },
+ "prefs_OptionText_anthropic_max_tokens_Info": {
+ "message": "補完で生成するトークンの最大数。プロンプトのトークン数とmax_tokensの合計は、モデルのコンテキスト長を超えることはできません。"
+ },
+ "anthropic_empty_apikey": {
+ "message": "Claude APIのAPIキーが設定されていません。オプションページで設定してください。"
+ },
+ "anthropic_empty_model": {
+ "message": "Claude APIのモデルが選択されていません。オプションページで選択してください。"
+ },
+ "anthropic_empty_version": {
+ "message": "Claude APIのバージョン文字列が設定されていません。オプションページで設定してください。"
+ },
+ "anthropic_api_request_failed": {
+ "message": "Claude APIリクエストが失敗しました"
+ },
+ "_api_connecting": {
+ "message": "$api_string$に以下の設定で接続を試みています...",
+ "placeholders": {
+ "api_string": {
+ "content": "$1"
+ }
+ }
+ },
+ "_api_connecting_model": {
+ "message": "モデル"
+ },
+ "_api_connecting_host": {
+ "message": "ホスト"
+ },
+ "_api_connecting_version": {
+ "message": "バージョン"
+ },
+ "prefs_OpenAIComp_AvailableServices": {
+ "message": "利用可能なサービス"
+ },
+ "prefs_OpenAIComp_AvailableServices_Info": {
+ "message": "OpenAI互換APIで利用可能なサービスから1つを選択するか、手動で入力してください。"
+ },
+ "Custom": {
+ "message": "カスタム"
+ },
+ "OpenAIComp_Configs_ConfirmApply": {
+ "message": "設定「$config_name$」を適用してもよろしいですか?",
+ "placeholders": {
+ "config_name": {
+ "content": "$1"
+ }
+ }
+ },
+ "apiwebchat_selection_info": {
+ "message": "テキストを選択すると、その部分のみが考慮されます。"
+ },
+ "ChatGPT_chatgpt_api_store": {
+ "message": "ストレージを使用"
+ },
+ "ChatGPT_chatgpt_api_store_info": {
+ "message": "チェックすると、チャットがOpenAIに保存されます。"
+ },
+ "prefs_chatgpt_api_temperature_Info": {
+ "message": "使用するサンプリング温度(0から2の間)。0.8のような高い値は出力をよりランダムにし、0.2のような低い値はより集中的で決定論的にします。"
+ },
+ "prefs_ollama_temperature_Info": {
+ "message": "モデルの温度。温度を上げると、モデルはより創造的に回答します。デフォルト値は0.8です。0から1の間の値を使用することをお勧めします。"
+ },
+ "prefs_ollama_think": {
+ "message": "思考を有効にする"
+ },
+ "prefs_ollama_think_Info": {
+ "message": "チェックすると、モデルは回答前に思考します。このオプションは「think」機能をサポートするモデルでのみ機能します。"
+ },
+ "chatgpt_win_change_reply_type": {
+ "message": "クリックして返信タイプを変更"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match": {
+ "message": "除外の完全一致"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match_Info": {
+ "message": "チェックすると、除外リストの単語がタグと完全に一致した場合のみ除外されます。チェックしない場合、タグに含まれている場合も一致します。"
+ },
+ "customDataPH_manageDataPH": {
+ "message": "データプレースホルダーを管理"
+ },
+ "customDataPH_manageDataPH_info_default_3": {
+ "message": "カスタムプロンプトを作成するときと同様に、オートコンプリートでデフォルトのデータプレースホルダーを使用することもできます。"
+ },
+ "customDataPH_manageDataPH_info_default": {
+ "message": "このページでは、カスタムプロンプトで使用するカスタムデータプレースホルダーを定義できます。"
+ },
+ "customDataPH_manageDataPH_info_default_2": {
+ "message": "同じIDの既存のデータプレースホルダーは上書きされます。新しいIDのプレースホルダーは追加されます。"
+ },
+ "customDataPH_ExportAll": {
+ "message": "すべてのカスタムデータプレースホルダーをエクスポート"
+ },
+ "customDataPH_Import": {
+ "message": "新しいデータプレースホルダーをインポート"
+ },
+ "customDataPH_form_label_Text": {
+ "message": "データプレースホルダーテキスト"
+ },
+ "customDataPH_saving_custom": {
+ "message": "カスタムデータプレースホルダーを保存中..."
+ },
+ "customDataPH_saved": {
+ "message": "カスタムデータプレースホルダーを保存しました!"
+ },
+ "customDataPH_btnAddNewCommit": {
+ "message": "データプレースホルダーを追加"
+ },
+ "importCustomDataPH_confirmText": {
+ "message": "新しいカスタムデータプレースホルダーをインポートしようとしています。"
+ },
+ "importCustomDataPH_start_import": {
+ "message": "カスタムデータプレースホルダーのインポートを開始中..."
+ },
+ "importCustomDataPH_import_completed": {
+ "message": "カスタムデータプレースホルダーのインポートが完了しました!「すべて保存」ボタンをクリックして変更を保存してください。"
+ },
+ "importCustomDataPH_invalidFile": {
+ "message": "インポートしようとしているファイルは有効なカスタムデータプレースホルダーファイルではありません。"
+ },
+ "importCustomDataPH_invalidDataPHs": {
+ "message": "インポートしようとしているファイルには有効なカスタムデータプレースホルダーが含まれていません。"
+ },
+ "customDataPH_add_to_menu": {
+ "message": "メニューに追加されたプロンプトで使用可能"
+ },
+ "prefs_OptionText_chatgpt_web_br_replace_info": {
+ "message": "AIの応答に含まれる
タグは改行に置換されます。"
+ },
+ "prefs_OpenAIComp_ClearModelsList": {
+ "message": "モデルリストをクリア"
+ },
+ "OpenAIComp_ClearModelsList_Confirm": {
+ "message": "モデルリストをクリアしてもよろしいですか?この操作は元に戻せません。"
+ },
+ "prefs_api_temperature": {
+ "message": "温度"
+ },
+ "prefs_openai_comp_temperature_Info": {
+ "message": "使用するサンプリング温度(0から2の間)。0.8のような高い値は出力をよりランダムにし、0.2のような低い値はより集中的で決定論的にします。"
+ },
+ "chatgpt_click_force_completion": {
+ "message": "ChatGPTが完了したかどうかを確認できないようです。ここをクリックしてジョブの完了を強制してください。"
+ },
+ "warn_API_needed": {
+ "message": "この機能を使用するには、ChatGPT Web連携ではなくAPI連携が必要です。上のチェックボックスをチェックしてから左のボタンをクリックすると、機能設定ページで特定のAPIを定義できます。"
+ },
+ "prefs_google_gemini_thinking_budget": {
+ "message": "思考バジェット"
+ },
+ "prefs_google_gemini_thinking_budget_Info": {
+ "message": "思考に使用するトークン数を定義します。選択したモデルが思考をサポートしていない場合、またはデフォルトの方法を使用したい場合は、このフィールドを空白のままにしてください。思考を無効にするには0を、動的思考を有効にするには-1を入力してください。"
+ },
+ "prefs_google_gemini_temperature_Info": {
+ "message": "このパラメーターは0.0から2.0の間の数値である必要があります。出力のランダム性を制御します。デフォルト値はモデルによって異なります。APIコールでパラメーターを設定しない場合は空のままにしてください。"
+ },
+ "SelectAll": {
+ "message": "すべて選択"
+ },
+ "DeselectAll": {
+ "message": "すべて解除"
+ },
+ "Anthropic_System_Prompt": {
+ "message": "システムプロンプト"
+ },
+ "Anthropic_System_Prompt_Info": {
+ "message": "システムプロンプトを使用してClaudeに役割を与えることで、パフォーマンスを向上させることができます。ロールプロンプティングと呼ばれるこの技術は、Claudeでシステムプロンプトを使用する最も強力な方法です。適切な役割により、Claudeを一般的なアシスタントから仮想的な専門家に変えることができます。"
+ },
+ "prefs_anthropic_temperature_Info": {
+ "message": "応答に注入されるランダム性の量。デフォルトは1.0。0.0から1.0の範囲。分析的/多肢選択には0.0に近い値を、創造的で生成的なタスクには1.0に近い値を使用してください。温度が0.0でも、結果は完全に決定論的にはなりません。"
+ },
+ "Optional_Permission_Denied_Model_Fetching": {
+ "message": "この連携のモデルを取得するために必要なオプション権限が拒否されました。"
+ }
+}
diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json
index 88650f76..8a6b424b 100644
--- a/_locales/pl/messages.json
+++ b/_locales/pl/messages.json
@@ -327,9 +327,6 @@
"chagpt_api_send_button": {
"message": "Używając modelu"
},
- "chagpt_api_connecting": {
- "message": "Próba połączenia z OpenAI ChatGPT przy użyciu podanego klucza API"
- },
"Debug": {
"message": "Debugowanie"
},
@@ -363,12 +360,6 @@
"ollama_empty_model": {
"message": "Nie wybrałeś modelu dla API Ollama. Proszę wybierz jeden na stronie opcji."
},
- "ollama_api_connecting": {
- "message": "Próba połączenia z lokalnym serwerem Ollama używając hosta"
- },
- "andModel": {
- "message": "i modelu"
- },
"error_connection_interrupted": {
"message": "Połączenie z serwerem zostało nieoczekiwanie przerwane"
},
@@ -399,9 +390,6 @@
"OpenAIComp_empty_model": {
"message": "Nie wybrałeś modelu dla API kompatybilnego z OpenAI. Proszę wybierz jeden na stronie opcji."
},
- "OpenAIComp_api_connecting": {
- "message": "Próba połączenia z lokalnym serwerem API kompatybilnym z OpenAI używając hosta"
- },
"OpenAIComp_api_request_failed": {
"message": "Zapytanie do API kompatybilnego z OpenAI nie powiodło się"
},
@@ -672,9 +660,6 @@
"google_gemini_api_request_failed": {
"message": "Połączenie do interfejsu API Google Gemini nie powiodło się"
},
- "google_gemini_api_connecting": {
- "message": "Próba połączenia z Google Gemini przy użyciu dostarczonego klucza API"
- },
"google_gemini_empty_apikey": {
"message": "Nie dodałeś klucza API dla API Google Gemini. Wstaw go na stronie opcji."
},
@@ -792,15 +777,12 @@
"Moved_to_Spam": {
"message": "Przeniesiono do spamu"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Nie"
},
"prefs_OptionText_add_tags_auto_force_existing_Info": {
"message": "Jeśli zaznaczone, AI doda tylko istniejące tagi do nowo odebranych e-maili i nie utworzy nowych."
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks nie zainstalowany!"
- },
"SpamFilter_info_default": {
"message": "Na tej stronie możesz edytować domyślny prompt używany do wykrywania e-maili spamowych."
},
@@ -813,7 +795,7 @@
"prefs_OptionText_btnManageSpamFilterInfo": {
"message": "Zarządzaj ustawieniami filtra spamu"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Tak"
},
"prefs_OptionText_spamfilter": {
diff --git a/_locales/pt-br/messages.json b/_locales/pt-br/messages.json
index a27d6a8c..1781c7fe 100644
--- a/_locales/pt-br/messages.json
+++ b/_locales/pt-br/messages.json
@@ -327,9 +327,6 @@
"chagpt_api_send_button": {
"message": "Usando modelo"
},
- "chagpt_api_connecting": {
- "message": "Tentando conectar ao OpenAI ChatGPT usando a chave de API fornecida"
- },
"Debug": {
"message": "Depurar"
},
@@ -363,12 +360,6 @@
"ollama_empty_model": {
"message": "Você não escolheu um modelo para a API do Ollama. Por favor, escolha um na página de opções."
},
- "ollama_api_connecting": {
- "message": "Tentando conectar ao servidor local do Ollama usando o host"
- },
- "andModel": {
- "message": "e modelo"
- },
"error_connection_interrupted": {
"message": "A conexão com o servidor foi interrompida inesperadamente"
},
@@ -399,9 +390,6 @@
"OpenAIComp_empty_model": {
"message": "Você não escolheu um modelo para a API Compatível com OpenAI. Por favor, escolha um na página de opções."
},
- "OpenAIComp_api_connecting": {
- "message": "Tentando conectar ao Servidor Local da API Compatível com OpenAI usando o host"
- },
"OpenAIComp_api_request_failed": {
"message": "Solicitação da API Comp do OpenAI falhou"
},
@@ -681,9 +669,6 @@
"google_gemini_api_request_failed": {
"message": "A solicitação para a API Google Gemini falhou"
},
- "google_gemini_api_connecting": {
- "message": "Tentando conectar ao Google Gemini usando a chave API fornecida"
- },
"google_gemini_empty_apikey": {
"message": "Você não adicionou uma chave API para a API Google Gemini. Por favor, insira uma na página de opções."
},
@@ -795,12 +780,9 @@
"Moved_to_Spam": {
"message": "Movido para spam"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Não"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks não instalado!"
- },
"prefs_OptionText_btnManageSpamFilterInfo": {
"message": "Gerenciar configurações do filtro de spam"
},
@@ -810,7 +792,7 @@
"prefs_OptionText_spamfilter_Info": {
"message": "Se marcado, o ThunderAI moverá automaticamente e-mails de spam para a pasta de spam."
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Sim"
},
"SpamReport_Title": {
diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json
index 6f93f42b..bc956a41 100644
--- a/_locales/ru/messages.json
+++ b/_locales/ru/messages.json
@@ -920,10 +920,10 @@
"Report_Date": {
"message": "Дата отчета"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Да"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Нет"
},
"context_menu_mzta-add-tags": {
@@ -932,18 +932,6 @@
"context_menu_mzta-spamfilter": {
"message": "Анализ на предмет спама"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Показать пункт меню \"Добавить теги\""
- },
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Если флажок установлен, пункт контекстного меню \"Добавить теги\" будет отображаться при щелчке ПКМ на письме в списке сообщений."
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Показать пункт контекстного меню \"Анализировать на предмет спама\""
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Если флажок установлен, пункт контекстного меню \"Анализировать на спам\" будет отображаться при щелчке ПКМ на письме в списке сообщений."
- },
"noActiveCalendar": {
"message": "Редактируемый календарь не найден!"
},
@@ -983,12 +971,6 @@
"CORS_alternative_1": {
"message": "Проблемы с настройкой CORS?"
},
- "CORS_alternative_2": {
- "message": "Нажмите кнопку ниже, чтобы дать разрешение во избежание проблем с CORS."
- },
- "CORS_give_allurls_perm": {
- "message": "Дайте разрешение на \"все URL-адреса\""
- },
"prefs_OptionText_composing_plain_text": {
"message": "Сочинение обычного текста"
},
diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json
index 62a270e6..5ac9445f 100644
--- a/_locales/sv/messages.json
+++ b/_locales/sv/messages.json
@@ -815,10 +815,10 @@
"Report_Date": {
"message": "Rapportdatum"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "Ja"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "Nej"
},
"context_menu_mzta-add-tags": {
@@ -827,18 +827,6 @@
"context_menu_mzta-spamfilter": {
"message": "Analysera för skräppost"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "Visa snabbmenyn \"Lägg till taggar\""
- },
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "Om markerat visas snabbmenyn \"Lägg till taggar\" när du högerklickar på ett e-postmeddelande i meddelandelistan."
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "Visa snabbmenyalternativet \"Analysera för skräppost\""
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "Om markerat visas snabbmenyn \"Analysera för skräppost\" när du högerklickar på ett e-postmeddelande i meddelandelistan."
- },
"noActiveCalendar": {
"message": "Ingen redigerbar kalender hittades!"
},
@@ -878,9 +866,6 @@
"CORS_alternative_1": {
"message": "Problem med att ställa in CORS?"
},
- "CORS_alternative_2": {
- "message": "Tryck på knappen nedan för att ge behörighet för att undvika eventuella CORS-problem."
- },
"customPrompts_Properties": {
"message": "Egenskaper"
},
@@ -1320,7 +1305,70 @@
"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\": ,\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%}\""
},
- "CORS_give_allurls_perm": {
- "message": "Ge behörighet för \"alla webbadresser\""
+ "Summarize_prompt_prefs_title": {
+ "message": "Lägg till sammanfattningsalternativ"
+ },
+ "prompt_summarize": {
+ "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."
+ },
+ "prompt_summarize_email_template": {
+ "message": "Sammanfattningsmall för e-post"
+ },
+ "prompt_summarize_email_template_full_text": {
+ "message": "Från: {%author%}\nTill: {%recipients%}\nCC: {%cc_list%}\nÄmne: {%mail_subject%}\nDatum: {%mail_datetime%}\nBilagor:\n{%mail_attachments_info%}\n\nBrödtext:\n{%mail_text_body%}"
+ },
+ "prompt_summarize_email_separator": {
+ "message": "E-postavgränsare"
+ },
+ "prompt_summarize_email_separator_full_text": {
+ "message": "\n\n---------- NÄSTA E-POST ----------\n\n"
+ },
+ "prefs_OptionText_Summarize_infoline2": {
+ "message": "Du kan ändra prompten som du vill, det första fältet är huvudprompten, det andra fältet är mallen för ett enskilt e-postmeddelande. Listan över e-postmeddelanden kommer att läggas till i huvudprompten. E-postmeddelanden kommer att separeras med avgränsaren som anges i det tredje fältet."
+ },
+ "prefs_OptionText_Summarize_main_prompt": {
+ "message": "Huvudprompten som beskriver uppgiften som ska utföras på alla valda e-postmeddelanden:"
+ },
+ "prefs_OptionText_Summarize_email_template": {
+ "message": "Mallen för ett enda e-postmeddelande:"
+ },
+ "prefs_OptionText_Summarize_email_separator": {
+ "message": "Avgränsaren mellan e-postmeddelanden:"
+ },
+ "prefs_OptionText_summarize": {
+ "message": "Sammanfatta e-postmeddelande"
+ },
+ "prefs_OptionText_summarize_use_specific_integration_Info": {
+ "message": "Om markerat kommer modellen och API:et som anges nedan att användas för att sammanfatta e-postmeddelanden, oavsett vilket som valts på ThunderAI-alternativsidan."
+ },
+ "prefs_OptionText_summarize_Info": {
+ "message": "Om markerad läggs ett alternativ till i snabbmenyn för att sammanfatta e-post."
+ },
+ "prefs_OptionText_btnManageSummarizeInfo": {
+ "message": "Hantera sammanfattningsinställningar"
+ },
+ "Summarize_PageTitle": {
+ "message": "Hantera sammanfattningsinställningar"
+ },
+ "Summarize_info_default": {
+ "message": "På den här sidan kan du ändra standardprompten som används för att sammanfatta e-postmeddelanden."
+ },
+ "Summarize_prompt_text_title": {
+ "message": "Aktuell prompttext"
+ },
+ "context_menu_mzta-summarize": {
+ "message": "Sammanfatta"
+ },
+ "CORS_alternative_2_new": {
+ "message": "Tryck på knappen nedan för att ge den aktuella värden behörighet att undvika CORS-problem."
+ },
+ "CORS_give_host_perm": {
+ "message": "Ge behörighet till den nuvarande värden"
+ },
+ "CORS_localhost_warn": {
+ "message": "Om du använder localhost eller 127.0.0.1 eftersom AI-servern finns på din dator krävs behörigheten ."
}
}
diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json
new file mode 100644
index 00000000..0127f024
--- /dev/null
+++ b/_locales/tr/messages.json
@@ -0,0 +1,20 @@
+{
+ "extensionDescription": {
+ "message": "E-postalarınızı geliştirmek için ChatGPT, Google Gemini, Claude veya Ollama’yı kullanın!"
+ },
+ "menu_title": {
+ "message": "YZ"
+ },
+ "customPrompts_managePrompts_info_default": {
+ "message": "Varsayılan promptlar düzenlenemez. Bunları devre dışı bırakabilir, ardından prompt metnini kopyalayıp yeni bir prompta yapıştırarak düzenlenmiş bir sürüm oluşturabilirsiniz."
+ },
+ "customPrompts_managePrompts_info_default_2": {
+ "message": "Promptları içe ve dışa aktarabilirsiniz. Aynı kimliğe (ID) sahip mevcut istemlerin üzerine yazılır. Yeni kimliklere (ID) sahip promptlar eklenir."
+ },
+ "customPrompts_managePrompts_info_default_3": {
+ "message": "Her şey doğruysa, içe aktarma işleminden sonra ‘Tümünü Kaydet’ düğmesine tıklayın."
+ },
+ "customPrompts_start_saving": {
+ "message": "Promptlar kaydediliyor…"
+ }
+}
diff --git a/_locales/zh_Hans/messages.json b/_locales/zh_Hans/messages.json
index 9f5aa903..0cd41bc9 100644
--- a/_locales/zh_Hans/messages.json
+++ b/_locales/zh_Hans/messages.json
@@ -134,10 +134,10 @@
"SpamReport_Title": {
"message": "垃圾邮件过滤报告"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "否"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "是"
},
"prompt_rewrite_polite": {
@@ -236,9 +236,6 @@
"prefs_OptionText_spamfilter_Info": {
"message": "如果选中,ThunderAI将自动将垃圾邮件移至垃圾邮件文件夹。"
},
- "sparks_not_installed": {
- "message": "ThunderAI Sparks 未安装!"
- },
"chatgpt_textarea_not_found_error": {
"message": "看起来 ChatGPT 页面加载时间太长。如果加载完成,请点击右边的按钮。如果问题仍然存在,请检查服务状态。"
},
@@ -341,9 +338,6 @@
"prefs_ChatGPT_API_Key": {
"message": "ChatGPT API 密钥"
},
- "chagpt_api_connecting": {
- "message": "尝试使用提供的 API 密钥连接到 OpenAI ChatGPT"
- },
"prefs_OptionText_release_notes": {
"message": "发行说明"
},
@@ -371,9 +365,6 @@
"OpenAIComp_empty_model": {
"message": "您尚未选择 OpenAI Compatible API 的模型。请在选项页面中选择一个。"
},
- "OpenAIComp_api_connecting": {
- "message": "尝试使用主机连接到 OpenAI 兼容 API 本地服务器"
- },
"prefs_OpenAIComp_ChatName": {
"message": "对话名称"
},
@@ -416,9 +407,6 @@
"importPrompts_invalidPrompts": {
"message": "您尝试导入的文件不包含任何有效提示词。"
},
- "andModel": {
- "message": "和模型"
- },
"ChatGPT_Models_Error_fetching": {
"message": "尝试获取 ChatGPT 模型时出错"
},
@@ -581,9 +569,6 @@
"OpenAIComp_force_model_ask": {
"message": "在此处填入您想要使用的模型名称。"
},
- "ollama_api_connecting": {
- "message": "尝试使用主机连接到 Ollama 本地服务器"
- },
"ollama_api_request_failed": {
"message": "Ollama API 请求失败"
},
@@ -635,9 +620,6 @@
"thunderai_warning_title": {
"message": "ThunderAI 警告"
},
- "google_gemini_api_connecting": {
- "message": "尝试使用提供的 API 密钥连接到 Google Gemini"
- },
"prefs_SurveyLinkText2": {
"message": "单击此处,只需一分钟!"
},
@@ -854,21 +836,9 @@
"context_menu_mzta-add-tags": {
"message": "添加标签"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "显示“添加标签”上下文菜单项"
- },
- "prefs_OptionText_spamfilter_context_menu": {
- "message": "显示“分析垃圾邮件”上下文菜单项"
- },
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "如果选中,则在邮件列表中右键单击电子邮件时,将显示“分析垃圾邮件”上下文菜单项。"
- },
"context_menu_mzta-spamfilter": {
"message": "分析垃圾邮件"
},
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "如果选中,“添加标签”上下文菜单项将在消息列表中右键单击电子邮件时显示。"
- },
"noActiveCalendar": {
"message": "未找到可编辑的日历!"
},
diff --git a/_locales/zh_Hant/messages.json b/_locales/zh_Hant/messages.json
index 59e2dfbc..2b0d912f 100644
--- a/_locales/zh_Hant/messages.json
+++ b/_locales/zh_Hant/messages.json
@@ -284,7 +284,7 @@
"Spam_Value": {
"message": "垃圾訊息評分"
},
- "spamfilter_not_moved": {
+ "no_string": {
"message": "否"
},
"Report_Date": {
@@ -387,7 +387,7 @@
"Date": {
"message": "日期"
},
- "spamfilter_moved": {
+ "yes_string": {
"message": "是"
},
"Custom": {
@@ -533,9 +533,6 @@
"chatgpt_api_request_failed": {
"message": "OpenAI ChatGPT API 請求失敗"
},
- "WaitingServerReponse": {
- "message": "等待伺服器回應"
- },
"error_connection_interrupted": {
"message": "與伺服器的連線意外中斷"
},
@@ -635,9 +632,6 @@
"context_menu_mzta-spamfilter": {
"message": "檢測垃圾郵件"
},
- "prefs_OptionText_spamfilter_context_menu_Info": {
- "message": "如果勾選,則在訊息清單中點右鍵時,會出現「分析垃圾郵件」快顯功能選單項目。"
- },
"apiwebchat_use_this_answer": {
"message": "使用這個答案"
},
@@ -802,9 +796,6 @@
"prefs_OptionText_spamfilter_threshold_Info": {
"message": "如果 AI 傳回的值高於此閾值,則電子郵件將被移至垃圾郵件資料夾。"
},
- "prefs_OptionText_add_tags_context_menu": {
- "message": "顯示「新增標籤」在快顯功能選單"
- },
"remember_CORS": {
"message": "記住,您需要在伺服器上設定 CORS 設定!"
},
@@ -1005,9 +996,6 @@
"prefs_OptionText_btnManageSpamFilterInfo": {
"message": "管理垃圾郵件設定"
},
- "CORS_give_allurls_perm": {
- "message": "授予「所有網址」權限"
- },
"prefs_ollama_num_ctx": {
"message": "情境 Token 數量"
},
@@ -1095,9 +1083,6 @@
"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_spamfilter_context_menu": {
- "message": "顯示「分析垃圾郵件」在快顯功能選單"
- },
"sign_msg_as": {
"message": "簽署訊息為"
},
@@ -1137,15 +1122,9 @@
"prompt_rewrite_formal_full_text": {
"message": "請將以下文字重寫得更正式一些。僅回覆重寫的文字,不要提供任何額外的註解或其他文字。"
},
- "CORS_alternative_2": {
- "message": "點擊下方按鈕,授予「所有網址」權限,以避免任何 CORS 問題。"
- },
"GoogleGemini_SystemInstruction_Info": {
"message": "當您設定系統指示時,您會為模型提供額外情境來理解任務,提供更客製化的回應,並遵守將要發送的提示的特定指南。"
},
- "prefs_OptionText_add_tags_context_menu_Info": {
- "message": "如果勾選,則右鍵單擊訊息清單中的電子郵件時將顯示「新增標籤」在快顯功能選單。"
- },
"prefs_OptionText_chatgpt_web_custom_gpt_info": {
"message": "這是將針對 ChatGPT 網頁介面強制執行的自訂 GPT。"
},
diff --git a/api_webchat/controller.js b/api_webchat/controller.js
index 6dec60df..8b722a25 100644
--- a/api_webchat/controller.js
+++ b/api_webchat/controller.js
@@ -213,6 +213,8 @@ if (worker) {
version_string: prefs_api[`${integration_prefix}_version`],
additional_messages: additional_text_elements
}), "info");
+
+ //console.log(`>>>>>>>>>>>>> command: ${llm}_ready_${call_id}`,)
browser.runtime.sendMessage({
command: `${llm}_ready_${call_id}`,
diff --git a/images/summarize.png b/images/summarize.png
new file mode 100644
index 00000000..9c829f0e
Binary files /dev/null and b/images/summarize.png differ
diff --git a/js/api/anthropic.js b/js/api/anthropic.js
index 2fa9ae78..9d44a99e 100644
--- a/js/api/anthropic.js
+++ b/js/api/anthropic.js
@@ -87,8 +87,6 @@ export class Anthropic {
fetchResponse = async (messages) => {
- // console.log(">>>>>>>>>>> Anthropic API request: " + JSON.stringify(messages));
-
try {
let claude_body = {
@@ -103,6 +101,8 @@ export class Anthropic {
if(this.temperature != '' && !Number.isNaN(tempFloat)) claude_body.temperature = tempFloat;
+ // console.log(">>>>>>>>>>>>>>>>> [ThunderAI] Anthropic API request: " + JSON.stringify(claude_body));
+
const response = await fetch("https://api.anthropic.com/v1/messages", {
method: "POST",
headers: {
diff --git a/js/api/google_gemini.js b/js/api/google_gemini.js
index caea5eb0..91e764bb 100644
--- a/js/api/google_gemini.js
+++ b/js/api/google_gemini.js
@@ -116,7 +116,7 @@ export class GoogleGemini {
google_gemini_body.generationConfig.temperature = tempFloat;
}
- // console.log("[ThunderAI] Google Gemini API request: " + JSON.stringify(google_gemini_body));
+ // console.log(">>>>>>>>>>>>>>>>> [ThunderAI] Google Gemini API request: " + JSON.stringify(google_gemini_body));
const response = await fetch("https://generativelanguage.googleapis.com/v1beta/models/" + this.model + ":" + (this.stream ? 'streamGenerateContent?alt=sse&' : 'generateContent?') + "key=" + this.apiKey, {
method: "POST",
diff --git a/js/mzta-chatgpt.js b/js/mzta-chatgpt.js
index 4ccdb448..eeda649e 100644
--- a/js/mzta-chatgpt.js
+++ b/js/mzta-chatgpt.js
@@ -85,7 +85,7 @@ async function chatgpt_isIdle() {
function chatgpt_getRegenerateButton() {
for (const mainSVG of document.querySelectorAll('main svg.icon')) {
- if (mainSVG.querySelector('path[d^="M3.502 16.6663V13"]') || mainSVG.querySelector('path[d^="M3.06957"]') || mainSVG.querySelector('path[d^="M10.9153 1.83987L11.2942 1.88772L11.4749"]')){ // regen icon or thumb-up icon found
+ if (mainSVG.querySelector('path[d^="M3.502 16.6663V13"]') || mainSVG.querySelector('path[d^="M3.06957"]') || mainSVG.querySelector('path[d^="M10.9153 1.83987L11.2942 1.88772L11.4749"]') || document.querySelector("button[data-testid=good-response-turn-action-button]")){ // regen icon or thumb-up icon found
//console.log(">>>>>>>>>> found regen icon!");
return mainSVG.parentNode.parentNode;
}
diff --git a/js/mzta-menus.js b/js/mzta-menus.js
index a74124ed..b164bae1 100644
--- a/js/mzta-menus.js
+++ b/js/mzta-menus.js
@@ -430,7 +430,13 @@ export class mzta_Menus {
}
}else{ // Classic prompts for the API webchat
this.logger.log("fullPrompt: " + fullPrompt);
- this.logger.log("curr_prompt: " + JSON.stringify(curr_prompt));
+ this.logger.log("curr_prompt: " + JSON.stringify(curr_prompt, (key, value) => {
+ if (typeof key === 'string' && key.endsWith('_api_key')) {
+ return '****************';
+ }
+ return value;
+ })
+ );
this.openChatGPT(fullPrompt, curr_prompt.action, tabs[0].id, curr_prompt.name, curr_prompt.need_custom_text, curr_prompt);
taWorkingStatus.stopWorking();
return {ok:'1'};
diff --git a/js/mzta-prompts.js b/js/mzta-prompts.js
index b598cbce..a3fac86e 100644
--- a/js/mzta-prompts.js
+++ b/js/mzta-prompts.js
@@ -324,6 +324,54 @@ const specialPrompts = [
is_default: "1",
is_special: "1",
},
+ {
+ id: 'prompt_summarize',
+ name: "__MSG_prompt_summarize__",
+ text: "prompt_summarize_full_text",
+ type: "1",
+ action: "0",
+ need_selected: "0",
+ need_signature: "0",
+ need_custom_text: "0",
+ define_response_lang: "0",
+ use_diff_viewer: "0",
+ api_type: '',
+ api_model: '',
+ is_default: "1",
+ is_special: "1",
+ },
+ {
+ id: 'prompt_summarize_email_template',
+ name: "__MSG_prompt_summarize_email_template__",
+ text: "prompt_summarize_email_template_full_text",
+ type: "1",
+ action: "0",
+ need_selected: "0",
+ need_signature: "0",
+ need_custom_text: "0",
+ define_response_lang: "0",
+ use_diff_viewer: "0",
+ api_type: '',
+ api_model: '',
+ is_default: "1",
+ is_special: "1",
+ },
+ {
+ id: 'prompt_summarize_email_separator',
+ name: "__MSG_prompt_summarize_email_separator__",
+ text: "prompt_summarize_email_separator_full_text",
+ type: "1",
+ action: "0",
+ need_selected: "0",
+ need_signature: "0",
+ need_custom_text: "0",
+ define_response_lang: "0",
+ use_diff_viewer: "0",
+ api_type: '',
+ api_model: '',
+ is_default: "1",
+ is_special: "1",
+ }
];
@@ -362,18 +410,55 @@ export async function getPrompts(onlyEnabled = false, includeSpecial = [], allSp
return output;
}
-export function preparePromptsForExport(prompts){
- let output = [...prompts];
+export function preparePromptsForExport(prompts, include_api_settings = false){
+ let output = JSON.parse(JSON.stringify(prompts));
output.forEach(prompt => {
+
+ if(!include_api_settings){
+ delete prompt.api_type;
+ for (const [integration, options] of Object.entries(integration_options_config)) {
+ for (const key of Object.keys(options)) {
+ delete prompt[`${integration}_${key}`];
+ }
+ }
+ } else {
+ if(prompt.api_type && prompt.api_type !== ''){
+ const activeIntegration = prompt.api_type.replace('_api', '');
+ for (const [integration, options] of Object.entries(integration_options_config)) {
+ if(integration !== activeIntegration){
+ for (const key of Object.keys(options)) {
+ delete prompt[`${integration}_${key}`];
+ }
+ }
+ }
+ } else {
+ for (const [integration, options] of Object.entries(integration_options_config)) {
+ for (const key of Object.keys(options)) {
+ delete prompt[`${integration}_${key}`];
+ }
+ }
+ }
+ }
+
if(prompt.is_default == 1){
+ let allowedKeys = ['id', 'enabled', 'position_compose', 'position_display', 'need_custom_text'];
+ if(include_api_settings){
+ allowedKeys.push('api_type');
+ for (const [integration, options] of Object.entries(integration_options_config)) {
+ for (const key of Object.keys(options)) {
+ allowedKeys.push(`${integration}_${key}`);
+ }
+ }
+ }
Object.keys(prompt).forEach(key => {
- if(!['id', 'enabled', 'position_compose', 'position_display', 'need_custom_text'].includes(key)){
+ if(!allowedKeys.includes(key)){
delete prompt[key];
}
})
}else{
delete prompt['idnum'];
}
+
});
return output;
}
@@ -587,4 +672,4 @@ export async function clearPromptAPI(id){
}
// console.log(">>>>>>>>>>>>> clearPromptAPI _prompt AFTER: " + JSON.stringify(_prompt));
await savePrompt(_prompt);
-}
\ No newline at end of file
+}
diff --git a/js/mzta-utils-prompt.js b/js/mzta-utils-prompt.js
index d1c638b7..c19499f8 100644
--- a/js/mzta-utils-prompt.js
+++ b/js/mzta-utils-prompt.js
@@ -50,7 +50,9 @@ export const taPromptUtils = {
if(!placeholdersUtils.hasPlaceholder(curr_prompt.text)){
// no placeholders, do as usual
- fullPrompt = curr_prompt.text + (String(curr_prompt.need_signature) == "1" ? " " + await taPromptUtils.getDefaultSignature():"") + " " + chatgpt_lang + " \"" + (selection_text=='' ? body_text : selection_text) + "\" ";
+ const signature = String(curr_prompt.need_signature) === "1" ? await taPromptUtils.getDefaultSignature() : "";
+ const content = selection_text || body_text;
+ fullPrompt = [curr_prompt.text, signature, chatgpt_lang, content ? `"${content}"` : ""].filter(Boolean).join(" ");
}else{
// we have at least a placeholder, do the magic!
// check if we have custom placeholders
diff --git a/js/mzta-utils.js b/js/mzta-utils.js
index 67ce0823..90feb52b 100644
--- a/js/mzta-utils.js
+++ b/js/mzta-utils.js
@@ -25,9 +25,11 @@ export const getMenuContextDisplay = () => 'message_display_action_menu';
export const contextMenuID_AddTags = 'mzta-add-tags';
export const contextMenuID_Spamfilter = 'mzta-spamfilter';
+export const contextMenuID_Summarize = 'mzta-summarize';
export const contextMenuIconsPath = {
[contextMenuID_AddTags]: 'moz-extension:images/autotags.png',
[contextMenuID_Spamfilter]: 'moz-extension:images/spamfilter.png',
+ [contextMenuID_Summarize]: 'moz-extension:images/summarize.png',
};
export function getLanguageDisplayName(languageCode) {
@@ -92,6 +94,17 @@ export async function getCurrentIdentity(msgHeader, getFull = false) {
}
}
+ // Check the account that the folder of the message belongs to
+ if (msgHeader.folder && msgHeader.folder.accountId) {
+ const account = accounts.find(a => a.id === msgHeader.folder.accountId);
+ if (account && account.identities && account.identities.length > 0) {
+ // Just return the first identity of the account.
+ const identity = account.identities[0];
+ console.log(">>>>>>>>>> got from folder");
+ return getFull ? { id: identity.id, email: identity.email } : identity.id;
+ }
+ }
+
// Fallback
return getFull ? fallbackIdentity : fallbackIdentity?.id || null;
}
@@ -347,17 +360,6 @@ export function i18nConditionalGet(str) {
return str; // Return the original string if the conditions are not met
}
-export async function isThunderbird128OrGreater(){
- try {
- const info = await browser.runtime.getBrowserInfo();
- const version = info.version;
- return compareThunderbirdVersions(version, '128.0') >= 0;
- } catch (error) {
- console.error('[ThunderAI] Error retrieving browser information:', error);
- return false;
- }
-}
-
function compareThunderbirdVersions(v1, v2) {
const v1parts = v1.split('.').map(Number);
const v2parts = v2.split('.').map(Number);
@@ -383,12 +385,9 @@ export function generateCallID(length = 10) {
export async function getTagsList(){
let messageTags = [];
- if(await isThunderbird128OrGreater()) {
- // without the tags related permissions, we can't get the tags list
- messageTags = await browser.messages.tags.list();
- } else {
- messageTags = await browser.messages.listTags();
- }
+ // without the tags related permissions, we can't get the tags list
+ messageTags = await browser.messages.tags.list();
+
const output = messageTags.map(tag => tag.tag).join(', ');
const output2 = messageTags.reduce((acc, messageTag) => {
@@ -409,11 +408,7 @@ export async function createTag(tag) {
if(prefs_tag.add_tags_first_uppercase) tag = tag.toLowerCase().charAt(0).toUpperCase() + tag.toLowerCase().slice(1);
try {
const tagKey = '$ta-' + generateCallID(16) + '-' + sanitizeString(tag); // Ensure uniqueness with a longer random ID
- if(await isThunderbird128OrGreater()) {
- return browser.messages.tags.create(tagKey, tag, generateHexColorForTag());
- }else{
- return browser.messages.createTag(tagKey, tag, generateHexColorForTag());
- }
+ return browser.messages.tags.create(tagKey, tag, generateHexColorForTag());
} catch (error) {
console.error('[ThunderAI] Error creating tag:', error);
}
@@ -515,6 +510,10 @@ export function normalizeStringList(list, returnType = 0) {
}
}
+export function prepareOriginURL(url) {
+ return url.endsWith('/') ? `${url}*` : `${url}/*`;
+}
+
function generateHexColorForTag() {
const red = Math.floor(Math.random() * 256);
const green = Math.floor(Math.random() * 256);
@@ -535,6 +534,14 @@ export async function transformTagsLabels(labels, tags_list) {
return output;
}
+export function setTomSelectBorder(el){
+ if (el.getValue() === "") {
+ el.control.style.border = '2px solid red';
+ } else {
+ el.control.style.border = '1px solid #d0d0d0';
+ }
+}
+
export function getAPIsInitMessageString(args = {}) {
const {
api_string = '',
@@ -685,6 +692,29 @@ export function validateCustomData_ChatGPTWeb(event) {
document.getElementById(event.target.id + '_info').style.color = is_valid ? '' : 'red';
}
+// From https://thunderbird.topicbox.com/groups/addons/Tafa58394231a18f8-M3e565a75287313ea4395ff5f
+// Thanks to John Bieling
+export async function requestSitePermission(url) {
+ // Normalize the origin to ensure it ends with /*
+ const origin = url.replace(/\/?\*?$/, '/*');
+
+ const hasPermission = await browser.permissions.contains({
+ origins: [origin],
+ });
+
+ if (hasPermission) {
+ // Permission already granted — safe to save and use the URL.
+ return true;
+ }
+
+ const granted = await browser.permissions.request({
+ origins: [origin],
+ });
+
+ // If not granted, it's not safe to save or use the URL,
+ // since the user explicitly denied access.
+ return granted;
+}
// The following methods are a modified version derived from https://github.com/ali-raheem/Aify/blob/13ff87583bc520fb80f555ab90a90c5c9df797a7/plugin/content_scripts/compose.js
diff --git a/js/tb115_segmenter/tb115_loader.js b/js/tb115_segmenter/tb115_loader.js
deleted file mode 100644
index df476c7c..00000000
--- a/js/tb115_segmenter/tb115_loader.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * ThunderAI [https://micz.it/thunderbird-addon-thunderai/]
- * Copyright (C) 2024 - 2026 Mic (m@micz.it)
-
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-// Firefox 115 and, consequently, Thunderbird 115 are not compatible with Intl.Segmenter.
-// ChatGPT is using Intl.Segmenter, so we have to do something about it or it won't work...
-
-// console.log("[ThunderAI] Intl.Segmenter: " + Intl.Segmenter);
-
-(function() {
- if('Segmenter' in Intl){
- // console.log('[ThunderAI] TB128+ detected. Intl.Segmenter is already supported.');
- return;
- }
- // Creates a
+
+