diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5cc4a7dd..1b90de1d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,23 @@
+
Version 3.6.0 - 30/07/2025
+
+ - Now it's possibile to define custom data placeholders to be used in custom prompts [#156].
+ - Improved the handling of HTML and line breaks between the email text and the AI Chat.
+ - When replying, it's now possibile to choose a different reply type (between "all" or "sender only") directly in the AI chat window [#372].
+ - Added a new default prompt for replying to emails, which asks for a custom command each time it's used [#444].
+ - [All APIs] Added an option to choose to exclude a tag only with an exact match in the excluded words list [#395].
+ - [OpenAI API] Added an option to enable the OpenAI storage for API requests [#406].
+ - [OpenAI API] In the AI chat page, the initial configuration now also displays the storage setting and the "Developer Messages" [#430].
+ - [Ollama API] Added an option to enable the thinking feature [#398].
+ - [Google Gemini API] In the AI chat page, the initial configuration now also displays the "System Instructions". [#429].
+ - [OpenAI Comp API] Handling responses without choices when using RAG [#416].
+ - [OpenAI Comp API] Added Perplexity configuration [#405].
+ - [OpenAI Comp API] Added OpenRouter configuration [#401].
+ - Traditional Chinese (zh_Hant) translation added, thanks to evez.
+ - Some English typing errors have been fixed [#422].
+
Version 3.5.5 - ??/??/2025
- [All APIs] Fix: Autotag and Antispam filter working again [#449].
@@ -33,7 +50,7 @@
- Added Anthropic API support [#349].
- Added the {%selected_html%} placeholder to retrieve the HTML portion of the selected text [#368].
- - [OpenAI Comp API] Added a shortcut to select configurations for known AI services. Currently, Grok AI and Mistral AI are available [#378]. Open an issue to request additional services.
+ - [OpenAI Comp API] Added a shortcut to select configurations for known AI services. Currently, Grok AI and Mistral AI are available [#378]. Open an issue to request additional services.
- [All APIs] In the API WebChat is now possibile to select a part of the answer and use only that [#356].
- [All APIs] Setting the "Max prompt length" to zero on the options page will disable the length check when sending a prompt to the AI. [#380].
- [All APIs] Added a button to the options page to reset the 'Max prompt length' value to its default.
diff --git a/LANG.md b/LANG.md
index 576fab13..f312c798 100644
--- a/LANG.md
+++ b/LANG.md
@@ -1,3 +1,4 @@
+cs
de
en
fr
@@ -5,5 +6,6 @@ hr
it
pl
pt-br
-cs
-zh_Hans
\ No newline at end of file
+ru
+zh_Hans
+zh_Hant
\ No newline at end of file
diff --git a/README.md b/README.md
index 8e6cada4..d6389aa3 100644
--- a/README.md
+++ b/README.md
@@ -81,14 +81,18 @@ Are you using this addon in your Thunderbird?
### Translations
- Chinese (Simplified): [jeklau](https://github.com/jeklau)
+- Chinese (Traditional): [evez](https://github.com/evez)
- 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
- Italian (it): [Mic](https://github.com/micz/)
- Polski (pl): [neexpl](https://github.com/neexpl), [makkacprzak](https://github.com/makkacprzak)
+- Russian (ru): [Maksim](https://hosted.weblate.org/user/law820314/)
- Português Brasileiro (pt-br): Bruno Pereira de Souza
+
-Do you want to help translate this addon? [Find out how!](https://micz.it/thunderbird-addon-thunderai/translate/)
+Do you want to help translate this addon? [Find out how!](https://micz.it/thunderbird-addon-thunderai/translate/)
+_The language status represents the percentage of translated strings in the latest stable release._
diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json
index 792d8dc4..a47e25fe 100644
--- a/_locales/cs/messages.json
+++ b/_locales/cs/messages.json
@@ -41,7 +41,7 @@
"prompt_this": {
"message": "Zeptat se"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Další informace"
},
"customPrompts_start_saving": {
@@ -80,13 +80,13 @@
"customPrompts_form_label_enabled": {
"message": "Povoleno"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Uložit vše"
},
"customPrompts_do_reply": {
"message": "Odpovědět"
},
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Přidat nový"
},
"customPrompts_close_button": {
@@ -134,9 +134,6 @@
"customPrompts_btnOK": {
"message": "OK"
},
- "customPrompts_save_button": {
- "message": "Uložit"
- },
"customPrompts_unsaved_changes": {
"message": "Máte neuložené změny!"
},
@@ -188,9 +185,6 @@
"chatgpt_win_send": {
"message": "Odeslat"
},
- "chatgpt_use_gpt35": {
- "message": "Použít GPT3.5"
- },
"chatgpt_force_completion": {
"message": "vynutit doplnění"
},
@@ -353,7 +347,7 @@
"chatgpt_api_request_failed": {
"message": "Požadavek na OpenAI ChatGPT API selhal"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "Čekám na odpověď serveru"
},
"prefs_API_Host_Info": {
@@ -467,9 +461,6 @@
"SpamFilter_prompt_text_title": {
"message": "Aktuální text přikazu"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Příkaz můžete změnit, jak chcete, ale odpověď přijatá z AI musí být ve formátu JSON, jak je uvedeno ve výchozím příkazu!"
- },
"Moved_to_Spam": {
"message": "Přesunuto do Spamu"
},
@@ -650,9 +641,6 @@
"prompt_get_calendar_event": {
"message": "Přidej novou událost do kalendáře"
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Výzvu můžete změnit, jak chcete, ale odpověď obdržená od AI musí být seznam štítků oddělených čárkou!"
- },
"prefs_OptionText_add_tags_auto_only_inbox_Info": {
"message": "Pokud je zaškrtnuto, AI bude přidávat štítky pouze e-mailům přijatým ve složce Doručená pošta."
},
@@ -801,7 +789,7 @@
"message": "Pokud je zaškrtnuto, štitky, které jsou přítomny v seznamu vyloučení, budou skryty v potvrzovacím dialogu."
},
"prompt_add_tags_full_text": {
- "message": "Analyzuj následující text e-mailu a vygeneruj seznam štítků oddělených čárkou, které shrnují jeho obsah. Použij témata, klíčová témata a relevantní deskriptory jako štitky. Zajisti, aby štitky byly stručné a relevantní k obsahu e-mailu.\nText e-mailu: {%mail_text_body%}\nPro kontext zvaž následující podrobnosti:\n- Odesílatel: {%author%}\n- Příjemci: {%recipients%}\n- Seznam kopií: {%cc_list%}\n- Předmět e-mailu: {%mail_subject%}\nZalož své štitky na textu a kontextu e-mailu, ignoruj zbytečné informace nebo triviální detaily. Výstup by měl být pouze seznam štítků oddělených čárkou bez jakéhokoli dalšího komentáře nebo textu."
+ "message": "Analyzujte následující text e-mailu a vytvořte JSON pole tagů, které shrnují jeho obsah. Jako tagy použijte témata, klíčová témata a relevantní popisné prvky. Ujistěte se, že tagy jsou stručné a relevantní k obsahu e-mailu.\nText e-mailu: {%mail_text_body%}\nPro kontext zvaž následující podrobnosti:\n- Odesílatel: {%author%}\n- Příjemci: {%recipients%}\n- Seznam kopií: {%cc_list%}\n- Předmět e-mailu: {%mail_subject%}\nVycházejte z textu e-mailu a kontextu při generování tagů, ignorujte zbytečné informace nebo nepodstatné detaily.\nVygenerujte odpověď pouze ve formátu JSON. Výstupem by mělo být pouze JSON pole tagů, bez jakéhokoli dalšího komentáře nebo textu. Zde je příklad formátu JSON, který je třeba použít:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"prefs_OptionText_add_tags_maxnum": {
"message": "Maximální počet štítků"
@@ -839,7 +827,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Aktuální text výzvy"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Výzvu můžete změnit, jak si přejete, ale odpověď přijatá od AI musí být ve formátu JSON, jak je uvedeno ve výchozí výzvě!"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -981,7 +969,7 @@
"message": "POVINNÉ. Neměňte tuto hodnotu, pokud nevíte, co děláte. Více informací zde:"
},
"_api_connecting_version": {
- "message": "Verze: $api_version$",
+ "message": "Verze",
"placeholders": {
"api_version": {
"content": "$1"
@@ -1076,7 +1064,7 @@
"message": "Selhal požadavek API Anthropic"
},
"_api_connecting": {
- "message": "Pokus o připojení k $api_string$ s následující konfigurací:",
+ "message": "Pokus o připojení k $api_string$ s následující konfigurací...",
"placeholders": {
"api_string": {
"content": "$1"
@@ -1092,7 +1080,7 @@
}
},
"_api_connecting_model": {
- "message": "Model: $model$",
+ "message": "Model",
"placeholders": {
"model": {
"content": "$1"
@@ -1103,7 +1091,7 @@
"message": "Pokud vyberete nějaký text, bude zohledněna pouze tato část."
},
"_api_connecting_host": {
- "message": "API Server: $api_host$",
+ "message": "API Server",
"placeholders": {
"api_host": {
"content": "$1"
diff --git a/_locales/de/messages.json b/_locales/de/messages.json
index 90417cb7..2784f560 100644
--- a/_locales/de/messages.json
+++ b/_locales/de/messages.json
@@ -39,7 +39,7 @@
"customPrompts_managePrompts": {
"message": "Eingabeaufforderungen verwalten"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Informationen"
},
"customPrompts_managePrompts_info_default": {
@@ -120,13 +120,10 @@
"customPrompts_unsaved_changes": {
"message": "Es gibt ungespeicherte Änderungen!"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Alle speichern"
},
- "customPrompts_save_button": {
- "message": "Speichern"
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Neu hinzufügen"
},
"customPrompts_btnAddNewCommit": {
@@ -189,9 +186,6 @@
"chatgpt_win_send": {
"message": "Senden"
},
- "chatgpt_use_gpt35": {
- "message": "Verwenden Sie GPT3.5"
- },
"chatgpt_force_completion": {
"message": "Abschluss erzwingen"
},
@@ -384,7 +378,7 @@
"chatgpt_api_request_failed": {
"message": "Anfrage an die OpenAI ChatGPT API fehlgeschlagen"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "Warten auf die Serverantwort"
},
"prefs_API_Host_Info": {
@@ -513,9 +507,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "Sie können zusätzliche Datenplatzhalter verwenden."
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Sie können den Prompt nach Wunsch ändern, aber die Antwort der KI muss eine durch Kommas getrennte Liste von Tags sein!"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "\"v1\"-Kompatibilität beibehalten"
},
@@ -571,7 +562,7 @@
"message": "Tags zu dieser E-Mail hinzufügen"
},
"prompt_add_tags_full_text": {
- "message": "Analysieren Sie den folgenden E-Mail-Text und erstellen Sie eine durch Kommas getrennte Liste von Tags, die den Inhalt zusammenfassen. Verwenden Sie Themen, Hauptthemen und relevante Beschreibungen als Tags. Stellen Sie sicher, dass die Tags prägnant und relevant für den Inhalt der E-Mail sind.\nE-Mail-Text: {%mail_text_body%}\nBerücksichtigen Sie die folgenden Details als Kontext:\n- Absender: {%author%}\n- Empfänger: {%recipients%}\n- CC-Liste: {%cc_list%}\n- E-Mail-Betreff: {%mail_subject%}\nBitte basieren Sie Ihre Tags auf dem Text und Kontext der E-Mail und ignorieren Sie unnötige Informationen oder triviale Details. Die Ausgabe sollte nur eine Liste von durch Kommas getrennten Tags ohne zusätzlichen Kommentar oder Text sein."
+ "message": "Analysiere den folgenden E-Mail-Text und erstelle ein JSON-Array mit Tags, die den Inhalt zusammenfassen. Verwende Themen, zentrale Schlagwörter und relevante Beschreibungen als Tags. Achte darauf, dass die Tags prägnant und inhaltlich relevant sind.\nE-Mail-Text: {%mail_text_body%}\nBerücksichtigen Sie die folgenden Details als Kontext:\n- Absender: {%author%}\n- Empfänger: {%recipients%}\n- CC-Liste: {%cc_list%}\n- E-Mail-Betreff: {%mail_subject%}\nErstelle die Tags auf Grundlage des E-Mail-Inhalts und Kontexts. Ignoriere unnötige Informationen oder unwichtige Details.\nGib die Antwort ausschließlich im JSON-Format aus. Die Ausgabe darf nur ein JSON-Array mit Tags enthalten – ohne weiteren Kommentar oder Text. Hier ein Beispiel für das zu verwendende JSON-Format:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_current_email": {
"message": "E-Mail-Tags"
@@ -741,7 +732,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Aktueller Prompt-Text"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Sie können den Prompt nach Belieben ändern, aber die von der KI erhaltene Antwort muss im JSON-Format sein, wie im Standard-Prompt angegeben!"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -795,9 +786,6 @@
"SpamFilter_prompt_text_title": {
"message": "Aktueller Aufforderungstext"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Sie können die Aufforderung nach Belieben ändern, aber die Antwort der KI muss im JSON-Format erfolgen, wie in der Standardaufforderung angegeben!"
- },
"prompt_spamfilter": {
"message": "Spam-E-Mails erkennen"
},
@@ -916,7 +904,7 @@
"message": "Empfange Daten"
},
"customPrompts_form_label_use_diff_viewer": {
- "message": "Aktiviere den Unterschiedsbetrachter"
+ "message": "Die Textvergleichsansicht aktivieren"
},
"btn_show_differences": {
"message": "Unterschiede anzeigen"
@@ -982,7 +970,7 @@
"message": "Wenn ein Projekt in den Optionen oder im Prompt angegeben ist, wird der temporäre Chat nicht verwendet."
},
"customPrompts_form_label_use_diff_viewer_title": {
- "message": "Der Differenz-Viewer kann ausgewählt werden, wenn die Aktion auf „Text ersetzen“ gesetzt ist."
+ "message": "Die Textvergleichsansicht kann ausgewählt werden, wenn die Aktion auf „Text ersetzen“ eingestellt ist."
},
"prefs_OptionText_CustomGPT_Warn": {
"message": "Wenn ein Projekt in den Optionen oder im Prompt angegeben ist, überschreibt es die benutzerdefinierte GPT-Einstellung."
@@ -1102,7 +1090,7 @@
"message": "Anfrage an die Anthropic-API fehlgeschlagen"
},
"_api_connecting": {
- "message": "Verbindungsversuch zu $api_string$ mit der folgenden Konfiguration:",
+ "message": "Verbindungsversuch zu $api_string$ mit der folgenden Konfiguration...",
"placeholders": {
"api_string": {
"content": "$1"
@@ -1134,7 +1122,7 @@
"message": "Sie haben kein Modell für die Anthropic-API ausgewählt. Bitte wählen Sie eines auf der Optionsseite aus."
},
"_api_connecting_model": {
- "message": "Modell: $model$",
+ "message": "Modell",
"placeholders": {
"model": {
"content": "$1"
@@ -1142,7 +1130,7 @@
}
},
"_api_connecting_host": {
- "message": "Host: $api_host$",
+ "message": "Host",
"placeholders": {
"api_host": {
"content": "$1"
@@ -1150,7 +1138,7 @@
}
},
"_api_connecting_version": {
- "message": "Version: $api_version$",
+ "message": "Version",
"placeholders": {
"api_version": {
"content": "$1"
@@ -1179,5 +1167,86 @@
},
"Anthropic_Version_Info": {
"message": "ERFORDERLICH. Ändern Sie diesen Wert nicht, es sei denn, Sie wissen, was Sie tun. Weitere Informationen unter:"
+ },
+ "prefs_OptionText_reply_type_Info": {
+ "message": "Dies ist der Standard-Antworttyp, der beim Beantworten einer E-Mail verwendet wird. Du kannst später im Antwortdialog einen anderen auswählen."
+ },
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "message": "Verwalte deine Datenplatzhalter"
+ },
+ "ChatGPT_chatgpt_api_store_info": {
+ "message": "Wenn markiert, werden deine Chats bei OpenAI gespeichert."
+ },
+ "prefs_ollama_think_Info": {
+ "message": "Wenn markiert, wird das Modell nachdenken bevor es antwortet. Diese Option funtioniert nur mit Modellen, die das \"think\" Feature unterstützen."
+ },
+ "prefs_ollama_think": {
+ "message": "Erlaube nachzudenken"
+ },
+ "chatgpt_win_change_reply_type": {
+ "message": "Klicke, um den Rückgabetyp zu ändern"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match": {
+ "message": "Ausschlüsse exakte Übereinstimmung"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match_Info": {
+ "message": "Wenn aktiviert, werden die Wörter in der Ausschlussliste exakt mit den Tags abgeglichen. Andernfalls stimmen sie auch überein, wenn sie im Tag enthalten sind."
+ },
+ "customDataPH_manageDataPH": {
+ "message": "Datenplatzhalter verwalten"
+ },
+ "customDataPH_manageDataPH_info_default_3": {
+ "message": "Du kannst auch die Standard-Datenplatzhalter mit Autovervollständigung verwenden, genau wie beim Schreiben benutzerdefinierter Prompts."
+ },
+ "customDataPH_manageDataPH_info_default": {
+ "message": "Auf dieser Seite kannst du benutzerdefinierte Datenplatzhalter definieren, die in deinen benutzerdefinierten Prompts verwendet werden sollen."
+ },
+ "customDataPH_manageDataPH_info_default_2": {
+ "message": "Vorhandene Datenplatzhalter mit derselben ID werden überschrieben. Platzhalter mit neuen IDs werden hinzugefügt."
+ },
+ "customDataPH_ExportAll": {
+ "message": "Alle benutzerdefinierten Datenplatzhalter exportieren"
+ },
+ "customDataPH_Import": {
+ "message": "Neue Datenplatzhalter importieren"
+ },
+ "customDataPH_form_label_Text": {
+ "message": "Datenplatzhalter-Text"
+ },
+ "customDataPH_saving_custom": {
+ "message": "Speichern der benutzerdefinierten Datenplatzhalter..."
+ },
+ "customDataPH_saved": {
+ "message": "Benutzerdefinierte Datenplatzhalter gespeichert!"
+ },
+ "customDataPH_btnAddNewCommit": {
+ "message": "Datenplatzhalter hinzufügen"
+ },
+ "importCustomDataPH_confirmText": {
+ "message": "Du bist dabei, neue benutzerdefinierte Datenplatzhalter zu importieren."
+ },
+ "importCustomDataPH_start_import": {
+ "message": "Import der benutzerdefinierten Datenplatzhalter wird gestartet..."
+ },
+ "importCustomDataPH_import_completed": {
+ "message": "Import der benutzerdefinierten Datenplatzhalter abgeschlossen! Du musst auf die Schaltfläche „Alle speichern“ klicken, um deine Änderungen zu speichern."
+ },
+ "importCustomDataPH_invalidFile": {
+ "message": "Die Datei, die du importieren möchtest, ist keine gültige Datei für benutzerdefinierte Datenplatzhalter."
+ },
+ "importCustomDataPH_invalidDataPHs": {
+ "message": "Die Datei, die du importieren möchtest, enthält keine gültigen benutzerdefinierten Datenplatzhalter."
+ },
+ "customDataPH_add_to_menu": {
+ "message": "Verwendbar in Prompts, die dem Menü hinzugefügt wurden"
+ },
+ "ChatGPT_chatgpt_api_store": {
+ "message": "Verwende speicher"
+ },
+ "prompt_reply_custom_command_full_text": {
+ "message": "Antworten Sie auf die folgende E-Mail „{%mail_text_body%}“. {%additional_text%}. Antworten Sie nur mit dem erforderlichen Text und ohne zusätzliche Kommentare oder anderen Text."
+ },
+ "prompt_reply_custom_command": {
+ "message": "Mit Befehl antworten"
}
}
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 608c8382..c8e45d19 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -1,6 +1,6 @@
{
"extensionDescription": {
- "message": "Use ChatGPT, Goolge Gemini, Anthropic or Ollama to enhance your emails!",
+ "message": "Use ChatGPT, Google Gemini, Anthropic or Ollama to enhance your emails!",
"description": "Description of the extension."
},
"menu_title": {
@@ -19,6 +19,10 @@
"message": "Reply to this thread",
"description": ""
},
+ "prompt_reply_custom_command": {
+ "message": "Reply with command",
+ "description": ""
+ },
"prompt_rewrite_polite": {
"message": "Rewrite polite",
"description": ""
@@ -51,7 +55,7 @@
"message": "Manage Prompts",
"description": ""
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "More info",
"description": ""
},
@@ -132,11 +136,11 @@
"description": ""
},
"customPrompts_form_label_use_diff_viewer": {
- "message": "Enable the diff viewer",
+ "message": "Enable the text comparison viewer",
"description": ""
},
"customPrompts_form_label_use_diff_viewer_title": {
- "message": "The diff viewer can be selected when the action is set to \"Substitute text\".",
+ "message": "The text comparison viewer can be selected when the action is set to \"Substitute text\".",
"description": ""
},
"customPrompts_form_required_fields": {
@@ -167,15 +171,11 @@
"message": "There are unsaved changes!",
"description": ""
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Save All",
"description": ""
},
- "customPrompts_save_button": {
- "message": "Save",
- "description": ""
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Add New",
"description": ""
},
@@ -259,10 +259,6 @@
"message": "Send",
"description": ""
},
- "chatgpt_use_gpt35": {
- "message": "Use GPT3.5",
- "description": ""
- },
"chatgpt_force_completion": {
"message": "force completion",
"description": ""
@@ -304,21 +300,29 @@
"description": ""
},
"prefs_OptionText_reply_all": {
- "message": "Reply to All",
+ "message": "Reply to all",
"description": ""
},
"prefs_OptionText_reply_sender": {
- "message": "Reply to Sender",
+ "message": "Reply to sender",
"description": ""
},
"prefs_OptionText_reply_type": {
"message": "Reply type",
"description": ""
},
+ "prefs_OptionText_reply_type_Info": {
+ "message": "This is the default reply type that will be used when replying to an email. You can choose the other later in the reply dialog.",
+ "description": ""
+ },
"prefs_OptionText_btnManagePrompts": {
"message": "Manage your prompts",
"description": ""
},
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "message": "Manage your data placeholders",
+ "description": ""
+ },
"prefsInfoTitle": {
"message": "Important Information",
"description": ""
@@ -400,7 +404,7 @@
"description": ""
},
"customprompts_form_label_define_response_lang": {
- "message": "Define the reponse language in the prompt",
+ "message": "Define the response language in the prompt",
"description": ""
},
"prefs_Connection_type": {
@@ -444,7 +448,7 @@
"description": ""
},
"chatgpt_empty_model": {
- "message": "You've not choosen a model for the ChatGPT API. Please choose one in the options page.",
+ "message": "You've not chosen a model for the ChatGPT API. Please choose one in the options page.",
"description": ""
},
"chagpt_api_send_button": {
@@ -492,7 +496,7 @@
"description": ""
},
"ollama_empty_model": {
- "message": "You've not choosen a model for the Ollama API. Please choose one in the options page.",
+ "message": "You've not chosen a model for the Ollama API. Please choose one in the options page.",
"description": ""
},
"error_connection_interrupted": {
@@ -507,7 +511,7 @@
"message": "OpenAI ChatGPT API request failed",
"description": ""
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "Waiting for the server response",
"description": ""
},
@@ -532,7 +536,7 @@
"description": ""
},
"OpenAIComp_empty_model": {
- "message": "You've not choosen a model for the OpenAI Compatible API. Please choose one in the options page.",
+ "message": "You've not chosen a model for the OpenAI Compatible API. Please choose one in the options page.",
"description": ""
},
"OpenAIComp_api_request_failed": {
@@ -560,7 +564,7 @@
"description": ""
},
"prefs_OptionText_dynamic_menu_force_enter_info": {
- "message": "If checked, using the keyboard shortcut CTRL+ALT+A will automatically send the hightlighted prompt from the menu. Otherwise, the prompt name will be displayed to the user, requiring another press of the Enter key to send it.",
+ "message": "If checked, using the keyboard shortcut CTRL+ALT+A will automatically send the highlighted prompt from the menu. Otherwise, the prompt name will be displayed to the user, requiring another press of the Enter key to send it.",
"description": ""
},
"prefs_OptionText_dynamic_menu_order_alphabet": {
@@ -695,10 +699,6 @@
"message": "You can use additional data placeholders.",
"description": ""
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "You can change the prompt as you wish, but the response received from the AI must be a comma-separated list of tags!",
- "description": ""
- },
"prefs_OptionText_openai_comp_use_v1" : {
"message": "Keep the \"v1\" compatibility",
"description": ""
@@ -739,6 +739,10 @@
"message": "Reply to the following email \"{%selected_text%}\", considering this is the full thread of emails \"{%mail_html_body%}\". Reply with only the needed text and with no extra comments or other text.",
"description": ""
},
+ "prompt_reply_custom_command_full_text": {
+ "message": "Reply to the following email \"{%mail_text_body%}\". {%additional_text%}. Reply with only the needed text and with no extra comments or other text.",
+ "description": ""
+ },
"prompt_rewrite_full_text": {
"message": "Rewrite the following text to be more polite. Reply with only the re-written text and with no extra comments or other text.",
"description": ""
@@ -776,7 +780,7 @@
"description": ""
},
"prompt_add_tags_full_text": {
- "message": "Analyze the following email text and generate a comma-separated list of tags that summarize its content. Use themes, key topics, and relevant descriptors as tags. Ensure the tags are concise and relevant to the email's content.\nEmail text: {%mail_text_body%}\nConsider the following details for context:\n- Sender: {%author%}\n- Recipients: {%recipients%}\n- CC list: {%cc_list%}\n- Email subject: {%mail_subject%}\nPlease base your tags on the email's text and context, ignoring unnecessary information or trivial details. The output should be only a list of comma separated tags without any additional comment or text.",
+ "message": "Analyze the following email text and generate a JSON array of tags that summarize its content. Use themes, key topics, and relevant descriptors as tags. Ensure the tags are concise and relevant to the email's content.\nEmail text: {%mail_text_body%}\nConsider the following details for context:\n- Sender: {%author%}\n- Recipients: {%recipients%}\n- CC list: {%cc_list%}\n- Email subject: {%mail_subject%}\nPlease base your tags on the email's text and context, ignoring unnecessary information or trivial details.\nGenerate a response in JSON format only. The output should be only a JSON array of tags without any additional comment or text. Here is an example of the JSON format to be used:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}",
"description": ""
},
"prompt_proofread_this": {
@@ -948,7 +952,7 @@
"description": ""
},
"google_gemini_empty_model": {
- "message": "You've not choosen a model for the Google Gemini API. Please choose one in the options page.",
+ "message": "You've not chosen a model for the Google Gemini API. Please choose one in the options page.",
"description": ""
},
"GoogleGemini_SystemInstruction": {
@@ -1047,7 +1051,7 @@
"message": "Current prompt text",
"description": ""
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"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": ""
},
@@ -1100,7 +1104,7 @@
"description": ""
},
"no_valid_data_received": {
- "message": "No valid data recevied from the AI.",
+ "message": "No valid data received from the AI.",
"description": ""
},
"prefs_OptionText_add_tags_auto": {
@@ -1167,10 +1171,6 @@
"message": "Current prompt text",
"description": ""
},
- "prefs_OptionText_spamfilter_infoline": {
- "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": ""
- },
"prompt_spamfilter" : {
"message" : "Detect spam emails",
"description" : ""
@@ -1468,7 +1468,7 @@
"description": ""
},
"anthropic_empty_model": {
- "message": "You've not choosen a model for the Anthropic API. Please choose one in the options page.",
+ "message": "You've not chosen a model for the Anthropic API. Please choose one in the options page.",
"description": ""
},
"anthropic_empty_version": {
@@ -1480,7 +1480,7 @@
"description": ""
},
"_api_connecting": {
- "message": "Attempting to connect to $api_string$ using the following configuration:",
+ "message": "Attempting to connect to $api_string$ using the following configuration...",
"description": "",
"placeholders": {
"api_string": {
@@ -1489,31 +1489,16 @@
}
},
"_api_connecting_model": {
- "message": "Model: $model$",
- "description": "",
- "placeholders": {
- "model": {
- "content": "$1"
- }
- }
+ "message": "Model",
+ "description": ""
},
"_api_connecting_host": {
- "message": "Host: $api_host$",
- "description": "",
- "placeholders": {
- "api_host": {
- "content": "$1"
- }
- }
+ "message": "Host",
+ "description": ""
},
"_api_connecting_version": {
- "message": "Version: $api_version$",
- "description": "",
- "placeholders": {
- "api_version": {
- "content": "$1"
- }
- }
+ "message": "Version",
+ "description": ""
},
"prefs_OpenAIComp_AvailableServices": {
"message": "Available Services",
@@ -1539,5 +1524,97 @@
"apiwebchat_selection_info": {
"message": "If you select some text, only that portion will be considered.",
"description": ""
+ },
+ "ChatGPT_chatgpt_api_store": {
+ "message": "Use storage",
+ "description": ""
+ },
+ "ChatGPT_chatgpt_api_store_info": {
+ "message": "If checked, your chats will be stored by OpenAI.",
+ "description": ""
+ },
+ "prefs_ollama_think": {
+ "message": "Enable thinking",
+ "description": ""
+ },
+ "prefs_ollama_think_Info": {
+ "message": "If checked, the Model will think before answering. This option works only with models that support the 'think' feature.",
+ "description": ""
+ },
+ "chatgpt_win_change_reply_type": {
+ "message": "Click to change the reply type",
+ "description": ""
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match": {
+ "message": "Exclusions exact match",
+ "description": ""
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match_Info": {
+ "message": "If checked, the words in the exclusion list will be matched exactly with the tags. Otherwise, they will also match if included within the tag.",
+ "description": ""
+ },
+ "customDataPH_manageDataPH": {
+ "message": "Manage Data Placeholders",
+ "description": ""
+ },
+ "customDataPH_manageDataPH_info_default_3": {
+ "message": "You can also use the default data placeholders with autocomplete, just like when writing custom prompts.",
+ "description": ""
+ },
+ "customDataPH_manageDataPH_info_default": {
+ "message": "On this page, it is possible to define custom data placeholders to be used in your custom prompts.",
+ "description": ""
+ },
+ "customDataPH_manageDataPH_info_default_2": {
+ "message": "Existing data placeholders with the same ID will be overwritten. Placeholders with new IDs will be added.",
+ "description": ""
+ },
+ "customDataPH_ExportAll": {
+ "message": "Export all custom data placeholders",
+ "description": ""
+ },
+ "customDataPH_Import": {
+ "message": "Import new data placeholders",
+ "description": ""
+ },
+ "customDataPH_form_label_Text": {
+ "message": "Data Placeholder Text",
+ "description": ""
+ },
+ "customDataPH_saving_custom": {
+ "message": "Saving custom data placeholders...",
+ "description": ""
+ },
+ "customDataPH_saved": {
+ "message": "Custom data placeholders saved!",
+ "description": ""
+ },
+ "customDataPH_btnAddNewCommit": {
+ "message": "Add the Data Placeholder",
+ "description": ""
+ },
+ "importCustomDataPH_confirmText": {
+ "message": "You are about to import new custom data placeholders.",
+ "description": ""
+ },
+ "importCustomDataPH_start_import": {
+ "message": "Starting custom data placeholders import...",
+ "description": ""
+ },
+ "importCustomDataPH_import_completed": {
+ "message": "Custom data placeholders import completed! You need to click on the 'Save All' button to save your changes.",
+ "description": ""
+ },
+ "importCustomDataPH_invalidFile": {
+ "message": "The file you're trying to import is not a valid custom data placeholders file.",
+ "description": ""
+ },
+ "importCustomDataPH_invalidDataPHs": {
+ "message": "The file you're trying to import does not contain any valid custom data placeholders.",
+ "description": ""
+ },
+ "customDataPH_add_to_menu": {
+ "message": "Usable in prompts added to menu",
+ "description": ""
}
}
\ No newline at end of file
diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json
index 6a1d39c9..4624c571 100644
--- a/_locales/eo/messages.json
+++ b/_locales/eo/messages.json
@@ -1,7 +1,4 @@
{
- "customPrompts_save_button": {
- "message": "Konservi"
- },
"prompt_lang": {
"message": "Respondi per"
},
@@ -11,7 +8,7 @@
"prompt_rewrite_formal": {
"message": "Reverki formale"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Pliaj informoj"
},
"customPrompts_managePrompts": {
@@ -23,10 +20,10 @@
"customPrompts_form_required_fields": {
"message": "Postulataj kampoj"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Konservi ĉion"
},
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Aldoni novan"
},
"chatgpt_btn_retry": {
diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json
index 53e30fe2..38fd0925 100644
--- a/_locales/fr/messages.json
+++ b/_locales/fr/messages.json
@@ -39,7 +39,7 @@
"customPrompts_managePrompts": {
"message": "Gérer les prompts"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Informations"
},
"customPrompts_managePrompts_info_default": {
@@ -120,13 +120,10 @@
"customPrompts_unsaved_changes": {
"message": "Il y a des modifications non enregistrées !"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Tout enregistrer"
},
- "customPrompts_save_button": {
- "message": "Enregistrer"
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Ajouter nouveau"
},
"customPrompts_btnAddNewCommit": {
@@ -189,9 +186,6 @@
"chatgpt_win_send": {
"message": "Envoyer"
},
- "chatgpt_use_gpt35": {
- "message": "Utiliser GPT3.5"
- },
"chatgpt_force_completion": {
"message": "forcer l'achèvement"
},
@@ -384,7 +378,7 @@
"chatgpt_api_request_failed": {
"message": "La demande d'API OpenAI ChatGPT a échoué"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "En attente de la réponse du serveur"
},
"prefs_API_Host_Info": {
@@ -513,9 +507,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "Vous pouvez utiliser des espaces réservés pour des données supplémentaires."
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Vous pouvez modifier le prompt comme vous le souhaitez, mais la réponse de l'IA doit être une liste de tags séparés par des virgules !"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "Conserver la compatibilité \"v1\""
},
@@ -571,7 +562,7 @@
"message": "Ajoutez des tags à ce courriel"
},
"prompt_add_tags_full_text": {
- "message": "Analysez le texte de courriel suivant et générez une liste de tags séparés par des virgules qui résument son contenu. Utilisez des thèmes, des sujets clés et des descripteurs pertinents comme tags. Assurez-vous que les tags soient concis et pertinents pour le contenu du courriel.\nTexte du courriel : {%mail_text_body%}\nConsidérez les détails suivants pour le contexte :\n- Expéditeur : {%author%}\n- Destinataires : {%recipients%}\n- Liste CC : {%cc_list%}\n- Sujet du courriel : {%mail_subject%}\nVeuillez baser vos tags sur le texte et le contexte du courriel, en ignorant les informations inutiles ou triviales. La sortie doit être uniquement une liste de tags séparés par des virgules, sans aucun commentaire ou texte supplémentaire."
+ "message": "Analyse le texte de l’e-mail suivant et génère un tableau JSON de tags résumant son contenu. Utilise des thèmes, des sujets clés et des descripteurs pertinents comme tags. Assure-toi que les tags soient concis et en lien direct avec le contenu de l’e-mail.\nTexte du courriel : {%mail_text_body%}\nConsidérez les détails suivants pour le contexte :\n- Expéditeur : {%author%}\n- Destinataires : {%recipients%}\n- Liste CC : {%cc_list%}\n- Sujet du courriel : {%mail_subject%}\nGénère les tags en te basant sur le texte de l’e-mail et le contexte, en ignorant les informations inutiles ou les détails sans importance.\nGénère une réponse uniquement au format JSON. La sortie doit être uniquement un tableau JSON de tags, sans commentaire ni texte supplémentaire. Voici un exemple du format JSON à utiliser :\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_current_email": {
"message": "Tags de courriels"
@@ -741,7 +732,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Texte du prompt actuel"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Vous pouvez modifier le prompt comme vous le souhaitez, mais la réponse reçue de l'IA doit être au format JSON tel que spécifié dans l'invite par défaut !"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -837,9 +828,6 @@
"SpamFilter_prompt_text_title": {
"message": "Texte du prompt actuelle"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Vous pouvez modifier le prompt comme vous le souhaitez, mais la réponse de l'IA doit être au format JSON, comme spécifié dans le prompt par défaut !"
- },
"thunderai_def_lang": {
"message": "Langue par défaut telle que définie dans les options de ThunderAI."
},
@@ -919,7 +907,7 @@
"message": "Réception des données"
},
"customPrompts_form_label_use_diff_viewer": {
- "message": "Activer le visualiseur de différences"
+ "message": "Active la visionneuse de comparaison de texte"
},
"context_menu_mzta-spamfilter": {
"message": "Analyser comme spam"
@@ -979,7 +967,7 @@
"message": "GPT personnalisé pour ChatGPT Web"
},
"customPrompts_form_label_use_diff_viewer_title": {
- "message": "Le visualiseur de différences peut être sélectionné lorsque l'action est définie sur \"Remplacer le texte\"."
+ "message": "La visionneuse de comparaison de texte peut être sélectionnée lorsque l’action est définie sur « Substituer le texte »."
},
"ask_chatgptweb_permission_1": {
"message": "Pour utiliser l'intégration Web de ChatGPT, vous devez accorder l'autorisation requise."
@@ -1084,7 +1072,7 @@
"message": "Extrait tous les détails pertinents nécessaires pour générer une tâche à partir du texte suivant. Les informations extraites doivent inclure :\n- Date et heure d'échéance (incluant le fuseau horaire, si précisé)\n- Résumé de la tâche\n- Date et heure de début (incluant le fuseau horaire, si précisé)\nAssure-toi que les données sont clairement et uniformément formatées afin qu’elles puissent être utilisées directement pour créer une tâche.\nS'il y a des références temporelles relatives, considère que la date et l’heure de l’e-mail sont \"{%mail_datetime%}\". Calcule la date et l’heure de début en te basant sur cette référence. Si la date et l’heure de début calculées sont antérieures à \"{%current_datetime%}\", recalcule-les en utilisant \"{%current_datetime%}\" comme base.\nSi tu ne peux pas obtenir une ou plusieurs des informations requises, réponds par une chaîne vide.\nGénère une réponse uniquement au format JSON. N’inclus aucun texte ou explication supplémentaire – fournis uniquement le JSON. Voici le format à utiliser :\n{\n\"InitialDate\" : \"YYYYMMDDTHHMMSS\",\n\"dueDate\" : \"YYYYMMDDTHHMMSS\",\n\"summary\" : \"Résumé de la tâche ici\"\n}\nS'il n'y a pas d'informations concernant les dates, supprime-les.\nVoici le texte : \"{%selected_text%}\""
},
"_api_connecting": {
- "message": "Tentative de connexion à $api_string$ avec la configuration suivante :",
+ "message": "Tentative de connexion à $api_string$ avec la configuration suivante ...",
"placeholders": {
"api_string": {
"content": "$1"
@@ -1151,7 +1139,7 @@
"message": "Erreur lors de la tentative de récupération des modèles Anthropic"
},
"_api_connecting_model": {
- "message": "Modèle : $model$",
+ "message": "Modèle",
"placeholders": {
"model": {
"content": "$1"
@@ -1159,7 +1147,7 @@
}
},
"_api_connecting_host": {
- "message": "Hôte : $api_host$",
+ "message": "Hôte",
"placeholders": {
"api_host": {
"content": "$1"
@@ -1167,7 +1155,7 @@
}
},
"_api_connecting_version": {
- "message": "Version : $api_version$",
+ "message": "Version",
"placeholders": {
"api_version": {
"content": "$1"
@@ -1179,5 +1167,86 @@
},
"Custom": {
"message": "Personnalisé"
+ },
+ "prefs_OptionText_reply_type_Info": {
+ "message": "Ceci est le type de réponse par défaut qui sera utilisé lors de la réponse à un e-mail. Vous pouvez choisir l'autre plus tard dans la fenêtre de réponse."
+ },
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "message": "Gérez vos espaces réservés de données"
+ },
+ "ChatGPT_chatgpt_api_store_info": {
+ "message": "Si cette option est cochée, vos conversations seront enregistrées par OpenAI."
+ },
+ "prefs_ollama_think_Info": {
+ "message": "Si cette option est cochée, le Modèle réfléchira avant de répondre. Cette option fonctionne uniquement avec les modèles qui prennent en charge la fonction « réfléchir »."
+ },
+ "chatgpt_win_change_reply_type": {
+ "message": "Cliquez pour changer le type de réponse"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match": {
+ "message": "Correspondance exacte des exclusions"
+ },
+ "customDataPH_manageDataPH_info_default": {
+ "message": "Sur cette page, il est possible de définir des espaces réservés de données personnalisés à utiliser dans vos invites personnalisées."
+ },
+ "customDataPH_manageDataPH_info_default_3": {
+ "message": "Vous pouvez également utiliser les espaces réservés de données par défaut avec la saisie semi-automatique, comme lorsque vous rédigez des invites personnalisées."
+ },
+ "customDataPH_manageDataPH_info_default_2": {
+ "message": "Les espaces réservés de données existants avec le même identifiant seront écrasés. Les espaces réservés avec de nouveaux identifiants seront ajoutés."
+ },
+ "customDataPH_ExportAll": {
+ "message": "Exporter tous les espaces réservés de données personnalisés"
+ },
+ "customDataPH_Import": {
+ "message": "Importer de nouveaux espaces réservés de données"
+ },
+ "customDataPH_form_label_Text": {
+ "message": "Texte de l'espace réservé de données"
+ },
+ "customDataPH_saving_custom": {
+ "message": "Enregistrement des espaces réservés de données personnalisés..."
+ },
+ "customDataPH_saved": {
+ "message": "Espaces réservés de données personnalisés enregistrés !"
+ },
+ "customDataPH_btnAddNewCommit": {
+ "message": "Ajouter l'espace réservé de données"
+ },
+ "importCustomDataPH_confirmText": {
+ "message": "Vous êtes sur le point d'importer de nouveaux espaces réservés de données personnalisés."
+ },
+ "importCustomDataPH_start_import": {
+ "message": "Démarrage de l'importation des espaces réservés de données personnalisés..."
+ },
+ "importCustomDataPH_import_completed": {
+ "message": "Importation des espaces réservés de données personnalisés terminée ! Vous devez cliquer sur le bouton « Enregistrer tout » pour sauvegarder vos modifications."
+ },
+ "importCustomDataPH_invalidFile": {
+ "message": "Le fichier que vous essayez d'importer n'est pas un fichier valide d'espaces réservés de données personnalisés."
+ },
+ "importCustomDataPH_invalidDataPHs": {
+ "message": "Le fichier que vous essayez d'importer ne contient aucun espace réservé de données personnalisés valide."
+ },
+ "customDataPH_add_to_menu": {
+ "message": "Utilisable dans les invites ajoutées au menu"
+ },
+ "ChatGPT_chatgpt_api_store": {
+ "message": "Utiliser le stockage"
+ },
+ "prefs_ollama_think": {
+ "message": "Activer la réflexion"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match_Info": {
+ "message": "Si cette option est cochée, les mots de la liste d'exclusion correspondront exactement aux balises. Sinon, ils correspondront également s'ils sont inclus dans la balise."
+ },
+ "customDataPH_manageDataPH": {
+ "message": "Gérer les espaces réservés de données"
+ },
+ "prompt_reply_custom_command": {
+ "message": "Répondre avec une commande"
+ },
+ "prompt_reply_custom_command_full_text": {
+ "message": "Répondez à l'e-mail suivant « {%mail_text_body%} ». {%additional_text%}. Répondez uniquement avec le texte nécessaire, sans commentaires ou texte supplémentaire."
}
}
diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json
index 7f939146..c913a94a 100644
--- a/_locales/hr/messages.json
+++ b/_locales/hr/messages.json
@@ -39,7 +39,7 @@
"customPrompts_managePrompts": {
"message": "Upravljaj upitima"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Više informacija"
},
"customPrompts_managePrompts_info_default": {
@@ -120,13 +120,10 @@
"customPrompts_unsaved_changes": {
"message": "Ima nespremljenih promjena!"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Spremi sve"
},
- "customPrompts_save_button": {
- "message": "Spremi"
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Dodaj novo"
},
"customPrompts_btnAddNewCommit": {
@@ -189,9 +186,6 @@
"chatgpt_win_send": {
"message": "Pošalji"
},
- "chatgpt_use_gpt35": {
- "message": "Koristi GPT3.5"
- },
"chatgpt_force_completion": {
"message": "prisilno dovrši"
},
@@ -384,7 +378,7 @@
"chatgpt_api_request_failed": {
"message": "OpenAI ChatGPT API zahtjev nije uspio"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "Čeka se odgovor poslužitelja"
},
"prefs_API_Host_Info": {
@@ -513,9 +507,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "Možete koristiti dodatna rezervirana mjesta za podatke."
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Možete promijeniti upit kako želite, ali odgovor primljen od AI mora biti popis oznaka odvojenih zarezima!"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "Zadrži \"v1\" kompatibilnost"
},
@@ -571,7 +562,7 @@
"message": "Dodaj oznake ovoj e-poruci"
},
"prompt_add_tags_full_text": {
- "message": "Analiziraj sljedeći tekst e-poruke i generiraj popis oznaka odvojenih zarezima koji sažimaju njegov sadržaj. Koristi teme, ključne teme i relevantne deskriptore kao oznake. Provjeri jesu li oznake sažete i relevantne za sadržaj e-poruke.\nTekst e-poruke: {%mail_text_body%}\nUzmi u obzir sljedeće pojedinosti za kontekst:\n- Šalje: {%author%}\n- Primatelji: {%recipients%}\n- CC popis: {%cc_list%}\n- Naslov: {%mail_subject%}\nTemelji svoje oznake na tekstu i kontekstu e-poruke, zanemarujući nepotrebne informacije ili trivijalne detalje. Izlaz bi trebao biti samo popis oznaka odvojenih zarezom bez dodatnih komentara ili teksta."
+ "message": "Analiziraj sljedeći tekst e-pošte i generiraj JSON niz oznaka koje sažimaju njezin sadržaj. Koristi teme, ključne pojmove i relevantne opise kao oznake. Pobrini se da oznake budu sažete i relevantne za sadržaj poruke.\nTekst e-poruke: {%mail_text_body%}\nUzmi u obzir sljedeće pojedinosti za kontekst:\n- Šalje: {%author%}\n- Primatelji: {%recipients%}\n- CC popis: {%cc_list%}\n- Naslov: {%mail_subject%}\nTemelji oznake na tekstu poruke i kontekstu, zanemarujući nebitne informacije ili trivijalne detalje.\nGeneriraj odgovor isključivo u JSON formatu. Izlaz mora biti samo JSON niz oznaka, bez ikakvih dodatnih komentara ili teksta. Evo primjera formata koji treba koristiti:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_current_email": {
"message": "Oznake e-pošte"
@@ -741,7 +732,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Trenutačni tekst upita"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Možete promijeniti upit kako želite, ali odgovor primljen od AI mora biti u JSON formatu kako je navedeno u zadanom upitu!"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -807,9 +798,6 @@
"SpamFilter_prompt_text_title": {
"message": "Trenutačni tekst upita"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Možete promijeniti upit kako želite, ali odgovor primljen od AI mora biti u JSON formatu kako je navedeno u zadanom upitu!"
- },
"prompt_spamfilter": {
"message": "Prepoznaj neželjenu poštu"
},
diff --git a/_locales/it/messages.json b/_locales/it/messages.json
index 57f083fe..27b32bca 100644
--- a/_locales/it/messages.json
+++ b/_locales/it/messages.json
@@ -39,7 +39,7 @@
"customPrompts_managePrompts": {
"message": "Gestisci i prompt"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Informazioni"
},
"customPrompts_managePrompts_info_default": {
@@ -120,13 +120,10 @@
"customPrompts_unsaved_changes": {
"message": "Ci sono modifiche non salvate!"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Salva Tutto"
},
- "customPrompts_save_button": {
- "message": "Salva"
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Aggiungi Nuovo"
},
"customPrompts_btnAddNewCommit": {
@@ -189,9 +186,6 @@
"chatgpt_win_send": {
"message": "Invia"
},
- "chatgpt_use_gpt35": {
- "message": "Usa GPT3.5"
- },
"chatgpt_force_completion": {
"message": "forza il completamento"
},
@@ -384,7 +378,7 @@
"chatgpt_api_request_failed": {
"message": "Richiesta all'API compatibile con OpenAI ChatGPT fallita"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "In attesa della risposta del server"
},
"prefs_API_Host_Info": {
@@ -513,9 +507,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "Puoi utilizzare segnaposto per dati aggiuntivi."
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Puoi modificare il prompt come preferisci, ma la risposta ricevuta dall'IA deve essere una lista di tag separati da virgole!"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "Mantieni la compatibilità con \"v1\""
},
@@ -571,7 +562,7 @@
"message": "Aggiungi tag a questa email"
},
"prompt_add_tags_full_text": {
- "message": "Analizza il seguente testo email e genera una lista di tag separati da virgole che ne riassumano il contenuto. Usa temi, argomenti principali e descrittori pertinenti come tag. Assicurati che i tag siano concisi e rilevanti per il contenuto dell'email.\nTesto email: {%mail_text_body%}\nConsidera i seguenti dettagli come contesto:\n- Mittente: {%author%}\n- Destinatari: {%recipients%}\n- Lista CC: {%cc_list%}\n- Oggetto dell'email: {%mail_subject%}\nBasa i tuoi tag sul testo e sul contesto dell'email, ignorando informazioni superflue o dettagli banali. L'output dovrebbe essere solo un elenco di tag separati da virgole, senza alcun commento o testo aggiuntivo."
+ "message": "Analizza il seguente testo email e genera un array JSON di tag che ne riassumano il contenuto. Utilizza come tag i temi, gli argomenti principali e i descrizioni rilevanti. Assicurati che i tag siano concisi e pertinenti al contenuto dell’email.\nTesto email: {%mail_text_body%}\nConsidera i seguenti dettagli come contesto:\n- Mittente: {%author%}\n- Destinatari: {%recipients%}\n- Lista CC: {%cc_list%}\n- Oggetto dell'email: {%mail_subject%}\nBasati sul testo dell’email e sul contesto per generare i tag, ignorando le informazioni superflue o i dettagli irrilevanti.\nGenera una risposta esclusivamente in formato JSON. L’output deve essere solo un array JSON di tag, senza alcun commento o testo aggiuntivo. Ecco un esempio del formato JSON da utilizzare:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_current_email": {
"message": "Tag delle email"
@@ -741,7 +732,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Testo attuale del prompt"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Puoi modificare il prompt come preferisci, ma la risposta ricevuta dall'AI deve essere in formato JSON come specificato nel prompt predefinito!"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -849,9 +840,6 @@
"prefs_OptionText_spamfilter_Info": {
"message": "Se selezionato, ThunderAI sposterà automaticamente le email di spam nella cartella dello spam."
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Puoi modificare il prompt come desideri, ma la risposta ricevuta dall'IA deve essere in formato JSON come specificato nel prompt predefinito!"
- },
"prefs_OptionText_spamfilter_threshold": {
"message": "Valore soglia per lo spam"
},
@@ -931,7 +919,7 @@
"message": "Se selezionato, il fuso orario specificato verrà applicato agli eventi del calendario e alle attività."
},
"customPrompts_form_label_use_diff_viewer": {
- "message": "Abilita il visualizzatore delle differenze"
+ "message": "Abilita il visualizzatore di confronto del testo"
},
"apiwebchat_stopping": {
"message": "Interruzione in corso"
@@ -973,7 +961,7 @@
"message": "Nessun testo selezionato, vuoi inserire la risposta dell'IA all'inizio dell'email?"
},
"customPrompts_form_label_use_diff_viewer_title": {
- "message": "Il visualizzatore delle differenze può essere selezionato quando l'azione è impostata su \"Sostituisci testo\"."
+ "message": "Il visualizzatore di confronto del testo può essere selezionato quando l'azione è impostata su \"Sostituisci testo\"."
},
"prefs_OptionText_get_calendar_event_Sparks_wrong_version": {
"message": "Per utilizzare le funzionalità di eventi del calendario e delle attività, installa una versione aggiornata del componente aggiuntivo ThunderAI Sparks."
@@ -1132,7 +1120,7 @@
"message": "Non hai aggiunto la versione per l'API di Anthropic. Inseriscila nella pagina delle opzioni."
},
"_api_connecting": {
- "message": "Tentativo di connessione a $api_string$ utilizzando la seguente configurazione:",
+ "message": "Tentativo di connessione a $api_string$ utilizzando la seguente configurazione...",
"placeholders": {
"api_string": {
"content": "$1"
@@ -1140,7 +1128,7 @@
}
},
"_api_connecting_model": {
- "message": "Modello: $model$",
+ "message": "Modello",
"placeholders": {
"model": {
"content": "$1"
@@ -1148,7 +1136,7 @@
}
},
"_api_connecting_host": {
- "message": "Host: $api_host$",
+ "message": "Host",
"placeholders": {
"api_host": {
"content": "$1"
@@ -1173,7 +1161,7 @@
"message": "Se selezioni del testo, verrà considerata solo quella parte."
},
"_api_connecting_version": {
- "message": "Versione: $api_version$",
+ "message": "Versione",
"placeholders": {
"api_version": {
"content": "$1"
@@ -1182,5 +1170,86 @@
},
"anthropic_api_request_failed": {
"message": "Richiesta all'API di Anthropic non riuscita"
+ },
+ "prefs_OptionText_reply_type_Info": {
+ "message": "Questa è la modalità di risposta predefinita che verrà utilizzata quando rispondi a un'email. Puoi scegliere l'altra modalità nella finestra di risposta."
+ },
+ "ChatGPT_chatgpt_api_store": {
+ "message": "Usa lo storage"
+ },
+ "ChatGPT_chatgpt_api_store_info": {
+ "message": "Se selezionato, le tue chat verranno memorizzate da OpenAI."
+ },
+ "prefs_ollama_think": {
+ "message": "Abilita il thinking"
+ },
+ "prefs_ollama_think_Info": {
+ "message": "Se selezionato, il Modello rifletterà prima di rispondere. Questa opzione funziona solo con i modelli che supportano la funzione \"think\"."
+ },
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "message": "Gestisci i segnaposti dei tuoi dati"
+ },
+ "chatgpt_win_change_reply_type": {
+ "message": "Fai clic per cambiare il tipo di risposta"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match": {
+ "message": "Esclusione con corrispondenza esatta"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match_Info": {
+ "message": "Se selezionato, le parole nell'elenco delle esclusioni verranno confrontate esattamente con i tag. Altrimenti, verranno considerate corrispondenti anche quando incluse all'interno del tag."
+ },
+ "customDataPH_manageDataPH": {
+ "message": "Gestisci i segnaposto dei dati"
+ },
+ "customDataPH_manageDataPH_info_default": {
+ "message": "In questa pagina è possibile definire segnaposto di dati personalizzati da utilizzare nei tuoi prompt personalizzati."
+ },
+ "customDataPH_btnAddNewCommit": {
+ "message": "Aggiungi il segnaposto di dati"
+ },
+ "customDataPH_saved": {
+ "message": "Segnaposto di dati personalizzati salvati!"
+ },
+ "customDataPH_saving_custom": {
+ "message": "Salvataggio dei segnaposto di dati personalizzati in corso..."
+ },
+ "importCustomDataPH_invalidFile": {
+ "message": "Il file che stai cercando di importare non è un file valido di segnaposto di dati personalizzati."
+ },
+ "customDataPH_manageDataPH_info_default_3": {
+ "message": "Puoi anche usare i segnaposto dei dati predefiniti con il completamento automatico, proprio come quando scrivi prompt personalizzati."
+ },
+ "customDataPH_ExportAll": {
+ "message": "Esporta tutti i segnaposto di dati personalizzati"
+ },
+ "customDataPH_Import": {
+ "message": "Importa nuovi segnaposto di dati"
+ },
+ "customDataPH_form_label_Text": {
+ "message": "Testo del segnaposto di dati"
+ },
+ "importCustomDataPH_confirmText": {
+ "message": "Stai per importare nuovi segnaposto di dati personalizzati."
+ },
+ "importCustomDataPH_start_import": {
+ "message": "Avvio dell'importazione dei segnaposto di dati personalizzati..."
+ },
+ "importCustomDataPH_import_completed": {
+ "message": "Importazione dei segnaposto di dati personalizzati completata! Devi cliccare sul pulsante \"Salva tutto\" per salvare le modifiche."
+ },
+ "importCustomDataPH_invalidDataPHs": {
+ "message": "Il file che stai cercando di importare non contiene alcun segnaposto di dati personalizzati valido."
+ },
+ "customDataPH_add_to_menu": {
+ "message": "Utilizzabile nei prompt aggiunti al menu"
+ },
+ "customDataPH_manageDataPH_info_default_2": {
+ "message": "I segnaposto di dati esistenti con lo stesso ID verranno sovrascritti. I segnaposto con ID nuovi verranno aggiunti."
+ },
+ "prompt_reply_custom_command": {
+ "message": "Rispondi con istruzioni aggiuntive"
+ },
+ "prompt_reply_custom_command_full_text": {
+ "message": "Rispondi alla seguente email \"{%mail_text_body%}\". {%additional_text%}. Rispondi solo con il testo necessario, senza commenti aggiuntivi o altro testo."
}
}
diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json
index 7972466b..6443d310 100644
--- a/_locales/pl/messages.json
+++ b/_locales/pl/messages.json
@@ -39,7 +39,7 @@
"customPrompts_managePrompts": {
"message": "Zarządzaj poleceniami"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Więcej informacji"
},
"customPrompts_managePrompts_info_default": {
@@ -120,13 +120,10 @@
"customPrompts_unsaved_changes": {
"message": "Istnieją niezapisane zmiany!"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Zapisz wszystko"
},
- "customPrompts_save_button": {
- "message": "Zapisz"
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Dodaj nowe"
},
"customPrompts_btnAddNewCommit": {
@@ -189,9 +186,6 @@
"chatgpt_win_send": {
"message": "Wyślij"
},
- "chatgpt_use_gpt35": {
- "message": "Użyj GPT3.5"
- },
"chatgpt_force_completion": {
"message": "wymuś zakończenie"
},
@@ -384,7 +378,7 @@
"chatgpt_api_request_failed": {
"message": "Zapytanie do API OpenAI ChatGPT nie powiodło się"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "Oczekiwanie na odpowiedź serwera"
},
"prefs_API_Host_Info": {
@@ -513,9 +507,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "Możesz użyć dodatkowych symboli zastępczych danych."
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Możesz zmienić polecenie według własnego uznania, ale odpowiedź otrzymana od AI musi być listą tagów oddzielonych przecinkami!"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "Zachowaj kompatybilność z \"v1\""
},
@@ -571,7 +562,7 @@
"message": "Dodaj tagi do tego e-maila"
},
"prompt_add_tags_full_text": {
- "message": "Przeanalizuj poniższy tekst e-maila i wygeneruj listę tagów oddzielonych przecinkami, które podsumowują jego treść. Użyj tematów, kluczowych zagadnień i odpowiednich opisów jako tagów. Upewnij się, że tagi są zwięzłe i odpowiednie do treści e-maila.\nTekst e-maila: {%mail_text_body%}\nWeź pod uwagę następujące szczegóły w kontekście:\n- Nadawca: {%author%}\n- Odbiorcy: {%recipients%}\n- Lista DW: {%cc_list%}\n- Temat e-maila: {%mail_subject%}\nOprzyj swoje tagi na treści i kontekście e-maila, ignorując zbędne informacje lub nieistotne szczegóły. Wynik powinien być jedynie listą tagów oddzielonych przecinkami, bez żadnych dodatkowych komentarzy ani tekstu."
+ "message": "Przeanalizuj poniższy tekst e-maila i wygeneruj tablicę JSON z tagami podsumowującymi jego treść. Użyj tematów, kluczowych zagadnień i odpowiednich określeń jako tagów. Upewnij się, że tagi są zwięzłe i adekwatne do treści wiadomości.\nTekst e-maila: {%mail_text_body%}\nWeź pod uwagę następujące szczegóły w kontekście:\n- Nadawca: {%author%}\n- Odbiorcy: {%recipients%}\n- Lista DW: {%cc_list%}\n- Temat e-maila: {%mail_subject%}\nNa podstawie treści wiadomości i kontekstu wygeneruj tagi, pomijając zbędne informacje lub nieistotne szczegóły.\nWygeneruj odpowiedź wyłącznie w formacie JSON. Wynik powinien zawierać jedynie tablicę tagów w formacie JSON, bez dodatkowych komentarzy czy tekstu. Oto przykład wymaganego formatu:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_current_email": {
"message": "Tagi e-maila"
@@ -732,7 +723,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Bieżący tekst zapytania"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Możesz zmienić monit według własnego uznania, ale odpowiedź otrzymana od AI musi być w formacie JSON, jak określono w domyślnym zapytaniu!"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -765,9 +756,6 @@
"message": "Klucz API Google Gemini",
"description": "Klucz API dla interfejsu API Google Gemini"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Możesz zmienić prompt według własnego uznania, ale odpowiedź AI musi być w formacie JSON zgodnie z domyślnym promptem!"
- },
"Subject": {
"message": "Temat"
},
diff --git a/_locales/pt-br/messages.json b/_locales/pt-br/messages.json
index 0ed18b61..960c4c79 100644
--- a/_locales/pt-br/messages.json
+++ b/_locales/pt-br/messages.json
@@ -39,7 +39,7 @@
"customPrompts_managePrompts": {
"message": "Gerenciar Prompts"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "Mais informações"
},
"customPrompts_managePrompts_info_default": {
@@ -120,13 +120,10 @@
"customPrompts_unsaved_changes": {
"message": "Existem alterações não salvas!"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "Salvar Tudo"
},
- "customPrompts_save_button": {
- "message": "Salvar"
- },
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "Adicionar Novo"
},
"customPrompts_btnAddNewCommit": {
@@ -189,9 +186,6 @@
"chatgpt_win_send": {
"message": "Enviar"
},
- "chatgpt_use_gpt35": {
- "message": "Usar GPT-3.5"
- },
"chatgpt_force_completion": {
"message": "forçar conclusão"
},
@@ -384,7 +378,7 @@
"chatgpt_api_request_failed": {
"message": "A solicitação da API do OpenAI ChatGPT falhou"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "Aguardando a resposta do servidor"
},
"prefs_API_Host_Info": {
@@ -513,9 +507,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "Você pode usar espaços reservados para dados adicionais."
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "Você pode alterar o prompt como quiser, mas a resposta recebida da IA deve ser uma lista de tags separadas por vírgulas!"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "Manter a compatibilidade com \"v1\""
},
@@ -571,7 +562,7 @@
"message": "Adicione tags a este e-mail"
},
"prompt_add_tags_full_text": {
- "message": "Analise o seguinte texto do e-mail e gere uma lista de tags separadas por vírgulas que resumam seu conteúdo. Use temas, tópicos principais e descritores relevantes como tags. Certifique-se de que as tags sejam concisas e relevantes para o conteúdo do e-mail.\nTexto do e-mail: {%mail_text_body%}\nConsidere os seguintes detalhes como contexto:\n- Remetente: {%author%}\n- Destinatários: {%recipients%}\n- Lista CC: {%cc_list%}\n- Assunto do e-mail: {%mail_subject%}\nBaseie suas tags no texto e contexto do e-mail, ignorando informações desnecessárias ou triviais. A saída deve ser apenas uma lista de tags separadas por vírgulas, sem nenhum comentário ou texto adicional."
+ "message": "Analise o seguinte texto de e-mail e gere um array JSON de tags que resumam seu conteúdo. Use temas, tópicos principais e descritores relevantes como tags. Certifique-se de que as tags sejam concisas e pertinentes ao conteúdo do e-mail.\nTexto do e-mail: {%mail_text_body%}\nConsidere os seguintes detalhes como contexto:\n- Remetente: {%author%}\n- Destinatários: {%recipients%}\n- Lista CC: {%cc_list%}\n- Assunto do e-mail: {%mail_subject%}\nBaseie-se no texto do e-mail e no contexto para gerar as tags, ignorando informações desnecessárias ou detalhes triviais.\nGere uma resposta somente no formato JSON. A saída deve ser apenas um array JSON de tags, sem nenhum comentário ou texto adicional. Aqui está um exemplo do formato JSON a ser usado:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_current_email": {
"message": "Tags do e-mail"
@@ -741,7 +732,7 @@
"GetCalendarEvent_prompt_text_title": {
"message": "Texto do prompt atual"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "Você pode alterar o prompt como desejar, mas a resposta recebida da IA deve estar no formato JSON conforme especificado no prompt padrão!"
},
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
@@ -762,9 +753,6 @@
"calendar_opening_dialog_error": {
"message": "Erro ao abrir a caixa de diálogo do evento de calendário"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "Você pode alterar o prompt como quiser, mas a resposta recebida da IA deve estar no formato JSON, conforme especificado no prompt padrão!"
- },
"spamfilter_threshold_zero": {
"message": "O limite de spam está em zero! Você marcará todos os e-mails como spam!"
},
diff --git a/_locales/pt/messages.json b/_locales/pt/messages.json
new file mode 100644
index 00000000..cf68ee66
--- /dev/null
+++ b/_locales/pt/messages.json
@@ -0,0 +1,158 @@
+{
+ "prompt_lang": {
+ "message": "Responder em"
+ },
+ "prompt_selection_needed": {
+ "message": "Para avançar tens que selecionar texto!"
+ },
+ "customPrompts_form_label_need_custom_text": {
+ "message": "Pedir texto adicional"
+ },
+ "customPrompts_form_label_use_diff_viewer_title": {
+ "message": "O visualizador de comparação de texto pode ser selecionado quando a ação escolhida é \"Substituir texto\"."
+ },
+ "chatgpt_win_job_completed": {
+ "message": "Concluído!"
+ },
+ "chatgpt_win_job_completed_select": {
+ "message": "Seleciona o texto que queres usar e carrega no botão."
+ },
+ "prompt_reply_advanced": {
+ "message": "Responder a esta sequência"
+ },
+ "more_info_string": {
+ "message": "Mais informação"
+ },
+ "menu_title": {
+ "message": "IA"
+ },
+ "prompt_classify": {
+ "message": "Classificar"
+ },
+ "customPrompts_add_to_menu_always": {
+ "message": "Sempre"
+ },
+ "prompt_reply": {
+ "message": "Responder a este email"
+ },
+ "prompt_rewrite_polite": {
+ "message": "Rescrever educadamente"
+ },
+ "prompt_rewrite_formal": {
+ "message": "Rescrever formalmente"
+ },
+ "prompt_translate_this": {
+ "message": "Traduzir isto"
+ },
+ "customPrompts_reindexing_list": {
+ "message": "A redefinir os índices da lista..."
+ },
+ "customPrompts_reloading_menus": {
+ "message": "A recarregar menus..."
+ },
+ "customPrompts_form_label_ID": {
+ "message": "ID"
+ },
+ "customPrompts_form_label_ID_rules": {
+ "message": "Deve ser único, letra minúscula e sem espaços"
+ },
+ "customPrompts_form_label_Action": {
+ "message": "Ação"
+ },
+ "customPrompts_form_label_need_selected": {
+ "message": "Necessário selecionar texto"
+ },
+ "customPrompts_form_label_need_signature": {
+ "message": "Adicionar sempre assinatura"
+ },
+ "customPrompts_form_label_enabled": {
+ "message": "Ativo"
+ },
+ "customPrompts_form_required_fields": {
+ "message": "Campos obrigatórios"
+ },
+ "customPrompts_btnEdit": {
+ "message": "Editar"
+ },
+ "customPrompts_btnCancel": {
+ "message": "Cancelar"
+ },
+ "customPrompts_btnOK": {
+ "message": "OK"
+ },
+ "customPrompts_btnDelete": {
+ "message": "Apagar"
+ },
+ "customPrompts_btnDelete_confirmText": {
+ "message": "Tens a certeza que queres apagar este item?"
+ },
+ "customPrompts_unsaved_changes": {
+ "message": "Existem alterações por guardar!"
+ },
+ "btnSaveAll_string": {
+ "message": "Guardar Tudo"
+ },
+ "btnNew_string": {
+ "message": "Adicionar Novo"
+ },
+ "customPrompts_add_to_menu": {
+ "message": "Adicionar ao menu"
+ },
+ "customPrompts_add_to_menu_reading": {
+ "message": "A ler um email"
+ },
+ "customPrompts_substitute_text": {
+ "message": "Substituir texto"
+ },
+ "customPrompts_managePrompts_info_default_3": {
+ "message": "Se estiver tudo certo, depois de importar carrega no botão \"Guardar Tudo\"."
+ },
+ "extensionDescription": {
+ "message": "Usa o ChatGPT, Google Gemini, Anthropic ou Ollama para melhorar os teus emails!"
+ },
+ "customPrompts_form_label_Name": {
+ "message": "Nome"
+ },
+ "prompt_summarize_this": {
+ "message": "Resumir isto"
+ },
+ "customPrompts_add_to_menu_composing": {
+ "message": "A compor um email"
+ },
+ "customPrompts_form_label_use_diff_viewer": {
+ "message": "Ativar o visualizador de comparação de texto"
+ },
+ "chatgpt_win_working": {
+ "message": "Trabalho em curso..."
+ },
+ "customPrompts_managePrompts": {
+ "message": "Gerir prompts"
+ },
+ "customPrompts_managePrompts_info_default": {
+ "message": "Os prompts padrão não são editáveis. Podes desativá-los, copiar o texto do prompt e colá-lo num novo, para criar uma versão modificada."
+ },
+ "customPrompts_managePrompts_info_default_2": {
+ "message": "Podes importar e exportar prompts. Prompts existentes com o mesmo ID serão escritos por cima. Prompts com um ID novo serão adicionados."
+ },
+ "customPrompts_start_saving": {
+ "message": "A guardar prompts..."
+ },
+ "customPrompts_filtering_prompts": {
+ "message": "A filtrar prompts..."
+ },
+ "customPrompts_saving_default_prompts": {
+ "message": "A guardar prompts padrão..."
+ },
+ "customPrompts_saving_custom_prompts": {
+ "message": "A guardar prompts personalizados..."
+ },
+ "customPrompts_saved": {
+ "message": "Prompts guardados!"
+ },
+ "customPrompts_btnAddNewCommit": {
+ "message": "Adicionar o prompt"
+ },
+ "customPrompts_do_reply": {
+ "message": "Responder"
+ }
+}
diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json
new file mode 100644
index 00000000..a69cb301
--- /dev/null
+++ b/_locales/ru/messages.json
@@ -0,0 +1,1218 @@
+{
+ "importPrompts_invalidFile": {
+ "message": "Файл, который вы пытаетесь импортировать, не является допустимым файлом пользовательских промтов."
+ },
+ "chatgpt_empty_model": {
+ "message": "Вы не выбрали модель для API ChatGPT. Выберите ее на странице параметров."
+ },
+ "menu_title": {
+ "message": "ИИ"
+ },
+ "customPrompts_start_saving": {
+ "message": "Сохранение промта..."
+ },
+ "customPrompts_form_label_need_custom_text": {
+ "message": "Запросить дополнительный текст"
+ },
+ "chatgpt_user_not_logged_in": {
+ "message": "Вы не вошли в ChatGPT. Пожалуйста, войдите в систему, используя свои учетные данные, закройте окно ChatGPT, а затем повторите предпринятое вами действие. После этого вы останетесь в системе."
+ },
+ "customPrompts_import_completed": {
+ "message": "Импорт пользовательских промтов завершен! Вам нужно нажать кнопку «Сохранить все», чтобы сохранить изменения."
+ },
+ "importPrompts_invalidPrompts": {
+ "message": "Файл, который вы пытаетесь импортировать, не содержит допустимых промтов."
+ },
+ "ChatGPT_Models_Fetch": {
+ "message": "Обновить список моделей ChatGPT"
+ },
+ "more_info_string": {
+ "message": "Дополнительная информация"
+ },
+ "customPrompts_btnEdit": {
+ "message": "Править"
+ },
+ "customPrompts_btnDelete": {
+ "message": "Удалить"
+ },
+ "customPrompts_Import": {
+ "message": "Импорт новых промтов"
+ },
+ "prompt_classify": {
+ "message": "Классифицировать"
+ },
+ "importPrompts_confirmText": {
+ "message": "Вы собираетесь импортировать новые промты."
+ },
+ "customPrompts_managePrompts_info_default_2": {
+ "message": "Вы можете импортировать и экспортировать промты. Существующие промты с теми же идентификатороми будут перезаписаны. Промты с новыми идентификаторами будут добавлены."
+ },
+ "prompt_this": {
+ "message": "Создать промт"
+ },
+ "customPrompts_btnOK": {
+ "message": "Да"
+ },
+ "prompt_lang": {
+ "message": "Ответить в"
+ },
+ "prompt_reply": {
+ "message": "Ответить на это письмо"
+ },
+ "prompt_reply_advanced": {
+ "message": "Ответить на эту тему"
+ },
+ "prompt_rewrite_polite": {
+ "message": "Переписать вежливо"
+ },
+ "prompt_translate_this": {
+ "message": "Перевести"
+ },
+ "prompt_selection_needed": {
+ "message": "Чтобы продолжить, вам нужно выделить текст!"
+ },
+ "customPrompts_managePrompts": {
+ "message": "Управление промтами"
+ },
+ "customPrompts_managePrompts_info_default_3": {
+ "message": "Если все правильно, после импорта нажмите кнопку «Сохранить все»."
+ },
+ "customPrompts_form_label_Name": {
+ "message": "Имя"
+ },
+ "customPrompts_form_label_Text": {
+ "message": "Текст промта"
+ },
+ "customPrompts_form_label_Action": {
+ "message": "Действие"
+ },
+ "customPrompts_managePrompts_info_default": {
+ "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_form_label_need_selected": {
+ "message": "Необходимо выделить текст"
+ },
+ "customPrompts_btnCancel": {
+ "message": "Отмена"
+ },
+ "customPrompts_btnDelete_confirmText": {
+ "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_composing": {
+ "message": "Составление письма"
+ },
+ "customPrompts_do_reply": {
+ "message": "Ответить"
+ },
+ "customPrompts_substitute_text": {
+ "message": "Заменить текст"
+ },
+ "chatgpt_win_working": {
+ "message": "Обработка..."
+ },
+ "chatgpt_win_job_completed": {
+ "message": "Завершена!"
+ },
+ "chatgpt_win_get_answer": {
+ "message": "Используй выбранный ответ"
+ },
+ "chatgpt_win_close": {
+ "message": "Закрыть"
+ },
+ "chatgpt_btn_retry": {
+ "message": "Повторить попытку"
+ },
+ "chatgpt_sendbutton_not_found_error": {
+ "message": "Нажмите кнопку «Отправить», чтобы отправить промт."
+ },
+ "chatgpt_win_custom_text": {
+ "message": "Вставьте сюда дополнительный текст промта."
+ },
+ "chatgpt_force_completion": {
+ "message": "Принудительное завершение"
+ },
+ "msg_prompt_too_long": {
+ "message": "Текст, который вы предоставили, слишком длинный. Вам нужно его сократить."
+ },
+ "prefs_OptionText_release_notes": {
+ "message": "Заметки о выпуске"
+ },
+ "prefs_status_page": {
+ "message": "статус сервиса"
+ },
+ "prefs_OptionText_default_sign_name": {
+ "message": "Имя подписи по умолчанию"
+ },
+ "prefs_OptionText_default_chatgpt_lang": {
+ "message": "Язык по умолчанию для ответов"
+ },
+ "prefs_OptionText_reply_all": {
+ "message": "Ответить всем"
+ },
+ "prefs_OptionText_btnManagePrompts": {
+ "message": "Менеджер ваших промтов"
+ },
+ "prefsInfoTitle": {
+ "message": "Важная информация"
+ },
+ "prefsInfoDesc_1": {
+ "message": "Может случиться так, что веб-интерфейс ChatGPT изменится таким образом, что это нарушит работу расширения. Проверьте страницу «Состояние службы», ссылка на которую находится внизу этой страницы. Также помните, что при первом использовании ThunderAI вам необходимо войти в ChatGPT."
+ },
+ "prefsInfoDesc_5": {
+ "message": "Помните, что вы можете открыть меню ThunderAI с помощью сочетания клавиш CTRL+ALT+A."
+ },
+ "prefsDonation_1": {
+ "message": "Вам нравится это расширение?"
+ },
+ "backToOptionsText": {
+ "message": "Параметры"
+ },
+ "currently_used_prompt": {
+ "message": "Имя текущего промта"
+ },
+ "prefs_Connection_type_ChatGPT_Web": {
+ "message": "Веб интерфейс ChatGPT"
+ },
+ "prefs_Connection_type_ChatGPT_API": {
+ "message": "ChatGPT OpenAI API"
+ },
+ "prefs_ChatGPT_API_Key": {
+ "message": "ChatGPT API ключ"
+ },
+ "Loading": {
+ "message": "Загрузка..."
+ },
+ "error": {
+ "message": "Ошибка ThunderAI!"
+ },
+ "prefs_Connection_type_Ollama_API": {
+ "message": "Ollama API (локальная LLM)"
+ },
+ "prefs_API_Host": {
+ "message": "Адрес сервера"
+ },
+ "customPrompts_form_label_ID": {
+ "message": "ID"
+ },
+ "prompt_rewrite_formal": {
+ "message": "Переписать формально"
+ },
+ "prefsInfoDesc_3": {
+ "message": "Для использования интеграции с Ollama вам необходимо настроить локальный сервер Ollama. После запуска сервера введите его адрес в указанное поле в приложении. Для обеспечения корректной связи между ThunderAI и сервером Ollama не забудьте установить OLLAMA_ORIGINS=moz-extension://*."
+ },
+ "prompt_summarize_this": {
+ "message": "Подвести итоги"
+ },
+ "customPrompts_close_button": {
+ "message": "Кнопка «Закрыть»"
+ },
+ "chatgpt_win_model_warning": {
+ "message": "По какой-то причине невозможно проверить, загружена ли правильная модель. Сейчас вы можете нажать синюю кнопку, чтобы продолжить."
+ },
+ "chatgpt_force_completion_title": {
+ "message": "Нажмите здесь, чтобы отобразить кнопку «Использовать последний ответ», если ChatGPT завершил свою работу, но кнопка не появилась."
+ },
+ "prefs_OptionText_chatgpt_win_text": {
+ "message": "Размеры окна чата ИИ"
+ },
+ "customPrompts_reindexing_list": {
+ "message": "Переиндексация списка..."
+ },
+ "customPrompts_filtering_prompts": {
+ "message": "Фильтрация промтов..."
+ },
+ "customPrompts_saving_custom_prompts": {
+ "message": "Сохранение пользовательских промтов..."
+ },
+ "customPrompts_saved": {
+ "message": "Промт сохранен!"
+ },
+ "customPrompts_reloading_menus": {
+ "message": "Перезагрузка меню..."
+ },
+ "customPrompts_form_label_need_signature": {
+ "message": "Всегда добавлять подпись"
+ },
+ "customPrompts_add_to_menu_reading": {
+ "message": "Чтение письма"
+ },
+ "prefs_OptionText_reply_type_Info": {
+ "message": "Это тип ответа по умолчанию, который будет использоваться при ответе на электронное письмо. Вы можете выбрать другой позже в диалоговом окне ответа."
+ },
+ "chatgpt_win_job_completed_select": {
+ "message": "Выберите текст, который вы хотите использовать, и нажмите кнопку."
+ },
+ "chatgpt_textarea_not_found_error": {
+ "message": "Кажется, что страница ChatGPT загружается слишком долго. Если загрузка завершится, нажмите кнопку справа. Если проблема не устранена, проверьте статус сервиса."
+ },
+ "customPrompts_ExportAll": {
+ "message": "Экспортировать все промты"
+ },
+ "chatgpt_win_send": {
+ "message": "Отправить"
+ },
+ "prefs_OptionText_reply_sender": {
+ "message": "Ответить отправителю"
+ },
+ "customprompts_form_label_define_response_lang": {
+ "message": "Определите язык ответа в промте"
+ },
+ "ChatGPT_Models_Error_fetching": {
+ "message": "Ошибка при попытке получить модели ChatGPT"
+ },
+ "prefs_OptionText_chatgpt_win_height": {
+ "message": "Высота"
+ },
+ "prefs_OptionText_chatgpt_win_width": {
+ "message": "Ширина"
+ },
+ "prefs_OptionText_reply_type": {
+ "message": "Тип ответа"
+ },
+ "customPrompts_form_label_ID_rules": {
+ "message": "Должен быть уникальным, строчным и без пробелов"
+ },
+ "prefsInfoDesc_2": {
+ "message": "Для использования API ChatGPT вам понадобится ключ API OpenAI ChatGPT и нужно выбрать модель."
+ },
+ "prefsInfoDesc_4": {
+ "message": "Чтобы использовать эту интеграцию, вам необходимо настроить локальный сервер, совместимый с API OpenAI, например LM Studio. После запуска сервера введите его адрес в указанное поле в приложении. Чтобы обеспечить надлежащую связь между ThunderAI и локальным сервером, не забудьте правильно настроить параметры CORS."
+ },
+ "prefsInfoDesc_6": {
+ "message": "Вы можете изменить сочетание клавиш, нажав на значок шестеренки в правом верхнем углу этой страницы и выбрав «Управление сочетанием клавиш расширения»."
+ },
+ "TranslateLink": {
+ "message": "Узнайте как!"
+ },
+ "prefsDonation_2": {
+ "message": "Рассмотрите возможность сделать пожертвование!"
+ },
+ "chagpt_api_send_button": {
+ "message": "Текущая модель"
+ },
+ "TranslateText": {
+ "message": "Хотите помочь перевести это дополнение?"
+ },
+ "chatgpt_empty_apikey": {
+ "message": "Вы не добавили API-ключ для API ChatGPT. Пожалуйста, введите его на странице параметров."
+ },
+ "prefs_Connection_type_OpenAI_Comp_API": {
+ "message": "API, совместимый с OpenAI"
+ },
+ "customPrompts_start_import": {
+ "message": "Запуск импорта пользовательских промтов..."
+ },
+ "Ollama_Models_Fetch": {
+ "message": "Обновить список моделей Ollama"
+ },
+ "Ollama_Models": {
+ "message": "Модели Ollama"
+ },
+ "customPrompts_saving_default_prompts": {
+ "message": "Сохранение системных промтов..."
+ },
+ "customPrompts_unsaved_changes": {
+ "message": "Есть не сохраненные изменения!"
+ },
+ "Debug": {
+ "message": "Отладка"
+ },
+ "prefs_Connection_type": {
+ "message": "Тип соединения"
+ },
+ "extensionDescription": {
+ "message": "Используй ChatGPT, Goolge Gemini, Anthropic или Ollama, чтобы улучшить качество своих электронных писем!"
+ },
+ "prefs_OptionText_do_debug_info": {
+ "message": "Активировать систему отладки"
+ },
+ "ChatGPT_Models": {
+ "message": "Модели ChatGPT"
+ },
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "message": "Управление размещением данных"
+ },
+ "Ollama_Models_Error_fetching": {
+ "message": "Ошибка при попытке получить модели Ollama"
+ },
+ "API_Models_Error_NoModels": {
+ "message": "Модели не найдены"
+ },
+ "ollama_empty_host": {
+ "message": "Вы не добавили адрес хоста для API Ollama. Пожалуйста, укажите его на странице параметров."
+ },
+ "ollama_empty_model": {
+ "message": "Вы не выбрали модель для API Ollama. Пожалуйста, выберите ее на странице параметров."
+ },
+ "error_connection_interrupted": {
+ "message": "Соединение с сервером было неожиданно прервано"
+ },
+ "ollama_api_request_failed": {
+ "message": "Запрос API Ollama завершился неудачей"
+ },
+ "chatgpt_api_request_failed": {
+ "message": "Не удалось выполнить запрос API OpenAI ChatGPT"
+ },
+ "WaitingServerResponse": {
+ "message": "Ожидание ответа сервера"
+ },
+ "prefs_API_Host_Info": {
+ "message": "Что-то вроде"
+ },
+ "OpenAIComp_Models": {
+ "message": "Совместимые с OpenAI модели API"
+ },
+ "OpenAIComp_Models_Fetch": {
+ "message": "Обновление списка совместимых с OpenAI моделей API"
+ },
+ "OpenAIComp_Models_Error_fetching": {
+ "message": "Ошибка при попытке получить модели OpenAI Compatible API"
+ },
+ "OpenAIComp_empty_host": {
+ "message": "Вы не добавили адрес хоста для OpenAI Compatible API. Пожалуйста, укажите его на странице параметров."
+ },
+ "OpenAIComp_empty_model": {
+ "message": "Вы не выбрали модель для OpenAI Compatible API. Пожалуйста, выберите ее на странице параметров."
+ },
+ "OpenAIComp_api_request_failed": {
+ "message": "Запрос OpenAI Comp API завершился неудачей"
+ },
+ "prefs_OpenAIComp_ChatName": {
+ "message": "Имя чата"
+ },
+ "prefs_OpenAIComp_ChatName_Info": {
+ "message": "Это имя будет использоваться в чате ИИ."
+ },
+ "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": "Ключ API OpenAI Comp"
+ },
+ "Optional": {
+ "message": "Дополнительно"
+ },
+ "OpenChatGPTTab": {
+ "message": "Откройте вкладку ChatGPT"
+ },
+ "OpenChatGPTTab_Info": {
+ "message": "В случае проблем со входом в окно ThunderAI откройте ChatGPT в новой вкладке с помощью кнопки справа, войдите в систему, затем закройте вкладку и продолжите работу с ThunderAI."
+ },
+ "OpenChatGPTTab_Info2": {
+ "message": "При открытии ChatGPT Web отсюда будут применены все настроенные параметры для модели, проекта и Custom 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_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. Установите нулевое значение, чтобы отключить проверку."
+ },
+ "prefs_OptionText_chatgpt_web_model": {
+ "message": "Веб-модель ChatGPT"
+ },
+ "prefs_OptionText_chatgpt_web_model_info": {
+ "message": "Это модель, которая будет применяться для веб-интерфейса ChatGPT. Если модель не указана или указана неверно, ChatGPT установит на веб-странице модель по умолчанию. Эта настройка не будет работать с бесплатной учетной записью ChatGPT."
+ },
+ "prefs_OptionText_chatgpt_web_tempchat": {
+ "message": "Временный веб-чат ChatGPT"
+ },
+ "prefs_OptionText_chatgpt_web_tempchat_info": {
+ "message": "Если флажок установлен, временный чат будет использоваться в веб-интерфейсе ChatGPT."
+ },
+ "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": "Если флажок установлен, сегмент \"v1\" в пути вызовов API будет сохранен, как и \"http://localhost:1234/v1/chat/completions\"."
+ },
+ "prefs_OptionText_openai_comp_info_remote": {
+ "message": "Здесь вы также можете вставить адрес удаленного сервера."
+ },
+ "prefs_OptionText_owl_warning": {
+ "message": "Похоже, что по крайней мере одна из ваших учетных записей использует дополнение 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_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Пожалуйста, основывайте свои теги на тексте и контексте письма, игнорируя ненужную информацию или тривиальные детали.\nГенерируйте ответ только в формате JSON. На выходе должен получиться только 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": "Максимальное кол-во тегов, предложенных ИИ. Установите значение 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": "Сброс настроек по умолчанию"
+ },
+ "addtags_excl_list_infoline2": {
+ "message": "Добавьте по одному слову в строку или разделите их запятой."
+ },
+ "addtags_dialog_title": {
+ "message": "Добавьте теги в эл. письмо"
+ },
+ "addtags_exclude_tag": {
+ "message": "Исключить тег"
+ },
+ "addtags_no_tags_received": {
+ "message": "Никаких меток от ИИ не получено."
+ },
+ "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": "Нажмите здесь, это займет всего минуту!"
+ },
+ "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": "API Google Gemini"
+ },
+ "prefs_GoogleGemini_API_Key": {
+ "message": "Ключ API"
+ },
+ "GoogleGemini_Models": {
+ "message": "Модели API Google Gemini"
+ },
+ "GoogleGemini_Models_Fetch": {
+ "message": "Обновление списка моделей Google Gemini"
+ },
+ "GoogleGemini_Models_Error_fetching": {
+ "message": "Ошибка при попытке получить модели Google Gemini"
+ },
+ "google_gemini_api_request_failed": {
+ "message": "Запрос API Google Gemini завершился неудачей"
+ },
+ "google_gemini_empty_apikey": {
+ "message": "Вы не добавили ключ API для API Google Gemini. Пожалуйста, введите его на странице параметров."
+ },
+ "google_gemini_empty_model": {
+ "message": "Вы не выбрали модель для API Google Gemini. Пожалуйста, выберите ее на странице параметров."
+ },
+ "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Если продолжительность не указана, установите ее равной одному часу.\nК ним относятся: {%author%}, {%recipients%}, {%cc_list%}. Если присутствует, исключите мой адрес: {%account_email_address%}.\nЕсли вы не можете получить одну или несколько требуемых данных, ответьте пустой строкой.\nГенерируйте ответ только в формате JSON. Не включайте никаких дополнительных текстов или пояснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"startDate\": \"ГГГГММДДДХММССС\",\n\"endDate\": \"ГГГГММДДДХММССС\",\n\"summary\": \"Здесь выводится краткое описание события календаря\",\n\"forceAllDay\": false,\n\"attendees\": [участник1@example.com,участник2@example.com,участник3@example.com]\n}\nВот текст: \"{%selected_text%}\""
+ },
+ "prompt_get_task": {
+ "message": "Добавить новую задачу"
+ },
+ "prompt_get_task_full_text": {
+ "message": "Извлеките из следующего текста все необходимые сведения, необходимые для составления задания. Извлеченная информация должна включать:\n- Дата и время выполнения (включая часовой пояс, если он указан)\n- краткое описание задачи\n- Начальная дата и время (включая часовой пояс, если он указан).\nУбедитесь, что данные отформатированы четко и последовательно, чтобы их можно было напрямую использовать для создания задачи.\nЕсли есть относительные временные ссылки, считайте, что дата и время письма - это \"{%mail_datetime%}\". Рассчитайте дату и время начала на основе этой ссылки. Если рассчитанные дата и время начала окажутся раньше, чем \"{%current_datetime%}\", пересчитайте дату и время начала, взяв за основу \"{%current_datetime%}\".\nЕсли вам не удалось получить одну или несколько требуемых данных, укажите в ответе пустую строку.\nГенерируйте ответ только в формате JSON. Не включайте никаких дополнительных текстов или пояснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"InitialDate\": \"ГГГГММДДДХММССС\",\n\"dueDate\": \"ГГГГММДДДХММССС\",\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": "Не получены достоверные данные от ИИ."
+ },
+ "prefs_OptionText_add_tags_auto": {
+ "message": "Добавляйте теги автоматически"
+ },
+ "prefs_OptionText_add_tags_auto_Info": {
+ "message": "Если флажок установлен, ИИ будет автоматически добавлять теги к вновь полученным сообщениям электронной почты."
+ },
+ "prefs_OptionText_add_tags_auto_Info2": {
+ "message": "Выберите, для какой учетной записи активировать эту функцию, в нижней части этой страницы."
+ },
+ "prefs_OptionText_add_tags_auto_force_existing": {
+ "message": "Принудительное использование существующих тегов при авто тегировании или использовании контекстного меню"
+ },
+ "prefs_OptionText_add_tags_auto_force_existing_Info": {
+ "message": "Если флажок установлен, ИИ будет добавлять только существующие теги к вновь полученным сообщениям эл. почты и не будет создавать новые теги."
+ },
+ "prefs_OptionText_add_tags_auto_only_inbox": {
+ "message": "Добавляйте теги только к входящим сообщениям эл. почты"
+ },
+ "prefs_OptionText_add_tags_auto_only_inbox_Info": {
+ "message": "Если флажок установлен, ИИ будет добавлять теги только к письмам, полученным в папке \"Входящие\"."
+ },
+ "placeholder_thunderai_def_sign": {
+ "message": "Подпись по умолчанию, определенная в опциях ThunderAI."
+ },
+ "thunderai_def_lang": {
+ "message": "Язык по умолчанию, определенный в опциях ThunderAI."
+ },
+ "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": "Проанализируйте следующее письмо и определите, является ли оно спамом или нет. Учитывайте такие факторы, как подозрительные ключевые слова, излишняя рекламная лексика, вводящие в заблуждение тематические строки, запросы личной информации и необычные адреса отправителей.\nУкажите значение от 0 (не спам) до 100 (спам) и объяснение, состоящее не более чем из 10 слов.\nВ случае отсутствия данных о сообщении установите значение 0 (не спам) и укажите причину.\nГенерируйте ответ только в формате JSON. Не включайте никаких доп. текстов или объяснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"spamValue\": <целое число от 0 до 100>,\n\"explanation\": \"Краткое объяснение ваших рассуждений\"\n}\nЗдесь находится информация о почте:\nОтправитель: \"{%author%}\"\nТема: \"{%mail_subject%}\"\nHtml-тело: \"{%mail_html_body%}\""
+ },
+ "SpamFilter_prompt_prefs_title": {
+ "message": "Параметры спам-фильтра"
+ },
+ "prefs_OptionText_spamfilter_threshold": {
+ "message": "Порог спама"
+ },
+ "prefs_OptionText_spamfilter_threshold_Info": {
+ "message": "Если значение, возвращаемое ИИ, превышает этот порог, письмо будет перемещено в папку \"Спам\"."
+ },
+ "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": "Дата отчета"
+ },
+ "spamfilter_moved": {
+ "message": "Да"
+ },
+ "spamfilter_not_moved": {
+ "message": "Нет"
+ },
+ "context_menu_mzta-add-tags": {
+ "message": "Добавить теги"
+ },
+ "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": "Редактируемый календарь не найден!"
+ },
+ "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. Эта проблема может возникнуть на linux в некоторых средах, например, при использовании Hyprland."
+ },
+ "remember_CORS": {
+ "message": "Помните, что вам необходимо настроить параметры CORS на сервере!"
+ },
+ "maybe_CORS_openai_comp": {
+ "message": "Использование OpenAI Compatible API может потребовать настройки CORS на сервере."
+ },
+ "CORS_alternative_1": {
+ "message": "Проблемы с настройкой CORS?"
+ },
+ "CORS_alternative_2": {
+ "message": "Нажмите кнопку ниже, чтобы дать разрешение во избежание проблем с CORS."
+ },
+ "CORS_give_allurls_perm": {
+ "message": "Дайте разрешение на \"все URL-адреса\""
+ },
+ "prefs_OptionText_composing_plain_text": {
+ "message": "Сочинение обычного текста"
+ },
+ "prefs_OptionText_composing_plain_text_Info": {
+ "message": "Установите этот флажок, если вы составляете эл. письма в формате обычного текста."
+ },
+ "Replace_No_Selected_Text": {
+ "message": "Текст не выбран, вы хотите вставить ответ ИИ в начало письма?"
+ },
+ "prefs_ollama_num_ctx": {
+ "message": "Количество контекстных токенов"
+ },
+ "prefs_ollama_num_ctx_Info": {
+ "message": "Количество контекстных токенов, используемых для API Ollama. Установите значение 0, если вы не хотите передавать его в качестве параметра серверу."
+ },
+ "ask_chatgptweb_permission_1": {
+ "message": "Чтобы использовать веб-интеграцию ChatGPT, необходимо предоставить необходимые права."
+ },
+ "ask_anthropic_api_permission_1": {
+ "message": "Чтобы использовать интеграцию с API Anthropic, необходимо предоставить необходимые права."
+ },
+ "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"
+ },
+ "prefs_OptionText_chatgpt_web_project_info": {
+ "message": "Это проект, который будет использоваться для веб-интерфейса ChatGPT."
+ },
+ "prefs_OptionText_chatgpt_web_custom_gpt": {
+ "message": "ChatGPT Пользовательский сайт GPT"
+ },
+ "prefs_OptionText_chatgpt_web_custom_gpt_info": {
+ "message": "Это пользовательский GPT, который будет применяться для веб-интерфейса ChatGPT."
+ },
+ "prefs_OptionText_chatgpt_web_custom_data_info": {
+ "message": "Это должно быть сделано в следующей форме:"
+ },
+ "prefs_OptionText_chatgpt_web_custom_data_info2": {
+ "message": "Вы можете найти правильное значение в поле URL браузера при открытии соответствующей страницы ChatGPT."
+ },
+ "customPrompts_Properties": {
+ "message": "Свойства"
+ },
+ "customPrompts_show_additional_info": {
+ "message": "Показать доп. свойства"
+ },
+ "customPrompts_hide_additional_info": {
+ "message": "Скрыть доп. свойства"
+ },
+ "customPrompts_show_additional_info_show": {
+ "message": "Доп. свойства"
+ },
+ "prefs_OptionText_CustomGPT_Warn": {
+ "message": "Если в параметрах или в подсказке указан проект, он отменяет настройку Custom GPT."
+ },
+ "prefs_OptionText_Project_No_temporary_chat_warn": {
+ "message": "Если в опциях или в подсказке указан Проект, временный чат не будет использоваться."
+ },
+ "prefs_Anthropic_API_Key": {
+ "message": "Ключ API Anthropic"
+ },
+ "prefs_Connection_type_Anthropic_API": {
+ "message": "Антропный(Anthropic) API"
+ },
+ "Anthropic_Models": {
+ "message": "Антропологические модели"
+ },
+ "Anthropic_Models_Fetch": {
+ "message": "Обновить список антропологических моделей"
+ },
+ "Anthropic_Models_Error_fetching": {
+ "message": "Ошибка при попытке получить антропные модели"
+ },
+ "Anthropic_Version": {
+ "message": "Антропная версия API"
+ },
+ "Anthropic_Version_Info": {
+ "message": "ОБЯЗАТЕЛЬНО. Не изменяйте это значение, если не знаете, что делаете. Доп. информация на сайте:"
+ },
+ "prefs_OptionText_anthropic_max_tokens": {
+ "message": "Anthropic максимум токенов"
+ },
+ "prefs_OptionText_anthropic_max_tokens_Info": {
+ "message": "Максимальное кол-во токенов, генерируемых в процессе завершения. Кол-во токенов в подсказке плюс max_tokens не может превышать длину контекста модели."
+ },
+ "anthropic_empty_apikey": {
+ "message": "Вы не добавили ключ API для API Anthropic. Пожалуйста, введите его на странице параметров."
+ },
+ "anthropic_empty_model": {
+ "message": "Вы не выбрали модель для Anthropic API. Пожалуйста, выберите ее на странице параметров."
+ },
+ "anthropic_empty_version": {
+ "message": "Вы не добавили строку версии для API Anthropic. Пожалуйста, вставьте ее на странице параметров."
+ },
+ "anthropic_api_request_failed": {
+ "message": "Anthropic 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 Compatible API, или вставьте его вручную."
+ },
+ "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_ollama_think": {
+ "message": "Позволяет мыслить"
+ },
+ "prefs_ollama_think_Info": {
+ "message": "Если флажок установлен, Модель будет думать перед ответом. Эта опция работает только с моделями, поддерживающими функцию \"думать\"."
+ },
+ "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": "Существующие держатели данных с тем же идентификатором будут перезаписаны. Будут добавлены местоположения с новыми идентификаторами."
+ },
+ "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": "Возможность использования в подсказках, добавленных в меню"
+ },
+ "prompt_reply_custom_command": {
+ "message": "Ответьте командой"
+ },
+ "prompt_reply_custom_command_full_text": {
+ "message": "Ответьте на следующее письмо \"{%mail_text_body%}\". {%additional_text%}. Отвечайте только на нужный текст, без лишних комментариев или другого текста."
+ }
+}
diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/_locales/sk/messages.json
@@ -0,0 +1 @@
+{}
diff --git a/_locales/zh_Hans/messages.json b/_locales/zh_Hans/messages.json
index 04bcaf10..33fa33d0 100644
--- a/_locales/zh_Hans/messages.json
+++ b/_locales/zh_Hans/messages.json
@@ -38,13 +38,13 @@
"customPrompts_form_label_need_signature": {
"message": "始终添加签名"
},
- "customPrompts_btnNew": {
+ "btnNew_string": {
"message": "新增"
},
"chatgpt_win_job_completed": {
"message": "完成了!"
},
- "customPrompts_btnSaveAll": {
+ "btnSaveAll_string": {
"message": "保存所有变动"
},
"extensionDescription": {
@@ -65,7 +65,7 @@
"customPrompts_managePrompts": {
"message": "管理提示词"
},
- "customPrompts_managePrompts_help": {
+ "more_info_string": {
"message": "更多信息"
},
"customPrompts_managePrompts_info_default": {
@@ -116,9 +116,6 @@
"prefs_OptionText_btnManagePrompts_infoline": {
"message": "您可以使用额外的数据占位符。"
},
- "prefs_OptionText_btnManagePrompts_infoline2": {
- "message": "您可以根据需要更改提示,但从 AI 收到的响应必须是以逗号分隔的标签列表!"
- },
"prefs_OptionText_openai_comp_use_v1": {
"message": "保持“v1”兼容性"
},
@@ -197,9 +194,6 @@
"customPrompts_btnCancel": {
"message": "取消"
},
- "customPrompts_save_button": {
- "message": "保存"
- },
"customPrompts_add_to_menu": {
"message": "添加到菜单"
},
@@ -359,15 +353,12 @@
"prefsDonation_2": {
"message": "考虑捐款!"
},
- "WaitingServerReponse": {
+ "WaitingServerResponse": {
"message": "正在等待服务器响应"
},
"OpenAIComp_Models_Error_fetching": {
"message": "尝试获取 OpenAI 兼容 API 模型时出错"
},
- "chatgpt_use_gpt35": {
- "message": "使用 GPT3.5"
- },
"customPrompts_Import": {
"message": "导入新提示词"
},
@@ -651,7 +642,7 @@
"message": "单击此处,只需一分钟!"
},
"prompt_add_tags_full_text": {
- "message": "分析以下邮件文本,并生成一个用逗号分隔的标签列表,以概括其内容。使用主题、关键话题和相关描述词作为标签。确保标签简洁且与邮件内容相关。\n邮件文本:{%mail_text_body%}\n考虑以下细节以获取上下文:\n- 发件人:{%author%}\n- 收件人:{%recipients%}\n- 抄送列表:{%cc_list%}\n- 邮件主题:{%mail_subject%}\n请根据邮件文本和上下文生成标签,忽略不必要的信息或琐碎的细节。输出应仅为逗号分隔的标签列表,不包含任何额外评论或文字。"
+ "message": "请分析以下电子邮件文本,并生成一个 JSON 数组的标签,总结其内容。请使用主题、关键话题和相关描述词作为标签。确保标签简洁且与邮件内容密切相关。\n邮件文本:{%mail_text_body%}\n考虑以下细节以获取上下文:\n- 发件人:{%author%}\n- 收件人:{%recipients%}\n- 抄送列表:{%cc_list%}\n- 邮件主题:{%mail_subject%}\n请仅根据邮件正文和上下文生成标签,忽略无关信息或琐碎细节。\n请仅以 JSON 格式生成回复。输出应仅包含标签的 JSON 数组,不包含任何额外注释或文本。以下是需使用的 JSON 格式示例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
},
"placeholder_tags_full_list": {
"message": "现有标签"
@@ -830,15 +821,12 @@
"GetCalendarEvent_prompt_text_title": {
"message": "当前提示词文字"
},
- "prefs_OptionText_GetCalendarEvent_infoline2": {
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
"message": "您可以根据需要更改提示,但从 AI 收到的响应必须采用默认提示中指定的 JSON 格式!"
},
"calendar_getting_data_error": {
"message": "获取日历事件数据时出错"
},
- "prefs_OptionText_spamfilter_infoline": {
- "message": "您可以根据需要更改提示词,但从 AI 收到的响应必须采用默认提示中指定的 JSON 格式!"
- },
"prompt_spamfilter_full_text": {
"message": "分析以下邮件并判断它是否为垃圾邮件。考虑因素包括可疑关键词、过多的宣传语言、误导性的主题行、索取个人信息的请求以及异常的发件人地址。\n提供一个从 0(非垃圾邮件)到 100(垃圾邮件)的值,并附上不超过 10 个单词的解释。\n如果消息数据缺失,将数值设为0(非垃圾邮件),并说明原因。\n仅以 JSON 格式生成响应。不要包含任何额外文本或解释;仅提供 JSON。以下是使用的格式:\n{\n\"spamValue\": <0 到 100 的整数>,\n\"explanation\": \"简要说明您的判断理由\"\n}\n以下是邮件信息:\n发件人:“{%author%}”\n主题:“{%mail_subject%}”\nHTML 正文:“{%mail_html_body%}”"
},
@@ -882,7 +870,7 @@
"message": "如果选中,“添加标签”上下文菜单项将在消息列表中右键单击电子邮件时显示。"
},
"noActiveCalendar": {
- "message": "未找到激活的日历!"
+ "message": "未找到可编辑的日历!"
},
"customPrompts_form_label_use_diff_viewer": {
"message": "启用差异查看器"
@@ -928,5 +916,8 @@
},
"Explanation": {
"message": "说明"
+ },
+ "customPrompts_form_label_use_diff_viewer_title": {
+ "message": "当操作设置为“替换文本”时,可以选择差异查看器。"
}
}
diff --git a/_locales/zh_Hant/messages.json b/_locales/zh_Hant/messages.json
new file mode 100644
index 00000000..8a5515ec
--- /dev/null
+++ b/_locales/zh_Hant/messages.json
@@ -0,0 +1,1230 @@
+{
+ "more_info_string": {
+ "message": "更多資訊"
+ },
+ "prompt_reply_advanced": {
+ "message": "回覆這個討論串"
+ },
+ "prompt_translate_this": {
+ "message": "翻譯這段"
+ },
+ "customPrompts_saving_custom_prompts": {
+ "message": "正在儲存自訂提示..."
+ },
+ "customPrompts_managePrompts_info_default": {
+ "message": "預設的提示無法編輯。你可以先停用它們,然後複製提示內容,再貼到新的提示中,就能製作出修改版本。"
+ },
+ "prompt_rewrite_formal": {
+ "message": "改寫得比較正式一點"
+ },
+ "menu_title": {
+ "message": "AI"
+ },
+ "prompt_lang": {
+ "message": "回覆在"
+ },
+ "prompt_reply": {
+ "message": "回覆這封郵件"
+ },
+ "prompt_rewrite_polite": {
+ "message": "改寫得比較有禮貌一點"
+ },
+ "prompt_classify": {
+ "message": "分類"
+ },
+ "prompt_summarize_this": {
+ "message": "摘要這段"
+ },
+ "prompt_this": {
+ "message": "提示這段"
+ },
+ "prompt_selection_needed": {
+ "message": "要繼續的話,你需要選取一些文字!"
+ },
+ "customPrompts_managePrompts": {
+ "message": "管理提示"
+ },
+ "customPrompts_managePrompts_info_default_2": {
+ "message": "你可以匯入和匯出提示。如果匯入的提示編號與現有提示相同,會覆寫現有提示;如果匯入的提示編號是新的,則會新增進來。"
+ },
+ "customPrompts_managePrompts_info_default_3": {
+ "message": "如果一切都沒錯,匯入完成後點一下「儲存全部」按鈕。"
+ },
+ "customPrompts_start_saving": {
+ "message": "正在儲存提示..."
+ },
+ "customPrompts_reindexing_list": {
+ "message": "正在重新建立索引清單..."
+ },
+ "customPrompts_filtering_prompts": {
+ "message": "正在篩選提示..."
+ },
+ "customPrompts_saving_default_prompts": {
+ "message": "正在儲存預設提示..."
+ },
+ "customPrompts_reloading_menus": {
+ "message": "正在重新載入選單..."
+ },
+ "customPrompts_saved": {
+ "message": "提示已儲存!"
+ },
+ "customPrompts_form_label_ID": {
+ "message": "編號"
+ },
+ "customPrompts_form_label_ID_rules": {
+ "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_required_fields": {
+ "message": "必填欄位"
+ },
+ "customPrompts_btnCancel": {
+ "message": "取消"
+ },
+ "customPrompts_btnOK": {
+ "message": "確定"
+ },
+ "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_job_completed": {
+ "message": "已完成!"
+ },
+ "chatgpt_win_get_answer": {
+ "message": "使用選定的答案"
+ },
+ "chatgpt_win_close": {
+ "message": "關閉"
+ },
+ "chatgpt_btn_retry": {
+ "message": "重試"
+ },
+ "chatgpt_sendbutton_not_found_error": {
+ "message": "點擊「送出」按鈕提交提示。"
+ },
+ "chatgpt_win_model_warning": {
+ "message": "不知為何,沒辦法確認是否已載入正確的模型。目前你可以按下藍色按鈕繼續。"
+ },
+ "chatgpt_win_custom_text": {
+ "message": "在此處輸入用於提示的額外文字。"
+ },
+ "chatgpt_win_send": {
+ "message": "送出"
+ },
+ "chatgpt_force_completion": {
+ "message": "強制結束"
+ },
+ "msg_prompt_too_long": {
+ "message": "您提供的文字太長了,需要縮短。"
+ },
+ "prefs_OptionText_chatgpt_win_height": {
+ "message": "高度"
+ },
+ "prefs_status_page": {
+ "message": "服務狀態"
+ },
+ "prefs_OptionText_default_sign_name": {
+ "message": "預設簽名"
+ },
+ "prefs_OptionText_reply_all": {
+ "message": "回覆全部"
+ },
+ "prefs_OptionText_reply_sender": {
+ "message": "回覆寄件人"
+ },
+ "prefsInfoTitle": {
+ "message": "重要資訊"
+ },
+ "prefs_OptionText_btnManagePrompts": {
+ "message": "管理你的提示"
+ },
+ "TranslateLink": {
+ "message": "了解怎麼做!"
+ },
+ "customPrompts_Import": {
+ "message": "匯入新的提示"
+ },
+ "ChatGPT_Models": {
+ "message": "ChatGPT 模型"
+ },
+ "prefs_Connection_type_ChatGPT_Web": {
+ "message": "ChatGPT 網頁介面"
+ },
+ "prefs_ChatGPT_API_Key": {
+ "message": "ChatGPT API 金鑰"
+ },
+ "Loading": {
+ "message": "載入中…"
+ },
+ "error": {
+ "message": "ThunderAI 錯誤!"
+ },
+ "chagpt_api_send_button": {
+ "message": "使用模型"
+ },
+ "Ollama_Models": {
+ "message": "Ollama 模型"
+ },
+ "prefs_Connection_type_OpenAI_Comp_API": {
+ "message": "OpenAI 相容 API"
+ },
+ "API_Models_Error_NoModels": {
+ "message": "沒有找到模型"
+ },
+ "prefs_OpenAIComp_ChatName": {
+ "message": "聊天名稱"
+ },
+ "SearchPrompt": {
+ "message": "搜尋提示"
+ },
+ "Optional": {
+ "message": "可選的"
+ },
+ "placeholder_mail_html_body": {
+ "message": "HTML 郵件本文"
+ },
+ "placeholder_selected_html": {
+ "message": "選取的 HTML"
+ },
+ "placeholder_additional_text": {
+ "message": "額外文字"
+ },
+ "placeholder_junk_score": {
+ "message": "垃圾評分"
+ },
+ "placeholder_cc_list": {
+ "message": "副本清單"
+ },
+ "AllowedValues": {
+ "message": "允許的值"
+ },
+ "placeholder_tags_current_email": {
+ "message": "郵件標籤"
+ },
+ "placeholder_tags_full_list": {
+ "message": "現有標籤"
+ },
+ "AddTags_excl_list_title": {
+ "message": "排除清單"
+ },
+ "addtags_exclude_tag": {
+ "message": "排除標籤"
+ },
+ "prefs_OptionText_add_tags_force_lang": {
+ "message": "強制語言"
+ },
+ "prefs_GoogleGemini_API_Key": {
+ "message": "API 金鑰"
+ },
+ "ChatGPT_Developer_Messages": {
+ "message": "開發者訊息"
+ },
+ "From": {
+ "message": "來自"
+ },
+ "Explanation": {
+ "message": "說明"
+ },
+ "Spam_Value": {
+ "message": "垃圾訊息評分"
+ },
+ "spamfilter_not_moved": {
+ "message": "否"
+ },
+ "Report_Date": {
+ "message": "報告日期"
+ },
+ "apiwebchat_info": {
+ "message": "資訊"
+ },
+ "apiwebchat_stopping": {
+ "message": "結束中"
+ },
+ "customPrompts_show_additional_info_show": {
+ "message": "額外屬性"
+ },
+ "Anthropic_Models": {
+ "message": "Anthropic 模型"
+ },
+ "_api_connecting_model": {
+ "message": "模型",
+ "placeholders": {
+ "model": {
+ "content": "$1"
+ }
+ }
+ },
+ "prefs_OpenAIComp_AvailableServices": {
+ "message": "可用服務"
+ },
+ "prefs_ollama_think": {
+ "message": "啟用思考"
+ },
+ "extensionDescription": {
+ "message": "使用 ChatGPT、Google Gemini、Anthropic 或 Ollama 來幫你寫好你的郵件吧!"
+ },
+ "customPrompts_form_label_Name": {
+ "message": "名稱"
+ },
+ "customPrompts_form_label_use_diff_viewer_title": {
+ "message": "當動作設定為「取代文字」時,可以選取文字比較檢視器。"
+ },
+ "chatgpt_user_not_logged_in": {
+ "message": "您尚未登入 ChatGPT。請使用您的帳戶登入,關閉 ChatGPT 視窗,然後再嘗試您的動作。之後您就會維持登入。"
+ },
+ "chatgpt_win_job_completed_select": {
+ "message": "選擇您要使用的文字,然後點擊按鈕。"
+ },
+ "chatgpt_win_working": {
+ "message": "製作中..."
+ },
+ "prefs_OptionText_chatgpt_win_width": {
+ "message": "寬度"
+ },
+ "Debug": {
+ "message": "除錯"
+ },
+ "placeholder_author": {
+ "message": "作者"
+ },
+ "apiwebchat_receiving_data": {
+ "message": "接收資料中"
+ },
+ "placeholder_recipients": {
+ "message": "收件人"
+ },
+ "Subject": {
+ "message": "主旨"
+ },
+ "_api_connecting_version": {
+ "message": "版本",
+ "placeholders": {
+ "api_version": {
+ "content": "$1"
+ }
+ }
+ },
+ "customPrompts_btnEdit": {
+ "message": "編輯"
+ },
+ "chatgpt_textarea_not_found_error": {
+ "message": "看起來 ChatGPT 的頁面好像要載很久了。如果它載完了,就點一下右邊的按鈕。如果問題還是持續發生,請檢查服務狀態。"
+ },
+ "apiwebchat_you": {
+ "message": "您"
+ },
+ "ChatGPT_chatgpt_api_store": {
+ "message": "使用儲存"
+ },
+ "prefs_OptionText_reply_type": {
+ "message": "回覆類型"
+ },
+ "prefs_OptionText_release_notes": {
+ "message": "版本說明"
+ },
+ "customPrompts_Properties": {
+ "message": "屬性"
+ },
+ "placeholder_folder_path": {
+ "message": "資料夾路徑"
+ },
+ "Date": {
+ "message": "日期"
+ },
+ "spamfilter_moved": {
+ "message": "是"
+ },
+ "Custom": {
+ "message": "自訂"
+ },
+ "prefs_Connection_type_Anthropic_API": {
+ "message": "Anthropic API"
+ },
+ "save": {
+ "message": "儲存"
+ },
+ "apiwebchat_error": {
+ "message": "錯誤"
+ },
+ "backToOptionsText": {
+ "message": "選項"
+ },
+ "OpenChatGPTTab": {
+ "message": "打開 ChatGPT 分頁"
+ },
+ "placeholder_account_email_address": {
+ "message": "帳戶電子郵件地址"
+ },
+ "customPrompts_ExportAll": {
+ "message": "匯出所有提示"
+ },
+ "prefs_OptionText_dynamic_menu_order_alphabet": {
+ "message": "選單:按字母排序"
+ },
+ "prefs_API_Host": {
+ "message": "主機位址"
+ },
+ "placeholder_mail_text_body": {
+ "message": "郵件本文"
+ },
+ "prefs_Connection_type": {
+ "message": "連線類型"
+ },
+ "prefs_API_Host_Info": {
+ "message": "類似於"
+ },
+ "SendingPrompt": {
+ "message": "送出提示中..."
+ },
+ "context_menu_mzta-add-tags": {
+ "message": "新增標籤"
+ },
+ "placeholder_mail_subject": {
+ "message": "郵件主旨"
+ },
+ "placeholder_folder_name": {
+ "message": "資料夾名稱"
+ },
+ "GoogleGemini_SystemInstruction": {
+ "message": "系統指示"
+ },
+ "placeholder_selected_text": {
+ "message": "選取的文字"
+ },
+ "_api_connecting_host": {
+ "message": "主機",
+ "placeholders": {
+ "api_host": {
+ "content": "$1"
+ }
+ }
+ },
+ "thunderai_error_title": {
+ "message": "ThunderAI 錯誤"
+ },
+ "thunderai_warning_title": {
+ "message": "ThunderAI 警示"
+ },
+ "prefs_Connection_type_ChatGPT_API": {
+ "message": "ChatGPT OpenAI API"
+ },
+ "prefs_OptionText_spamfilter_threshold": {
+ "message": "垃圾訊息閾值"
+ },
+ "get_task_prompt_prefs_title": {
+ "message": "任務選項"
+ },
+ "btn_show_differences": {
+ "message": "顯示差異"
+ },
+ "chatgpt_force_completion_title": {
+ "message": "如果 ChatGPT 已完成工作但按鈕尚未出現,請按一下此處顯示「使用最後一個答案」按鈕。"
+ },
+ "prefs_OptionText_chatgpt_win_text": {
+ "message": "AI 聊天視窗維度"
+ },
+ "prefs_OptionText_default_chatgpt_lang": {
+ "message": "回應的預設語言"
+ },
+ "prefs_OptionText_reply_type_Info": {
+ "message": "這是回覆電子郵件時使用的預設回覆類型。您可以稍後在回覆對話方塊中選擇其他回覆類型。"
+ },
+ "prefsInfoDesc_2": {
+ "message": "要使用 ChatGPT API,您需要一個 OpenAI ChatGPT API 金鑰並且必須選擇一個模型。"
+ },
+ "prefsDonation_1": {
+ "message": "你喜歡這個附加元件嗎?"
+ },
+ "prefsDonation_2": {
+ "message": "考慮贊助一下吧!"
+ },
+ "importPrompts_confirmText": {
+ "message": "您即將匯入新的提示。"
+ },
+ "importPrompts_invalidFile": {
+ "message": "您嘗試匯入的檔案不是有效的自訂提示檔案。"
+ },
+ "customprompts_form_label_define_response_lang": {
+ "message": "定義提示中的回應語言"
+ },
+ "importPrompts_invalidPrompts": {
+ "message": "您嘗試匯入的文件不包含任何有效提示。"
+ },
+ "ChatGPT_Models_Fetch": {
+ "message": "更新 ChatGPT 模型清單"
+ },
+ "ChatGPT_Models_Error_fetching": {
+ "message": "嘗試取得 ChatGPT 模型時出錯"
+ },
+ "chatgpt_empty_apikey": {
+ "message": "您尚未新增 ChatGPT API 的 API 金鑰。請在選項頁面中輸入一個。"
+ },
+ "prefs_Connection_type_Ollama_API": {
+ "message": "Ollama API (本地 LLM)"
+ },
+ "chatgpt_empty_model": {
+ "message": "您尚未選擇 ChatGPT API 的模型。請在選項頁面中選擇一個。"
+ },
+ "Ollama_Models_Fetch": {
+ "message": "更新 Ollama 模型清單"
+ },
+ "Ollama_Models_Error_fetching": {
+ "message": "嘗試取得 Ollama 模型時出錯"
+ },
+ "ollama_empty_host": {
+ "message": "您尚未為 Ollama API 新增主機位址。請在選項頁面中輸入一個。"
+ },
+ "chatgpt_api_request_failed": {
+ "message": "OpenAI ChatGPT API 請求失敗"
+ },
+ "WaitingServerReponse": {
+ "message": "等待伺服器回應"
+ },
+ "error_connection_interrupted": {
+ "message": "與伺服器的連線意外中斷"
+ },
+ "OpenAIComp_Models": {
+ "message": "OpenAI 相容 API 模型"
+ },
+ "OpenAIComp_api_request_failed": {
+ "message": "OpenAI 相容 API 請求失敗"
+ },
+ "OpenAIComp_Models_Fetch": {
+ "message": "更新 OpenAI 相容 API 模型列表"
+ },
+ "OpenAIComp_Models_Error_fetching": {
+ "message": "嘗試取得 OpenAI 相容 API 模型時出錯"
+ },
+ "OpenAIComp_empty_model": {
+ "message": "您尚未選擇 OpenAI 相容 API 的模型。請在選項頁面中選擇一個。"
+ },
+ "StorageSpace": {
+ "message": "總共佔用空間"
+ },
+ "prefs_OptionText_dynamic_menu_force_enter": {
+ "message": "選單:即時發送提示"
+ },
+ "prefs_OpenAIComp_ChatName_Info": {
+ "message": "這是將在 AI 對話中使用的名稱。"
+ },
+ "prefs_OptionText_chatgpt_win_dims_info": {
+ "message": "如果不想指定視窗大小,請設定為 0。"
+ },
+ "prefs_OptionText_max_prompt_length": {
+ "message": "最大提示長度"
+ },
+ "prefs_OptionText_chatgpt_web_model": {
+ "message": "ChatGPT 網頁模型"
+ },
+ "chatgpt_btn_model": {
+ "message": "使用目前模型"
+ },
+ "prefs_OptionText_chatgpt_web_tempchat": {
+ "message": "ChatGPT 網頁臨時聊天"
+ },
+ "prefs_OptionText_btnManagePrompts_infoline": {
+ "message": "您可以使用額外的資料佔位符。"
+ },
+ "prefs_OptionText_add_tags_Info": {
+ "message": "如果勾選,將會新增一個選項到選單,以便對郵件進行標籤管理。"
+ },
+ "prompt_proofread_this_full_text": {
+ "message": "校對以下電子郵件,並更正所有拼字或文法錯誤。僅回覆更正後的文本,不要提供任何額外的註解或其他文字。\n\n「{%mail_typed_text%}」"
+ },
+ "prompt_proofread_this": {
+ "message": "校對這封郵件"
+ },
+ "prompt_add_tags_maxnum": {
+ "message": "將標籤數量限制為"
+ },
+ "prefs_OptionText_add_tags_maxnum_Info": {
+ "message": "AI 建議的最大標籤數量。如果您不想限制標籤數量,請設定為 0。"
+ },
+ "addtags_no_tags_received": {
+ "message": "未收到來自 AI 的標籤。"
+ },
+ "prefs_OptionText_add_tags_first_uppercase": {
+ "message": "第一個字母須為大寫"
+ },
+ "prefs_SurveyLinkText": {
+ "message": "分享您的回饋並協助改進 ThunderAI!"
+ },
+ "prompt_add_tags_force_lang": {
+ "message": "標籤必須寫在"
+ },
+ "GoogleGemini_Models_Error_fetching": {
+ "message": "嘗試取得 Google Gemini 模型時出錯"
+ },
+ "google_gemini_empty_model": {
+ "message": "您尚未選擇 Google Gemini API 的模型。請在選項頁面中選擇一個。"
+ },
+ "Select_your_timezone": {
+ "message": "選擇您的時區"
+ },
+ "prefs_OptionText_add_tags_auto_Info": {
+ "message": "如果勾選,AI 將自動為新收到的電子郵件新增標籤。"
+ },
+ "prefs_OptionText_add_tags_auto_only_inbox_Info": {
+ "message": "如果勾選,AI 將僅對收件匣資料夾中收到的電子郵件新增標籤。"
+ },
+ "prompt_spamfilter": {
+ "message": "偵測垃圾郵件"
+ },
+ "SpamFilter_prompt_prefs_title": {
+ "message": "垃圾郵件過濾器選項"
+ },
+ "SpamReport_Title": {
+ "message": "垃圾郵件過濾報告"
+ },
+ "context_menu_mzta-spamfilter": {
+ "message": "檢測垃圾郵件"
+ },
+ "prefs_OptionText_spamfilter_context_menu_Info": {
+ "message": "如果勾選,則在訊息清單中點右鍵時,會出現「分析垃圾郵件」快顯功能選單項目。"
+ },
+ "apiwebchat_use_this_answer": {
+ "message": "使用這個答案"
+ },
+ "prefs_OptionText_chatgpt_web_project_info": {
+ "message": "這是將針對 ChatGPT 網頁介面強制執行的專案。"
+ },
+ "Anthropic_Models_Fetch": {
+ "message": "更新 Anthropic 模型列表"
+ },
+ "prefs_Anthropic_API_Key": {
+ "message": "Anthropic API 金鑰"
+ },
+ "anthropic_api_request_failed": {
+ "message": "Anthropic API 請求失敗"
+ },
+ "OpenAIComp_Configs_ConfirmApply": {
+ "message": "您確定要套用設定「$config_name$」嗎?",
+ "placeholders": {
+ "config_name": {
+ "content": "$1"
+ }
+ }
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match_Info": {
+ "message": "如果勾選,排除列表中的詞語將與標籤完全匹配。否則,若詞語包含於標籤內,亦視為匹配。"
+ },
+ "prefs_OptionText_openai_comp_use_v1": {
+ "message": "保持“v1”相容性"
+ },
+ "prefs_OptionText_openai_comp_info_remote": {
+ "message": "您也可以在此處輸入遠端伺服器位址。"
+ },
+ "reply_same_lang": {
+ "message": "用相同的語言回覆。"
+ },
+ "prompt_reply_full_text": {
+ "message": "回覆以下郵件。僅回覆所需內容,不要提供任何註解或其他文字。"
+ },
+ "prompt_translate_this_full_text": {
+ "message": "將以下電子郵件翻譯成"
+ },
+ "prompt_rewrite_full_text": {
+ "message": "請重寫以下文字,使其更有禮貌。僅回覆重寫的文字,不要提供任何額外的註解或其他文字。"
+ },
+ "prefs_OptionText_add_tags": {
+ "message": "新增郵件標籤"
+ },
+ "prefs_OptionText_add_tags_maxnum": {
+ "message": "最大標籤數量"
+ },
+ "prompt_add_tags": {
+ "message": "為這封電子郵件新增標籤"
+ },
+ "prompt_this_full_text": {
+ "message": "僅回覆所需的文本,不要提供額外的註解或其他文本。"
+ },
+ "prefs_OptionText_add_tags_hide_exclusions": {
+ "message": "隱藏排除標籤"
+ },
+ "prefs_OptionText_btnManageTagsInfo": {
+ "message": "管理標籤設定"
+ },
+ "AddTags_PageTitle": {
+ "message": "管理標籤設定"
+ },
+ "prefs_OptionText_add_tags_hide_exclusions_Info": {
+ "message": "如果勾選,排除清單中的標籤將在確認對話方塊中隱藏。"
+ },
+ "reset_default": {
+ "message": "重置為預設"
+ },
+ "AddTags_excl_list_infoline": {
+ "message": "這是一份禁止在郵件中新增的標籤清單。"
+ },
+ "AddTags_prompt_prefs_title": {
+ "message": "新增標籤選項"
+ },
+ "addtags_dialog_title": {
+ "message": "為電子郵件新增標籤"
+ },
+ "addtags_excl_list_infoline2": {
+ "message": "以每行一個單詞,或用逗號分隔新增。"
+ },
+ "addtags_no_valid_tags": {
+ "message": "使用排除清單過濾後,未找到有效標籤。"
+ },
+ "OpenAIComp_force_model_ask": {
+ "message": "在此輸入您想要使用的模型名稱。"
+ },
+ "GoogleGemini_Models": {
+ "message": "Google Gemini API 模型"
+ },
+ "google_gemini_empty_apikey": {
+ "message": "您尚未新增 Google Gemini API 的 API 金鑰。請在選項頁面中輸入一個。"
+ },
+ "placeholder_mail_typed_text": {
+ "message": "在引用的郵件本文前輸入文本"
+ },
+ "prompt_get_calendar_event": {
+ "message": "新增新的日曆事件"
+ },
+ "placeholder_mail_quoted_text": {
+ "message": "郵件本文中的引用文字"
+ },
+ "prefs_OptionText_get_calendar_event": {
+ "message": "從選定的文字新增新的日曆事件"
+ },
+ "prefs_OptionText_get_task": {
+ "message": "從選定的文字新增任務"
+ },
+ "prefs_OptionText_get_calendar_event_Info": {
+ "message": "如果勾選,就會在選單中加入一個選項,可以從選取的文字中取得日曆活動資訊。"
+ },
+ "prefs_OptionText_btnManageCalendarEventInfo": {
+ "message": "管理日曆事件設定"
+ },
+ "GetCalendarEvent_prompt_text_title": {
+ "message": "現有提示文字"
+ },
+ "GetCalendarEvent_PageTitle": {
+ "message": "管理日曆事件設定"
+ },
+ "prefs_OptionText_AdvancedPromptResponse_infoline2": {
+ "message": "您可以根據需要更改提示,但從 AI 收到的回應必須採用預設提示中指定的 JSON 格式!"
+ },
+ "GetTask_info_default": {
+ "message": "在此頁面中,您可以修改用於從選定文字中取得任務的預設提示。"
+ },
+ "prefs_OptionText_download_now": {
+ "message": "馬上下載 ThunderAI Sparks!"
+ },
+ "placeholder_mail_datetime": {
+ "message": "電子郵件的日期和時間"
+ },
+ "placeholder_current_datetime": {
+ "message": "目前日期和時間"
+ },
+ "calendar_getting_data_error": {
+ "message": "取得日曆事件資料時出錯"
+ },
+ "task_opening_dialog_error": {
+ "message": "開啟任務對話方塊時出錯"
+ },
+ "no_valid_data_received": {
+ "message": "未從 AI 收到有效資料。"
+ },
+ "placeholder_thunderai_def_sign": {
+ "message": "ThunderAI 選項中定義的預設簽章。"
+ },
+ "prefs_OptionText_add_tags_auto_force_existing": {
+ "message": "自動標記或快顯功能選單時強制使用現有標記"
+ },
+ "prefs_OptionText_add_tags_auto_Info2": {
+ "message": "在此頁面底部選擇要啟動此功能的帳戶。"
+ },
+ "SpamFilter_prompt_text_title": {
+ "message": "現有提示文字"
+ },
+ "SpamFilter_info_default": {
+ "message": "在此頁面中,您可以修改用於偵測垃圾郵件的預設提示。"
+ },
+ "prefs_OptionText_spamfilter_threshold_Info": {
+ "message": "如果 AI 傳回的值高於此閾值,則電子郵件將被移至垃圾郵件資料夾。"
+ },
+ "prefs_OptionText_add_tags_context_menu": {
+ "message": "顯示「新增標籤」在快顯功能選單"
+ },
+ "remember_CORS": {
+ "message": "記住,您需要在伺服器上設定 CORS 設定!"
+ },
+ "prefs_OptionText_composing_plain_text": {
+ "message": "使用純文字撰寫"
+ },
+ "ask_integration_permission_2_popup": {
+ "message": "點擊此處開啟新分頁並按照說明進行操作。"
+ },
+ "ask_anthropic_api_permission_1": {
+ "message": "要使用 Anthropic API 整合,您需要授予所需的權限。"
+ },
+ "ask_integration_permission_ok": {
+ "message": "已授予權限。您可以按一下此處關閉此分頁並返回主視窗。"
+ },
+ "AccountSelector_AutoTags_infoline": {
+ "message": "每個變更都會立即儲存。"
+ },
+ "AccountSelector_AutoTags": {
+ "message": "選擇已啟用自動標記的帳戶"
+ },
+ "prefs_OptionText_chatgpt_web_custom_data_info": {
+ "message": "必須採用以下形式:"
+ },
+ "AccountSelector_Spamfilter": {
+ "message": "選擇啟用垃圾郵件過濾器的帳戶"
+ },
+ "customPrompts_show_additional_info": {
+ "message": "顯示額外屬性"
+ },
+ "customPrompts_hide_additional_info": {
+ "message": "隱藏額外屬性"
+ },
+ "prefs_OptionText_chatgpt_web_custom_data_info2": {
+ "message": "當您開啟相關的 ChatGPT 頁面時,您可以在瀏覽器 URL 欄位中找到正確的值。"
+ },
+ "prefs_OptionText_Project_No_temporary_chat_warn": {
+ "message": "如果在選項或提示中指定了專案,則不會使用臨時聊天。"
+ },
+ "Anthropic_Models_Error_fetching": {
+ "message": "嘗試取得 Anthropic 模型時出錯"
+ },
+ "_api_connecting": {
+ "message": "嘗試使用以下配置連接到 $api_string$...",
+ "placeholders": {
+ "api_string": {
+ "content": "$1"
+ }
+ }
+ },
+ "anthropic_empty_model": {
+ "message": "您尚未選擇 Anthropic API 的模型。請在選項頁面中選擇一個。"
+ },
+ "anthropic_empty_version": {
+ "message": "您尚未新增 Anthropic API 的版本字串。請在選項頁面中輸入一個。"
+ },
+ "ChatGPT_chatgpt_api_store_info": {
+ "message": "如果勾選,您的聊天記錄將由 OpenAI 儲存。"
+ },
+ "apiwebchat_selection_info": {
+ "message": "如果您選擇一些文本,則只會考慮該部分。"
+ },
+ "prefs_ollama_think_Info": {
+ "message": "如果勾選,模型將在回答之前進行思考。此選項僅適用於支援「思考」功能的模型。"
+ },
+ "AddTags_prompt_text_title": {
+ "message": "現有提示文字"
+ },
+ "prefs_OptionText_openai_comp_use_v1_info": {
+ "message": "如果勾選,API 呼叫路徑中的「v1」段將會保留,例如「http://localhost:1234/v1/chat/completions」。"
+ },
+ "OpenAIComp_empty_host": {
+ "message": "您尚未新增 OpenAI 相容 API 的主機位址。請在選項頁面中輸入一個。"
+ },
+ "GetCalendarEvent_info_default": {
+ "message": "在此頁面中,您可以修改用於從選定文字取得日曆事件的預設提示。"
+ },
+ "OpenChatGPTTab_Info2": {
+ "message": "從這裡開啟 ChatGPT 網頁將套用模型、專案和自訂 GPT 的任何配置設定。"
+ },
+ "prefs_OptionText_add_tags_first_uppercase_Info": {
+ "message": "如果勾選,標籤將設定為小寫字母,只有首字母大寫。"
+ },
+ "ChatGPT_Developer_Messages_Info": {
+ "message": "當您設定開發人員訊息時,您會為模型提供額外的情境理解任務,提供更客製化的回應,並遵守將要發送的提示的特定指南。"
+ },
+ "prefs_OptionText_chatgpt_web_model_info": {
+ "message": "這是 ChatGPT 網頁介面強制使用的模型。如果未指定或提供了錯誤的模型,ChatGPT 將在網頁上設定預設模型。此設定不適用於 ChatGPT 免費帳戶。"
+ },
+ "prefs_OptionText_add_tags_exclusions_exact_match": {
+ "message": "排除精確匹配"
+ },
+ "hyprland_warning": {
+ "message": "如果您在開啟 AI 聊天視窗時遇到問題,請嘗試將高度和寬度值設為 0。此問題可能會在某些環境下的 Linux 上出現,例如,使用 Hyprland 時。"
+ },
+ "prefs_Connection_type_Google_Gemini_API": {
+ "message": "Google Gemini API"
+ },
+ "prefsInfoDesc_3": {
+ "message": "要使用與 Ollama 的整合,您需要設定本地 Ollama 伺服器。伺服器運行後,請在應用程式的指定欄位中輸入其位址。為確保 ThunderAI 和 Ollama 伺服器之間正常通訊,請記得設定 OLLAMA_ORIGINS=moz-extension://*。"
+ },
+ "prefs_OptionText_get_task_Info": {
+ "message": "如果勾選,將會新增一個選項到選單,以便從選取的文字中取得任務資訊。"
+ },
+ "prefs_OptionText_get_calendar_event_Sparks_wrong_version": {
+ "message": "若要使用日曆事件和任務功能,請安裝更新版本的 ThunderAI Sparks 附加元件。"
+ },
+ "prefs_OptionText_add_tags_auto": {
+ "message": "自動新增標籤"
+ },
+ "anthropic_empty_apikey": {
+ "message": "您尚未新增 Anthropic API 的 API 金鑰。請在選項頁面中輸入一個。"
+ },
+ "prefs_OpenAIComp_ForceModel": {
+ "message": "手動輸入模型"
+ },
+ "get_calendar_event_prompt_prefs_title": {
+ "message": "日曆事件選項"
+ },
+ "prefs_OptionText_btnManageTaskInfo": {
+ "message": "管理任務設定"
+ },
+ "Anthropic_Version": {
+ "message": "Anthropic API 版本"
+ },
+ "prefs_OptionText_spamfilter": {
+ "message": "自動垃圾郵件過濾器"
+ },
+ "Moved_to_Spam": {
+ "message": "已移到垃圾郵件"
+ },
+ "prefs_OptionText_anthropic_max_tokens": {
+ "message": "Anthropic 最大 Token 數"
+ },
+ "prefs_OpenAIComp_API_Key": {
+ "message": "OpenAI 相容 API 金鑰"
+ },
+ "CORS_alternative_1": {
+ "message": "設定 CORS 有問題嗎?"
+ },
+ "prefs_OptionText_chatgpt_web_project": {
+ "message": "ChatGPT 網頁專案"
+ },
+ "ask_integration_permission_2": {
+ "message": "點擊這裡繼續。"
+ },
+ "customPrompts_start_import": {
+ "message": "正在匯入自訂提示…"
+ },
+ "GoogleGemini_Models_Fetch": {
+ "message": "更新 Google Gemini 模型列表"
+ },
+ "chatgpt_win_diff_title": {
+ "message": "原文與修改後的文字之間的差異"
+ },
+ "ask_chatgptweb_permission_1": {
+ "message": "要使用 ChatGPT 網頁整合,您需要授予所需的權限。"
+ },
+ "currently_used_prompt": {
+ "message": "目前使用的提示名稱"
+ },
+ "noActiveCalendar": {
+ "message": "未找到可編輯的日曆!"
+ },
+ "calendar_opening_dialog_error": {
+ "message": "開啟日曆事件對話方塊時出錯"
+ },
+ "prefs_OptionText_add_tags_auto_only_inbox": {
+ "message": "僅對收件匣電子郵件新增標籤"
+ },
+ "prefs_OptionText_do_debug_info": {
+ "message": "啟用除錯系統"
+ },
+ "chatgpt_win_change_reply_type": {
+ "message": "點擊更改回覆類型"
+ },
+ "prefs_OptionText_calendar_enforce_timezone": {
+ "message": "強制指定時區"
+ },
+ "SpamFilter_PageTitle": {
+ "message": "管理垃圾郵件設定"
+ },
+ "ollama_api_request_failed": {
+ "message": "Ollama API 請求失敗"
+ },
+ "prompt_reply_additional_text": {
+ "message": "不要在回覆中加入主旨。"
+ },
+ "prompt_summarize_this_full_text": {
+ "message": "將以下電子郵件總結為要點清單。"
+ },
+ "prefs_OptionText_placeholders_use_default_value": {
+ "message": "佔位符:使用預設值"
+ },
+ "prompt_get_task": {
+ "message": "新增任務"
+ },
+ "prefs_OptionText_btnManageSpamFilterInfo": {
+ "message": "管理垃圾郵件設定"
+ },
+ "CORS_give_allurls_perm": {
+ "message": "授予「所有網址」權限"
+ },
+ "prefs_ollama_num_ctx": {
+ "message": "情境 Token 數量"
+ },
+ "prefs_OptionText_chatgpt_web_custom_gpt": {
+ "message": "ChatGPT 網頁自訂 GPT"
+ },
+ "thunderai_def_lang": {
+ "message": "ThunderAI 選項中定義的預設語言。"
+ },
+ "prefs_SurveyLinkText2": {
+ "message": "點擊此處,只需一分鐘!"
+ },
+ "google_gemini_api_request_failed": {
+ "message": "Google Gemini API 請求失敗"
+ },
+ "spamfilter_threshold_zero": {
+ "message": "垃圾郵件閾值為零!您將把所有郵件標記為垃圾郵件!"
+ },
+ "prefs_OptionText_chatgpt_web_model_tooltip": {
+ "message": "點擊一個值來設定它。"
+ },
+ "prefs_OptionText_dynamic_menu_order_alphabet_info": {
+ "message": "如果勾選,選單中的提示將按字母順序排列。"
+ },
+ "prefs_OptionText_spamfilter_Info": {
+ "message": "如果勾選,ThunderAI 將自動將垃圾郵件移至垃圾郵件資料夾。"
+ },
+ "addtags_info_additional_statements": {
+ "message": "此語句將會被加入到提示的末尾:"
+ },
+ "prefsInfoDesc_5": {
+ "message": "請記住,您可以使用鍵盤快速鍵 CTRL+ALT+A 開啟 ThunderAI 選單。"
+ },
+ "prefs_OptionText_composing_plain_text_Info": {
+ "message": "如果您以純文字格式撰寫電子郵件,請勾選此選項。"
+ },
+ "maybe_CORS_openai_comp": {
+ "message": "使用 OpenAI 相容 API 可能需要在伺服器上設定 CORS 設定。"
+ },
+ "Replace_No_Selected_Text": {
+ "message": "沒有選擇任何文字,您想將 AI 的回覆放在郵件的開頭嗎?"
+ },
+ "Anthropic_Version_Info": {
+ "message": "必需。除非您清楚自己在做什麼,否則請勿變更此值。更多資訊請見:"
+ },
+ "customPrompts_import_completed": {
+ "message": "自訂提示滙入完成!您需要點擊「儲存全部」按鈕來儲存變更。"
+ },
+ "prefs_OptionText_calendar_enforce_timezone_Info": {
+ "message": "如果勾選,則日曆事件和任務將強制使用指定的時區。"
+ },
+ "spamfilter_threshold_too_low": {
+ "message": "垃圾郵件閾值太低!您可能會將太多郵件標記為垃圾郵件!"
+ },
+ "prefs_OptionText_add_tags_auto_force_existing_Info": {
+ "message": "如果勾選,AI 將僅對新收到的電子郵件新增現有標籤,而不會建立新標籤。"
+ },
+ "prefs_OptionText_CustomGPT_Warn": {
+ "message": "如果在選項或提示中指定了專案,它將覆蓋自訂 GPT 設定。"
+ },
+ "prefs_ollama_num_ctx_Info": {
+ "message": "用於 Ollama API 的情境 Token 數量。 設定為 0 表示不要將其作為參數傳給伺服器。"
+ },
+ "prefs_OptionText_max_prompt_length_Info": {
+ "message": "這是提示中可以使用的最大字元數。否則,將顯示錯誤訊息。此值在 ChatGPT 網頁介面中不可編輯。將其設為零可停用檢查。"
+ },
+ "empty": {
+ "message": "此佔位符不會加入任何文本,但它可以防止電子郵件本文自動附加在提示的末尾。"
+ },
+ "prefs_OptionText_placeholders_use_default_value_info": {
+ "message": "如果勾選,則當未提供任何值時,佔位符將使用預設值填充。否則,佔位符將保留在原處。"
+ },
+ "prefs_OptionText_anthropic_max_tokens_Info": {
+ "message": "生成最多幾個 Token 的數量。 你的提示數量加上最大 Token 數量,不能超過模型的情境長度。"
+ },
+ "ollama_empty_model": {
+ "message": "您尚未選擇 ChatGPT API 的模型。請在選項頁面中選擇一個。"
+ },
+ "prompt_get_calendar_event_full_text": {
+ "message": "從以下文字中提取所有需要生成日曆事件的相關資訊。 提取的資訊應包含:\n- 事件名稱\n- 起始日期和時間(包含時區,如果指定)\n- 結束日期和時間(包含時間區,如果指定)\n- 整天事件(如果提及\n- 參與者\n確保數據以清晰一致的方式格式化,以便直接用於創建日曆事件。\n如果有相對時間參考,請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。 如果計算出的起日期和時間早於「{%current_datetime%}」,則使用「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果持續時間沒有指定,則設定為一小時。\n參與者:{%author%}, {%recipients%}, {%cc_list%}。如果存在,請排除我的地址:{%account_email_address%}。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不要包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日曆事件摘要在此\",\n\"forceAllDay\": false,\n\"attendees\": [\"attendee1@example.com \",\"attendee2@example.com \",\"attendee3@example.com \"]\n}\n這裡是文字:「{%selected_text%}」"
+ },
+ "TranslateText": {
+ "message": "您願意幫忙翻譯這個附加元件嗎?"
+ },
+ "prompt_get_task_full_text": {
+ "message": "從以下文字中提取所有需要生成任務的相關資訊。 提取的資訊應包含:\n- 截止日期和時間(包括時區,如果指定)\n- 任務總結\n- 初始日期和時間(包括時區,如果指定)\n確保數據以清晰一致的方式格式化,以便直接用於建立任務。\n如果有相對時間參考,請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。如果計算出的起日期和時間早於「{%current_datetime%}」,則使用 「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"InitialDate\": \"YYYYMMDDTHHMMSS\",\n\"dueDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"任務總結在此\"\n}\n如果沒有日期資訊,請刪除這些資訊。\n以下是文字:「{%selected_text%}」"
+ },
+ "prefs_OptionText_spamfilter_context_menu": {
+ "message": "顯示「分析垃圾郵件」在快顯功能選單"
+ },
+ "sign_msg_as": {
+ "message": "簽署訊息為"
+ },
+ "prefs_OptionText_chatgpt_web_tempchat_info": {
+ "message": "如果勾選,將在 ChatGPT 網頁介面中使用臨時聊天。"
+ },
+ "AddTags_info_default": {
+ "message": "在此頁面中,您可以修改用於對電子郵件新增標籤的預設提示並管理排除清單。"
+ },
+ "prefsInfoDesc_1": {
+ "message": "ChatGPT 網頁介面可能會發生一些變化,導致附加元件無法正常運作。請查看此頁面底部連結的「服務狀態」頁面。另外,請記住,首次使用 ThunderAI 時,您需要登入 ChatGPT。"
+ },
+ "prompt_spamfilter_full_text": {
+ "message": "分析以下 Email 並判斷是否為垃圾郵件。 考慮因素包括可疑關鍵字、過度推銷性語言、誤導性主旨、要求個人資訊以及異常的寄件人地址。\n提供一個 0 (非垃圾郵件) 到 100 (垃圾郵件) 的分數,並提供一段不超過 10 字的說明。\n如果缺少訊息資料,則設定分數為 0 (非垃圾郵件),並說明原因。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。以下是將要使用的格式:\n{\n\"spamValue\": <由 0 到 100 的整數>,\n\"explanation\": \"簡短說明您的理由\"\n}\n以下是郵件資訊:\n寄件人:「{%author%}」\n主旨:「{%mail_subject%}」\nHTML 內容:「{%mail_html_body%}」"
+ },
+ "task_getting_data_error": {
+ "message": "取得取得任務資料時出錯"
+ },
+ "prefsInfoDesc_4": {
+ "message": "要使用此一整合,您需要設定一個與 OpenAI API 相容的本機伺服器,例如 LM Studio。伺服器運行後,請在應用程式的指定欄位中輸入其位址。為確保 ThunderAI 與本地伺服器之間能夠正常通訊,請務必正確設定 CORS。"
+ },
+ "OpenChatGPTTab_Info": {
+ "message": "如果 ThunderAI 視窗出現登入問題,請使用右側按鈕在新分頁中開啟 ChatGPT,登入,然後關閉分頁並繼續使用 ThunderAI。"
+ },
+ "prefsInfoDesc_6": {
+ "message": "您可以透過點擊此頁面右上角的齒輪圖示並選擇「管理附加元件捷徑」來變更捷徑。"
+ },
+ "prefs_OptionText_owl_warning": {
+ "message": "您的帳戶中至少有一個正在使用 Owl for Exchange 附加元件。 Thunderbird 和 Owl 之間有一個已知問題,目前正在解決。目前,您可以在撰寫電子郵件時使用 ThunderAI,但無法在閱讀電子郵件時使用。"
+ },
+ "prefs_OpenAIComp_AvailableServices_Info": {
+ "message": "選擇適用於 OpenAI 相容 API 的服務之一或手動輸入一項。"
+ },
+ "prefs_OptionText_dynamic_menu_force_enter_info": {
+ "message": "如果勾選,使用鍵盤快速鍵 CTRL+ALT+A 將自動傳送選單中所選的提示。否則,提示名稱將顯示給用戶,需要再次按下 Enter 鍵才能傳送。"
+ },
+ "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。"
+ },
+ "prompt_reply_advanced_full_text": {
+ "message": "回覆以下郵件「{%selected_text%}」,郵件完整內容為「{%mail_html_body%}」。僅回覆所需文本,不要提供任何註解或其他文字。"
+ },
+ "spamfilter_no_reports": {
+ "message": "尚未篩選出任何垃圾郵件。此處僅列出當前連線的最近 100 條垃圾郵件報告。"
+ },
+ "prompt_classify_full_text": {
+ "message": "將以下文字按禮貌、熱情、正式、自信和冒犯性進行分類,並為每個類別給出百分比。僅回覆該類別並評分,不要提供任何註解或其他文字。"
+ },
+ "prompt_add_tags_full_text": {
+ "message": "分析以下電子郵件文字,並生成一個 JSON 陣列,總結其內容。 使用主題、關鍵話題和相關描述作為標籤。 確保標籤簡潔且與電子郵件的內容相關。 請分析以下電子郵件文字:\n{%mail_text_body%}\n考慮以下細節作為背景資訊:\n- 寄件人:{%author%}\n- 收件人:{%recipients%}\n- 副本清單:{%cc_list%}\n- 電子郵件主旨:{%mail_subject%}\n請根據電子郵件的文字和背景資訊,忽略不必要的資訊或瑣碎細節。\n請以 JSON 格式回覆,輸出僅為一個包含標籤的 JSON 陣列,不包含任何額外的註解或文字。 以下是一個 JSON 格式的範例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
+ },
+ "prefs_OptionText_add_tags_force_lang_Info": {
+ "message": "如果勾選,標籤的語言會強制設定為選項頁面所定義的語言,若有指定則使用。"
+ },
+ "prefs_OptionText_get_calendar_event_Sparks_not_present": {
+ "message": "若要使用日曆事件和任務功能,請安裝 ThunderAI Sparks 附加元件。"
+ },
+ "prefs_OptionText_btnManagePrompts_infoline3": {
+ "message": "您可以在提示符號中使用 {%tags_full_list%} 資料佔位符來列出可用的標籤。然後,使用適當的提示,您可以強制僅從現有標籤清單中選擇標籤。"
+ },
+ "GetTask_PageTitle": {
+ "message": "管理任務設定"
+ },
+ "WaitingServerResponse": {
+ "message": "等待伺服器回應"
+ },
+ "prefs_OptionText_btnManageCustomDataPH": {
+ "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": "已將可使用的內容新增至選單提示中"
+ }
+}
diff --git a/api_webchat/controller.js b/api_webchat/controller.js
index 18b1bd48..18fa2277 100644
--- a/api_webchat/controller.js
+++ b/api_webchat/controller.js
@@ -73,14 +73,19 @@ messageInput.setMessagesArea(messagesArea);
switch (llm) {
case "chatgpt_api": {
- let prefs_api = await browser.storage.sync.get({chatgpt_api_key: '', chatgpt_model: '', chatgpt_developer_messages:'', do_debug: false});
+ let prefs_api = await browser.storage.sync.get({chatgpt_api_key: '', chatgpt_model: '', chatgpt_developer_messages:'', chatgpt_api_store: false, do_debug: false});
let i18nStrings = {};
i18nStrings["chatgpt_api_request_failed"] = browser.i18n.getMessage('chatgpt_api_request_failed');
i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted');
messageInput.setModel(prefs_api.chatgpt_model);
messagesArea.setLLMName("ChatGPT");
- worker.postMessage({ type: 'init', chatgpt_api_key: prefs_api.chatgpt_api_key, chatgpt_model: prefs_api.chatgpt_model, chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings});
- messagesArea.appendUserMessage(getAPIsInitMessageString("ChatGPT API", prefs_api.chatgpt_model), "info");
+ worker.postMessage({ type: 'init', chatgpt_api_key: prefs_api.chatgpt_api_key, chatgpt_model: prefs_api.chatgpt_model, chatgpt_developer_messages: prefs_api.chatgpt_developer_messages, chatgpt_api_store: prefs_api.chatgpt_api_store, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings});
+ let additional_text_elements = [];
+ additional_text_elements.push({label: 'OpenAI Store', value: (prefs_api.chatgpt_api_store ? 'Yes' : 'No')});
+ if(prefs_api.chatgpt_developer_messages && prefs_api.chatgpt_developer_messages.length > 0) {
+ additional_text_elements.push({label: browser.i18n.getMessage("ChatGPT_Developer_Messages"), value: prefs_api.chatgpt_developer_messages});
+ }
+ messagesArea.appendUserMessage(getAPIsInitMessageString("ChatGPT API", prefs_api.chatgpt_model, '', '', additional_text_elements), "info");
browser.runtime.sendMessage({command: "openai_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id});
break;
}
@@ -91,19 +96,23 @@ switch (llm) {
i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted');
messageInput.setModel(prefs_api.google_gemini_model);
messagesArea.setLLMName("Google Gemini");
+ let additional_text_elements = [];
+ if(prefs_api.google_gemini_system_instruction && prefs_api.google_gemini_system_instruction.length > 0) {
+ additional_text_elements.push({label: browser.i18n.getMessage("GoogleGemini_SystemInstruction"), value: prefs_api.google_gemini_system_instruction});
+ }
worker.postMessage({ type: 'init', google_gemini_api_key: prefs_api.google_gemini_api_key, google_gemini_model: prefs_api.google_gemini_model, google_gemini_system_instruction: prefs_api.google_gemini_system_instruction, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings});
- messagesArea.appendUserMessage(getAPIsInitMessageString("Google Gemini API", prefs_api.google_gemini_model), "info");
+ messagesArea.appendUserMessage(getAPIsInitMessageString("Google Gemini API", prefs_api.google_gemini_model, '', '', additional_text_elements), "info");
browser.runtime.sendMessage({command: "google_gemini_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id});
break;
}
case "ollama_api": {
- let prefs_api = await browser.storage.sync.get({ollama_host: '', ollama_model: '', ollama_num_ctx: 0, do_debug: false});
+ let prefs_api = await browser.storage.sync.get({ollama_host: '', ollama_model: '', ollama_num_ctx: 0, ollama_think: false, do_debug: false});
let i18nStrings = {};
i18nStrings["ollama_api_request_failed"] = browser.i18n.getMessage('ollama_api_request_failed');
i18nStrings["error_connection_interrupted"] = browser.i18n.getMessage('error_connection_interrupted');
messageInput.setModel(prefs_api.ollama_model);
messagesArea.setLLMName("Ollama Local");
- worker.postMessage({ type: 'init', ollama_host: prefs_api.ollama_host, ollama_model: prefs_api.ollama_model, ollama_num_ctx: prefs_api.ollama_num_ctx, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings});
+ worker.postMessage({ type: 'init', ollama_host: prefs_api.ollama_host, ollama_model: prefs_api.ollama_model, ollama_num_ctx: prefs_api.ollama_num_ctx, ollama_think: prefs_api.ollama_think, do_debug: prefs_api.do_debug, i18nStrings: i18nStrings});
browser.runtime.sendMessage({command: "ollama_api_ready_" + call_id, window_id: (await browser.windows.getCurrent()).id});
messagesArea.appendUserMessage(getAPIsInitMessageString("Ollama API", prefs_api.ollama_model, prefs_api.ollama_host), "info");
break;
@@ -137,7 +146,7 @@ switch (llm) {
//let prefs_ph = await browser.storage.sync.get({placeholders_use_default_value: false});
// Event listeners for worker messages
-worker.onmessage = function(event) {
+worker.onmessage = async function(event) {
const { type, payload } = event.data;
switch (type) {
case 'messageSent':
@@ -148,7 +157,7 @@ worker.onmessage = function(event) {
messageInput.setStatusMessage(browser.i18n.getMessage("apiwebchat_receiving_data") + '...');
break;
case 'tokensDone':
- messagesArea.handleTokensDone(promptData);
+ await messagesArea.handleTokensDone(promptData);
messageInput.enableInput();
break;
case 'error':
diff --git a/api_webchat/messageInput.js b/api_webchat/messageInput.js
index 80070659..aba7c272 100644
--- a/api_webchat/messageInput.js
+++ b/api_webchat/messageInput.js
@@ -49,6 +49,7 @@ messagesInputStyle.textContent = `
height: 36px;
cursor: pointer;
border-radius: 10px;
+ border: 1px outset buttonface;
}
#stopButton {
width: 44px;
@@ -296,7 +297,7 @@ class MessageInput extends HTMLElement {
if (this.messagesAreaComponent) {
this.messagesAreaComponent.appendUserMessage(messageContent);
}
- this.setStatusMessage(browser.i18n.getMessage('WaitingServerReponse') + '...');
+ this.setStatusMessage(browser.i18n.getMessage('WaitingServerResponse') + '...');
this.showStatusMessage();
this.worker.postMessage({ type: 'chatMessage', message: messageContent });
}
diff --git a/api_webchat/messagesArea.js b/api_webchat/messagesArea.js
index 7af3fec2..eb61eca0 100644
--- a/api_webchat/messagesArea.js
+++ b/api_webchat/messagesArea.js
@@ -57,14 +57,29 @@ messagesAreaStyle.textContent = `
}
.action-buttons {
line-height: 1.3;
- text-align: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
.action-buttons button {
display: inline;
margin: 0 10px;
padding: 5px 10px;
- border-radius: 5px;
cursor: pointer;
+ border: 1px outset buttonface;
+ }
+ .action-buttons button.close_btn, .action-buttons button.diffv_btn {
+ border-radius: 5px;
+ }
+ .action-buttons button.action_btn {
+ margin-right: 0;
+ border-top-left-radius: 5px;
+ border-bottom-left-radius: 5px;
+ }
+ .action_btn_info {
+ font-size: 0.6rem;
+ color: gray;
+ display: inline-block;
}
@keyframes fadeIn {
to {
@@ -88,13 +103,20 @@ messagesAreaStyle.textContent = `
background: lightblue;
color: navy;
margin-bottom: var(--margin);
+ font-size: 0.8em;
+ }
+ .info_obj{
+ color:rgb(0, 71, 36);
}
.sel_info{
font-size: 0.7rem;
color: gray;
margin-top: 5px;
display: none;
+ width: 100%;
+ text-align: center;
}
+
/* diff viewer */
.added {
background-color: #d4fcdc;
@@ -105,6 +127,73 @@ messagesAreaStyle.textContent = `
display: inline;
text-decoration: line-through;
}
+
+ /* Split button styles */
+ .split-button {
+ display: inline-flex;
+ position: relative;
+ font-family: sans-serif;
+ }
+
+ .split-button button {
+ padding: 5px 0px 5px 10px;
+ cursor: pointer;
+ font-size: 14px;
+ }
+
+ .split-button .dropdown-toggle {
+ border-left: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 38px;
+ margin-left:-1px;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+ padding:0;
+ }
+
+ .dropdown-toggle svg {
+ fill: #555;
+ margin-left: -4px;
+ }
+
+ .dropdown-menu {
+ position: absolute;
+ top: 2.55rem;
+ right:0;
+ display: none;
+ flex-direction: column;
+ background-color: white;
+ border: 1px solid #ccc;
+ min-width: 160px;
+ z-index: 1000;
+ margin-top: 2px;
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
+ border-radius: 5px;
+ text-align: right;
+ width: -moz-available;
+ }
+
+ .dropdown-menu button {
+ padding: 10px 14px;
+ border: none;
+ background-color: white;
+ text-align: right;
+ cursor: pointer;
+ font-size: 0.6rem;
+ color: gray;
+ }
+
+ .dropdown-menu button:hover {
+ background-color: #f0f0f0;
+ }
+
+ .dropdown-menu.show {
+ display: flex;
+ }
+
+ /* Dark mode styles */
@media (prefers-color-scheme: dark) {
.added {
background-color:rgb(0, 94, 0);
@@ -158,9 +247,9 @@ class MessagesArea extends HTMLElement {
this.llmName = llmName;
}
- handleTokensDone(promptData = null) {
+ async handleTokensDone(promptData = null) {
this.flushAccumulatingMessage();
- this.addActionButtons(promptData);
+ await this.addActionButtons(promptData);
this.addDivider();
}
@@ -183,15 +272,16 @@ class MessagesArea extends HTMLElement {
const messageElement = document.createElement('div');
messageElement.classList.add('message', type);
// Replace \n with
for correct HTML display
- messageElement.textContent = messageText;
- // Replace \n with
elements for correct HTML display
- messageElement.innerHTML = '';
- messageText.split('\n').forEach((line, idx, arr) => {
- messageElement.appendChild(document.createTextNode(line));
- if (idx < arr.length - 1) {
- messageElement.appendChild(document.createElement('br'));
- }
- });
+ messageElement.appendChild(htmlStringToFragment(messageText));
+ // messageElement.textContent = messageText;
+ // // Replace \n with
elements for correct HTML display
+ // messageElement.innerHTML = '';
+ // messageText.split('\n').forEach((line, idx, arr) => {
+ // messageElement.appendChild(document.createTextNode(line));
+ // if (idx < arr.length - 1) {
+ // messageElement.appendChild(document.createElement('br'));
+ // }
+ // });
this.messages.appendChild(messageElement);
this.scrollToBottom();
}
@@ -238,31 +328,30 @@ class MessagesArea extends HTMLElement {
this.messages.scrollTop = this.messages.scrollHeight;
}
- addActionButtons(promptData = null) {
- if(promptData == null) { return; }
- const actionButtons = document.createElement('div');
- actionButtons.classList.add('action-buttons');
- const selectionInfo = document.createElement('p');
- selectionInfo.textContent = browser.i18n.getMessage("apiwebchat_selection_info");
- selectionInfo.classList.add('sel_info');
- const actionButton = document.createElement('button');
- actionButton.textContent = browser.i18n.getMessage("apiwebchat_use_this_answer");
- const fullTextHTMLAtAssignment = this.fullTextHTML.trim().replace(/^"|"$/g, '').replace(/^"/, '
').replace(/"<\/p>$/, '
'); // strip quotation marks
- //console.log(">>>>>>>>>>>> fullTextHTMLAtAssignment: " + fullTextHTMLAtAssignment);
- actionButton.addEventListener('click', async () => {
+ // Helper to create dropdown options
+ createOption(label, callback) {
+ const btn = document.createElement('button');
+ btn.textContent = label;
+ btn.onclick = callback;
+ return btn;
+ }
+
+ // click callcback for the "use this answer" button
+ handleUseThisAnswerButtonClick(promptData, replyType, fullTextHTMLAtAssignment){
+ return async () => {
if(promptData.mailMessageId == -1) { // we are using the reply from the compose window!
promptData.action = "2"; // replace text
}
- let finalText = fullTextHTMLAtAssignment;
+ let finalText = removeAloneBRs(fullTextHTMLAtAssignment);
const selectedHTML = this.getCurrentSelectionHTML();
if(selectedHTML != "") {
- finalText = selectedHTML;
+ finalText = removeAloneBRs(selectedHTML);
}
switch(promptData.action) {
case "1": // do reply
// console.log("[ThunderAI] (do reply) fullTextHTMLAtAssignment: " + fullTextHTMLAtAssignment);
- await browser.runtime.sendMessage({command: "chatgpt_replyMessage", text: finalText, tabId: promptData.tabId, mailMessageId: promptData.mailMessageId});
+ await browser.runtime.sendMessage({command: "chatgpt_replyMessage", text: finalText, tabId: promptData.tabId, mailMessageId: promptData.mailMessageId, replyType: replyType});
browser.runtime.sendMessage({command: "chatgpt_close", window_id: (await browser.windows.getCurrent()).id});
break;
case "2": // replace text
@@ -271,14 +360,96 @@ class MessagesArea extends HTMLElement {
browser.runtime.sendMessage({command: "chatgpt_close", window_id: (await browser.windows.getCurrent()).id});
break;
}
- });
+ }
+ }
+
+ async addActionButtons(promptData = null) {
+ if(promptData == null) { return; }
+ const actionButtons = document.createElement('div');
+ actionButtons.classList.add('action-buttons');
+ // Create the main container for the "use this answer" button when replying
+ const splitButton = document.createElement('div');
+ splitButton.className = 'split-button';
+ // selection info
+ const selectionInfo = document.createElement('p');
+ selectionInfo.textContent = browser.i18n.getMessage("apiwebchat_selection_info");
+ selectionInfo.classList.add('sel_info');
+ // main button
+ const actionButton = document.createElement('button');
+ actionButton.className = 'action_btn';
+ const actionButton_line1 = document.createElement('span');
+ actionButton_line1.textContent = browser.i18n.getMessage("apiwebchat_use_this_answer");
+ actionButton.appendChild(actionButton_line1);
+ splitButton.appendChild(actionButton);
+ const fullTextHTMLAtAssignment = this.fullTextHTML.trim().replace(/^"|"$/g, '').replace(/^"/, '
').replace(/"<\/p>$/, '
'); // strip quotation marks
+ //console.log(">>>>>>>>>>>> fullTextHTMLAtAssignment: " + fullTextHTMLAtAssignment);
+ let reply_type_pref = await browser.storage.sync.get({reply_type: 'reply_all'});
+ if((promptData.action == "1") && (promptData.mailMessageId != -1)) {
+ const actionButton_line2 = document.createElement('span');
+ actionButton_line2.classList.add('action_btn_info');
+ actionButton_line2.textContent = reply_type_pref.reply_type == 'reply_all' ? browser.i18n.getMessage("prefs_OptionText_reply_all") : browser.i18n.getMessage("prefs_OptionText_reply_sender");
+ actionButton.appendChild(document.createElement('br'));
+ actionButton.appendChild(actionButton_line2);
+ // Dropdown toggle button
+ const toggleBtn = document.createElement('button');
+ toggleBtn.className = 'dropdown-toggle';
+ toggleBtn.setAttribute('aria-label', 'Show options');
+ // SVG icon
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
+ svg.setAttribute('viewBox', '0 0 20 20');
+ svg.setAttribute('width', '16');
+ svg.setAttribute('height', '16');
+ svg.setAttribute('fill', 'currentColor');
+ svg.setAttribute('stroke-width', '2');
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
+ path.setAttribute('d', 'M19 9l-7 7-7-7');
+ svg.appendChild(path);
+ toggleBtn.appendChild(svg);
+ splitButton.appendChild(toggleBtn);
+ // Dropdown menu
+ const dropdown = document.createElement('div');
+ dropdown.className = 'dropdown-menu';
+ dropdown.id = 'dropdown';
+ // Add options
+ dropdown.appendChild(this.createOption(
+ reply_type_pref.reply_type == 'reply_all' ? browser.i18n.getMessage("prefs_OptionText_reply_sender") : browser.i18n.getMessage("prefs_OptionText_reply_all"),
+ this.handleUseThisAnswerButtonClick(promptData, reply_type_pref.reply_type == 'reply_all' ? 'reply_sender' : 'reply_all', fullTextHTMLAtAssignment))
+ );
+ splitButton.appendChild(dropdown);
+ let dropdownJustOpened = false;
+ // Toggle function
+ toggleBtn.onclick = () => {
+ dropdownJustOpened = true;
+ dropdown.classList.toggle('show');
+ };
+ // Close on outside click
+ window.addEventListener('click', (e) => {
+ // Delay the execution to allow other handlers (like toggle) to run first
+ if (dropdownJustOpened) {
+ dropdownJustOpened = false;
+ return; // Skip this click because it's the one that opened the menu
+ }
+ setTimeout(() => {
+ if (!splitButton.contains(e.target)) {
+ dropdown.classList.remove('show');
+ }
+ }, 0);
+ });
+ }else{
+ actionButton.style.paddingRight = "10px";
+ actionButton.style.borderTopRightRadius = "5px";
+ actionButton.style.borderBottomRightRadius = "5px";
+ actionButton.style.marginRight = "10px";
+ }
+ actionButton.addEventListener('click', this.handleUseThisAnswerButtonClick(promptData,reply_type_pref.reply_type, fullTextHTMLAtAssignment));
const closeButton = document.createElement('button');
closeButton.textContent = browser.i18n.getMessage("chatgpt_win_close");
+ closeButton.classList.add('close_btn');
closeButton.addEventListener('click', async () => {
browser.runtime.sendMessage({command: "chatgpt_close", window_id: (await browser.windows.getCurrent()).id}); // close window
});
if(promptData.action != 0) {
- actionButtons.appendChild(actionButton);
+ actionButtons.appendChild(splitButton);
selectionInfo.style.display = "block"; // show selection info
}
@@ -286,6 +457,7 @@ class MessagesArea extends HTMLElement {
if(promptData.prompt_info?.use_diff_viewer == "1") {
const diffvButton = document.createElement('button');
diffvButton.textContent = browser.i18n.getMessage("btn_show_differences");
+ diffvButton.classList.add('diffv_btn');
diffvButton.addEventListener('click', async () => {
let strippedText = fullTextHTMLAtAssignment.replace(/<\/?[^>]+(>|$)/g, "");
let originalText = promptData.prompt_info?.selection_text;
@@ -299,8 +471,8 @@ class MessagesArea extends HTMLElement {
}
actionButtons.appendChild(closeButton);
- actionButtons.appendChild(selectionInfo);
this.messages.appendChild(actionButtons);
+ this.messages.appendChild(selectionInfo);
this.scrollToBottom();
}
@@ -318,22 +490,29 @@ class MessagesArea extends HTMLElement {
// Iterate over each part of the diff to create the HTML output
wordDiff.forEach(part => {
- const diffElement = document.createElement("span");
-
- // Apply a different class depending on whether the word is added, removed, or unchanged
- if (part.added) {
- diffElement.className = "added";
- diffElement.textContent = part.value;
- } else if (part.removed) {
- diffElement.className = "removed";
- diffElement.textContent = part.value;
- } else {
- diffElement.textContent = part.value;
+ // Split part.value by
(handling
,
,
)
+ const brRegex = /(
)/gi;
+ const segments = part.value.split(brRegex);
+
+ segments.forEach(segment => {
+ if (segment.match(brRegex)) {
+ // It's a
, add a real
element
+ messageElement.appendChild(document.createElement("br"));
+ } else if (segment.length > 0) {
+ const diffElement = document.createElement("span");
+ if (part.added) {
+ diffElement.className = "added";
+ diffElement.textContent = segment;
+ } else if (part.removed) {
+ diffElement.className = "removed";
+ diffElement.textContent = segment;
+ } else {
+ diffElement.textContent = segment;
+ }
+ messageElement.appendChild(diffElement);
}
-
- // Add the element to the container
- messageElement.appendChild(diffElement);
- });
+ });
+ });
const header = document.createElement('h2');
header.textContent = browser.i18n.getMessage("chatgpt_win_diff_title");
@@ -354,9 +533,11 @@ class MessagesArea extends HTMLElement {
// Convert Markdown to DOM nodes using the markdown-it library
const md = window.markdownit();
- const html = md.render(fullText);
+ const html = convertNewlinesToBr(md.render(fullText));
this.fullTextHTML += html;
+
+ // console.log(">>>>>>>>>>>>>>>> flushAccumulatingMessage this.fullTextHTML: " + this.fullTextHTML);
// Create a new DOM parser
const parser = new DOMParser();
@@ -390,4 +571,46 @@ class MessagesArea extends HTMLElement {
}
-customElements.define('messages-area', MessagesArea);
\ No newline at end of file
+customElements.define('messages-area', MessagesArea);
+
+
+function htmlStringToFragment(htmlString) {
+// console.log(">>>>>>>>>>>>>>>> htmlStringToFragment htmlString: " + htmlString);
+ const normalizedHtml = htmlString.replace(/\n/g, '
');
+// console.log(">>>>>>>>>>>>>>>> htmlStringToFragment normalizedHtml: " + normalizedHtml);
+ const parser = new DOMParser();
+ const doc = parser.parseFromString(normalizedHtml, 'text/html');
+ const fragment = document.createDocumentFragment();
+ Array.from(doc.body.childNodes).forEach(node => fragment.appendChild(node));
+ return fragment;
+}
+
+function convertNewlinesToBr(text) {
+ return text.replace(/\n/g, '
');
+}
+
+function removeAloneBRs(htmlString) {
+ const parser = new DOMParser();
+ const doc = parser.parseFromString(htmlString, 'text/html');
+
+ const brElements = Array.from(doc.querySelectorAll('br'));
+
+ brElements.forEach(br => {
+ let current = br;
+ let isInsideP = false;
+
+ while (current.parentElement) {
+ if (current.parentElement.tagName.toLowerCase() === 'p') {
+ isInsideP = true;
+ break;
+ }
+ current = current.parentElement;
+ }
+
+ if (!isInsideP) {
+ br.remove();
+ }
+ });
+
+ return doc.body.innerHTML;
+}
\ No newline at end of file
diff --git a/js/api/ollama.js b/js/api/ollama.js
index 5cc41215..5c10763a 100644
--- a/js/api/ollama.js
+++ b/js/api/ollama.js
@@ -22,12 +22,14 @@ export class Ollama {
model = '';
stream = false;
num_ctx = 0;
+ think = false;
- constructor(host, model, stream = false, num_ctx = 0) {
+ constructor(host, model, stream = false, num_ctx = 0, think = false) {
this.host = host.trim().replace(/\/+$/, "");
this.model = model;
this.stream = stream;
this.num_ctx = num_ctx;
+ this.think = think;
}
fetchModels = async () => {
@@ -80,7 +82,8 @@ export class Ollama {
model: this.model,
messages: messages,
stream: this.stream,
- ...(this.num_ctx > 0 ? { options: { num_ctx: parseInt(this.num_ctx) } } : {})
+ think: this.think,
+ ...(this.num_ctx > 0 ? { options: { num_ctx: parseInt(this.num_ctx) } } : {}),
}),
});
return response;
diff --git a/js/api/openai.js b/js/api/openai.js
index e077b750..11884e7e 100644
--- a/js/api/openai.js
+++ b/js/api/openai.js
@@ -25,12 +25,14 @@ export class OpenAI {
model = '';
developer_messages = '';
stream = false;
+ store = false;
- constructor(apiKey, model, developer_messages, stream) {
+ constructor(apiKey, model, developer_messages, stream, store) {
this.apiKey = apiKey;
this.model = model;
this.developer_messages = developer_messages;
this.stream = stream;
+ this.store = store;
}
@@ -89,6 +91,7 @@ export class OpenAI {
model: this.model,
messages: messages,
stream: this.stream,
+ store: this.store,
...(maxTokens > 0 ? { 'max_tokens': parseInt(maxTokens) } : {})
}),
});
diff --git a/js/api/openai_comp.js b/js/api/openai_comp.js
index 459f968f..a0ba14ec 100644
--- a/js/api/openai_comp.js
+++ b/js/api/openai_comp.js
@@ -41,6 +41,11 @@ export class OpenAIComp {
"Content-Type": "application/json",
};
if(this.apiKey !== '') curr_headers["Authorization"] = "Bearer "+ this.apiKey;
+
+ if(this.host.includes('openrouter.ai')) {
+ curr_headers['HTTP-Referer'] = 'https://micz.it/thunderbird-addon-thunderai/';
+ curr_headers['X-Title'] = 'ThunderAI';
+ }
const response = await fetch(this.host + (this.use_v1 ? "/v1" : "") + "/models", {
method: "GET",
diff --git a/js/api/openai_comp_configs.js b/js/api/openai_comp_configs.js
index 3bf312f8..32298e08 100644
--- a/js/api/openai_comp_configs.js
+++ b/js/api/openai_comp_configs.js
@@ -34,16 +34,30 @@ export const openAICompConfigs = [
},
{
id: 'grok',
- name: 'Grok AI API',
- chat_name: 'Grok AI',
+ name: 'Grok API',
+ chat_name: 'Grok',
host: 'https://api.x.ai',
use_v1: true,
},
{
id: 'mistral',
- name: 'Mistral AI API',
- chat_name: 'Mistral AI',
+ name: 'Mistral API',
+ chat_name: 'Mistral',
host: 'https://api.mistral.ai',
use_v1: true,
},
+ {
+ id: 'openrouter',
+ name: 'OpenRouter API',
+ chat_name: 'OpenRouter',
+ host: 'https://openrouter.ai/api',
+ use_v1: true,
+ },
+ {
+ id: 'perplexity',
+ name: 'Perplexity API',
+ chat_name: 'Perplexity',
+ host: 'https://api.perplexity.ai',
+ use_v1: true,
+ },
];
\ No newline at end of file
diff --git a/js/mzta-addatags-exclusion-list.js b/js/mzta-addatags-exclusion-list.js
index 06a103bd..47e35ece 100644
--- a/js/mzta-addatags-exclusion-list.js
+++ b/js/mzta-addatags-exclusion-list.js
@@ -26,4 +26,15 @@ export async function addTags_getExclusionList() {
export function addTags_setExclusionList(add_tags_exclusions) {
browser.storage.local.set({add_tags_exclusions: add_tags_exclusions});
+}
+
+export function checkExcludedTag(tag, excluded_word, exact_match = false) {
+ // Check if the tag is in the exclusion list
+ if (excluded_word === '') {
+ return false; // No exclusion word, so no exclusion
+ }
+ if(exact_match) {
+ return tag.toLowerCase() === excluded_word.toLowerCase();
+ }
+ return tag.toLowerCase().includes(excluded_word.toLowerCase());
}
\ No newline at end of file
diff --git a/js/mzta-chatgpt.js b/js/mzta-chatgpt.js
index bbe5029d..a6d953b6 100644
--- a/js/mzta-chatgpt.js
+++ b/js/mzta-chatgpt.js
@@ -99,7 +99,7 @@ function chatgpt_getRegenerateButton() {
function chatpgt_scrollToBottom () {
try {
//document.querySelector('button[class*="cursor"][class*="bottom"]').click();
- document.querySelector('path[d^="M9.33468 3.33333C9.33468 2.96617"]')?.parentNode?.parentNode?.click();
+ document.querySelector('path[d^="M9.33468 3.33333C9.33468"]')?.parentNode?.parentNode?.click();
}
catch (err) { console.error('[ThunderAI] ', err); }
}
@@ -130,6 +130,8 @@ function addCustomDiv(prompt_action,tabId,mailMessageId) {
style.textContent += "#mzta-diff_content{overflow-y:scroll;text-align:justify;width:100%;height:22.5em;}";
style.textContent += "#mzta-diff span.added{background-color: rgb(0, 94, 0);display:inline;} #mzta-diff span.removed{background-color: rgb(90, 0, 0);display:inline;text-decoration:line-through;}";
style.textContent += "#mzta-btn_close_diff{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);}";
+ style.textContent += "#mzta-btn_change_reply_type{padding-left:4px;padding-right:10px;margin-left:0px;border-bottom-left-radius:0px;border-top-left-radius:0px;height:2.7em;}";
+ style.textContent += ".mzta-btn_reply{padding-right:4px;margin-right:0px;border-bottom-right-radius:0px;border-top-right-radius:0px;}";
// Add