Compare commits
144 commits
v4.1.0pre3
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d1d790e39 | ||
|
|
998d626277 | ||
|
|
59efb5f007 | ||
|
|
fb52da1436 | ||
|
|
42d6b11e29 | ||
|
|
94019819ec | ||
|
|
ee853dd447 | ||
|
|
ce3eb57612 | ||
|
|
326bc39ee6 | ||
|
|
538f8b59a9 | ||
|
|
c7a9a7812c | ||
|
|
e1288d65d5 | ||
|
|
9bbc5fbc69 | ||
|
|
f7186431d3 | ||
|
|
39752e6b35 | ||
|
|
3a0f42f411 | ||
|
|
d6eaa5842b | ||
|
|
13e0ceaefb | ||
|
|
e7ec1476d7 | ||
|
|
5dfcf20714 | ||
|
|
4f620e2cce | ||
|
|
71b5c7f7d5 | ||
|
|
48f9002f87 | ||
|
|
71848558cd | ||
|
|
cccdc8442a | ||
|
|
6f0308bbf7 | ||
|
|
0eaa27f8aa | ||
|
|
9f3671e13f | ||
|
|
2f7055db78 | ||
|
|
286d127bcd | ||
|
|
d3086a7711 | ||
|
|
2d924ce74c | ||
|
|
1b8ebb756f | ||
|
|
58e4f5130a | ||
|
|
8fd5825a8e | ||
|
|
2d61e730e5 | ||
|
|
8cf6f447d4 | ||
|
|
565134ecbd | ||
|
|
85afdb0a77 | ||
|
|
822953482d | ||
|
|
a1888e60f7 | ||
|
|
5977a8feb4 | ||
|
|
9dbfb93e62 | ||
|
|
80f8bc1019 | ||
|
|
a5620b7173 | ||
|
|
44daa24840 | ||
|
|
c7234d035e | ||
|
|
fc803700fa | ||
|
|
e28726f30f | ||
|
|
83543561d4 | ||
|
|
939c319f6f | ||
|
|
084d289af0 | ||
|
|
e4f8fcf678 | ||
|
|
119464bd69 | ||
|
|
f34431ea6a | ||
|
|
7b99c1c5b3 | ||
|
|
cccd3346a5 | ||
|
|
8b1e130bb4 | ||
|
|
1baac228c0 | ||
|
|
a10bd5725b | ||
|
|
e717b827b4 | ||
|
|
9fac73c319 | ||
|
|
0a99b28067 | ||
|
|
d383e78503 | ||
|
|
8ba30a1b7c | ||
|
|
d007ed37e9 | ||
|
|
82d38f7ebe | ||
|
|
fa885f44dd | ||
|
|
0691a027a9 | ||
|
|
48128b978d | ||
|
|
ec5506ed8a | ||
|
|
4704a884a1 | ||
|
|
35bc236ce5 | ||
|
|
4c7b38fffc | ||
|
|
954c650d4b | ||
|
|
f903149e51 | ||
|
|
3240177717 | ||
|
|
2a51e39815 | ||
|
|
cfc0aedb98 | ||
|
|
e6bc740adf | ||
|
|
0ee53d6b37 | ||
|
|
43fcc972b5 | ||
|
|
4d145db282 | ||
|
|
1ac16ed4c2 | ||
|
|
62629fe191 | ||
|
|
1eb1ef6dc1 | ||
|
|
e4c065df7b | ||
|
|
4575ab795d | ||
|
|
3a506f710f | ||
|
|
dd1aba576d | ||
|
|
13a5e273ef | ||
|
|
e2b20e7ed6 | ||
|
|
3eba2865d7 | ||
|
|
23e8fb9e07 | ||
|
|
a5e3ac9a07 | ||
|
|
1984a70b28 | ||
|
|
a98e2edafe | ||
|
|
8522a28a7d | ||
|
|
a402f378f0 | ||
|
|
156a0fa9a8 | ||
|
|
c0a95f41fa | ||
|
|
fa54572279 | ||
|
|
e89ab5beca | ||
|
|
14868d4fd4 | ||
|
|
591120a571 | ||
|
|
0e58db3f9e | ||
|
|
9c72d2fc05 | ||
|
|
e4f3ff9351 | ||
|
|
0eb8b41f33 | ||
|
|
9f525231f9 | ||
|
|
584bc32ec5 | ||
|
|
487d4e33af | ||
|
|
8522f0b7f6 | ||
|
|
67f30ee6bc | ||
|
|
6f665b1892 | ||
|
|
79d15ee0cf | ||
|
|
68084a6718 | ||
|
|
b235005911 | ||
|
|
d96d7ab025 | ||
|
|
7c984dc74d | ||
|
|
fbedb7dfd9 | ||
|
|
a92d2f4c55 | ||
|
|
b17d094d0c | ||
|
|
4ab2af98a3 | ||
|
|
1494651de6 | ||
|
|
774c63ef9e | ||
|
|
742034ce82 | ||
|
|
a87420c155 | ||
|
|
da82fb0b6d | ||
|
|
9df3667e75 | ||
|
|
9f929ff003 | ||
|
|
0b3c66b78d | ||
|
|
7d2b811926 | ||
|
|
43ffdd32e1 | ||
|
|
b1b02312e9 | ||
|
|
696ef5aa3c | ||
|
|
0e9790ccf4 | ||
|
|
3623b92ea5 | ||
|
|
63f52703b7 | ||
|
|
36d606bbc6 | ||
|
|
40235e5df4 | ||
|
|
afdae833dc | ||
|
|
1522e2c04c | ||
|
|
021e317a37 |
|
|
@ -2,7 +2,7 @@ name: pre-release comment issues
|
|||
|
||||
on:
|
||||
release:
|
||||
types: [published, edited]
|
||||
types: [published]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}
|
||||
|
|
|
|||
26
CHANGELOG.md
|
|
@ -3,19 +3,41 @@
|
|||
|
||||
|
||||
|
||||
<h2>Version 4.1.0 - ??/??/2026</h2>
|
||||
<h2>Version 4.1.0 - 13/05/2026</h2>
|
||||
<ul>
|
||||
<li>Antispam information are now permanently saved for each message [<a href="https://github.com/micz/ThunderAI/issues/675">#675</a>].</li>
|
||||
<li><i>[All APIs]</i> A summary has been added above the mail content [<a href="https://github.com/micz/ThunderAI/issues/580">#580</a>].</li>
|
||||
<li><i>[All APIs]</i> Added inline auto translation for emails [<a href="https://github.com/micz/ThunderAI/issues/247">#247</a>].</li>
|
||||
<li>Custom menus configuration added. Now it's possibile to define which prompts show in the ThunderAI menu, which ones in the context menu and in which order [<a href="https://github.com/micz/ThunderAI/issues/49">#49</a>, <a href="https://github.com/micz/ThunderAI/issues/184">#184</a>, <a href="https://github.com/micz/ThunderAI/issues/680">#680</a>].</li>
|
||||
<li>Now the popup menu closes immediatly and the working indicator is in the button icon [<a href="https://github.com/micz/ThunderAI/issues/247">#677</a>].</li>
|
||||
<li><i>[All APIs]</i> Error messages added also for background operations when the API has not been configured correctly [<a href="https://github.com/micz/ThunderAI/issues/766">#766</a>].</li>
|
||||
<li><i>[Ollama API]</i> Added <i>format: json</i> option [<a href="https://github.com/micz/ThunderAI/issues/703">#703</a>].</li>
|
||||
<li>Fix: The "Important Information" section in the options page now updates correctly when choosing an integration [<a href="https://github.com/micz/ThunderAI/issues/730">#730</a>].</li>
|
||||
<li>In the options page now is visible if a special prompt is using a specific API integration [<a href="https://github.com/micz/ThunderAI/issues/676">#676</a>].</li>
|
||||
<li>Added an antispam skip list to ensure messages from designated addresses are not forwarded to the AI [<a href="https://github.com/micz/ThunderAI/issues/743">#743</a>].</li>
|
||||
<li>Fix: Correctly setting the end date for a new calendar event [<a href="https://github.com/micz/ThunderAI/issues/750">#750</a>].</li>
|
||||
<li>Now it's possibile to use different date and time formats in the AI output when creating a calendar event [<a href="https://github.com/micz/ThunderAI/issues/737">#737</a>].</li>
|
||||
<li>...</li>
|
||||
<li>Added the <i>{%mail_full_headers%}</i> placeholder to retrieve all the email headers at once [<a href="https://github.com/micz/ThunderAI/issues/713">#713</a>].</li>
|
||||
<li><i>[All APIs]</i> In the API webchat the status messages have different colors [<a href="https://github.com/micz/ThunderAI/issues/3">#3</a>].</li>
|
||||
<li>Account exclusion lists for add tags and antispam are enforced only for automatic analysis of incoming emails and not for the context menu action that is always executed [<a href="https://github.com/micz/ThunderAI/issues/749">#749</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.7 - 17/04/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Correctly parsing the body of HTML base64 encoded mails [<a href="https://github.com/micz/ThunderAI/issues/757">#757</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.6 - 01/04/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Now it's possibile to create a tag also with accented characters in the label [<a href="https://github.com/micz/ThunderAI/issues/738">#738</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.5 - 27/03/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: HTML part of the mail body used in prompt is displayed as HTML code and it is not rendered. This a display fix, there is no change on how the prompt is sent to the AI [<a href="https://github.com/micz/ThunderAI/issues/711">#711</a>].</li>
|
||||
<li>Fix: HTML elements added by ThunderAI (like the antispam banner) are now not present in HTML or text data placeholders [<a href="https://github.com/micz/ThunderAI/issues/710">#710</a>].</li>
|
||||
<li><i>[All APIs]</i> The API webchat window now has a dynamic title [<a href="https://github.com/micz/ThunderAI/issues/696">#696</a>]</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.4 - 26/03/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Correctly showing the selected model in the special prompt pages.</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.3 - 20/03/2026</h2>
|
||||
<ul>
|
||||
|
|
|
|||
16
README.md
|
|
@ -60,6 +60,16 @@ Using an API integration, you can activate some automatic features:
|
|||
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
## Documentation
|
||||
|
||||
[Setup Guides](https://micz.it/thunderbird-addon-thunderai/guides/) - Step-by-step guides to connect ThunderAI to the AI backend of your choice, from ChatGPT to local models with Ollama.
|
||||
|
||||
[Custom Prompt Tutorial](https://micz.it/thunderbird-addon-thunderai/tutorial/) - Learn how to build your first custom prompt from scratch, combining placeholders and user input to automate your email replies.
|
||||
|
||||
[ThunderAI Prompt Architect](https://chatgpt.com/g/g-69b6b11c89b88191a6798be6e97025f1-thunder-ai-prompt-architect) - Let ChatGPT help you crafting your custom prompts. Thanks to [Paweł](https://github.com/PawelKinczyk) for this tool!
|
||||
|
||||
<br>
|
||||
|
||||
## Translations
|
||||
|
|
@ -67,6 +77,8 @@ Do you want to help translate this addon?
|
|||
|
||||
[Find out how!](https://micz.it/thunderbird-addon-thunderai/translate/)
|
||||
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
## Changelog
|
||||
|
|
@ -101,7 +113,7 @@ Are you using this addon in your Thunderbird?
|
|||
- Polish - Polski (pl): [neexpl](https://github.com/neexpl), [makkacprzak](https://github.com/makkacprzak) <img src="https://micz.it/weblate/thunderai/pl.svg">
|
||||
- Russian - Russkiy (русский) (ru): [Maksim](https://hosted.weblate.org/user/law820314/) <img src="https://micz.it/weblate/thunderai/ru.svg">
|
||||
- Spanish - Español (es): [Gerardo Sobarzo](https://hosted.weblate.org/user/gerardo.sobarzo/), [Andrés Rendón Hernández](https://hosted.weblate.org/user/arendon/), [Erick Limon](https://hosted.weblate.org/user/ErickLimonG/) <img src="https://micz.it/weblate/thunderai/es.svg">
|
||||
- Swedish - Svenska (sv): [Andreas Pettersson](https://hosted.weblate.org/user/Andy_tb/) , [Luna Jernberg](https://hosted.weblate.org/user/bittin1ddc447d824349b2/) <img src="https://micz.it/weblate/thunderai/sv.svg">
|
||||
- Swedish - Svenska (sv): [Andreas Pettersson](https://hosted.weblate.org/user/Andy_tb/), [Luna Jernberg](https://hosted.weblate.org/user/bittin1ddc447d824349b2/) <img src="https://micz.it/weblate/thunderai/sv.svg">
|
||||
<br>
|
||||
|
||||
Do you want to help translate this addon? [Find out how!](https://micz.it/thunderbird-addon-thunderai/translate/) <br>
|
||||
|
|
@ -120,6 +132,8 @@ _The language status represents the percentage of translated strings in the late
|
|||
- [Roundicons](https://www.flaticon.com/authors/roundicons) for the summarize context menu icon
|
||||
- [HideMau](https://www.flaticon.com/authors/hidemaru) for the ai summarize icon
|
||||
- [Hilmy Abiyyu A.](https://www.flaticon.com/authors/hilmy-abiyyu-a) for the ai translate and context menu icons
|
||||
- [bearicons](https://www.flaticon.com/authors/bearicons) for the empty context menu icon
|
||||
- [meaicon](https://www.flaticon.com/authors/meaicon) for the add task context menu icon
|
||||
|
||||
|
||||
<br>
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@ file: pages\_lib\list.js
|
|||
source: https://raw.githubusercontent.com/javve/list.js/v2.3.1/dist/list.js
|
||||
|
||||
file: pages\_lib\tom-select.base.js
|
||||
source: https://cdn.jsdelivr.net/npm/tom-select@2.5.2/dist/js/tom-select.base.js
|
||||
source: https://cdn.jsdelivr.net/npm/tom-select@v2.6.1/dist/js/tom-select.base.js
|
||||
|
||||
file: pages\_lib\tom-select.default.min.css
|
||||
source: https://cdn.jsdelivr.net/npm/tom-select@v2.5.2/dist/css/tom-select.default.min.css
|
||||
source: https://cdn.jsdelivr.net/npm/tom-select@v2.6.1/dist/css/tom-select.default.min.css
|
||||
|
||||
file: js\lib\diff.js
|
||||
source: https://cdnjs.cloudflare.com/ajax/libs/jsdiff/7.0.0/diff.js
|
||||
|
|
@ -26,9 +26,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Класифициране"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Обобщаване"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Превеждане"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -59,9 +59,6 @@
|
|||
"prompt_translate_this": {
|
||||
"message": "Přeložit"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Shrnout"
|
||||
},
|
||||
"customPrompts_managePrompts": {
|
||||
"message": "Spravovat dotazy"
|
||||
},
|
||||
|
|
@ -423,10 +420,10 @@
|
|||
"message": "Pokud je zaškrtnuto, bude do nabídky přidána položka pro získání informací o události kalendáře z vybraného textu."
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_force_existing_Info": {
|
||||
"message": "Pokud je zaškrtnuto, AI bude nově přijatým e-mailům přidávat pouze existující štítky a nebude vytvářet nové."
|
||||
"message": "Pokud je zaškrtnuto, AI bude přidávat pouze existující štítky a nebude vytvářet nové."
|
||||
},
|
||||
"prompt_spamfilter": {
|
||||
"message": "Detekovat spamové e-maily"
|
||||
"message": "Analyzovat spam"
|
||||
},
|
||||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Výchozí podpis podle nastavení ThunderAI."
|
||||
|
|
@ -495,7 +492,7 @@
|
|||
"message": "Modely ChatGPT"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "Zatím nebyly žádné zprávy zkontrolovány na spam. Zde naleznete seznam posledních 100 hlášení spamu pouze pro aktuální relaci."
|
||||
"message": "Zatím nebyly žádné zprávy zkontrolovány na spam. Zde naleznete seznam posledních 100 hlášení spamu."
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "\"Možnosti filtru spamu\""
|
||||
|
|
@ -641,12 +638,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Pokud je zaškrtnuto, použití klávesové zkratky CTRL+ALT+A automaticky odešle zvýrazněnou výzvu z menu. Jinak se uživateli zobrazí název výzvy a pro její odeslání bude nutné znovu stisknout klávesu Enter."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menu: seřadit abecedně"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Pokud je zaškrtnuto, výzvy v menu budou seřazeny abecedně."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Nastavte na 0, pokud nechcete specifikovat velikost okna."
|
||||
},
|
||||
|
|
@ -740,17 +731,14 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Klasifikujte následující text z hlediska zdvořilosti, vřelosti, formálnosti, asertivity, urážlivosti a uveďte procento pro každou kategorii. Odpovězte pouze kategorií a skóre bez dalších komentářů nebo jiného textu."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Shrňte následující e-mail do seznamu s odrážkami."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Přeložte následující e-mail do"
|
||||
"message": "Přeložte níže uvedený e-mail do jazyka {%thunderai_translate_lang%}.\n\nPravidla:\n- Přeložte předmět i tělo zprávy.\n- Výsledek vraťte jako objekt JSON se třemi poli: „subject“, „body“ a „status“.\n- Pokud byl překlad proveden, status se rovná 1.\n- Pokud je e-mail napsán v jednom z těchto jazyků „{%thunderai_translate_exclude_lang%}“ nebo v jazyce {%thunderai_translate_lang%}, vraťte prázdný řetězec pro pole „body“ a „subject“ a nastavte status na -1.\n- Nepřidávejte žádná vysvětlení, poznámky ani žádný text mimo JSON.\n\nPředmět e-mailu: {%mail_subject%}\n\nTělo e-mailu: {%mail_html_body%}\n\nOdpověď vygenerujte pouze ve formátu JSON. Výstupem musí být pouze objekt JSON. Zde je příklad formátu JSON, který má být použit:\n{\n\"subject\": \"překlad předmětu\",\n\"body\": \"překlad těla\",\n\"status\": \"výsledek statusu\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Odpovězte pouze potřebným textem a bez dalších komentářů nebo jiného textu."
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Přidat štitky k tomuto e-mailu"
|
||||
"message": "Přidat štitky"
|
||||
},
|
||||
"prefs_OptionText_add_tags_Info": {
|
||||
"message": "Pokud je zaškrtnuto, do menu bude přidána položka pro aplikaci štítků na e-maily."
|
||||
|
|
@ -768,7 +756,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": "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}"
|
||||
"message": "Analyzuj následující text e-mailu a vytvoř JSON pole tagů, které shrnují jeho obsah. Jako tagy použij témata, klíčová témata a relevantní popisné prvky. Ujisti 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ázej z textu e-mailu a kontextu při generování tagů, ignoruj zbytečné informace nebo nepodstatné detaily.\nVygeneruj 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ů"
|
||||
|
|
@ -834,17 +822,11 @@
|
|||
"message": "Pokud je zaškrtnuto, AI automaticky přidá štítky k nově přijatým e-mailům."
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_force_existing": {
|
||||
"message": "Vynutit existující štítky při automatickém označování nebo použití kontextového menu"
|
||||
"message": "Vynutit existující štítky"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analyzuj následující e-mail a urči, zda se jedná o spam či nikoli. Zvaž faktory, jako jsou podezřelá klíčová slova, nadměrné propagační výrazy, zavádějící řádky předmětu, žádosti o osobní informace a neobvyklé adresy odesílatele.\nZadej hodnotu od 0 (není spam) do 100 (spam) a vysvětlení o maximálně 10 slovech. \nV případě chybějících údajů zprávy nastavte hodnotu na 0 (není spam) a uveďte důvod.\nVygeneruj odpověď pouze ve formátu JSON. Neuváděj žádný další text nebo vysvětlení; uveď pouze JSON. Zde je formát, který se má použít:\n{\n\"explanation\": \"Stručné vysvětlení vašeho zdůvodnění\",\n\"spamValue\": <celé číslo od 0 do 100>\n}\nZde jsou informace o e-mailu:\nOdesílatel: \"{%author%}\"\nPředmět: \"{%mail_subject%}\"\nText HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Přidat štítky"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analýza spamu"
|
||||
},
|
||||
"get_calendar_event_prompt_prefs_title": {
|
||||
"message": "Možnosti události kalendáře"
|
||||
},
|
||||
|
|
@ -1010,7 +992,7 @@
|
|||
"message": "Chyba při pokusu o načtení modelů Claude"
|
||||
},
|
||||
"prefs_OptionText_anthropic_max_tokens": {
|
||||
"message": "Maximální počet tokenů Claude"
|
||||
"message": "Maximální počet tokenů"
|
||||
},
|
||||
"prefs_OptionText_anthropic_max_tokens_Info": {
|
||||
"message": "Maximální počet tokenů, které se mají vygenerovat v dokončení. Počet tokenů vaší výzvy plus max_tokens nesmí překročit délku kontextu modelu."
|
||||
|
|
@ -1055,7 +1037,7 @@
|
|||
"message": "Pokud vyberete nějaký text, bude zohledněna pouze tato část."
|
||||
},
|
||||
"_api_connecting_host": {
|
||||
"message": "API Server",
|
||||
"message": "Host",
|
||||
"placeholders": {
|
||||
"api_host": {
|
||||
"content": "$1"
|
||||
|
|
@ -1084,7 +1066,7 @@
|
|||
"message": "Počet kontextových tokenů, které se mají použít pro API Ollama. Nastavte na 0, pokud jej nechcete předávat jako parametr serveru."
|
||||
},
|
||||
"AccountSelector_Spamfilter": {
|
||||
"message": "Vyberte účty, na kterých je povolen filtr spamu"
|
||||
"message": "Vyberte účty, na kterých je povolen automatický filtr spamu"
|
||||
},
|
||||
"CORS_alternative_1": {
|
||||
"message": "Problémy s nastavením CORS?"
|
||||
|
|
@ -1124,5 +1106,690 @@
|
|||
},
|
||||
"prefs_OptionText_get_calendar_event_Sparks_wrong_version": {
|
||||
"message": "Pro používání funkcí událostí v kalendáři a úloh, nainstalujte aktualizovanou verzi doplňku ThunderAI Sparks."
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Odpovědět pomocí příkazu..."
|
||||
},
|
||||
"prompt_string": {
|
||||
"message": "Prompt (příkaz)"
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Zobrazit v"
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Pouze ve vyskakovacím okně"
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Pouze v kontextové nabídce"
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Obojí"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Uložit jako shrnutí"
|
||||
},
|
||||
"prefs_OptionText_reply_type_Info": {
|
||||
"message": "Toto je výchozí typ odpovědi, který se použije při odpovídání na e-mail. Jiný typ můžete zvolit později v dialogu odpovědi."
|
||||
},
|
||||
"prefs_OptionText_btnManageCustomDataPH": {
|
||||
"message": "Spravovat zástupné symboly dat"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Úložiště"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "Úložiště slouží k ukládání informací o spamovém skóre, shrnutích a překladech každé zprávy."
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Velikost úložiště"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Vymazat úložiště"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Opravdu chcete vymazat všechna uložená data (shrnutí, hlášení o spamu, překlady)? Tuto akci nelze vzít zpět."
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "Chcete-li používat Google Gemini API, potřebujete API klíč Google Gemini a musíte vybrat model."
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "Chcete-li používat Claude API, potřebujete API klíč Anthropic Claude a musíte vybrat model."
|
||||
},
|
||||
"placeholder_mail_headers": {
|
||||
"message": "Hlavičky e-mailu"
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Všechny hlavičky e-mailu"
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Tělo e-mailu nebo vybraný text"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Tělo e-mailu nebo vybrané HTML"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Doba čekání na načtení stránky"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Doba v milisekundách, po kterou se má čekat na načtení stránky ChatGPT před načtením dalšího obsahu. Výchozí hodnota je 1000 ms. Pokud je definováno vlastní GPT nebo projekt, k této hodnotě se přidá dalších 1000 ms."
|
||||
},
|
||||
"prompt_reply_custom_command_full_text": {
|
||||
"message": "Odpověz na následující e-mail „{%mail_text_body%}“. {%additional_text%}. Odpověz pouze potřebným textem, bez dalších komentářů nebo jiného textu."
|
||||
},
|
||||
"reset": {
|
||||
"message": "Resetovat"
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Dokumentace"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Průvodci nastavením"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Návod na vlastní prompty"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Otevřít uvítací stránku"
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Přidat událost do kalendáře ze schránky"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Nepodařilo se přečíst schránku. Zkontrolujte prosím oprávnění."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Schránka je prázdná. Nejdříve prosím zkopírujte nějaký text."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Oprávnění ke schránce bylo zamítnuto. Povolte prosím tuto funkci znovu v nastavení pro udělení oprávnění."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Chyba při žádosti o oprávnění ke schránce. Zkuste to prosím znovu."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Získat událost kalendáře ze schránky"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Zobrazit další položku menu pro vytváření událostí kalendáře z obsahu schránky."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Možnosti shrnutí"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Shrnout"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Šablona pro shrnutí e-mailu"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "Oddělovač e-mailů"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Prompt můžete libovolně měnit; první pole je hlavní prompt, druhé pole je šablona pro jednotlivý e-mail. Seznam e-mailů bude připojen k hlavnímu promptu. E-maily budou odděleny oddělovačem uvedeným ve třetím poli."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "Hlavní prompt popisující úkol, který se má provést u všech vybraných e-mailů:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "Šablona pro jeden e-mail:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "Oddělovač mezi e-maily:"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_uselist": {
|
||||
"message": "Použít pouze tyto štítky"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_uselist_Info": {
|
||||
"message": "Pokud je zaškrtnuto, AI bude přidávat pouze štítky ze seznamu níže."
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_uselist_list_Info": {
|
||||
"message": "Seznam musí obsahovat alespoň jeden štítek. Přidejte jeden štítek na řádek nebo je oddělte čárkou."
|
||||
},
|
||||
"prompt_add_tags_use_list": {
|
||||
"message": "Použít pouze štítky v tomto seznamu odděleném čárkami"
|
||||
},
|
||||
"prefs_OptionText_add_tags_use_specific_integration_Info": {
|
||||
"message": "Pokud je zaškrtnuto, pro přidávání štítků k e-mailům se použije model a API uvedené níže, bez ohledu na to, co je vybráno na stránce možností ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Pokud je zaškrtnuto, pro vytváření událostí v kalendáři se použije model a API uvedené níže, bez ohledu na to, co je vybráno na stránce možností ThunderAI."
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "Jazyk, který se má používat při překladu e-mailů."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Kódy jazyků, které se nemají překládat, pokud jsou detekovány."
|
||||
},
|
||||
"placeholder_mail_attachments_info": {
|
||||
"message": "Informace o přílohách v e-mailu"
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Shrnout e-mail"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Pokud je zaškrtnuto, pro shrnutí e-mailu (e-mailů) se použije model a API uvedené níže, bez ohledu na to, co je vybráno na stránce možností ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Pokud je zaškrtnuto, přidá do kontextové nabídky možnost shrnout e-mail(y)."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Spravovat nastavení shrnutí"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Spravovat nastavení shrnutí"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "Na této stránce můžete upravit výchozí prompt používaný pro shrnutí e-mailů."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Aktuální text promptu"
|
||||
},
|
||||
"prefs_OptionText_use_specific_integration": {
|
||||
"message": "Použít konkrétní model a API"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_use_specific_integration_Info": {
|
||||
"message": "Pokud je zaškrtnuto, pro spamový filtr se použije model a API uvedené níže, bez ohledu na to, co je vybráno na stránce možností ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Zobrazit panel hlášení o spamu"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Pokud je zaškrtnuto, nad zprávou se zobrazí panel s hlášením o spamu."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Seznam ignorovaných e-mailových adres"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "E-maily z těchto adres nebudou odesílány umělé inteligenci k filtraci spamu."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Přidejte jednu e-mailovou adresu na řádek nebo je oddělte čárkou."
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "Odesílatel je na seznamu ignorovaných adres pro antispam."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Ignorovat adresy z adresářů"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Pokud je zaškrtnuto, e-maily od odesílatelů ve vašich adresářích nebudou odesílány umělé inteligenci k filtraci spamu."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "Odesílatel je kontaktem v adresáři."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Oprávnění k adresáři bylo zamítnuto. Povolte prosím tuto funkci znovu pro udělení oprávnění."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Chyba při žádosti o oprávnění k adresáři. Zkuste to prosím znovu."
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Spam"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "V pořádku"
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Hotovo!"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Stiskněte tlačítko níže a udělte oprávnění aktuálnímu hostiteli, abyste se vyhnuli problémům s CORS."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Udělit oprávnění aktuálnímu hostiteli"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Pokud používáte localhost nebo 127.0.0.1, protože AI server běží na vašem PC, je vyžadováno oprávnění <all_urls>."
|
||||
},
|
||||
"ask_openai_api_permission_1": {
|
||||
"message": "Chcete-li používat integraci OpenAI API, musíte udělit vyžadované oprávnění."
|
||||
},
|
||||
"ChatGPT_chatgpt_api_store": {
|
||||
"message": "Používat úložiště"
|
||||
},
|
||||
"ChatGPT_chatgpt_api_store_info": {
|
||||
"message": "Pokud je zaškrtnuto, vaše chaty budou ukládány společností OpenAI."
|
||||
},
|
||||
"prefs_chatgpt_api_temperature_Info": {
|
||||
"message": "Jakou vzorkovací teplotu použít (mezi 0 a 2). Vyšší hodnoty jako 0,8 učiní výstup náhodnějším, zatímco nižší hodnoty jako 0,2 jej učiní soustředěnějším a determinističtějším."
|
||||
},
|
||||
"prefs_ollama_temperature_Info": {
|
||||
"message": "Teplota modelu. Zvýšení teploty způsobí, že model bude odpovídat kreativněji. Výchozí hodnota je 0,8. Doporučuje se používat hodnoty mezi 0 a 1."
|
||||
},
|
||||
"prefs_ollama_think": {
|
||||
"message": "Povolit přemýšlení (thinking)"
|
||||
},
|
||||
"prefs_ollama_think_Info": {
|
||||
"message": "Pokud je zaškrtnuto, model bude před odpovědí „přemýšlet“. Tato možnost funguje pouze u modelů, které podporují funkci „think“."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Vynutit výstup v JSON"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Pokud je zaškrtnuto, Ollama bude nucena vrátit platnou odpověď ve formátu JSON. Tato možnost funguje pouze u modelů, které podporují strukturovaný výstup."
|
||||
},
|
||||
"chatgpt_win_change_reply_type": {
|
||||
"message": "Kliknutím změníte typ odpovědi"
|
||||
},
|
||||
"prefs_OptionText_add_tags_exclusions_exact_match": {
|
||||
"message": "Přesná shoda vyloučení"
|
||||
},
|
||||
"prefs_OptionText_add_tags_exclusions_exact_match_Info": {
|
||||
"message": "Pokud je zaškrtnuto, slova v seznamu vyloučení musí přesně odpovídat štítkům. V opačném případě dojde ke shodě, i když je slovo součástí štítku."
|
||||
},
|
||||
"customDataPH_manageDataPH": {
|
||||
"message": "Spravovat zástupné symboly dat"
|
||||
},
|
||||
"customDataPH_manageDataPH_info_default_3": {
|
||||
"message": "Můžete také používat výchozí zástupné symboly dat s automatickým doplňováním, stejně jako při psaní vlastních promptů."
|
||||
},
|
||||
"customDataPH_manageDataPH_info_default": {
|
||||
"message": "Na této stránce je možné definovat vlastní zástupné symboly dat pro použití ve vašich vlastních promptech."
|
||||
},
|
||||
"customDataPH_manageDataPH_info_default_2": {
|
||||
"message": "Existující zástupné symboly se stejným ID budou přepsány. Zástupné symboly s novými ID budou přidány."
|
||||
},
|
||||
"customDataPH_ExportAll": {
|
||||
"message": "Exportovat všechny vlastní zástupné symboly dat"
|
||||
},
|
||||
"customDataPH_Import": {
|
||||
"message": "Importovat nové zástupné symboly dat"
|
||||
},
|
||||
"customDataPH_form_label_Text": {
|
||||
"message": "Text zástupného symbolu dat"
|
||||
},
|
||||
"customDataPH_saving_custom": {
|
||||
"message": "Ukládání vlastních zástupných symbolů dat..."
|
||||
},
|
||||
"customDataPH_saved": {
|
||||
"message": "Vlastní zástupné symboly dat byly uloženy!"
|
||||
},
|
||||
"customDataPH_btnAddNewCommit": {
|
||||
"message": "Přidat zástupný symbol dat"
|
||||
},
|
||||
"importCustomDataPH_confirmText": {
|
||||
"message": "Chystáte se importovat nové vlastní zástupné symboly dat."
|
||||
},
|
||||
"importCustomDataPH_start_import": {
|
||||
"message": "Zahajování importu vlastních zástupných symbolů dat..."
|
||||
},
|
||||
"importCustomDataPH_import_completed": {
|
||||
"message": "Import vlastních zástupných symbolů dat byl dokončen! Pro uložení změn musíte kliknout na tlačítko „Uložit vše“."
|
||||
},
|
||||
"importCustomDataPH_invalidFile": {
|
||||
"message": "Soubor, který se pokoušíte importovat, není platným souborem vlastních zástupných symbolů dat."
|
||||
},
|
||||
"importCustomDataPH_invalidDataPHs": {
|
||||
"message": "Soubor, který se pokoušíte importovat, neobsahuje žádné platné vlastní zástupné symboly dat."
|
||||
},
|
||||
"customDataPH_add_to_menu": {
|
||||
"message": "Použitelné v promptech přidaných do nabídky"
|
||||
},
|
||||
"prefs_OpenAIComp_ClearModelsList": {
|
||||
"message": "Vymazat seznam modelů"
|
||||
},
|
||||
"OpenAIComp_ClearModelsList_Confirm": {
|
||||
"message": "Opravdu chcete vymazat seznam modelů? Tuto akci nelze vzít zpět."
|
||||
},
|
||||
"prefs_api_temperature": {
|
||||
"message": "Teplota (Temperature)"
|
||||
},
|
||||
"prefs_openai_comp_temperature_Info": {
|
||||
"message": "Jakou vzorkovací teplotu použít (mezi 0 a 2). Vyšší hodnoty jako 0,8 učiní výstup náhodnějším, zatímco nižší hodnoty jako 0,2 jej učiní soustředěnějším a determinističtějším."
|
||||
},
|
||||
"chatgpt_click_force_completion": {
|
||||
"message": "Zdá se, že nelze zjistit, zda ChatGPT skončil. Kliknutím sem vynutíte dokončení úlohy."
|
||||
},
|
||||
"warn_API_needed": {
|
||||
"message": "Chcete-li používat tuto funkci, potřebujete integraci API namísto webové integrace ChatGPT. Konkrétní API můžete definovat na stránce nastavení funkce tak, že nejprve zaškrtnete políčko výše a poté kliknete na tlačítko vlevo."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Používá se $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_google_gemini_thinking_budget": {
|
||||
"message": "Rozpočet pro přemýšlení (Thinking Budget)"
|
||||
},
|
||||
"prefs_google_gemini_thinking_budget_Info": {
|
||||
"message": "Definujte počet tokenů, které se mají použít pro přemýšlení. Pokud vybraný model přemýšlení nepodporuje nebo chcete použít výchozí metodu, ponechte toto pole prázdné. Zadáním 0 přemýšlení zakážete, zadáním -1 povolíte dynamické přemýšlení."
|
||||
},
|
||||
"prefs_google_gemini_temperature_Info": {
|
||||
"message": "Tento parametr musí být číslo mezi 0.0 a 2.0. Ovládá náhodnost výstupu. Výchozí hodnota se liší podle modelu. Ponechte prázdné, pokud parametr v volání API nastavovat nechcete."
|
||||
},
|
||||
"SelectAll": {
|
||||
"message": "Vybrat vše"
|
||||
},
|
||||
"DeselectAll": {
|
||||
"message": "Zrušit výběr všeho"
|
||||
},
|
||||
"Anthropic_System_Prompt": {
|
||||
"message": "Systémový prompt"
|
||||
},
|
||||
"Anthropic_System_Prompt_Info": {
|
||||
"message": "Výkon modelu Claude můžete vylepšit použitím systémového promptu k přidělení role. Tato technika, známá jako „role prompting“, je nejúčinnějším způsobem použití systémových promptů u modelu Claude. Správná role může změnit Clauda z obecného asistenta na vašeho virtuálního odborníka v dané oblasti."
|
||||
},
|
||||
"prefs_anthropic_temperature_Info": {
|
||||
"message": "Míra náhodnosti vkládaná do odpovědi. Výchozí hodnota je 1,0. Rozsah od 0,0 do 1,0. Teplotu blízkou 0,0 použijte pro analytické úkoly nebo výběr z více možností, teplotu blízkou 1,0 pro kreativní a generativní úkoly. Upozorňujeme, že i při teplotě 0,0 nebudou výsledky plně deterministické."
|
||||
},
|
||||
"Optional_Permission_Denied_Model_Fetching": {
|
||||
"message": "Odmítli jste volitelné oprávnění potřebné pro načtení modelů pro tuto integraci."
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Povolit automatické shrnutí pomocí AI pro náhledy zpráv"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Pokud je zaškrtnuto, ThunderAI po otevření e-mailu automaticky vygeneruje a zobrazí shrnutí pomocí AI. Upozorňujeme, že to znamená okamžité odeslání všech zpráv, které si prohlížíte, nakonfigurované AI službě."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "ThunderAI Shrnutí"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Generování shrnutí pomocí AI..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "Nepodařilo se vygenerovat shrnutí pomocí AI. Zkontrolujte prosím nastavení a zkuste to znovu."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Chcete do exportu zahrnout i nastavení API? Uvědomte si, že do souboru bude uložen i váš API klíč!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Nepožadovat výběr textu"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Pokud je zaškrtnuto, není nutné vybírat text. Pro získání události kalendáře se použije celé tělo zprávy."
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "Aby bylo možné tuto možnost povolit, musí prompt obsahovat zástupný symbol {%mail_text_body_or_selected%} nebo {%mail_html_body_or_selected%}. Přidejte prosím jeden z těchto symbolů do promptu nebo jej resetujte na výchozí hodnotu."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Kopírovat"
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "kopírovat"
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Probíhá kontrola spamu..."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Automaticky shrnovat zprávy"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Zvolte, zda se mají při prohlížení zpráv automaticky generovat shrnutí. Vyžaduje připojení přes API (nikoli ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Zobrazit shrnutí v"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Zvolte, kde se zobrazí výsledek shrnutí. Režim „Inline“ zobrazí lištu se shrnutím přímo v panelu zprávy. Režim „Chat window“ otevře okno AI chatu."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Maximální délka zobrazení"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Maximální počet znaků zobrazených ve shrnutí v těle zprávy. Nastavte 0 pro neomezenou délku."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Odstranit formátování"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Odstraní formátování HTML a Markdown ze shrnutí vygenerovaného AI a zobrazí pouze prostý text."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Zobrazit více"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Zobrazit méně"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "ThunderAI Přehled"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "AI Shrnutí"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Sbalit shrnutí"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Generování shrnutí..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Shrnutí se nepodařilo vygenerovat"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Klikněte zde pro vygenerování shrnutí"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Automatické shrnutí vyžaduje připojení přes API. Nakonfigurujte prosím API připojení v nastavení ThunderAI."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Obnovit shrnutí"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Obnovit hlášení o spamu"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Smazat hlášení o spamu"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Smazat shrnutí"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Přeložit e-mail"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Pokud je zaškrtnuto, pro překlad e-mailů se použije model a API uvedené níže, bez ohledu na to, co je vybráno na stránce možností ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Pokud je zaškrtnuto, přidá do těla zprávy tlačítko pro překlad."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Spravovat nastavení překladu"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Spravovat nastavení překladu"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "Na této stránce můžete upravit výchozí prompt používaný pro překlad e-mailů."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Aktuální text promptu"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Možnosti překladu"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Automaticky překládat zprávy"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Vypnuto"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Pouze manuální tlačítko"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "Při otevření e-mailu"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Vyberte, kdy se mají zprávy překládat: vypnuto, pouze po kliknutí na tlačítko, nebo automaticky při otevření zprávy."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Panel zprávy (vloženě)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Okno chatu"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Maximální délka zobrazeného překladu"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Maximální počet znaků zobrazených ve vloženém překladu. 0 = bez omezení. Při nastavení limitu bude delší text zkrácen s přepínačem „Zobrazit více“."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Zobrazit více"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Zobrazit méně"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Cílový jazyk překladu"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Jazyk, do kterého se mají e-maily překládat. Pokud je prázdné, použije se výchozí nastavení jazyka."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Vyloučit jazyky"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Čárkami oddělený seznam kódů jazyků (např. en, fr, it), které se mají při automatickém překladu přeskočit. Pokud je e-mail v jednom z těchto jazyků, nebude přeložen automaticky nebo se nezobrazí tlačítko pro manuální překlad."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "Prompt popisující úkol překladu:"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Překládání..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Klikněte zde pro překlad tohoto e-mailu"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "AI Překlad"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "Automatický překlad vyžaduje připojení přes API. Nakonfigurujte prosím API připojení v nastavení ThunderAI."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Obnovit překlad"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Smazat překlad"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "AI Překlad"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Překlad se nezdařil."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "Jazyk překladu není nakonfigurován. Nastavte prosím jazyk v nastavení překladu nebo nastavte výchozí jazyk v obecném nastavení."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Překlad přeskočen: Jazyk je vyloučen nebo je shodný s cílovým jazykem."
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam od"
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Spamové skóre — kliknutím zobrazíte vysvětlení"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Shrnutí od"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Překlad od"
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Chcete přehledné statistiky o svých e-mailech?"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Klikněte zde! Vyzkoušejte ThunderStats!"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "Pozice okna AI chatu"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Nahoře"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Vlevo"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Automaticky uložit pozici okna při použití tlačítka zavřít."
|
||||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Ponechte prázdné pro použití výchozí pozice."
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "Při přijetí e-mailu"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Zástupný symbol"
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Pořadí v nabídce"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Vyskakovací nabídka"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Kontextová nabídka"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Pořadí v nabídce uloženo!"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Čtení"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Psaní"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Výchozí"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Speciální"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Vlastní"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Čtení"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Psaní"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Vždy"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Spravovat nastavení pořadí nabídek"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Položky seřaďte přetažením. Pomocí přepínače u každé položky ji zobrazíte nebo skryjete v dané nabídce."
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Viditelné položky"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Skryté položky"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Vyberte ikonu"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(žádná)"
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "Smazáno $COUNT$ záznamů.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Vypracuj stručné shrnutí následujících e-mailů. Shrnutí musí mít maximálně 3 až 5 vět a vystihovat hlavní body. Piš v souvislých odstavcích bez odrážek, seznamů nebo markdown formátování:\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "Od: {%author%}\nKomu: {%recipients%}\nKopie: {%cc_list%}\nPředmět: {%mail_subject%}\nDatum: {%mail_datetime%}\nPřílohy:\n{%mail_attachments_info%}\n\nTělo zprávy:\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- DALŠÍ EMAIL ----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_br_replace_info": {
|
||||
"message": "Vezměte prosím na vědomí, že veškeré značky <br> v odpovědi AI budou nahrazeny zalomením řádku."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Klassifizieren"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Zusammenfassen"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Übersetzen"
|
||||
},
|
||||
|
|
@ -411,12 +408,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Wenn diese Option aktiviert ist, wird die Tastenkombination STRG+ALT+A den hervorgehobenen Prompt aus dem Menü automatisch senden. Andernfalls wird der Prompt-Name dem Benutzer angezeigt, und es ist ein weiterer Druck auf die Eingabetaste erforderlich, um ihn zu senden."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menü: Alphabetisch sortieren"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Wenn diese Option aktiviert ist, werden die Prompts im Menü alphabetisch sortiert."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Auf 0 setzen, wenn Sie die Fenstergröße nicht angeben möchten."
|
||||
},
|
||||
|
|
@ -525,11 +516,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Klassifizieren Sie den folgenden Text nach Höflichkeit, Wärme, Formalität, Bestimmtheit und Anstößigkeit und geben Sie einen Prozentsatz für jede Kategorie an. Antworten Sie nur mit der Kategorie und der Punktzahl ohne zusätzliche Kommentare oder andere Texte."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Fassen Sie die folgende E-Mail in einer Liste mit Aufzählungspunkten zusammen."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Übersetzen Sie die folgende E-Mail in"
|
||||
"message": "Übersetzen Sie die unten stehende E-Mail in die Sprache {%thunderai_translate_lang%}.\n\nRegeln:\n- Übersetzen Sie sowohl den Betreff als auch den Textkörper.\n- Geben Sie das Ergebnis als JSON-Objekt mit drei Feldern zurück: \"subject\", \"body\" und \"status\".\n- Wenn die Übersetzung erstellt wurde, ist der Status gleich 1.\n- Wenn die E-Mail in einer dieser Sprachen \"{%thunderai_translate_exclude_lang%}\" oder in der Sprache {%thunderai_translate_lang%} verfasst ist, geben Sie eine leere Zeichenfolge für den Textkörper und den Betreff zurück und setzen Sie den Status auf -1.\n- Fügen Sie keine Erklärungen, Notizen oder Texte außerhalb des JSON-Objekts hinzu.\n\nE-Mail-Betreff: {%mail_subject%}\n\nE-Mail-Textkörper: {%mail_html_body%}\n\nGenerieren Sie die Antwort ausschließlich im JSON-Format. Die Ausgabe darf nur ein JSON-Objekt sein. Hier ist ein Beispiel für das zu verwendende JSON-Format:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Antworten Sie nur mit dem benötigten Text und ohne zusätzliche Kommentare oder andere Texte."
|
||||
|
|
@ -541,7 +529,7 @@
|
|||
"message": "Wenn aktiviert, wird ein Element im Menü hinzugefügt, um Tags auf E-Mails anzuwenden."
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Tags zu dieser E-Mail hinzufügen"
|
||||
"message": "Tags hinzufügen"
|
||||
},
|
||||
"prompt_add_tags_full_text": {
|
||||
"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}"
|
||||
|
|
@ -766,7 +754,7 @@
|
|||
"message": "Aktueller Aufforderungstext"
|
||||
},
|
||||
"prompt_spamfilter": {
|
||||
"message": "Spam-E-Mails erkennen"
|
||||
"message": "Auf Spam prüfen"
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Spam-Filter-Optionen"
|
||||
|
|
@ -820,7 +808,7 @@
|
|||
"message": "Vorhandene Tags erzwingen"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "Es wurden noch keine Nachrichten auf Spam überprüft. Hier finden Sie eine Liste der letzten 100 Spam-Berichte nur für die aktuelle Sitzung."
|
||||
"message": "Es wurden noch keine Nachrichten auf Spam geprüft. Hier finden Sie eine Liste der letzten 100 Spam-Berichte."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_Info": {
|
||||
"message": "Wenn ausgewählt, wird ThunderAI Spam-E-Mails automatisch in den Spam-Ordner verschieben."
|
||||
|
|
@ -834,12 +822,6 @@
|
|||
"prefs_OptionText_calendar_enforce_timezone": {
|
||||
"message": "Erzwinge die angegebene Zeitzone"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Tags hinzufügen"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Auf Spam analysieren"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Kein bearbeitbarer Kalender gefunden!"
|
||||
},
|
||||
|
|
@ -997,7 +979,7 @@
|
|||
"message": "Jede Änderung wird sofort gespeichert."
|
||||
},
|
||||
"AccountSelector_Spamfilter": {
|
||||
"message": "Wähle die Konten aus, bei denen der Spamfilter aktiviert ist"
|
||||
"message": "Wähle die Konten aus, bei denen der automatische Spamfilter aktiviert ist"
|
||||
},
|
||||
"prompt_proofread_this": {
|
||||
"message": "Korrigiere diese E-Mail"
|
||||
|
|
@ -1334,10 +1316,10 @@
|
|||
"message": "Zusammenfassungseinstellungen"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Diese E-Mail o. E-Mails zusammenfassen"
|
||||
"message": "Zusammenfassen"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Du bist ein Assistent, der E-Mail-Konversationen zusammenfasst.\n\nErstelle aus einem E-Mail-Verlauf eine prägnante und präzise Zusammenfassung, die Folgendes enthält:\n\n- Das Hauptthema oder den Zweck der Konversation\n- Wichtige Entscheidungen, Schlussfolgerungen oder Vereinbarungen\n- Wichtige Fragen, Anfragen oder Aufgaben (Action Items)\n- Die verantwortliche Person für jede Aufgabe (falls angegeben)\n\nLasse Begrüßungen, Signaturen, zitierten Text und redundantes Hin- und Her weg.\nFüge keine Annahmen oder Informationen hinzu, die nicht in den E-Mails enthalten sind.\n\nVerfasse die Zusammenfassung in einer klaren, neutralen Sprache, die für vielbeschäftigte Fachkräfte geeignet ist."
|
||||
"message": "Geben Sie eine prägnante Zusammenfassung der folgenden E-Mail-Nachricht(en) an. Die Zusammenfassung sollte maximal 3 bis 5 Sätze umfassen und die wesentlichen Punkte enthalten. Schreiben Sie in einfachen Absätzen ohne Aufzählungszeichen, Listen oder Markdown-Formatierung.\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Vorlage für E-Mail-Zusammenfassung"
|
||||
|
|
@ -1399,9 +1381,6 @@
|
|||
"Valid": {
|
||||
"message": "Zulässig"
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "Zusammenfassen"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Klicken Sie auf die untenstehende Schaltfläche, um dem aktuellen Host die Berechtigung zu erteilen und CORS-Probleme zu vermeiden."
|
||||
},
|
||||
|
|
@ -1467,5 +1446,369 @@
|
|||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Leer lassen, um die Standardposition zu verwenden."
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Anzeigen in"
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Nur Popup"
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Nur Kontextmenü"
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Beide"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Als Zusammenfassung speichern"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Speicher"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "Der Speicher wird verwendet, um Informationen über Spam-Scores, Zusammenfassungen und Übersetzungen jeder Nachricht zu speichern."
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Speichergröße"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Speicher leeren"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Sind Sie sicher, dass Sie alle gespeicherten Daten (Zusammenfassungen, Spam-Berichte, Übersetzungen) löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden."
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "$COUNT$ Datensätze entfernt.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "Um die Google Gemini API zu nutzen, benötigen Sie einen Google Gemini API-Key und müssen ein Modell auswählen."
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "Um die Claude API zu nutzen, benötigen Sie einen Anthropic Claude API-Key und müssen ein Modell auswählen."
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Alle E-Mail-Header"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking": {
|
||||
"message": "Denk-Block standardmäßig einklappen"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking_info": {
|
||||
"message": "Steuert den Anfangszustand des Denk-Blocks, der über der Antwort angezeigt wird. Wenn aktiviert, ist der Block standardmäßig eingeklappt und kann per Klick geöffnet werden. Wenn deaktiviert, ist der Block standardmäßig geöffnet und kann per Klick eingeklappt werden. Der Inhalt des Denk-Prozesses bleibt dabei stets erhalten."
|
||||
},
|
||||
"prefs_OptionText_thinking_summary": {
|
||||
"message": "Denkt nach"
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "Die Sprache, die für E-Mail-Übersetzungen verwendet werden soll."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Sprachcodes, die nicht übersetzt werden sollen."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Ausschlussliste für E-Mail-Adressen"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "E-Mails von diesen Adressen werden nicht zur Spam-Filterung an die KI gesendet."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Geben Sie eine E-Mail-Adresse pro Zeile ein oder trennen Sie diese durch Kommas."
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "Der Absender befindet sich auf der Antispam-Ausschlussliste."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Adressbuch-Kontakte überspringen"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Wenn aktiviert, werden E-Mails von Absendern in Ihren Adressbüchern nicht zur Spam-Prüfung an die KI gesendet."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "Der Absender ist ein Kontakt im Adressbuch."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Der Zugriff auf das Adressbuch wurde verweigert. Bitte aktivieren Sie die Funktion erneut, um die Berechtigung zu erteilen."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Fehler beim Anfordern der Adressbuch-Berechtigung. Bitte versuchen Sie es erneut."
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Fertig!"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget": {
|
||||
"message": "Budget für erweitertes Denken (Tokens)"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget_Info": {
|
||||
"message": "Maximale Anzahl an Tokens, die das Modell für erweitertes Denken (Extended Thinking) verwenden darf. Auf 0 setzen, um das erweiterte Denken zu deaktivieren. Wenn diese Funktion aktiviert ist, wird der Temperature-Wert von der Claude-API ignoriert."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "JSON-Ausgabe erzwingen"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Wenn aktiviert, wird Ollama gezwungen, eine gültige JSON-Antwort zurückzugeben (nur für unterstützte Modelle)."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Verwendet $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Automatische KI-Zusammenfassung für Nachrichtenvorschauen aktivieren"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Falls aktiviert, erstellt und zeigt ThunderAI automatisch KI-Zusammenfassungen oberhalb von E-Mails an, sobald diese geöffnet werden. Beachten Sie, dass hierbei alle von Ihnen aufgerufenen Nachrichten sofort an den konfigurierten KI-Dienst gesendet werden."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "ThunderAI Zusammenfassung"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "KI-Zusammenfassung wird generiert..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "KI-Zusammenfassung konnte nicht generiert werden. Bitte Einstellungen prüfen."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Nachrichten automatisch zusammenfassen"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Wählen Sie aus, ob beim Anzeigen von Nachrichten automatisch Zusammenfassungen erstellt werden sollen. Erfordert eine API-basierte Verbindung (kein ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Zusammenfassung anzeigen in"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Wählen Sie aus, wo das Ergebnis der Zusammenfassung angezeigt werden soll. Der Inline-Modus zeigt ein Zusammenfassungs-Banner direkt im Nachrichtenbereich an. Der Chat-Fenster-Modus öffnet das KI-Chat-Fenster."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Maximale Anzeigelänge"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Maximale Anzahl der Zeichen in der Inline-Zusammenfassung. 0 für kein Limit."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Formatierung entfernen"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Entfernt HTML und Markdown aus der Zusammenfassung, um nur reinen Text anzuzeigen."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Mehr sehen"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Weniger sehen"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "ThunderAI Überblick"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "KI-Zusammenfassung"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Zusammenfassung einklappen"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Zusammenfassung wird generiert..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Zusammenfassung konnte nicht erstellt werden"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Klicken Sie hier, um eine Zusammenfassung zu erstellen"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Die automatische Zusammenfassung erfordert eine API-basierte Verbindung. Bitte konfigurieren Sie eine API-Verbindung in den ThunderAI-Einstellungen."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Zusammenfassung aktualisieren"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Spam-Bericht aktualisieren"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Spam-Bericht löschen"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Zusammenfassung löschen"
|
||||
},
|
||||
"generic_error_dismiss": {
|
||||
"message": "Verwerfen"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "E-Mail übersetzen"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Wenn aktiviert, werden das unten angegebene Modell und die API für Übersetzungen verwendet."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Wenn aktiviert, wird eine Schaltfläche zum Übersetzen im Nachrichtentext hinzugefügt."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Übersetzungseinstellungen verwalten"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Übersetzungseinstellungen verwalten"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "Auf dieser Seite können Sie den Standard-Prompt für Übersetzungen bearbeiten."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Aktueller Prompt-Text"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Übersetzungsoptionen"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Nachrichten automatisch übersetzen"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Deaktiviert"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Nur manuelle Schaltfläche"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "Wenn die E-Mail geöffnet wird"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Wählen Sie aus, wann Nachrichten übersetzt werden sollen: deaktiviert, nur beim Klicken auf die Schaltfläche oder automatisch beim Öffnen einer Nachricht."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Nachrichtenbereich (inline)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Chat-Fenster"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Maximale Länge der Anzeige"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Maximale Anzahl der Zeichen, die in der Inline-Übersetzung angezeigt werden. 0 = kein Limit. Wenn festgelegt, wird längerer Text gekürzt und mit einer „Mehr anzeigen“-Schaltfläche versehen."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Mehr sehen"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Weniger sehen"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Zielsprache für Übersetzungen"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Sprache, in die E-Mails übersetzt werden sollen. Wenn das Feld leer ist, wird die Standardspracheinstellung verwendet."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Sprachen ausschließen"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Kommagetrennte Liste von Sprachkürzeln (z. B. en, fr, it), die von der automatischen Übersetzung ausgeschlossen werden sollen. Falls eine E-Mail in einer dieser Sprachen verfasst ist, wird sie nicht automatisch übersetzt bzw. die Schaltfläche für die manuelle Übersetzung wird nicht angezeigt."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "Der Prompt für die Übersetzungsaufgabe:"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Wird übersetzt..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Hier klicken, um diese E-Mail zu übersetzen"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "KI-Übersetzung"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "Die automatische Übersetzung erfordert eine API-basierte Verbindung. Bitte konfigurieren Sie eine API-Verbindung in den ThunderAI-Einstellungen."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Übersetzung aktualisieren"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Übersetzung löschen"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "KI-Übersetzung"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Übersetzung fehlgeschlagen."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "Die Übersetzungssprache ist nicht konfiguriert. Bitte legen Sie eine Sprache in den Übersetzungseinstellungen fest oder definieren Sie eine Standardsprache in den allgemeinen Einstellungen."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Übersetzung übersprungen: Sprache ausgeschlossen oder identisch."
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Spam-Score — Klicken für Details"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Zusammenfassung von"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Übersetzung von"
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "Wenn die E-Mail empfangen wird"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Platzhalter"
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Menü-Reihenfolge"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Popup-Menü"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Kontextmenü"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Menü-Reihenfolge gespeichert!"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Lesen"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Verfassen"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Standard"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Spezial"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Benutzerdefiniert"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Lesen"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Verfassen"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Immer"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Menü-Reihenfolge verwalten"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Elemente per Drag-and-Drop neu anordnen oder über den Umschalter ein-/ausblenden."
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Sichtbare Elemente"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Versteckte Elemente"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Icon wählen"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(keines)"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,11 +26,8 @@
|
|||
"prompt_classify": {
|
||||
"message": "Ταξινόμησε"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Συνόψισε"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Μετάφρασε το"
|
||||
"message": "Μετάφρασε"
|
||||
},
|
||||
"prompt_this": {
|
||||
"message": "Μήνυμα για"
|
||||
|
|
@ -422,12 +419,6 @@
|
|||
"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 εάν δεν θέλετε να καθορίσετε το μέγεθος του παραθύρου."
|
||||
},
|
||||
|
|
@ -714,7 +705,7 @@
|
|||
"message": "Τρέχον κείμενο προτροπής"
|
||||
},
|
||||
"prompt_spamfilter": {
|
||||
"message": "Εντοπισμός ανεπιθύμητων μηνυμάτων ηλεκτρονικού ταχυδρομείου"
|
||||
"message": "Ανάλυση για ανεπιθύμητα μηνύματα"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Αναλύστε το ακόλουθο email και προσδιορίστε εάν είναι spam ή όχι. Λάβετε υπόψη παράγοντες όπως ύποπτες λέξεις-κλειδιά, υπερβολική διαφημιστική γλώσσα, παραπλανητικές γραμμές θέματος, αιτήματα για προσωπικά στοιχεία και ασυνήθιστες διευθύνσεις αποστολέα.\nΔώστε μια τιμή από 0 (όχι spam) έως 100 (spam) και μια εξήγηση που δεν υπερβαίνει τις 10 λέξεις.\nΣε περίπτωση που λείπουν δεδομένα μηνύματος, ορίστε την τιμή σε 0 (όχι spam) και δώστε τον λόγο.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξήγηση. Δώστε μόνο το JSON. Ακολουθεί η μορφή που θα χρησιμοποιηθεί:\n{\n\"explanation\": \"Σύντομη εξήγηση του συλλογισμού σας\",\n\"spamValue\": <ακέραιος αριθμός από 0 έως 100>\n}\nΕδώ βρίσκονται οι πληροφορίες του email:\nΑποστολέας: \"{%author%}\"\nΘέμα: \"{%mail_subject%}\"\nΣώμα Html: \"{%mail_html_body%}\""
|
||||
|
|
@ -741,7 +732,7 @@
|
|||
"message": "Το όριο ανεπιθύμητης αλληλογραφίας είναι μηδέν! Θα επισημάνετε όλα τα μηνύματα ως ανεπιθύμητα!"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "Δεν έχουν ελεγχθεί ακόμη μηνύματα για ανεπιθύμητα. Εδώ θα βρείτε μια λίστα με τις τελευταίες 100 αναφορές ανεπιθύμητων μηνυμάτων μόνο για την τρέχουσα συνεδρία."
|
||||
"message": "Δεν έχουν ελεγχθεί ακόμη μηνύματα για ανεπιθύμητα. Εδώ θα βρείτε μια λίστα με τις τελευταίες 100 αναφορές ανεπιθύμητων μηνυμάτων."
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
"message": "Αναφορές φίλτρου ανεπιθύμητης αλληλογραφίας"
|
||||
|
|
@ -773,12 +764,6 @@
|
|||
"no_string": {
|
||||
"message": "Οχι"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Προσθήκη ετικετών"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Ανάλυση για ανεπιθύμητα μηνύματα"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Δεν βρέθηκε επεξεργάσιμο ημερολόγιο!"
|
||||
},
|
||||
|
|
@ -1047,11 +1032,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Ταξινομήστε το ακόλουθο κείμενο με βάση την Ευγένεια, τη Ζεστασιά, την Τυπικότητα, την Επιθετικότητα και την Προσβλητικότητα, δίνοντας ένα ποσοστό για κάθε κατηγορία. Απαντήστε μόνο με την κατηγορία και βαθμολογήστε χωρίς επιπλέον σχόλια ή άλλο κείμενο."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Συνοψίστε το ακόλουθο μήνυμα ηλεκτρονικού ταχυδρομείου σε μια λίστα με κουκκίδες."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Μεταφράστε το ακόλουθο μήνυμα ηλεκτρονικού ταχυδρομείου στα"
|
||||
"message": "Μεταφράστε το παρακάτω μήνυμα ηλεκτρονικού ταχυδρομείου στη γλώσσα {%thunderai_translate_lang%}.\n\nΚανόνες:\n- Μεταφράστε τόσο το θέμα όσο και το σώμα του μηνύματος.\n- Επιστρέψτε το αποτέλεσμα ως αντικείμενο JSON με τρία πεδία: \"subject\", \"body\" και \"status\".\n- Εάν η μετάφραση έχει ολοκληρωθεί, το status είναι ίσο με 1.\n- Εάν το μήνυμα είναι γραμμένο σε μία από αυτές τις γλώσσες \"{%thunderai_translate_exclude_lang%}\" ή στη γλώσσα {%thunderai_translate_lang%}, επιστρέψτε μια κενή συμβολοσειρά για το σώμα και το θέμα και ορίστε το status σε -1.\n- Μην προσθέτετε εξηγήσεις, σημειώσεις ή οποιοδήποτε κείμενο εκτός του JSON.\n\nΘέμα μηνύματος: {%mail_subject%}\n\nΣώμα μηνύματος: {%mail_html_body%}\n\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Η έξοδος πρέπει να είναι μόνο ένα αντικείμενο JSON. Ακολουθεί ένα παράδειγμα της μορφής JSON που πρέπει να χρησιμοποιηθεί:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Απαντήστε μόνο με το απαραίτητο κείμενο και χωρίς επιπλέον σχόλια ή άλλο κείμενο."
|
||||
|
|
@ -1063,7 +1045,7 @@
|
|||
"message": "Εάν είναι επιλεγμένο, θα συμπεριληφθεί ένα στοιχείο στο μενού για την εφαρμογή ετικετών σε μηνύματα ηλεκτρονικού ταχυδρομείου."
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Προσθήκη ετικετών σε αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου"
|
||||
"message": "Προσθήκη ετικετών"
|
||||
},
|
||||
"prompt_add_tags_full_text": {
|
||||
"message": "Αναλύστε το ακόλουθο κείμενο email και δημιουργήστε έναν πίνακα ετικετών JSON που συνοψίζει το περιεχόμενό του. Χρησιμοποιήστε θέματα, βασικά θέματα και σχετικές περιγραφές ως ετικέτες. Βεβαιωθείτε ότι οι ετικέτες είναι συνοπτικές και σχετικές με το περιεχόμενο του email.\nΚείμενο email: {%mail_text_body%}\nΛάβετε υπόψη τις ακόλουθες λεπτομέρειες για το περιεχόμενο:\n- Αποστολέας: {%author%}\n- Παραλήπτες: {%recipients%}\n- Λίστα CC: {%cc_list%}\n- Θέμα email: {%mail_subject%}\nΒασίστε τις ετικέτες σας στο κείμενο και το περιεχόμενο του email, αγνοώντας περιττές πληροφορίες ή ασήμαντες λεπτομέρειες.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Η έξοδος θα πρέπει να είναι μόνο ένας πίνακας ετικετών JSON χωρίς κανένα επιπλέον σχόλιο ή κείμενο. Ακολουθεί ένα παράδειγμα της μορφής JSON που θα χρησιμοποιηθεί:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
|
||||
|
|
@ -1309,19 +1291,19 @@
|
|||
"message": "Εμφάνιση ενός επιπλέον στοιχείου μενού για τη δημιουργία συμβάντων ημερολογίου από περιεχόμενο κειμένου στο πρόχειρο."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Προσθήκη επιλογών σύνοψης"
|
||||
"message": "Επιλογές σύνοψης"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Συνοψίστε αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου ή αυτά τα μηνύματα ηλεκτρονικού ταχυδρομείου"
|
||||
"message": "Συνοψίστε"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Είστε βοηθός που συνοψίζει συνομιλίες μέσω email. \nΔεδομένου ενός νήματος email, δημιουργήστε μια συνοπτική και ακριβή περίληψη που να καταγράφει: \n- Το κύριο θέμα ή τον σκοπό της συζήτησης \n- Βασικές αποφάσεις, συμπεράσματα ή συμφωνίες \n- Σημαντικές ερωτήσεις, αιτήματα ή ενέργειες \n- Ποιος είναι υπεύθυνος για κάθε ενέργεια (εάν αναφέρεται) \nΠαραλείψτε χαιρετισμούς, υπογραφές, παρατιθέμενο κείμενο και περιττές ανταλλαγές απόψεων. Μην προσθέτετε υποθέσεις ή πληροφορίες που δεν υπάρχουν στα email. \nΓράψτε την περίληψη σε σαφή, ουδέτερη γλώσσα, κατάλληλη για έναν πολυάσχολο επαγγελματία."
|
||||
"message": "Δώστε μια συνοπτική περίληψη των ακόλουθων μηνυμάτων ηλεκτρονικού ταχυδρομείου. Η περίληψη πρέπει να έχει μέγιστο μήκος 3-5 προτάσεις και να καταγράφει τα κύρια σημεία. Γράψτε σε απλές παραγράφους χωρίς κουκκίδες, λίστες ή μορφοποίηση markdown:\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Σύνοψη προτύπου email"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "Από: {%author%} \nΠρος: {%recipients%} \nΚοινοποίηση: {%cc_list%} \nΘέμα: {%mail_subject%} \nΗμερομηνία: {%mail_datetime%} \nΣυνημμένα: {%mail_attachments_info%} \nΚύριο κείμενο: \n{%mail_text_body%}"
|
||||
"message": "Από: {%author%} \nΠρος: {%recipients%} \nΚοινοποίηση: {%cc_list%} \nΘέμα: {%mail_subject%} \nΗμερομηνία: {%mail_datetime%} \nΣυνημμένα:\n{%mail_attachments_info%} \n\nΚύριο κείμενο: \n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "Διαχωριστής email"
|
||||
|
|
@ -1377,9 +1359,6 @@
|
|||
"Valid": {
|
||||
"message": "Έγκυρα Μηνύματα"
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "Σύνοψη"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Πατήστε το παρακάτω κουμπί για να δώσετε άδεια στον τρέχοντα κεντρικό υπολογιστή να αποφύγει οποιοδήποτε πρόβλημα με το CORS."
|
||||
},
|
||||
|
|
@ -1403,5 +1382,417 @@
|
|||
},
|
||||
"copy_text": {
|
||||
"message": "αντιγραφή"
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Εμφάνιση σε"
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Μόνο αναδυόμενο παράθυρο"
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Μόνο μενού περιβάλλοντος"
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Και τα δύο"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Αποθήκευση ως Σύνοψη"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Αποθήκευση"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "Ο χώρος αποθήκευσης χρησιμοποιείται για την αποθήκευση πληροφοριών σχετικά με τη βαθμολογία ανεπιθύμητης αλληλογραφίας, τις περιλήψεις και τις μεταφράσεις κάθε μηνύματος."
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Μέγεθος αποθήκευσης"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Εκκαθάριση χώρου αποθήκευσης"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα αποθηκευμένα δεδομένα (περιλήψεις, αναφορές ανεπιθύμητων μηνυμάτων, μεταφράσεις); Αυτή η ενέργεια δεν μπορεί να αναιρεθεί."
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "$COUNT$ εγγραφές καταργήθηκαν.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "Για να χρησιμοποιήσετε το Google Gemini API, χρειάζεστε ένα κλειδί Google Gemini API και πρέπει να επιλέξετε ένα μοντέλο."
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "Για να χρησιμοποιήσετε το Claude API, χρειάζεστε ένα Anthropic Claude API Key και πρέπει να επιλέξετε ένα μοντέλο."
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Όλες οι κεφαλίδες μηνυμάτων"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking": {
|
||||
"message": "Σύμπτυξη μπλοκ σκέψης από προεπιλογή"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking_info": {
|
||||
"message": "Ελέγχει την αρχική κατάσταση του μπλοκ σκέψης που εμφανίζεται πάνω από την απάντηση. Εάν είναι επιλεγμένο, το μπλοκ συμπτύσσεται από προεπιλογή και μπορεί να ανοιχτεί με ένα κλικ. Εάν δεν είναι επιλεγμένο, το μπλοκ είναι ανοιχτό από προεπιλογή και μπορεί να συμπτυχθεί με ένα κλικ. Το περιεχόμενο της σκέψης διατηρείται πάντα."
|
||||
},
|
||||
"prefs_OptionText_thinking_summary": {
|
||||
"message": "Σκέψη"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Χρόνος αναμονής για φόρτωση σελίδας"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Χρόνος σε χιλιοστά του δευτερολέπτου για την αναμονή φόρτωσης της σελίδας ChatGPT πριν από τη φόρτωση του πρόσθετου περιεχομένου. Η προεπιλογή είναι 1000ms. Εάν έχει οριστεί ένα προσαρμοσμένο GPT ή έργο, θα προστεθούν επιπλέον 1000ms σε αυτήν την τιμή."
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Documentation"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Οδηγοί εγκατάστασης"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Εκπαιδευτικό σεμινάριο προσαρμοσμένης προτροπής"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Άνοιγμα της σελίδας υποδοχής"
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "Η γλώσσα που θα χρησιμοποιηθεί στις μεταφράσεις αλληλογραφίας."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Ο κώδικας γλώσσας δεν θα μεταφράζεται όταν βρεθεί."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Λίστα παράλειψης διεύθυνσης ηλεκτρονικού ταχυδρομείου"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "Τα email από αυτές τις διευθύνσεις δεν θα αποστέλλονται στην Τεχνητή Νοημοσύνη για φιλτράρισμα ανεπιθύμητης αλληλογραφίας."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Προσθέστε μία διεύθυνση ηλεκτρονικού ταχυδρομείου ανά γραμμή ή διαχωρισμένη με κόμμα."
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "Ο αποστολέας βρίσκεται στη λίστα παράλειψης ανεπιθύμητης αλληλογραφίας της διεύθυνσης ηλεκτρονικού ταχυδρομείου."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Παράλειψη διευθύνσεων βιβλίων διευθύνσεων"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, τα email από αποστολείς στα βιβλία διευθύνσεών σας δεν θα αποστέλλονται στην Τεχνητή Νοημοσύνη για φιλτράρισμα ανεπιθύμητης αλληλογραφίας."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "Ο αποστολέας είναι μια επαφή στο βιβλίο διευθύνσεων."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Η άδεια χρήσης του βιβλίου διευθύνσεων απορρίφθηκε. Ενεργοποιήστε ξανά τη λειτουργία για να παραχωρήσετε άδεια."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Σφάλμα κατά την αίτηση άδειας για το βιβλίο διευθύνσεων. Δοκιμάστε ξανά."
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Έγινε!"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget": {
|
||||
"message": "Προϋπολογισμός εκτεταμένης σκέψης (tokens)"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget_Info": {
|
||||
"message": "Μέγιστος αριθμός διακριτικών που μπορεί να δαπανήσει το μοντέλο για εκτεταμένη σκέψη. Ορίστε σε 0 για να απενεργοποιήσετε την εκτεταμένη σκέψη. Όταν είναι ενεργοποιημένη, η τιμή θερμοκρασίας αγνοείται από το Claude API."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Επιβολή εξόδου JSON"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Εάν επιλεγεί, το Ollama θα αναγκαστεί να επιστρέψει μια έγκυρη απόκριση JSON. Αυτή η επιλογή λειτουργεί μόνο με μοντέλα που υποστηρίζουν δομημένη έξοδο."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Χρησιμοποιώντας 1$",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Ενεργοποίηση αυτόματης σύνοψης με τεχνητή νοημοσύνη για προεπισκοπήσεις μηνυμάτων"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, το ThunderAI θα δημιουργεί και θα εμφανίζει αυτόματα περιλήψεις AI πάνω από τα μηνύματα email όταν αυτά ανοίγονται. Σημειώστε ότι αυτό σημαίνει ότι όλα τα μηνύματα που βλέπετε σε προεπισκόπηση θα αποστέλλονται αμέσως στην διαμορφωμένη υπηρεσία AI."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "Σύνοψη ThunderAI"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Δημιουργία σύνοψης τεχνητής νοημοσύνης..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "Η δημιουργία σύνοψης τεχνητής νοημοσύνης απέτυχε. Επιβεβαιώστε τις ρυθμίσεις σας και δοκιμάστε ξανά."
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "Η προτροπή πρέπει να περιέχει το σύμβολο κράτησης θέσης {%mail_text_body_or_selected%} ή {%mail_html_body_or_selected%} για να ενεργοποιηθεί αυτή η επιλογή. Προσθέστε ένα από αυτά τα σύμβολα κράτησης θέσης στην προτροπή ή επαναφέρετέ το στην προεπιλεγμένη τιμή."
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Έλεγχος ανεπιθύμητης αλληλογραφίας σε εξέλιξη..."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Αυτόματη σύνοψη μηνυμάτων"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Επιλέξτε εάν θα δημιουργούνται αυτόματα συνόψεις κατά την προβολή μηνυμάτων. Απαιτείται σύνδεση που βασίζεται σε API (όχι ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Εμφάνιση σύνοψης σε"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Επιλέξτε πού θα εμφανίζεται το αποτέλεσμα σύνοψης. Η λειτουργία Inline εμφανίζει ένα banner σύνοψης απευθείας στο παράθυρο μηνύματος. Η λειτουργία παραθύρου συνομιλίας ανοίγει το παράθυρο συνομιλίας με τεχνητή νοημοσύνη."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Μέγιστο μήκος οθόνης"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Μέγιστος αριθμός χαρακτήρων που θα εμφανίζονται στην ενσωματωμένη σύνοψη. Ορίστε σε 0 για χωρίς όριο."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Μορφοποίηση λωρίδας"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Αφαιρέστε τη μορφοποίηση HTML και Markdown από τη σύνοψη που δημιουργείται από την τεχνητή νοημοσύνη, εμφανίζοντας μόνο απλό κείμενο."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Δείτε περισσότερα"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Δείτε λιγότερα"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "Επισκόπηση ThunderAI"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "Σύνοψη Τεχνητής Νοημοσύνης"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Σύμπτυξη σύνοψης"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Δημιουργία σύνοψης..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Η δημιουργία σύνοψης απέτυχε"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Κάντε κλικ εδώ για να δημιουργήσετε μια σύνοψη"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Η αυτόματη σύνοψη απαιτεί σύνδεση που βασίζεται σε API. Παρακαλούμε διαμορφώστε μια σύνδεση API στις ρυθμίσεις του ThunderAI."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Ανανέωση σύνοψης"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Ανανέωση αναφοράς ανεπιθύμητων μηνυμάτων"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Διαγραφή αναφοράς ανεπιθύμητων μηνυμάτων"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Διαγραφή σύνοψης"
|
||||
},
|
||||
"generic_error_dismiss": {
|
||||
"message": "Απόριψη"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Μετάφραση email"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Εάν επιλεγεί, το μοντέλο και το API που καθορίζονται παρακάτω θα χρησιμοποιηθούν για τη μετάφραση email(s), ανεξάρτητα από αυτό που έχει επιλεγεί στη σελίδα επιλογών ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, προσθέτει ένα κουμπί μετάφρασης στο σώμα του μηνύματος."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Διαχείριση ρυθμίσεων μετάφρασης"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Διαχείριση ρυθμίσεων μετάφρασης"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "Σε αυτήν τη σελίδα μπορείτε να τροποποιήσετε την προεπιλεγμένη προτροπή που χρησιμοποιείται για τη μετάφραση μηνυμάτων ηλεκτρονικού ταχυδρομείου."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Τρέχον κείμενο προτροπής"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Επιλογές μετάφρασης"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Αυτόματη μετάφραση μηνυμάτων"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Απενεργοποιημένο"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Μόνο χειροκίνητο κουμπί"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "Όταν ανοίξει το email"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Επιλέξτε πότε θα μεταφράζονται τα μηνύματα: απενεργοποιημένη, μόνο όταν κάνετε κλικ στο κουμπί ή αυτόματα κατά το άνοιγμα ενός μηνύματος."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Παράθυρο μηνύματος (ενσωματωμένο)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Παράθυρο συνομιλίας"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Μέγιστο μήκος εμφανιζόμενης μετάφρασης"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Μέγιστος αριθμός χαρακτήρων που εμφανίζονται στην ενσωματωμένη μετάφραση. 0 = χωρίς όριο. Όταν οριστεί, το μεγαλύτερο κείμενο περικόπτεται με την επιλογή \"Δείτε περισσότερα\"."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Δείτε περισσότερα"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Δείτε λιγότερα"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Γλώσσα-στόχος μετάφρασης"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Γλώσσα στην οποία θα μεταφραστούν τα μηνύματα ηλεκτρονικού ταχυδρομείου. Εάν είναι κενό, χρησιμοποιείται η προεπιλεγμένη ρύθμιση γλώσσας."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Εξαίρεση γλωσσών"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Λίστα κωδικών γλώσσας (π.χ., en, fr, it) διαχωρισμένων με κόμμα για παράλειψη για αυτόματη μετάφραση. Εάν το μήνυμα ηλεκτρονικού ταχυδρομείου είναι σε μία από αυτές τις γλώσσες, δεν θα μεταφραστεί αυτόματα ή το κουμπί χειροκίνητης μετάφρασης δεν θα εμφανιστεί."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "Η προτροπή που περιγράφει την εργασία μετάφρασης:"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Μεταφράζοντας..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Κάντε κλικ εδώ για να μεταφράσετε αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "Μετάφραση Τεχνητής Νοημοσύνης"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "Η αυτόματη μετάφραση απαιτεί σύνδεση που βασίζεται σε API. Παρακαλούμε διαμορφώστε μια σύνδεση API στις ρυθμίσεις του ThunderAI."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Ανανέωση μετάφρασης"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Διαγραφή μετάφρασης"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "Μετάφραση Τεχνητής Νοημοσύνης"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Η μετάφραση απέτυχε."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "Η γλώσσα μετάφρασης δεν έχει ρυθμιστεί. Ορίστε μια γλώσσα στις ρυθμίσεις μετάφρασης ή ορίστε μια προεπιλεγμένη γλώσσα στις Γενικές ρυθμίσεις."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Η μετάφραση παραλείφθηκε: Η γλώσσα εξαιρείται ή είναι πανομοιότυπη με τη γλώσσα-στόχο."
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam από"
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Βαθμολογία ανεπιθύμητης αλληλογραφίας — Κάντε κλικ για να δείτε την εξήγηση"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Σύνοψη από"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Μετάφραση από"
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Θέλετε όμορφα στατιστικά στοιχεία για τα email σας;"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Κάντε κλικ εδώ! Δοκιμάστε το ThunderStats!"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "Θέση παραθύρου συνομιλίας με τεχνητή νοημοσύνη"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Κορυφαία"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Αριστερά"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Αυτόματη αποθήκευση της θέσης του παραθύρου όταν χρησιμοποιείται το κουμπί κλεισίματος."
|
||||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Αφήστε το κενό για να χρησιμοποιήσετε την προεπιλεγμένη θέση."
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "Όταν ληφθεί το email"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Θέση κράτησης"
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Σειρά μενού"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Αναδυόμενο μενού"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Μενού περιβάλλοντος"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Η σειρά μενού αποθηκεύτηκε!"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Ανάγνωση"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Σύνθεση"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Προεπιλογή"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Σπέσιαλ"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Ειδικό"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Ανάγνωση"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Σύνθεση"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Πάντοτε"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Διαχείριση ρυθμίσεων σειράς μενού"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Σύρετε και αποθέστε στοιχεία για να τα αναδιατάξετε. Χρησιμοποιήστε την εναλλαγή για να εμφανίσετε ή να αποκρύψετε στοιχεία σε κάθε μενού."
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Ορατά στοιχεία"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Κρυμμένα αντικείμενα"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Επιλέξτε ένα εικονίδιο"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(τίποτα)"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,12 +35,8 @@
|
|||
"message": "Classify",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Summarize this",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Translate this",
|
||||
"message": "Translate",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_this": {
|
||||
|
|
@ -203,6 +199,22 @@
|
|||
"message": "Composing an email",
|
||||
"description": ""
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Show in",
|
||||
"description": ""
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Popup only",
|
||||
"description": ""
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Context menu only",
|
||||
"description": ""
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Both",
|
||||
"description": ""
|
||||
},
|
||||
"customPrompts_close_button": {
|
||||
"message": "Close button",
|
||||
"description": ""
|
||||
|
|
@ -612,14 +624,6 @@
|
|||
"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": {
|
||||
"message": "Menu: order alphabetically",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "If checked, the prompts in the menu will be ordered alphabetically.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Set to 0 if you don't want to specify the window size.",
|
||||
"description": ""
|
||||
|
|
@ -668,6 +672,10 @@
|
|||
"message": "Mail headers",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "All mail headers",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_selected_text": {
|
||||
"message": "Selected text",
|
||||
"description": ""
|
||||
|
|
@ -716,6 +724,18 @@
|
|||
"message": "If checked, the placeholders will be filled with the default values when no value is provided. Otherwise, the placeholders will be kept in place.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_hide_thinking": {
|
||||
"message": "Collapse thinking block by default",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_hide_thinking_info": {
|
||||
"message": "Controls the initial state of the thinking block shown above the answer. If checked, the block is collapsed by default and can be opened with a click. If unchecked, the block is open by default and can be collapsed with a click. The thinking content is always preserved.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_thinking_summary": {
|
||||
"message": "Thinking",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_max_prompt_length" : {
|
||||
"message": "Max prompt length",
|
||||
"description": ""
|
||||
|
|
@ -812,10 +832,6 @@
|
|||
"message": "Classify the following text in terms of Politeness, Warmth, Formality, Assertiveness, Offensiveness giving a percentage for each category. Reply with only the category and score with no extra comments or other text.",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Summarize the following email into a bullet point list.",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Translate the email below into {%thunderai_translate_lang%}.\n\nRules:\n- Translate both the subject and the body.\n- Return the result as a JSON object with three fields: \"subject\", \"body\" and \"status\".\n- If the translation has been done the status is equal to 1.\n- If the email is written in one of these languages \"{%thunderai_translate_exclude_lang%}\" or in the {%thunderai_translate_lang%} language, return an empty string for the body and the subject and set the status to -1.\n- Do not add explanations, notes, or any text outside the JSON.\n\nMail subject: {%mail_subject%}\n\nMail body: {%mail_html_body%}\n\nGenerate a response in JSON format only. The output should be only a JSON object. Here is an example of the JSON format to be used:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}",
|
||||
"description": ""
|
||||
|
|
@ -833,7 +849,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Add tags to this email",
|
||||
"message": "Add tags",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_add_tags_full_text": {
|
||||
|
|
@ -1101,7 +1117,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Summarize this email or these emails",
|
||||
"message": "Summarize",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
|
|
@ -1373,7 +1389,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_spamfilter" : {
|
||||
"message" : "Detect spam emails",
|
||||
"message" : "Analyze for spam",
|
||||
"description" : ""
|
||||
},
|
||||
"prompt_spamfilter_full_text" : {
|
||||
|
|
@ -1516,22 +1532,6 @@
|
|||
"message": "No",
|
||||
"description": ""
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Add tags",
|
||||
"description": ""
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analyze for spam",
|
||||
"description": ""
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "Summarize",
|
||||
"description": ""
|
||||
},
|
||||
"context_menu_mzta-translate": {
|
||||
"message": "Translate",
|
||||
"description": ""
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "No editable calendar found!",
|
||||
"description": ""
|
||||
|
|
@ -1568,6 +1568,10 @@
|
|||
"message": "Receiving data",
|
||||
"description": ""
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Done!",
|
||||
"description": ""
|
||||
},
|
||||
"hyprland_warning": {
|
||||
"message": "If you're having trouble opening the AI chat window, try setting the height and width values to 0. This issue can occur on linux in certain environments, for example, when using Hyprland.",
|
||||
"description": ""
|
||||
|
|
@ -1649,7 +1653,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"AccountSelector_Spamfilter": {
|
||||
"message": "Choose the accounts where the spam filter is enabled",
|
||||
"message": "Choose the accounts where the automatic spam filter is enabled",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_project": {
|
||||
|
|
@ -1736,6 +1740,14 @@
|
|||
"message": "The maximum number of tokens to generate in the completion. The token count of your prompt plus max_tokens cannot exceed the model's context length.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget": {
|
||||
"message": "Extended thinking budget (tokens)",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget_Info": {
|
||||
"message": "Maximum tokens the model may spend on extended thinking. Set to 0 to disable extended thinking. When enabled, the temperature value is ignored by the Claude API.",
|
||||
"description": ""
|
||||
},
|
||||
"anthropic_empty_apikey": {
|
||||
"message": "You've not added an API Key for the Claude API. Please insert one in the options page.",
|
||||
"description": ""
|
||||
|
|
@ -1935,7 +1947,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "[Using $1]",
|
||||
"message": "Using $1",
|
||||
"description": "Indicator near settings button when a special prompt uses a specific API.",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
|
|
@ -2111,6 +2123,10 @@
|
|||
"message": "Delete summary",
|
||||
"description": ""
|
||||
},
|
||||
"generic_error_dismiss": {
|
||||
"message": "Dismiss",
|
||||
"description": "Menu item to dismiss a generic error panel shown in the message display."
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Translate email",
|
||||
"description": ""
|
||||
|
|
@ -2298,5 +2314,77 @@
|
|||
"placeholder_string": {
|
||||
"message": "Placeholder",
|
||||
"description": ""
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Menu Order",
|
||||
"description": "Title for the menu order page"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Popup Menu",
|
||||
"description": "Header for the popup menu list in the menu order page"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Context Menu",
|
||||
"description": "Header for the context menu list in the menu order page"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Menu order saved!",
|
||||
"description": "Message shown after saving menu order"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Reading",
|
||||
"description": "Sub-tab label for reading view ordering"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Composing",
|
||||
"description": "Sub-tab label for composing view ordering"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Default",
|
||||
"description": "Badge label for default prompts"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Special",
|
||||
"description": "Badge label for special prompts"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Custom",
|
||||
"description": "Badge label for custom prompts"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Reading",
|
||||
"description": "Badge label for reading-only prompts"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Composing",
|
||||
"description": "Badge label for composing-only prompts"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Always",
|
||||
"description": "Badge label for prompts shown in all contexts"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Manage menu order settings",
|
||||
"description": "Button label to open the menu order page from options"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Drag and drop items to reorder them. Use the toggle to show or hide items in each menu.",
|
||||
"description": "Info text for the menu order page"
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Visible items",
|
||||
"description": "Section header for active/visible menu items"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Hidden items",
|
||||
"description": "Section header for hidden menu items"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Choose an icon",
|
||||
"description": "Label/tooltip for the context menu icon picker on the menu order page"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(none)",
|
||||
"description": "Dropdown option meaning no custom icon is selected for the context menu item"
|
||||
}
|
||||
}
|
||||
|
|
@ -65,9 +65,6 @@
|
|||
"prompt_reply_advanced": {
|
||||
"message": "Respondu al ĉi tiu fadeno"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Resumu ĉi tion"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traduku ĉi tion"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -20,9 +20,6 @@
|
|||
"prompt_rewrite_formal": {
|
||||
"message": "Reescribe de manera formal"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Resume esto"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traducir esto"
|
||||
},
|
||||
|
|
@ -425,12 +422,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Si está marcado, usar el atajo de teclado CTRL+ALT+A envará automáticamente el prompt resaltado del menú. De lo contrario, se mostrará el nombre del prompt al usuario, requiriendo otra pulsación de la tecla Enter para enviarlo."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menú: ordenar alfabéticamente"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Si está marcado, los prompts en el menú se ordenarán alfabéticamente."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Establezca en 0 si no quiere especificar el tamaño de la ventana."
|
||||
},
|
||||
|
|
@ -563,11 +554,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Clasifique el siguiente texto en términos de Cortesía, Calidez, Formalidad, Asertividad, Ofensividad dando un porcentaje para cada categoría. Responda solo con la categoría y la puntuación sin comentarios extra ni otro texto."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Resume el siguiente correo electrónico en una lista de viñetas."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Traducir el siguiente correo electrónico en"
|
||||
"message": "Traduce el correo electrónico a continuación a {%thunderai_translate_lang%}.\n\nReglas:\n- Traduce tanto el asunto como el cuerpo.\n- Devuelve el resultado como un objeto JSON con tres campos: \"subject\", \"body\" y \"status\".\n- Si la traducción se ha realizado, el estado es igual a 1.\n- Si el correo electrónico está escrito en uno de estos idiomas \"{%thunderai_translate_exclude_lang%}\" o en el idioma {%thunderai_translate_lang%}, devuelve una cadena vacía para el cuerpo y el asunto y establece el estado en -1.\n- No añadas explicaciones, notas o ningún texto fuera del JSON.\n\nAsunto del correo electrónico: {%mail_subject%}\n\nCuerpo del correo electrónico: {%mail_html_body%}\n\nGenera una respuesta solo en formato JSON. La salida debe ser solo un objeto JSON. Aquí hay un ejemplo del formato JSON a utilizar:\n{\n\"subject\": \"traducción del asunto\",\n\"body\": \"traducción del cuerpo\",\n\"status\": \"resultado del estado\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Responder solo con el texto necesario y sin comentarios extra ni otro texto."
|
||||
|
|
@ -900,7 +888,7 @@
|
|||
"message": "Detectar correos spam"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analiza el siguiente correo electrónico y determina si es spam o no. Considera factores como palabras clave sospechosas, lenguaje promocional excesivo, líneas de asunto engañosas, solicitudes de información personal y direcciones de remitente inusuales. \nProporciona un valor de 0 (no es spam) a 100 (spam) y una explicación de no más de 10 palabras. \nEn caso de que falten datos del mensaje, establece el valor en 0 (no es spam) y da la razón. \nGenera una respuesta únicamente en formato JSON. No incluyas texto adicional ni explicación; proporciona solo el JSON. El formato a usar es: \n{\n\"explanation\": \"Breve explicación de tu razonamiento\",\n\"spamValue\": <entero de 0 a 100>\n} \nAquí está la información del correo: \nRemitente: \"{%author%}\" \nAsunto: \"{%mail_subject%}\" \nCuerpo HTML: \"{%mail_html_body%}\""
|
||||
"message": "Analiza el siguiente correo electrónico y determina si es spam o no. Considera factores como palabras clave sospechosas, lenguaje promocional excesivo, líneas de asunto engañosas, solicitudes de información personal y direcciones de remitente inusuales.\nProporciona un valor de 0 (no es spam) a 100 (spam) y una explicación de no más de 10 palabras.\nEn caso de que falten datos del mensaje, establece el valor en 0 (no es spam) y da la razón.\nGenera una respuesta únicamente en formato JSON. No incluyas texto adicional ni explicación; proporciona solo el JSON. El formato a usar es:\n{\n\"explanation\": \"Breve explicación de tu razonamiento\",\n\"spamValue\": <entero de 0 a 100>\n}\nAquí está la información del correo:\nRemitente: \"{%author%}\"\nAsunto: \"{%mail_subject%}\"\nCuerpo HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Opciones del filtro de spam"
|
||||
|
|
@ -924,7 +912,7 @@
|
|||
"message": "¡El umbral de spam es cero! ¡Marcarás todos los correos como spam!"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "No hay mensajes filtrados como spam todavía. Aquí encontrarás una lista de los últimos 100 informes de spam solo para la sesión actual."
|
||||
"message": "Aún no se ha revisado ningún mensaje en busca de spam. Aquí encontrará una lista de los últimos 100 informes de spam."
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
"message": "Informes del filtro de spam"
|
||||
|
|
@ -956,12 +944,6 @@
|
|||
"no_string": {
|
||||
"message": "No"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Añadir etiquetas"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analizar el spam"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "¡No se encontró un calendario editable!"
|
||||
},
|
||||
|
|
@ -1041,7 +1023,7 @@
|
|||
"message": "Cada cambio se guarda inmediatamente."
|
||||
},
|
||||
"AccountSelector_Spamfilter": {
|
||||
"message": "Elige las cuentas donde el filtro de spam está habilitado"
|
||||
"message": "Elige las cuentas donde el filtro de spam automático está activado"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_project": {
|
||||
"message": "Proyecto ChatGPT Web"
|
||||
|
|
@ -1280,5 +1262,453 @@
|
|||
},
|
||||
"reset": {
|
||||
"message": "Reiniciar"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Guardar como Resumen"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Almacenamiento"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "El almacenamiento se utiliza para guardar información sobre la puntuación de spam, los resúmenes y las traducciones de cada mensaje."
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Tamaño de almacenamiento"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Borrar almacenamiento"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "¿Estás seguro de que quieres borrar todos los datos almacenados (resúmenes, informes de spam, traducciones)? Esta acción no se puede deshacer."
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "Se eliminaron $COUNT$ registros.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "Para usar la API de Google Gemini, necesitas una clave de API de Google Gemini y debes elegir un modelo."
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "Para usar la API de Claude, necesitas una clave de API de Anthropic Claude y debes elegir un modelo."
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Todos los encabezados de correo"
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Cuerpo del correo o texto seleccionado"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Cuerpo del correo o HTML seleccionado"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Tiempo de espera para la carga de la página"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Tiempo en milisegundos para esperar a que la página de ChatGPT se cargue antes de cargar el contenido adicional. El valor predeterminado es de 1000ms. Si se define un GPT personalizado o un proyecto, se sumarán 1000ms adicionales a este valor."
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Documentación"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Guías de configuración"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Tutorial de prompt personalizado"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Abrir la página de bienvenida"
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Añadir evento de calendario desde portapapeles"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "No se pudo leer el portapapeles. Por favor, verifica los permisos."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "El portapapeles está vacío. Por favor, copia algo de texto primero."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Se denegó el permiso del portapapeles. Por favor, habilita la función nuevamente en la configuración para conceder permiso."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Error al solicitar permiso del portapapeles. Por favor, inténtalo de nuevo."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Mostrar un elemento de menú adicional para crear eventos de calendario a partir del contenido de texto del portapapeles."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Opciones de resumen"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Resumir este correo electrónico o estos correos electrónicos"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Proporcione un resumen conciso del siguiente mensaje(s) de correo electrónico. El resumen debe tener un máximo de 3 a 5 oraciones y capturar los puntos principales. Escriba en párrafos sencillos sin viñetas, listas o formato markdown:\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Resumir plantilla de correo electrónico"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "De: {%author%}\nPara: {%recipients%}\nCC: {%cc_list%}\nAsunto: {%mail_subject%}\nFecha: {%mail_datetime%}\nArchivos adjuntos:\n{%mail_attachments_info%}\n\nCuerpo:\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "Separador de correo electrónico"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- SIGUIENTE CORREO ----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Puedes cambiar el prompt como desees, el primer campo es el prompt principal, el segundo campo es la plantilla para un correo individual. La lista de correos electrónicos se adjuntará al prompt principal. Los correos electrónicos se separarán por el separador especificado en el tercer campo."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "El prompt principal que describe la tarea a realizar en todos los correos electrónicos seleccionados:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "La plantilla para un correo electrónico individual:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "El separador entre correos electrónicos:"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Si está marcado, el Modelo y la API especificados a continuación se utilizarán para crear eventos de calendario, independientemente del que se elija en la página de opciones de ThunderAI."
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "El idioma que se utilizará en las traducciones de correo."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Los códigos de idioma que no se deben traducir cuando se encuentren."
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Resumir correo electrónico"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Si está marcado, el Modelo y la API especificados a continuación se utilizarán para resumir el(los) correo(s) electrónico(s), independientemente del que se elija en la página de opciones de ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Si está marcado, añade una opción al menú contextual para resumir el(los) correo(s) electrónico(s)."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Administrar configuración de resumen"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Administrar configuraciones de resumen"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "En esta página puedes modificar el prompt predeterminado utilizado para resumir correos electrónicos."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Texto del prompt actual"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Mostrar panel de informe de spam"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Si está marcado, se mostrará un panel con el informe de spam encima del mensaje."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Lista de salto de direcciones de correo electrónico"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Obtener evento de calendario del portapapeles"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "Los correos electrónicos de estas direcciones no se enviarán a la IA para filtrar spam."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Agrega una dirección de correo electrónico por línea, o separada por una coma."
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "El remitente está en la lista de omisión antispam de la dirección de correo electrónico."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Omitir direcciones de la agenda"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Si está marcado, los correos electrónicos de remitentes en sus agendas no se enviarán a la IA para filtrar spam."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "El remitente es un contacto en la agenda."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Se denegó el permiso de la agenda. Por favor, habilite la función de nuevo para otorgar permiso."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Error al solicitar el permiso de la agenda. Por favor, inténtelo de nuevo."
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Spam"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Válido"
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "¡Hecho!"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Presione el botón de abajo para dar el permiso al host actual para evitar cualquier problema de CORS."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Dar permiso al host actual"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Si está usando localhost o 127.0.0.1 porque el servidor de IA está alojado en su PC, se requiere el permiso <all_urls>."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Forzar salida JSON"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Si está marcado, Ollama se verá obligado a devolver una respuesta JSON válida. Esta opción solo funciona con modelos que admiten salida estructurada."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Usando $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Habilitar el resumen automático de IA para previsualizaciones de mensajes"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Si está marcado, ThunderAI generará y mostrará automáticamente resúmenes de IA encima de los mensajes de correo electrónico cuando se abran. Tenga en cuenta que esto significa que todos los mensajes que vea en vista previa se enviarán inmediatamente al servicio de IA configurado."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "Resumen de ThunderAI"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Generando resumen de IA..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "No se pudo generar el resumen de IA. Por favor, confirme su configuración e inténtelo de nuevo."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "¿Desea incluir la configuración de la API en la exportación? ¡Tenga en cuenta que también se guardará la clave de API en el archivo!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "No preguntar para seleccionar texto"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Si está marcado, no es necesario seleccionar texto. Se utilizará el cuerpo completo del mensaje para obtener el evento de calendario."
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "El prompt debe contener el marcador de posición {%mail_text_body_or_selected%} o {%mail_html_body_or_selected%} para habilitar esta opción. Por favor, añada uno de estos marcadores de posición al prompt o restablezca a la configuración predeterminada."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Copiar"
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "Copiar"
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Comprobación de spam en curso..."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Resumir automáticamente mensajes"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Elige si generar automáticamente resúmenes al ver mensajes. Requiere una conexión basada en API (no ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Mostrar resumen en"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Elige dónde se muestra el resultado del resumen. El modo en línea muestra un banner de resumen directamente en el panel de mensajes. El modo de ventana de chat abre la ventana de chat de IA."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Longitud máxima de visualización"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Número máximo de caracteres para mostrar en el resumen en línea. Establecer en 0 para no tener límite."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Eliminar formato"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Eliminar formato HTML y Markdown del resumen generado por IA, mostrando solo texto plano."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Ver más"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Ver menos"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "Resumen de ThunderAI"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "Resumen de IA"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Colapsar resumen"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Generando resumen..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Fallo al generar el resumen"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Haz clic aquí para generar un resumen"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "El resumen automático requiere una conexión basada en API. Por favor, configure una conexión API en la configuración de ThunderAI."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Actualizar resumen"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Actualizar informe de spam"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Eliminar informe de spam"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Eliminar resumen"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Traducir correo electrónico"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Si está marcado, el Modelo y la API especificados a continuación se utilizarán para traducir el(los) correo(s), independientemente de la opción elegida en la página de opciones de ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Si está marcado, añade un botón de traducción en el cuerpo del mensaje."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Gestionar configuraciones de traducción"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Gestionar configuraciones de traducción"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "En esta página puedes modificar el prompt predeterminado utilizado para traducir correos electrónicos."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Texto del prompt actual"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Opciones de traducción"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Traducir automáticamente mensajes"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Desactivado"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Solo botón manual"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "Cuando se abre el correo electrónico"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Elige cuándo traducir los mensajes: desactivado, solo al hacer clic en el botón o automáticamente al abrir un mensaje."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Panel de mensajes (en línea)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Ventana de chat"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Número máximo de caracteres que se muestran en la traducción en línea. 0 = sin límite. Al establecerlo, el texto más largo se trunca con un interruptor de \"Ver más\"."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Ver más"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Ver menos"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Idioma de destino de la traducción"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Idioma al que traducir los correos electrónicos. Si está vacío, utiliza la configuración de idioma predeterminada."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Excluir idiomas"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Lista separada por comas de códigos de idioma (por ejemplo, en, fr, it) para omitir en la traducción automática. Si el correo electrónico está en uno de estos idiomas, no se traducirá automáticamente ni se mostrará el botón manual."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "El prompt que describe la tarea de traducción:"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Traduciendo..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Haz clic aquí para traducir este correo electrónico"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "Traducción de IA"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "La traducción automática requiere una conexión basada en API. Por favor, configure una conexión API en la configuración de ThunderAI."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Actualizar traducción"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Eliminar traducción"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "Traducción de IA"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Fallo la traducción."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "El idioma de traducción no está configurado. Por favor, establece un idioma en la configuración de Traducción o establece un idioma predeterminado en la configuración General."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Traducción omitida: Idioma excluido o idéntico al objetivo."
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam por"
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Puntuación de spam — Haz clic para ver la explicación"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Resumen por"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Traducción por"
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "¿Quieres estadísticas bonitas sobre tus correos electrónicos?"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "¡Haz clic aquí! ¡Prueba ThunderStats!"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "Posición de la ventana de chat de IA"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Superior"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Izquierdo"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Guardar automáticamente la posición de la ventana al usar el botón de cerrar."
|
||||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Déjalo vacío para usar la posición predeterminada."
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "Cuando se recibe el correo electrónico"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Marcador de posición"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Longitud máxima de la traducción mostrada"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Classer"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Résumer ceci"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traduire ceci"
|
||||
},
|
||||
|
|
@ -411,12 +408,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Si cette option est cochée, le raccourci clavier CTRL+ALT+A enverra automatiquement l'invite sélectionnée dans le menu. Sinon, le nom de l'invite sera affiché à l'utilisateur, nécessitant une nouvelle pression sur la touche Entrée pour l'envoyer."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menu : Trier par ordre alphabétique"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Si cette option est cochée, les prompts dans le menu seront triés par ordre alphabétique."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Réglez sur 0 si vous ne souhaitez pas spécifier la taille de la fenêtre."
|
||||
},
|
||||
|
|
@ -525,11 +516,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Classifiez le texte suivant en termes de politesse, chaleur, formalité, assertivité, caractère offensant en donnant un pourcentage pour chaque catégorie. Répondez uniquement avec la catégorie et le score, sans commentaires ou autre texte."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Résumez le courriel suivant sous forme de liste à puces."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Traduisez le courriel suivant en"
|
||||
"message": "Traduisez l'e-mail ci-dessous en {%thunderai_translate_lang%}.\n\nRègles :\n- Traduisez à la fois l'objet et le corps du message.\n- Renvoyez le résultat sous forme d'objet JSON avec trois champs : \"subject\", \"body\" et \"status\".\n- Si la traduction a été effectuée, le statut est égal à 1.\n- Si l'e-mail est écrit dans l'une de ces langues \"{%thunderai_translate_exclude_lang%}\" ou dans la langue {%thunderai_translate_lang%}, renvoyez une chaîne vide pour le corps et l'objet et réglez le statut sur -1.\n- N'ajoutez pas d'explications, de notes ou de texte en dehors du JSON.\n\nObjet du mail : {%mail_subject%}\n\nCorps du mail : {%mail_html_body%}\n\nGénérez une réponse au format JSON uniquement. La sortie doit être exclusivement un objet JSON. Voici un exemple du format JSON à utiliser :\n{\n\"subject\" : \"subject translation\",\n\"body\" : \"body translation\",\n\"status\" : \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Répondez uniquement avec le texte nécessaire, sans commentaires ou autre texte."
|
||||
|
|
@ -831,9 +819,6 @@
|
|||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analysez l'e-mail suivant et déterminez s'il s'agit d'un spam ou non. Prenez en compte des facteurs tels que des mots-clés suspects, un langage promotionnel excessif, des lignes d'objet trompeuses, des demandes d'informations personnelles et des adresses d'expéditeurs inhabituelles.\nFournissez une valeur de 0 (non spam) à 100 (spam) et une explication de 10 mots maximum.\nEn cas de données de message manquantes, définissez la valeur à 0 (non spam) et indiquez la raison.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire ; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"explanation\" : \"Brève explication de votre raisonnement\",\n\"spamValue\" : <entier de 0 à 100>\n}\nVoici les informations de l'e-mail :\nExpéditeur : \"{%author%}\"\nObjet : \"{%mail_subject%}\"\nCorps HTML : \"{%mail_html_body%}\""
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Ajouter des étiquettes"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Aucun calendrier modifiable trouvé !"
|
||||
},
|
||||
|
|
@ -873,9 +858,6 @@
|
|||
"customPrompts_form_label_use_diff_viewer": {
|
||||
"message": "Active la visionneuse de comparaison de texte"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analyser comme spam"
|
||||
},
|
||||
"apiwebchat_info": {
|
||||
"message": "Information"
|
||||
},
|
||||
|
|
@ -979,7 +961,7 @@
|
|||
"message": "Chaque modification est enregistrée immédiatement."
|
||||
},
|
||||
"AccountSelector_Spamfilter": {
|
||||
"message": "Choisissez les comptes pour lesquels le filtre anti-spam est activé"
|
||||
"message": "Choisissez les comptes pour lesquels le filtre anti-spam est actif"
|
||||
},
|
||||
"ask_integration_permission_ok": {
|
||||
"message": "Autorisation accordée. Vous pouvez cliquer ici pour fermer cet onglet et revenir à la fenêtre principale."
|
||||
|
|
@ -1253,7 +1235,7 @@
|
|||
"message": "Définissez le nombre de jetons à utiliser pour le raisonnement. Laissez ce champ vide si le modèle sélectionné ne prend pas en charge le raisonnement ou si vous souhaitez utiliser la méthode par défaut. Entrez 0 pour désactiver le raisonnement, ou -1 pour l’activer de manière dynamique."
|
||||
},
|
||||
"prefs_google_gemini_thinking_budget": {
|
||||
"message": "Thinking Budget"
|
||||
"message": "Budget de réflexion"
|
||||
},
|
||||
"SelectAll": {
|
||||
"message": "Tout sélectionner"
|
||||
|
|
@ -1337,7 +1319,7 @@
|
|||
"message": "Résumer cet e-mail ou ces e-mails"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Vous êtes un assistant qui résume les conversations par e-mail.\n\nÀ partir d'un fil de discussion, produisez un résumé concis et précis qui capture :\n\n- Le sujet principal ou l'objet de la conversation.\n- Les décisions clés, conclusions ou accords.\n- Les questions importantes, requêtes ou points à traiter.\n- Le responsable de chaque action à entreprendre (si précisé).\n\nOmettez les salutations, les signatures, le texte cité et les échanges redondants.\nN'ajoutez pas d'hypothèses ou d'informations non présentes dans les e-mails.\n\nRédigez le résumé dans un langage clair et neutre, adapté à un professionnel occupé."
|
||||
"message": "Fournissez un résumé concis du ou des messages électroniques suivants. Le résumé doit comporter un maximum de 3 à 5 phrases et capturer les points principaux. Rédigez en paragraphes simples, sans listes à puces, énumérations ou formatage markdown.\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Résumé du modèle d'e-mail"
|
||||
|
|
@ -1399,9 +1381,6 @@
|
|||
"Valid": {
|
||||
"message": "Valide"
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "Résumer"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Appuyez sur le bouton ci-dessous pour donner l'autorisation à l'hôte actuel afin d'éviter tout problème CORS."
|
||||
},
|
||||
|
|
@ -1467,5 +1446,369 @@
|
|||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Laisser vide pour utiliser la position par défaut."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Ignorer les adresses du carnet d'adresses"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Si cette option est sélectionnée, les e-mails provenant d'expéditeurs figurant dans vos carnets d'adresses ne seront pas envoyés à l'IA pour le filtrage anti-spam."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "L'expéditeur est un contact dans votre carnet d'adresses."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "La permission d'accéder au carnet d'adresses a été refusée. Veuillez réactiver la fonction pour accorder la permission."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Erreur lors de la demande de permission pour le carnet d'adresses. Veuillez réessayer."
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Terminé !"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget": {
|
||||
"message": "Budget de réflexion étendue (tokens)"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget_Info": {
|
||||
"message": "Nombre maximum de tokens que le modèle peut utiliser pour la réflexion étendue. Réglez sur 0 pour désactiver. Lorsqu'il est activé, la valeur de la température est ignorée par l'API Claude."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Forcer le format JSON"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Si coché, Ollama sera forcé de renvoyer une réponse JSON valide. Cette option ne fonctionne qu'avec les modèles prenant en charge la sortie structurée."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Utilisation de $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Activer le résumé IA automatique pour l'aperçu des messages"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Si sélectionné, ThunderAI générera et affichera automatiquement des résumés IA au-dessus des messages lors de leur ouverture. Remarque : cela enverra immédiatement chaque message consulté au service IA configuré."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "Résumé ThunderAI"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Génération du résumé IA..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "Échec de la génération du résumé IA. Vérifiez vos paramètres et réessayez."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Résumer les messages automatiquement"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Choisissez de générer automatiquement des résumés lors de la visualisation des messages. Nécessite une connexion basée sur l'API (pas ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Afficher le résumé dans"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Choisissez où afficher le résultat du résumé. Le mode 'En ligne' affiche une bannière directement dans le panneau du message. Le mode 'Fenêtre de chat' ouvre la fenêtre de chat IA."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Longueur maximale d'affichage"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Nombre maximum de caractères à afficher dans le résumé en ligne. Réglez sur 0 pour aucune limite."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Supprimer le formatage"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Supprime le formatage HTML et Markdown du résumé généré par l'IA, n'affichant que du texte brut."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Voir plus"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Voir moins"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "Aperçu ThunderAI"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "Résumé IA"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Réduire le résumé"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Génération du résumé..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Impossible de générer le résumé"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Cliquez ici pour générer un résumé"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Le résumé automatique nécessite une connexion basée sur l'API. Veuillez configurer une connexion API dans les paramètres de ThunderAI."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Actualiser le résumé"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Actualiser le rapport spam"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Supprimer le rapport spam"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Supprimer le résumé"
|
||||
},
|
||||
"generic_error_dismiss": {
|
||||
"message": "Ignorer"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Traduire les e-mails"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Si sélectionné, le modèle et l'API spécifiés ci-dessous seront utilisés pour la traduction des e-mails, quel que soit le choix fait dans les options générales de ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Si sélectionné, ajoute un bouton de traduction dans le corps du message."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Gérer les paramètres de traduction"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Gérer les paramètres de traduction"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "Sur cette page, vous pouvez modifier le prompt par défaut utilisé pour traduire les e-mails."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Texte du prompt actuel"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Options de traduction"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Traduire les messages automatiquement"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Désactivé"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Bouton manuel uniquement"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "À l'ouverture de l'e-mail"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Choisissez quand traduire les messages : désactivé, uniquement au clic sur le bouton, ou automatiquement à l'ouverture d'un message."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Panneau de message (en ligne)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Fenêtre de chat"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Longueur maximale de traduction affichée"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Nombre maximum de caractères affichés dans la traduction en ligne. 0 = pas de limite. Si défini, le texte plus long sera tronqué avec un bouton 'Voir plus'."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Voir plus"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Voir moins"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Langue de destination"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Langue dans laquelle traduire les e-mails. Si vide, utilise le paramètre de langue par défaut."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Exclure des langues"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Liste de codes de langue séparés par des virgules (ex : en, fr, it) à ignorer pour la traduction automatique. Si l'e-mail est dans l'une de ces langues, il ne sera pas traduit automatiquement ou le bouton manuel ne sera pas affiché."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "Prompt décrivant la tâche de traduction :"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Traduction en cours..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Cliquez ici pour traduire cet e-mail"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "Traduction IA"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "La traduction automatique nécessite une connexion basée sur l'API. Veuillez configurer une connexion API dans les paramètres de ThunderAI."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Actualiser la traduction"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Supprimer la traduction"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "Traduction IA"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Échec de la traduction."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "Aucune langue de traduction n'est configurée. Définissez une langue dans les paramètres de Traduction ou une langue par défaut dans les paramètres Généraux."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Traduction ignorée : langue exclue ou identique à la destination."
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Score de spam — Cliquez pour voir l'explication"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Résumé par"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Traduction par"
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "À la réception de l'e-mail"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Espace réservé"
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Ordre du menu"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Menu contextuel (Popup)"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Menu contextuel"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Ordre du menu enregistré !"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Lecture"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Rédaction"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Par défaut"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Spécial"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Personnalisé"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Lecture"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Rédaction"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Toujours"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Gérer les paramètres d'ordre du menu"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Faites glisser et déposez les éléments pour les réordonner. Utilisez l'interrupteur pour afficher ou masquer les éléments dans chaque menu."
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Éléments visibles"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Éléments masqués"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Choisir une icône"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(aucune)"
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Afficher dans"
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Fenêtre contextuelle uniquement"
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Menu contextuel uniquement"
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Les deux"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Enregistrer comme résumé"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Stockage"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "Le stockage est utilisé pour sauvegarder les informations relatives au score de spam, aux résumés et aux traductions de chaque message."
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Taille du stockage"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Effacer le stockage"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Êtes-vous sûr de vouloir effacer toutes le données stockées (résumés, rapports de spam, traductions) ? Cette action est irréversible."
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "$COUNT$ enregistrements supprimés.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "Pour utiliser l'API Google Gemini, vous avez besoin d'une clé API Google Gemini et vous devez choisir un modèle."
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "Pour utiliser l'API Claude, vous avez besoin d'une clé API Anthropic Claude et vous devez choisir un modèle."
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Tous les en-têtes du message"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking": {
|
||||
"message": "Réduire le bloc de réflexion par défaut"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking_info": {
|
||||
"message": "Contrôle l'état initial du bloc de réflexion affiché au-dessus de la réponse. Si coché, le bloc est réduit par défaut. Le contenu de la réflexion est toujours conservé."
|
||||
},
|
||||
"prefs_OptionText_thinking_summary": {
|
||||
"message": "Réflexion"
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "La langue à utiliser pour les traductions des messages."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Les codes de langue à ne pas traduire lorsqu'ils sont détectés."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Liste d'exclusion d'adresses e-mail"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "Les e-mails provenant de ces adresses ne seront pas envoyés à l'IA pour le filtrage du spam."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Ajoutez une adresse e-mail par ligne, ou séparez-les par une virgule."
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "L'expéditeur figure dans la liste d'exclusion de l'antispam."
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Klasificiraj"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Sažmi ovo"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Prevedi ovo"
|
||||
},
|
||||
|
|
@ -411,12 +408,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Ako je označeno, korištenje tipkovničkog prečaca CTRL+ALT+A automatski će poslati istaknuti upit iz izbornika. U protivnom će korisniku biti prikazan naziv upita, koji će zahtijevati još jedan pritisak tipke Enter za slanje."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Izbornik: redoslijed po abecedi"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Ako je označeno, upiti u izborniku bit će poredani abecednim redom."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Postavite na 0 ako ne želite odrediti veličinu prozora."
|
||||
},
|
||||
|
|
@ -525,11 +516,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Klasificiraj sljedeći tekst u smislu ljubaznosti, topline, formalnosti, asertivnosti, uvredljivosti dajući postotak za svaku kategoriju. Odgovori samo kategorijom i ocijeni bez dodatnih komentara ili drugog teksta."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Sažmi sljedeću e-poruku u popis s točkama."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Prevedi sljedeću e-poruku na"
|
||||
"message": "Prevedite donju e-poštu na {%thunderai_translate_lang%}.\n\nPravila:\n- Prevedite i predmet i tijelo e-pošte.\n- Vratite rezultat kao JSON objekt s tri polja: \"subject\", \"body\" i \"status\".\n- Ako je prijevod izvršen, status je jedan 1.\n- Ako je e-pošta napisana na jednom od ovih jezika \"{%thunderai_translate_exclude_lang%}\" ili na jeziku {%thunderai_translate_lang%}, vratite prazan niz za tijelo i predmet i postavite status na -1.\n- Nemojte dodavati objašnjenja, bilješke ili bilo kakav tekst izvan JSON-a.\n\nPredmet e-pošte: {%mail_subject%}\n\nTijelo e-pošte: {%mail_html_body%}\n\nGenerirajte odgovor isključivo u JSON formatu. Izlaz treba biti samo JSON objekt. Evo primjera JSON formata koji treba koristiti:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Odgovori samo s potrebnim tekstom i bez dodatnih komentara ili drugog teksta."
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Classifica"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Riassumi"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traduci"
|
||||
},
|
||||
|
|
@ -411,12 +408,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Se selezionato, l'utilizzo della combinazione di tasti CTRL+ALT+A invierà automaticamente il prompt evidenziato dal menu. In caso contrario, verrà visualizzato il nome del prompt, richiedendo un'ulteriore pressione del tasto Invio per inviarlo."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menu: ordina alfabeticamente"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Se selezionato, i prompt nel menu verranno ordinati in ordine alfabetico."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Imposta a 0 se non desideri specificare la dimensione della finestra."
|
||||
},
|
||||
|
|
@ -525,11 +516,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Classifica il seguente testo in termini di Cortesia, Calore, Formalità, Assertività, Offensività, indicando una percentuale per ciascuna categoria. Rispondi solo con la categoria e il punteggio, senza commenti aggiuntivi o altro testo."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Riepiloga la seguente email in una lista con punti elenco."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Traduci la seguente email in"
|
||||
"message": "Traduci l'email qui sotto in italiano.\n\nRegole:\n- Traduci sia l'oggetto che il corpo dell'email.\n- Restituisci il risultato come un oggetto JSON con tre campi: \"subject\", \"body\" e \"status\".\n- Se la traduzione viene effettuata, lo stato è uguale a 1.\n- Se l'email è scritta in una di queste lingue \"{%thunderai_translate_exclude_lang%}\" o nella lingua {%thunderai_translate_lang%}, restituisci una stringa vuota per il corpo e l'oggetto e imposta lo stato a 1.\n- Non aggiungere spiegazioni, note o alcun testo al di fuori del JSON.\n\nOggetto dell'email: {%mail_subject%}\n\nCorpo dell'email: {%mail_html_body%}\n\nGenera una risposta esclusivamente in formato JSON. L'output deve essere solo un oggetto JSON. Ecco un esempio del formato JSON da utilizzare:\n{\n\"subject\": \"traduzione oggetto\",\n\"body\": \"traduzione corpo\",\n\"status\": \"risultato stato\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Rispondi solo con il testo necessario, senza commenti aggiuntivi o altro testo."
|
||||
|
|
@ -541,7 +529,7 @@
|
|||
"message": "Se selezionato, verrà incluso nel menu un elemento per applicare i tag alle email."
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Aggiungi tag a questa email"
|
||||
"message": "Aggiungi tag"
|
||||
},
|
||||
"prompt_add_tags_full_text": {
|
||||
"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}"
|
||||
|
|
@ -760,7 +748,7 @@
|
|||
"message": "Aggiungi tag solo alle email nella posta in arrivo"
|
||||
},
|
||||
"prompt_spamfilter": {
|
||||
"message": "Rileva le email di spam"
|
||||
"message": "Analizza per spam"
|
||||
},
|
||||
"Moved_to_Spam": {
|
||||
"message": "Spostato nello spam"
|
||||
|
|
@ -802,7 +790,7 @@
|
|||
"message": "Lingua predefinita come impostata nelle opzioni di ThunderAI."
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "Nessun messaggio è stato ancora controllato per lo spam. Qui troverai un elenco degli ultimi 100 report di spam solo per la sessione corrente."
|
||||
"message": "Nessun messaggio è stato ancora controllato per lo spam. Qui troverai un elenco degli ultimi 100 report di spam."
|
||||
},
|
||||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Firma predefinita come impostata nelle opzioni di ThunderAI."
|
||||
|
|
@ -840,12 +828,6 @@
|
|||
"placeholder_account_email_address": {
|
||||
"message": "Indirizzo email dell'account"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analizza come spam"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Aggiungi etichette"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Non è stato trovato alcun calendario modificabile!"
|
||||
},
|
||||
|
|
@ -1334,10 +1316,10 @@
|
|||
"message": "Impostazioni riassunto"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Riassumi email"
|
||||
"message": "Riassumi"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Sei un assistente che riassume conversazioni via email.\n\nDato un thread di email, produci un riassunto conciso e accurato che includa:\n\n- L'argomento principale o lo scopo della conversazione\n- Decisioni chiave, conclusioni o accordi\n- Domande importanti, richieste o punti d'azione\n- Il responsabile per ogni punto d'azione (se indicato)\n\nOmetti saluti, firme, testo citato e scambi ridondanti.\nNon aggiungere supposizioni o informazioni non presenti nelle email.\n\nScrivi il riassunto con un linguaggio chiaro e neutro, adatto a un professionista impegnato."
|
||||
"message": "Fornisci un riassunto conciso dei seguenti messaggi email. Il riassunto deve essere di massimo 3-5 frasi e deve catturare i punti principali. Scrivi in paragrafi semplici, senza elenchi puntati, liste o formattazione markdown.\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Template riassunto email"
|
||||
|
|
@ -1399,9 +1381,6 @@
|
|||
"Valid": {
|
||||
"message": "Valido"
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "Riassumi"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Premi il pulsante qui sotto per concedere le autorizzazioni all'host corrente ed evitare problemi di CORS."
|
||||
},
|
||||
|
|
@ -1467,5 +1446,369 @@
|
|||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Lascia vuoto per usare la posizione di default."
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Mostra in"
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Solo popup"
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Solo menu contestuale"
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Entrambi"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Salva come Riepilogo"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Archiviazione"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "L'archiviazione viene utilizzata per salvare informazioni sul punteggio di spam, i riepiloghi e le traduzioni di ogni messaggio."
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Dimensione archiviazione"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Svuota Archiviazione"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Sei sicuro di voler cancellare tutti i dati memorizzati (riepiloghi, segnalazioni spam, traduzioni)? L'azione è irreversibile."
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "$COUNT$ elementi cancellati.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "Per utilizzare le API di Google Gemini, è necessario avere una chiave API (API Key) di Google Gemini e scegliere un modello."
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "Per utilizzare le API di Claude, è necessario avere una chiave API (API Key) di Anthropic Claude e scegliere un modello."
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Tutte le intestazioni email"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking": {
|
||||
"message": "Nascondi l'output del ragionamento come impostazione predefinita"
|
||||
},
|
||||
"prefs_OptionText_thinking_summary": {
|
||||
"message": "Ragionamento"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking_info": {
|
||||
"message": "Controlla lo stato iniziale del ragionamento visualizzato sopra la risposta. Se selezionato, il ragionamento è compresso di default e può essere aperto con un clic. Se deselezionato, è invece aperto di default e può essere compresso con un clic. Il contenuto del ragionamento viene sempre conservato."
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "La lingua da utilizzare nella traduzioni delle email."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "I codici delle lingue da non tradurre se rilevate."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Elenco di esclusione indirizzi email"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "Le email provenienti da questi indirizzi non saranno inviate all'IA per l'analisi antispam."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Aggiungi un indirizzo email per riga, oppure separali con una virgola."
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "Il mittente è incluso nell'elenco di esclusione antispam degli indirizzi email."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Salta gli indirizzi in rubrica"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Se selezionato, le email provenienti da mittenti presenti nelle tue rubriche non verranno inviate all'IA per l'analisi antispam."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "Il mittente è un contatto presente in rubrica."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Il permesso di accesso alla rubrica è stato negato. Abilita nuovamente la funzione per concedere il permesso."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Errore durante la richiesta del permesso per la rubrica. Per favore, riprova."
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Fatto!"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget": {
|
||||
"message": "Budget per il pensiero esteso (token)"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget_Info": {
|
||||
"message": "Numero massimo di token che il modello può utilizzare per il pensiero esteso. Imposta a 0 per disabilitare. Quando abilitato, il valore della temperatura viene ignorato dall'API di Claude."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Forza output JSON"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Se selezionato, Ollama sarà forzato a restituire una risposta JSON valida. Questa opzione funziona solo con i modelli che supportano l'output strutturato."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Utilizzando $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Abilita riassunto IA automatico per l'anteprima messaggi"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Se selezionato, ThunderAI genererà e visualizzerà automaticamente dei riassunti IA sopra i messaggi quando vengono aperti. Nota: questo comporterà l'invio immediato di ogni messaggio visualizzato al servizio IA configurato."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "Riassunto ThunderAI"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Generazione riassunto IA..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "Impossibile generare il riassunto IA. Verifica le impostazioni e riprova."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Riassumi messaggi automaticamente"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Scegli se generare automaticamente i riassunti durante la visualizzazione dei messaggi. Richiede una connessione basata su API (non ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Visualizza riassunto in"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Scegli dove visualizzare il risultato del riassunto. La modalità 'Inline' mostra un banner direttamente nel pannello del messaggio. La modalità 'Finestra chat' apre la finestra della chat IA."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Lunghezza massima visualizzata"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Numero massimo di caratteri da mostrare nel riassunto inline. Imposta a 0 per nessun limite."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Rimuovi formattazione"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Rimuove la formattazione HTML e Markdown dal riassunto generato dall'IA, mostrando solo testo semplice."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Mostra altro"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Mostra meno"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "Panoramica ThunderAI"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "Riassunto IA"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Comprimi riassunto"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Generazione riassunto..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Impossibile generare il riassunto"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Clicca qui per generare un riassunto"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Il riassunto automatico richiede una connessione basata su API. Configura una connessione API nelle impostazioni di ThunderAI."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Aggiorna riassunto"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Aggiorna rapporto spam"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Elimina rapporto spam"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Elimina riassunto"
|
||||
},
|
||||
"generic_error_dismiss": {
|
||||
"message": "Ignora"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Traduci email"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Se selezionato, per la traduzione delle email verranno utilizzati il Modello e l'API specificati sotto, indipendentemente da quanto scelto nelle opzioni generali di ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Se selezionato, aggiunge un pulsante di traduzione nel corpo del messaggio."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Gestisci impostazioni traduzione"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Gestisci Impostazioni Traduzione"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "In questa pagina puoi modificare il prompt predefinito utilizzato per tradurre le email."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Testo del prompt attuale"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Opzioni Traduzione"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Traduci messaggi automaticamente"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Disabilitato"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Solo pulsante manuale"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "All'apertura dell'email"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Scegli quando tradurre i messaggi: disabilitato, solo al click del pulsante, o automaticamente all'apertura di un messaggio."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Pannello messaggio (inline)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Finestra chat"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Lunghezza massima della traduzione visualizzata"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Numero massimo di caratteri mostrati nella traduzione inline. 0 = nessun limite. Se impostato, il testo più lungo verrà troncato con un interruttore 'Mostra altro'."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Mostra altro"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Mostra meno"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Lingua di destinazione traduzione"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Lingua in cui tradurre le email. Se vuoto, utilizza l'impostazione della lingua predefinita."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Escludi lingue"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Elenco di codici lingua separati da virgola (es. en, fr, it) da saltare per la traduzione automatica. Se l'email è in una di queste lingue, non verrà tradotta automaticamente o il pulsante manuale non sarà mostrato."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "Prompt che descrive l'attività di traduzione:"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Traduzione in corso..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Clicca qui per tradurre questa email"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "Traduzione IA"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "La traduzione automatica richiede una connessione basata su API. Configura una connessione API nelle impostazioni di ThunderAI."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Aggiorna traduzione"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Elimina traduzione"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "Traduzione IA"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Traduzione fallita."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "La lingua di traduzione non è configurata. Imposta una lingua nelle impostazioni di Traduzione o una lingua predefinita nelle impostazioni Generali."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Traduzione saltata: lingua esclusa o identica alla destinazione."
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Punteggio spam — Clicca per vedere la spiegazione"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Riassunto da"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Traduzione da"
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "Alla ricezione dell'email"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Segnaposto"
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Ordine Menu"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Menu Popup"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Menu Contestuale"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Ordine menu salvato!"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Lettura"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Composizione"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Predefinito"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Speciale"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Personalizzato"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Lettura"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Composizione"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Sempre"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Gestisci impostazioni ordine menu"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Trascina gli elementi per riordinarli. Usa l'interruttore per mostrare o nascondere gli elementi in ogni menu."
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Elementi visibili"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Elementi nascosti"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Scegli un'icona"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(nessuna)"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,9 +26,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "分類する"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "要約する"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "翻訳する"
|
||||
},
|
||||
|
|
@ -428,12 +425,6 @@
|
|||
"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を設定してください。"
|
||||
},
|
||||
|
|
@ -566,11 +557,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "以下のテキストを丁寧さ、温かさ、フォーマルさ、自己主張、攻撃性の観点から分類し、各カテゴリのパーセンテージを示してください。カテゴリとスコアのみで、余分なコメントや他のテキストなしで返信してください。"
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "以下のメールを箇条書きリストに要約してください。"
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "以下のメールを次の言語に翻訳してください:"
|
||||
"message": "以下のメールを {%thunderai_translate_lang%} に翻訳してください。\n\nルール:\n- 件名と本文の両方を翻訳してください。\n- 結果は \"subject\"、\"body\"、\"status\" の3つのフィールドを持つ JSON オブジェクトとして返してください。\n- 翻訳が実行された場合、status は 1 になります。\n- メールが \"{%thunderai_translate_exclude_lang%}\" のいずれかの言語、または {%thunderai_translate_lang%} 言語で書かれている場合は、本文と件名に空の文字列を返し、status を -1 に設定してください。\n- JSON 以外の説明、メモ、テキストを追加しないでください。\n\nメール件名:{%mail_subject%}\n\nメール本文:{%mail_html_body%}\n\nJSON 形式のみで回答を生成してください。出力は JSON オブジェクトのみである必要があります。使用する JSON 形式の例は次のとおりです:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
|
||||
|
|
@ -959,12 +947,6 @@
|
|||
"no_string": {
|
||||
"message": "いいえ"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "タグを追加"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "スパムを分析"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "編集可能なカレンダーが見つかりません!"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Klasyfikuj"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Podsumuj to"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Przetłumacz to"
|
||||
},
|
||||
|
|
@ -411,12 +408,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Jeśli zaznaczone, użycie skrótu klawiszowego CTRL+ALT+A automatycznie wyśle zaznaczone polecenie z menu. W przeciwnym razie nazwa polecenia zostanie wyświetlona użytkownikowi, wymagając kolejnego naciśnięcia klawisza Enter, aby je wysłać."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menu: sortuj alfabetycznie"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Jeśli zaznaczone, polecenia w menu będą uporządkowane alfabetycznie."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Ustaw na 0, jeśli nie chcesz określać rozmiaru okna."
|
||||
},
|
||||
|
|
@ -525,11 +516,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Sklasyfikuj poniższy tekst pod względem uprzejmości, serdeczności, formalności, stanowczości, obraźliwości, podając procent dla każdej kategorii. Odpowiedz wyłącznie kategorią i wynikiem, bez dodatkowych komentarzy ani innego tekstu."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Podsumuj poniższy e-mail w formie listy punktowanej."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Przetłumacz poniższy e-mail na"
|
||||
"message": "Przetłumacz poniższą wiadomość e-mail na język {%thunderai_translate_lang%}.\n\nZasady:\n- Przetłumacz zarówno temat, jak i treść wiadomości.\n- Zwróć wynik jako obiekt JSON z trzema polami: \"subject\", \"body\" i \"status\".\n- Jeśli tłumaczenie zostało wykonane, status wynosi 1.\n- Jeśli wiadomość e-mail jest napisana w jednym z tych języków \"{%thunderai_translate_exclude_lang%}\" lub w języku {%thunderai_translate_lang%}, zwróć pusty ciąg znaków dla treści i tematu oraz ustaw status na -1.\n- Nie dodawaj wyjaśnień, notatek ani żadnego tekstu poza formatem JSON.\n\nTemat wiadomości: {%mail_subject%}\n\nTreść wiadomości: {%mail_html_body%}\n\nWygeneruj odpowiedź wyłącznie w formacie JSON. Wynikiem powinien być tylko obiekt JSON. Oto przykład formatu JSON, którego należy użyć:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Odpowiedz wyłącznie wymaganym tekstem, bez dodatkowych komentarzy ani innego tekstu."
|
||||
|
|
@ -834,9 +822,6 @@
|
|||
"spamfilter_no_reports": {
|
||||
"message": "Nie przeskanowano jeszcze żadnych wiadomości pod kątem spamu. Tutaj znajdziesz listę ostatnich 100 raportów o spamie tylko dla bieżącej sesji."
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Dodaj tagi"
|
||||
},
|
||||
"customPrompts_form_label_use_diff_viewer_title": {
|
||||
"message": "Widok zmian może zostać wybrany, kiedy wybrana akcja to \"Tekst zastępczy\"."
|
||||
},
|
||||
|
|
@ -867,9 +852,6 @@
|
|||
"prefs_OptionText_calendar_enforce_timezone": {
|
||||
"message": "Wymuś konkretną strefę czasową"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analizuj pod kątem spamu"
|
||||
},
|
||||
"placeholder_account_email_address": {
|
||||
"message": "Adres email konta"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Classificar"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Resuma isso"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traduza isso"
|
||||
},
|
||||
|
|
@ -411,12 +408,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter_info": {
|
||||
"message": "Se marcado, usar o atalho de teclado CTRL+ALT+A enviará automaticamente o prompt destacado do menu. Caso contrário, o nome do prompt será exibido para o usuário, exigindo outra pressão da tecla Enter para enviá-lo."
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Menu: ordenar alfabeticamente"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Se marcado, os prompts no menu serão ordenados alfabeticamente."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Defina como 0 se você não quiser especificar o tamanho da janela."
|
||||
},
|
||||
|
|
@ -525,11 +516,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Classifique o texto a seguir em termos de Educação, Calor, Formalidade, Assertividade e Ofensividade, atribuindo uma porcentagem para cada categoria. Responda apenas com as categorias e as pontuações, sem comentários adicionais ou outros textos."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Resuma o e-mail a seguir em uma lista de tópicos."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Traduza o e-mail a seguir para"
|
||||
"message": "Traduza o e-mail abaixo para o idioma {%thunderai_translate_lang%}.\n\nRegras:\n- Traduza tanto o assunto quanto o corpo do e-mail.\n- Retorne o resultado como um objeto JSON com três campos: \"subject\", \"body\" e \"status\".\n- Se a tradução for realizada, o status é igual a 1.\n- Se o e-mail estiver escrito em um destes idiomas \"{%thunderai_translate_exclude_lang%}\" ou no idioma {%thunderai_translate_lang%}, retorne uma string vazia para o corpo e o assunto e defina o status como -1.\n- Não adicione explicações, notas ou qualquer texto fora do JSON.\n\nAssunto do e-mail: {%mail_subject%}\n\nCorpo do e-mail: {%mail_html_body%}\n\nGere uma resposta apenas em formato JSON. A saída deve ser apenas um objeto JSON. Aqui está um exemplo do formato JSON a ser usado:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Responda apenas com o texto necessário e sem comentários adicionais ou outros textos."
|
||||
|
|
|
|||
|
|
@ -113,9 +113,6 @@
|
|||
"customPrompts_form_label_Name": {
|
||||
"message": "Nome"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Resumir isto"
|
||||
},
|
||||
"customPrompts_add_to_menu_composing": {
|
||||
"message": "A compor um email"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -35,9 +35,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Clasifica"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Sumarizează"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Tradu"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -227,9 +227,6 @@
|
|||
"prefsInfoDesc_3": {
|
||||
"message": "Для использования интеграции с Ollama вам необходимо настроить локальный сервер Ollama. После запуска сервера введите его адрес в указанное поле в приложении. Для обеспечения корректной связи между ThunderAI и сервером Ollama не забудьте установить OLLAMA_ORIGINS=moz-extension://*."
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Подвести итоги"
|
||||
},
|
||||
"customPrompts_close_button": {
|
||||
"message": "Кнопка «Закрыть»"
|
||||
},
|
||||
|
|
@ -422,12 +419,6 @@
|
|||
"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, если вы не хотите указывать размер окна."
|
||||
},
|
||||
|
|
@ -554,11 +545,8 @@
|
|||
"prompt_classify_full_text": {
|
||||
"message": "Классифицируйте следующий текст с точки зрения вежливости, теплоты, формальности, настойчивости, оскорбительности, указав процентное соотношение для каждой категории. В ответе укажите только категорию и оценку, без доп. комментариев или др. текста."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Резюмируйте следующее письмо в виде списка основных пунктов."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Переведите следующее письмо на"
|
||||
"message": "Переведите указанное ниже электронное письмо на язык {%thunderai_translate_lang%}.\n\nПравила:\n- Переведите и тему, и текст письма.\n- Верните результат в виде JSON-объекта с тремя полями: \"subject\", \"body\" и \"status\".\n- Если перевод выполнен, статус равен 1.\n- Если письмо написано на одном из этих языков \"{%thunderai_translate_exclude_lang%}\" или на языке {%thunderai_translate_lang%}, верните пустую строку для тела и темы и установите статус -1.\n- Не добавляйте никаких объяснений, заметок или любого текста вне JSON.\n\nТема письма: {%mail_subject%}\n\nТекст письма: {%mail_html_body%}\n\nСгенерируйте ответ только в формате JSON. На выходе должен быть только JSON-объект. Вот пример формата JSON, который необходимо использовать:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Отвечайте только нужным текстом, без лишних комментариев и прочего."
|
||||
|
|
@ -920,12 +908,6 @@
|
|||
"no_string": {
|
||||
"message": "Нет"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Добавить теги"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Анализ на предмет спама"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Редактируемый календарь не найден!"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -68,11 +68,8 @@
|
|||
"prefs_OptionText_chatgpt_win_width": {
|
||||
"message": "Bredd"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Sammanfatta detta"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Översätt detta"
|
||||
"message": "Översätt"
|
||||
},
|
||||
"more_info_string": {
|
||||
"message": "Mer information"
|
||||
|
|
@ -506,12 +503,6 @@
|
|||
"prefs_OptionText_dynamic_menu_force_enter": {
|
||||
"message": "Meny: skicka omedelbart prompt"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "Meny: ordna alfabetiskt"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "Om markerat kommer promptar i menyn att ordnas alfabetiskt."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_dims_info": {
|
||||
"message": "Ställ in värdet till 0 om du inte vill ange fönsterstorleken."
|
||||
},
|
||||
|
|
@ -635,9 +626,6 @@
|
|||
"prompt_rewrite_formal_full_text": {
|
||||
"message": "Skriv om följande text för att göra den mer formell. Svara endast med den omskrivna texten och utan extra kommentarer eller annan text."
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "Sammanfatta följande e-postmeddelande i en punktlista."
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "Översätt e-postmeddelandet nedan till {%thunderai_translate_lang%}.\n\nRegler:\n- Översätt både ämnet och brödtexten.\n- Returnera resultatet som ett JSON-objekt med tre fält: \"subject\", \"body\" och \"status\".\n- Om översättningen har gjorts är statusen lika med 1.\n- Om e-postmeddelandet är skrivet på ett av dessa språk \"{%thunderai_translate_exclude_lang%}\" eller på språket {%thunderai_translate_lang%}, returnera en tom sträng för brödtexten och ämnet och sätt statusen till -1.\n- Lägg inte till förklaringar, anteckningar eller någon text utanför JSON.\n\nE-postämne: {%mail_subject%}\n\nE-postbrödtext: {%mail_html_body%}\n\nGenerera ett svar endast i JSON-format. Utdata ska endast vara ett JSON-objekt. Här är ett exempel på JSON-formatet som ska användas:\n{\n\"subject\": \"ämnesöversättning\",\n\"body\": \"översättning av brödtext\",\n\"status\": \"statusresultat\"\n}"
|
||||
},
|
||||
|
|
@ -651,7 +639,7 @@
|
|||
"message": "Om markerat kommer ett alternativ att inkluderas i menyn för att tillämpa taggar på e-postmeddelanden."
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Lägg till taggar i det här e-postmeddelandet"
|
||||
"message": "Lägg till taggar"
|
||||
},
|
||||
"prompt_proofread_this": {
|
||||
"message": "Korrekturläs detta e-postmeddelande"
|
||||
|
|
@ -753,7 +741,7 @@
|
|||
"message": "Aktuell prompttext"
|
||||
},
|
||||
"prompt_spamfilter": {
|
||||
"message": "Upptäck skräppostmeddelanden"
|
||||
"message": "Analysera för skräppost"
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Alternativ för skräppostfilter"
|
||||
|
|
@ -797,12 +785,6 @@
|
|||
"no_string": {
|
||||
"message": "Nej"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Lägg till taggar"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analysera för skräppost"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Ingen redigerbar kalender hittades!"
|
||||
},
|
||||
|
|
@ -1207,7 +1189,7 @@
|
|||
"message": "Varje ändring sparas omedelbart."
|
||||
},
|
||||
"AccountSelector_Spamfilter": {
|
||||
"message": "Välj de konton där skräppostfiltret är aktiverat"
|
||||
"message": "Välj de konton där det automatiska skräppostfiltret är aktiverat"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_project": {
|
||||
"message": "ChatGPT webbprojekt"
|
||||
|
|
@ -1285,7 +1267,7 @@
|
|||
"message": "Sammanfattningsalternativ"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Sammanfatta det här e-postmeddelandet eller dessa e-postmeddelanden"
|
||||
"message": "Sammanfatta"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Ge en kortfattad sammanfattning av följande e-postmeddelanden. Sammanfattningen bör vara högst 3–5 meningar lång och fånga huvudpunkterna. Skriv i enkla stycken utan punktlistor, listor eller markdownformatering:\n\n"
|
||||
|
|
@ -1335,9 +1317,6 @@
|
|||
"Summarize_prompt_text_title": {
|
||||
"message": "Aktuell prompttext"
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "Sammanfatta"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Tryck på knappen nedan för att ge den aktuella värden behörighet att undvika CORS-problem."
|
||||
},
|
||||
|
|
@ -1562,9 +1541,6 @@
|
|||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Språkkoden ska inte översättas när den hittas."
|
||||
},
|
||||
"context_menu_mzta-translate": {
|
||||
"message": "Översätt"
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Översätt e-post"
|
||||
},
|
||||
|
|
@ -1686,7 +1662,7 @@
|
|||
"message": "Om markerat kommer Ollama att tvingas returnera ett giltigt JSON-svar. Det här alternativet fungerar bara med modeller som stöder strukturerad utdata."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "[Använder $1]",
|
||||
"message": "Använder $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
|
|
@ -1725,5 +1701,98 @@
|
|||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Fel vid begäran om behörighet till adressboken. Försök igen."
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Klar!"
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Alla e-postrubriker"
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "Avsändaren finns i listan över e-postadresser som inte ska skickas med skräppost."
|
||||
},
|
||||
"show_in": {
|
||||
"message": "Visa i"
|
||||
},
|
||||
"show_in_popup": {
|
||||
"message": "Popup endast"
|
||||
},
|
||||
"show_in_context": {
|
||||
"message": "Kontextmeny endast"
|
||||
},
|
||||
"show_in_both": {
|
||||
"message": "Båda"
|
||||
},
|
||||
"menu_order_title": {
|
||||
"message": "Menyordning"
|
||||
},
|
||||
"menu_order_popup_list_title": {
|
||||
"message": "Popup meny"
|
||||
},
|
||||
"menu_order_context_list_title": {
|
||||
"message": "Kontextmeny"
|
||||
},
|
||||
"menu_order_saved": {
|
||||
"message": "Menyordning sparad!"
|
||||
},
|
||||
"menu_order_tab_reading": {
|
||||
"message": "Läser"
|
||||
},
|
||||
"menu_order_tab_composing": {
|
||||
"message": "Skriver"
|
||||
},
|
||||
"menu_order_badge_default": {
|
||||
"message": "Standard"
|
||||
},
|
||||
"menu_order_badge_special": {
|
||||
"message": "Special"
|
||||
},
|
||||
"menu_order_badge_custom": {
|
||||
"message": "Anpassad"
|
||||
},
|
||||
"menu_order_type_reading": {
|
||||
"message": "Läser"
|
||||
},
|
||||
"menu_order_type_composing": {
|
||||
"message": "Skriver"
|
||||
},
|
||||
"menu_order_type_always": {
|
||||
"message": "Alltid"
|
||||
},
|
||||
"menu_order_btn_label": {
|
||||
"message": "Hantera menyordningsinställningar"
|
||||
},
|
||||
"menu_order_info": {
|
||||
"message": "Dra och släpp objekt för att ändra ordningen på dem. Använd växlingsknappen för att visa eller dölja objekt i varje meny."
|
||||
},
|
||||
"menu_order_active_items": {
|
||||
"message": "Synliga objekt"
|
||||
},
|
||||
"menu_order_hidden_items": {
|
||||
"message": "Dolda objekt"
|
||||
},
|
||||
"menu_order_icon_label": {
|
||||
"message": "Välj en ikon"
|
||||
},
|
||||
"menu_order_icon_none": {
|
||||
"message": "(ingen)"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking": {
|
||||
"message": "Fäll in tankeblock som standard"
|
||||
},
|
||||
"prefs_OptionText_hide_thinking_info": {
|
||||
"message": "Styr det initiala tillståndet för tankeblocket som visas ovanför svaret. Om markerat är blocket hopfällt som standard och kan öppnas med ett klick. Om det avmarkeras är blocket öppet som standard och kan hopfällas med ett klick. Tankeinnehållet bevaras alltid."
|
||||
},
|
||||
"prefs_OptionText_thinking_summary": {
|
||||
"message": "Tänker"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget": {
|
||||
"message": "Utökad tankebudget (tokens)"
|
||||
},
|
||||
"prefs_OptionText_anthropic_extended_thinking_budget_Info": {
|
||||
"message": "Maximalt antal tokens som modellen kan spendera på utökat tänkande. Ställ in på 0 för att inaktivera utökat tänkande. När det är aktiverat ignoreras temperaturvärdet av Claude API."
|
||||
},
|
||||
"generic_error_dismiss": {
|
||||
"message": "Avfärda"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,4 @@
|
|||
{
|
||||
"prompt_summarize_this": {
|
||||
"message": "总结一下这个"
|
||||
},
|
||||
"prompt_reply": {
|
||||
"message": "回复此电子邮件"
|
||||
},
|
||||
|
|
@ -317,9 +314,6 @@
|
|||
"prefs_Connection_type_OpenAI_Comp_API": {
|
||||
"message": "OpenAI 兼容的 API"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "如果勾选此项,菜单中的提示将按字母顺序排列。"
|
||||
},
|
||||
"chatgpt_win_send": {
|
||||
"message": "发送"
|
||||
},
|
||||
|
|
@ -407,9 +401,6 @@
|
|||
"ChatGPT_Models_Error_fetching": {
|
||||
"message": "尝试获取 ChatGPT 模型时出错"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "菜单:按字母顺序排列"
|
||||
},
|
||||
"prefsInfoDesc_2": {
|
||||
"message": "要使用 ChatGPT API,您需要一个 OpenAI ChatGPT API 密钥并且必须选择一个模型。"
|
||||
},
|
||||
|
|
@ -626,9 +617,6 @@
|
|||
"addtags_dialog_title": {
|
||||
"message": "为电子邮件添加标签"
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "将以下电子邮件总结为要点列表。"
|
||||
},
|
||||
"prompt_rewrite_formal_full_text": {
|
||||
"message": "重写以下文字,使其更加正式。回复时只使用重写的文字,不要添加任何额外的评论或其他文字。"
|
||||
},
|
||||
|
|
@ -827,12 +815,6 @@
|
|||
"Report_Date": {
|
||||
"message": "报告日期"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "添加标签"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "分析垃圾邮件"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "未找到可编辑的日历!"
|
||||
},
|
||||
|
|
@ -1099,12 +1081,6 @@
|
|||
"Valid": {
|
||||
"message": "有效的"
|
||||
},
|
||||
"context_menu_mzta-summarize": {
|
||||
"message": "总结"
|
||||
},
|
||||
"context_menu_mzta-translate": {
|
||||
"message": "翻译"
|
||||
},
|
||||
"hyprland_warning": {
|
||||
"message": "如果您在打开 AI 聊天窗口时遇到问题,请尝试将高度和宽度值设置为 0。此问题可能在某些 Linux 环境下出现,例如在使用 Hyprland 时。"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -32,9 +32,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "分類"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "摘要這段"
|
||||
},
|
||||
"prompt_this": {
|
||||
"message": "提示這段"
|
||||
},
|
||||
|
|
@ -414,9 +411,6 @@
|
|||
"customPrompts_ExportAll": {
|
||||
"message": "匯出所有提示"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "選單:按字母排序"
|
||||
},
|
||||
"prefs_API_Host": {
|
||||
"message": "主機位址"
|
||||
},
|
||||
|
|
@ -429,9 +423,6 @@
|
|||
"prefs_API_Host_Info": {
|
||||
"message": "類似於"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "新增標籤"
|
||||
},
|
||||
"placeholder_mail_subject": {
|
||||
"message": "郵件主旨"
|
||||
},
|
||||
|
|
@ -626,9 +617,6 @@
|
|||
"SpamReport_Title": {
|
||||
"message": "垃圾郵件過濾報告"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "檢測垃圾郵件"
|
||||
},
|
||||
"apiwebchat_use_this_answer": {
|
||||
"message": "使用這個答案"
|
||||
},
|
||||
|
|
@ -668,7 +656,7 @@
|
|||
"message": "回覆以下郵件。僅回覆所需內容,不要提供任何註解或其他文字。"
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "將以下電子郵件翻譯成"
|
||||
"message": "請將以下電子郵件翻譯成 **{%thunderai_translate_lang%}**。\n\n**規則:**\n- 同時翻譯主題(Subject)與正文(Body)。\n- 以 JSON 物件格式回傳結果,包含三個欄位:\"subject\"、\"body\" 以及 \"status\"。\n- 如果完成翻譯,status 等於 1。\n- 如果郵件是以 \"{%thunderai_translate_exclude_lang%}\" 其中之一的語言或 {%thunderai_translate_lang%} 語言編寫,請將 body 和 subject 設為空字串,並將 status 設為 -1。\n- 請勿在 JSON 之外添加任何說明、備註或文字。\n\n郵件主題:{%mail_subject%}\n\n郵件正文:{%mail_html_body%}\n\n請僅以 JSON 格式生成回應。輸出應僅包含一個 JSON 物件。以下是要使用的 JSON 格式範例:\n{\n\"subject\": \"subject translation\",\n\"body\": \"body translation\",\n\"status\": \"status result\"\n}"
|
||||
},
|
||||
"prompt_rewrite_full_text": {
|
||||
"message": "請重寫以下文字,使其更有禮貌。僅回覆重寫的文字,不要提供任何額外的註解或其他文字。"
|
||||
|
|
@ -981,9 +969,6 @@
|
|||
"prompt_reply_additional_text": {
|
||||
"message": "不要在回覆中加入主旨。"
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "將以下電子郵件總結為要點清單。"
|
||||
},
|
||||
"prefs_OptionText_placeholders_use_default_value": {
|
||||
"message": "佔位符:使用預設值"
|
||||
},
|
||||
|
|
@ -1011,9 +996,6 @@
|
|||
"spamfilter_threshold_zero": {
|
||||
"message": "垃圾郵件閾值為零!您將把所有郵件標記為垃圾郵件!"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "如果勾選,選單中的提示將按字母順序排列。"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_Info": {
|
||||
"message": "如果勾選,ThunderAI 將自動將垃圾郵件移至垃圾郵件資料夾。"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ if (worker) {
|
|||
const integration_prefix = integration;
|
||||
const options_config = integration_options_config[integration];
|
||||
|
||||
let prefsToGet = { do_debug: prefs_default.do_debug };
|
||||
let prefsToGet = { do_debug: prefs_default.do_debug, hide_thinking: prefs_default.hide_thinking };
|
||||
for (const key in options_config) {
|
||||
prefsToGet[`${integration_prefix}_${key}`] = prefs_default[`${integration_prefix}_${key}`];
|
||||
}
|
||||
|
|
@ -115,6 +115,9 @@ if (worker) {
|
|||
case 'anthropic': llmName = "Claude"; break;
|
||||
}
|
||||
messagesArea.setLLMName(llmName);
|
||||
messagesArea.setHideThinking(!!prefs_api.hide_thinking);
|
||||
|
||||
document.title += " [" + llmName + " | " + decodeURIComponent(prompt_name) + "]";
|
||||
|
||||
document.title += " [" + llmName + " | " + decodeURIComponent(prompt_name) + "]";
|
||||
|
||||
|
|
@ -153,7 +156,8 @@ if (worker) {
|
|||
anthropic: [
|
||||
{ key: 'system_prompt', labelKey: 'Anthropic_System_Prompt', type: 'string' },
|
||||
{ key: 'max_tokens', labelKey: 'prefs_OptionText_anthropic_max_tokens', type: 'number_gt_zero' },
|
||||
{ key: 'temperature', labelKey: 'prefs_api_temperature', type: 'string' }
|
||||
{ key: 'temperature', labelKey: 'prefs_api_temperature', type: 'string' },
|
||||
{ key: 'extended_thinking_budget', labelKey: 'prefs_OptionText_anthropic_extended_thinking_budget', type: 'number_gt_zero' }
|
||||
]
|
||||
};
|
||||
|
||||
|
|
@ -238,13 +242,17 @@ worker.onmessage = async function(event) {
|
|||
messagesArea.handleNewToken(payload.token);
|
||||
messageInput.setStatusMessage(browser.i18n.getMessage("apiwebchat_receiving_data") + '...');
|
||||
break;
|
||||
case 'newThinkingToken':
|
||||
messagesArea.handleNewThinkingToken(payload.token);
|
||||
messageInput.setStatusMessage(browser.i18n.getMessage("apiwebchat_receiving_data") + '...');
|
||||
break;
|
||||
case 'tokensDone':
|
||||
await messagesArea.handleTokensDone(promptData);
|
||||
messageInput.enableInput();
|
||||
break;
|
||||
case 'error':
|
||||
messagesArea.appendBotMessage(payload,'error');
|
||||
messageInput.enableInput();
|
||||
messageInput.enableInput(false);
|
||||
break;
|
||||
default:
|
||||
console.error('[ThunderAI] Unknown event type from API worker:', type);
|
||||
|
|
@ -292,7 +300,7 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
break;
|
||||
case "api_error":
|
||||
messagesArea.appendBotMessage(message.error,'error');
|
||||
messageInput.enableInput();
|
||||
messageInput.enableInput(false);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -74,6 +74,26 @@ messagesInputStyle.textContent = `
|
|||
display: none;
|
||||
vertical-align: middle;
|
||||
}
|
||||
#statusLoggerText{
|
||||
font-weight: 600;
|
||||
}
|
||||
#statusLogger.status-working{
|
||||
border-color: #2196F3;
|
||||
background: #E3F2FD;
|
||||
color: #1565C0;
|
||||
}
|
||||
#statusLogger.status-done{
|
||||
border-color: #4CAF50;
|
||||
background: #E8F5E9;
|
||||
color: #2E7D32;
|
||||
}
|
||||
@keyframes statusFadeOut {
|
||||
from { opacity: 1; }
|
||||
to { opacity: 0; }
|
||||
}
|
||||
#statusLogger.status-fadeout{
|
||||
animation: statusFadeOut 0.5s ease-out forwards;
|
||||
}
|
||||
#mzta-custom_text{
|
||||
padding:10px;
|
||||
width:50%;
|
||||
|
|
@ -134,6 +154,16 @@ messagesInputStyle.textContent = `
|
|||
background: #212121;
|
||||
color: #ffffff;
|
||||
}
|
||||
#statusLogger.status-working{
|
||||
border-color: #64B5F6;
|
||||
background: #1A3A5C;
|
||||
color: #90CAF9;
|
||||
}
|
||||
#statusLogger.status-done{
|
||||
border-color: #81C784;
|
||||
background: #1B3D1E;
|
||||
color: #A5D6A7;
|
||||
}
|
||||
}
|
||||
`;
|
||||
messageInputTemplate.content.appendChild(messagesInputStyle);
|
||||
|
|
@ -228,6 +258,7 @@ messageInputTemplate.content.appendChild(customDiv);
|
|||
class MessageInput extends HTMLElement {
|
||||
|
||||
model = '';
|
||||
_doneTimeout = null;
|
||||
_customTextArray = [];
|
||||
_currentCustomTextIndex = 0;
|
||||
|
||||
|
|
@ -285,7 +316,7 @@ class MessageInput extends HTMLElement {
|
|||
this._messageInputField.value = '';
|
||||
}
|
||||
|
||||
enableInput() {
|
||||
enableInput(showDone = true) {
|
||||
// console.log("[ThunderAI] enableInput");
|
||||
this._messageInputField.value = '';
|
||||
this._messageInputField.removeAttribute('disabled');
|
||||
|
|
@ -294,21 +325,56 @@ class MessageInput extends HTMLElement {
|
|||
this._stopButton.setAttribute('disabled', 'disabled');
|
||||
this._stopButton.style.display = 'none';
|
||||
this._stopButton.title = browser.i18n.getMessage("chagpt_api_send_button") + ": " + this.model;
|
||||
this.hideStatusMessage();
|
||||
this.setStatusMessage('');
|
||||
if (showDone) {
|
||||
this.showDoneStatus();
|
||||
} else {
|
||||
this.hideStatusMessage();
|
||||
this.setStatusMessage('');
|
||||
}
|
||||
}
|
||||
|
||||
setStatusMessage(message) {
|
||||
this._statusLoggerText.textContent = message;
|
||||
}
|
||||
|
||||
showStatusMessage() {
|
||||
showStatusMessage(state = 'working') {
|
||||
if (this._doneTimeout) {
|
||||
clearTimeout(this._doneTimeout);
|
||||
this._doneTimeout = null;
|
||||
}
|
||||
this._setStatusClass('status-' + state);
|
||||
this._statusLogger.style.display = 'flex';
|
||||
}
|
||||
|
||||
hideStatusMessage() {
|
||||
this._statusLogger.style.display = 'none';
|
||||
this._statusLoggerImg.style.display = 'none';
|
||||
this._setStatusClass(null);
|
||||
}
|
||||
|
||||
_setStatusClass(className) {
|
||||
this._statusLogger.classList.remove('status-working', 'status-done', 'status-fadeout');
|
||||
if (className) {
|
||||
this._statusLogger.classList.add(className);
|
||||
}
|
||||
}
|
||||
|
||||
showDoneStatus() {
|
||||
if (this._doneTimeout) {
|
||||
clearTimeout(this._doneTimeout);
|
||||
}
|
||||
this._statusLoggerImg.style.display = 'none';
|
||||
this.setStatusMessage(browser.i18n.getMessage('apiwebchat_done'));
|
||||
this._setStatusClass('status-done');
|
||||
this._statusLogger.style.display = 'flex';
|
||||
|
||||
this._doneTimeout = setTimeout(() => {
|
||||
this._statusLogger.classList.add('status-fadeout');
|
||||
this._doneTimeout = setTimeout(() => {
|
||||
this.hideStatusMessage();
|
||||
this.setStatusMessage('');
|
||||
}, 500);
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
_handleKeyDown(event) {
|
||||
|
|
|
|||
|
|
@ -194,6 +194,25 @@ messagesAreaStyle.textContent = `
|
|||
display: flex;
|
||||
}
|
||||
|
||||
/* Thinking block styles */
|
||||
details.thinking-block {
|
||||
border-left: 3px solid #bbb;
|
||||
background: #f7f7f7;
|
||||
padding: 0.3em 0.6em;
|
||||
margin: 0 0 0.6em 0;
|
||||
font-size: 0.9em;
|
||||
color: #555;
|
||||
border-radius: 4px;
|
||||
}
|
||||
details.thinking-block > summary {
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
}
|
||||
details.thinking-block .thinking-content {
|
||||
white-space: pre-wrap;
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
/* Dark mode styles */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.added {
|
||||
|
|
@ -202,6 +221,11 @@ messagesAreaStyle.textContent = `
|
|||
.removed {
|
||||
background-color:rgb(90, 0, 0);
|
||||
}
|
||||
details.thinking-block {
|
||||
background: #2a2a2a;
|
||||
color: #bbb;
|
||||
border-left-color: #555;
|
||||
}
|
||||
}
|
||||
`;
|
||||
messagesAreaTemplate.content.appendChild(messagesAreaStyle);
|
||||
|
|
@ -218,6 +242,8 @@ class MessagesArea extends HTMLElement {
|
|||
constructor() {
|
||||
super();
|
||||
this.accumulatingMessageEl = null;
|
||||
this.thinkingAccumulator = '';
|
||||
this.hideThinking = false;
|
||||
|
||||
const shadowRoot = this.attachShadow({ mode: 'open' });
|
||||
shadowRoot.appendChild(messagesAreaTemplate.content.cloneNode(true));
|
||||
|
|
@ -248,6 +274,14 @@ class MessagesArea extends HTMLElement {
|
|||
this.llmName = llmName;
|
||||
}
|
||||
|
||||
setHideThinking(val) {
|
||||
this.hideThinking = !!val;
|
||||
}
|
||||
|
||||
handleNewThinkingToken(token) {
|
||||
this.thinkingAccumulator += token;
|
||||
}
|
||||
|
||||
async handleTokensDone(promptData = null) {
|
||||
this.flushAccumulatingMessage();
|
||||
await this.addActionButtons(promptData);
|
||||
|
|
@ -559,6 +593,32 @@ class MessagesArea extends HTMLElement {
|
|||
fullText += tokenEl.textContent;
|
||||
});
|
||||
|
||||
// If an unterminated <think> block is present (mid-stream), defer the
|
||||
// markdown render until the closing tag arrives — tokens stay in the DOM
|
||||
// as raw fading spans, but the partial <think> content is never sent
|
||||
// through markdown-it or promoted to the final thinking block.
|
||||
const openThink = fullText.match(/<think>/i);
|
||||
const closeThink = fullText.match(/<\/think>/i);
|
||||
if (openThink && !closeThink) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Extract inline <think>...</think> blocks (Ollama / OpenAI Comp) and strip them from fullText.
|
||||
let inlineThinking = '';
|
||||
const thinkRegex = /<think>([\s\S]*?)<\/think>/gi;
|
||||
let match;
|
||||
while ((match = thinkRegex.exec(fullText)) !== null) {
|
||||
inlineThinking += (inlineThinking ? '\n' : '') + match[1];
|
||||
}
|
||||
fullText = fullText.replace(thinkRegex, '').replace(/^\s+/, '');
|
||||
|
||||
// Combined thinking content: worker-side (Anthropic) + inline (<think> tags)
|
||||
let combinedThinking = this.thinkingAccumulator;
|
||||
if (inlineThinking) {
|
||||
combinedThinking += (combinedThinking ? '\n' : '') + inlineThinking;
|
||||
}
|
||||
this.thinkingAccumulator = '';
|
||||
|
||||
// Convert Markdown to DOM nodes using the markdown-it library
|
||||
const md = window.markdownit();
|
||||
const html = md.render(fullText);
|
||||
|
|
@ -577,6 +637,23 @@ class MessagesArea extends HTMLElement {
|
|||
this.accumulatingMessageEl.removeChild(this.accumulatingMessageEl.firstChild);
|
||||
}
|
||||
|
||||
// Prepend thinking block (if any). hide_thinking controls the initial
|
||||
// open/collapsed state: true -> collapsed, false -> open. Users can always
|
||||
// toggle with a click.
|
||||
if (combinedThinking) {
|
||||
const details = document.createElement('details');
|
||||
details.classList.add('thinking-block');
|
||||
if (!this.hideThinking) details.open = true;
|
||||
const summary = document.createElement('summary');
|
||||
summary.textContent = browser.i18n.getMessage('prefs_OptionText_thinking_summary') || 'Thinking';
|
||||
const content = document.createElement('div');
|
||||
content.classList.add('thinking-content');
|
||||
content.textContent = combinedThinking;
|
||||
details.appendChild(summary);
|
||||
details.appendChild(content);
|
||||
this.accumulatingMessageEl.appendChild(details);
|
||||
}
|
||||
|
||||
// Append new nodes
|
||||
Array.from(doc.body.childNodes).forEach(node => {
|
||||
this.accumulatingMessageEl.appendChild(node);
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ taTranslationStore.saveTranslation()
|
|||
| `js/mzta-placeholders.js` | Placeholder definitions and resolution logic |
|
||||
| `js/mzta-utils.js` | General utilities (email parsing, storage helpers, etc.) |
|
||||
| `js/mzta-utils-prompt.js` | Prompt-specific utilities (text truncation, lang injection, `buildSummaryPrompt()` for unified summary prompt assembly, `buildTranslationPrompt()` for translation prompt assembly) |
|
||||
| `js/mzta-compose-script.js` | Content script for compose and message display: injects AI response into compose window, renders unified toolbar (spam badge, summary/translation trigger buttons) and content panels (spam explanation, summary, translation) in message display via `#mzta-container` |
|
||||
| `js/mzta-compose-script.js` | Content script for compose and message display: injects AI response into compose window, renders unified toolbar (spam badge, summary/translation trigger buttons) and content panels (generic error, spam explanation, summary, translation) in message display via `#mzta-container` |
|
||||
| `js/mzta-chatgpt.js` | ChatGPT Web integration (opens browser window, reads DOM) |
|
||||
| `js/mzta-special-commands.js` | Handles special prompt actions (add_tags, calendar, task) |
|
||||
| `js/mzta-spamreport.js` | Spam filter logic |
|
||||
|
|
@ -171,7 +171,7 @@ taTranslationStore.saveTranslation()
|
|||
| `js/mzta-summarystore.js` | Summary-specific storage wrapper (`taSummaryStore` class) with caching, truncation, and processing-state tracking |
|
||||
| `js/mzta-translationstore.js` | Translation-specific storage wrapper (`taTranslationStore` class) with caching, truncation, and processing-state tracking |
|
||||
| `js/mzta-working-status.js` | Visual status indicator during AI processing |
|
||||
| `js/mzta-addatags-exclusion-list.js` | Tag exclusion list management |
|
||||
| `js/mzta-addtags-exclusion-list.js` | Tag exclusion list management |
|
||||
| `js/mzta-placeholders-autocomplete.js` | Autocomplete for placeholders in prompt editor |
|
||||
|
||||
## API Modules (`js/api/`)
|
||||
|
|
@ -210,6 +210,7 @@ Each subdirectory is a self-contained settings/UI page for a specific feature:
|
|||
| `customdataplaceholders/` | Custom placeholder editor |
|
||||
| `get-calendar-event/` | Calendar event extraction settings |
|
||||
| `get-task/` | Task creation settings |
|
||||
| `menu_order/` | Drag-and-drop reordering and visibility control for popup and context menus |
|
||||
| `spamfilter/` | Spam filter settings |
|
||||
| `summarize/` | Email summarization settings |
|
||||
| `translate/` | Email translation settings |
|
||||
|
|
|
|||
|
|
@ -28,9 +28,12 @@ Prompts are the core user-facing feature of ThunderAI. Each prompt defines an AI
|
|||
|
||||
| Property | Type | Description |
|
||||
|----------|------|-------------|
|
||||
| `enabled` | number | `0` = hidden, `1` = shown in popup |
|
||||
| `position_display` | number | Sort order in reading view |
|
||||
| `position_compose` | number | Sort order in compose view |
|
||||
| `enabled` | number | `0` = hidden, `1` = shown in menus |
|
||||
| `position_display` | number | Sort order for the popup menu in reading view |
|
||||
| `position_compose` | number | Sort order for the popup menu in compose view |
|
||||
| `position_context` | number | Sort order for the context menu |
|
||||
| `show_in` | string | `"popup"` = popup only, `"context"` = context menu only, `"both"` = both, `"none"` = hidden from all menus. Default: `"popup"` for default/custom prompts, `"both"` for special prompts |
|
||||
| `custom_icon` | string | Filename (with extension) of an icon in `images/context_menu/custom/` used as the context-menu icon. Empty string = no icon. Only used for non-special prompts (special prompts use their hard-coded icons in `specialPromptToContextMenuID`). Selectable from a dropdown on the Menu Order page, context-menu tab. |
|
||||
|
||||
### Per-Prompt API Override Properties
|
||||
|
||||
|
|
@ -59,6 +62,70 @@ Some prompts trigger additional Thunderbird actions beyond just sending text to
|
|||
|
||||
These special prompts can have their own dedicated API integration settings (configured in the Options page). The list of these special prompts is in `options/mzta-options-default.js` as `special_prompts_with_integration`.
|
||||
|
||||
## Menu System
|
||||
|
||||
### Popup Menu
|
||||
- Displays prompts filtered by `show_in` (`"popup"` or `"both"`) and by tab context (`type` property: reading view shows types `0`+`1`, compose view shows types `0`+`2`)
|
||||
- Ordering: always position-based using `position_display` (reading view) or `position_compose` (compose view). Alphabetical ordering has been removed
|
||||
- Special prompts retain their colored background (CSS class `special_prompt`) in the popup based on `is_special == "1"`
|
||||
|
||||
### Context Menu
|
||||
- Dynamically built from all prompts with `show_in` set to `"context"` or `"both"`, filtered to reading types only (`type` 0 or 1)
|
||||
- Appears as a "ThunderAI" submenu in the `message_list` context
|
||||
- Ordering: position-based using `position_context` (fallback to alphabetical only when positions are equal)
|
||||
- Special prompts (add_tags, spamfilter, summarize, translate) route through `processEmails()` for batch processing; regular prompts execute via `menus.executeMenuAction()`
|
||||
- Icons: special prompts use dedicated icons (defined in `contextMenuIconsPath`); all other prompts use the addon icon (`images/icon-32.png`)
|
||||
- Add Tags in context menu assigns tags automatically (`addTagsAuto: true`), while in the popup it shows the interactive tag selection form
|
||||
|
||||
### Menu Order Page (`pages/menu_order/`)
|
||||
|
||||
Dedicated page for reordering, enabling, and disabling menu items across both the popup and the context menu. Opened from the options page via the "Menu Order" button.
|
||||
|
||||
**UI layout** — two side-by-side panels:
|
||||
- **Popup Menu panel**: sub-tabs for "Reading" / "Composing" switch the list between `position_display` / `position_compose` ordering and between the allowed types (`0`+`1` vs `0`+`2`)
|
||||
- **Context Menu panel**: single list ordered by `position_context`. Items with `type: "2"` (composing-only) are never shown here
|
||||
|
||||
Each list has two sections:
|
||||
- **Visible items**: active for the menu (`show_in` includes the menu), draggable to reorder
|
||||
- **Hidden items**: inactive for the menu (`show_in` excludes the menu), sorted alphabetically, not draggable
|
||||
|
||||
**Toggle coordination** — flipping the checkbox updates the prompt's `show_in` with four-state logic:
|
||||
- Popup ON: `"none"` → `"popup"`, `"context"` → `"both"`
|
||||
- Popup OFF: `"popup"` → `"none"`, `"both"` → `"context"`
|
||||
- Context ON: `"none"` → `"context"`, `"popup"` → `"both"`
|
||||
- Context OFF: `"context"` → `"none"`, `"both"` → `"popup"`
|
||||
|
||||
**Drag and drop** — native HTML5 DnD assigns sequential position numbers (1, 2, 3, ...) to `position_display`, `position_compose`, or `position_context` depending on which list is being sorted.
|
||||
|
||||
**Exclusions from the UI** (preserved on save so data is not lost):
|
||||
- Prompts with `enabled === 0` (disabled)
|
||||
- Special prompts whose base definition has `show_in: "none"` (internal prompts like `prompt_summarize_email_template` and `prompt_summarize_email_separator`) — retrieved via `getHiddenSpecialPromptIds()`
|
||||
- Special prompts whose feature is not active — retrieved from background via `get_active_special_ids` message, which calls `getActiveSpecialPromptsIDs()` with current prefs and `_sparks_presence`
|
||||
|
||||
**Cross-tab reload** — the page listens on `browser.storage.onChanged` for changes to `_default_prompts_properties`, `_custom_prompt`, or `_special_prompts`. When one of those keys changes (e.g. user saves from the Custom Prompts page in another tab), the page reloads its data with a 200ms debounce. Any unsaved local changes are discarded to avoid overwriting the other page's work.
|
||||
|
||||
**Save flow**:
|
||||
1. Re-concat preserved prompts (disabled + hidden-specials + inactive-feature specials) with the UI-visible prompts
|
||||
2. Split by `is_default` / `is_special` and call `setDefaultPromptsProperties()`, `setCustomPrompts()`, `setSpecialPrompts()`
|
||||
3. Send `reload_menus` to the background to rebuild both menus
|
||||
|
||||
### Alphabetic-to-Position Migration
|
||||
|
||||
The `dynamic_menu_order_alphabet` preference (previously a user-facing option) has been retired and removed from the UI, but the key still exists in storage as a one-shot migration flag. At every background startup, `migrateMenuOrderAlphabetic()` in `js/mzta-prompts.js` runs:
|
||||
|
||||
1. Reads `dynamic_menu_order_alphabet` (defaults to `true` if unset)
|
||||
2. If `true`: sorts all visible prompts with special prompts first (alphabetically), then the rest (alphabetically), and assigns sequential `position_display` = `position_compose` = `position_context` numbers. Hidden special prompts are preserved untouched.
|
||||
3. Persists the new positions via `setDefaultPromptsProperties` / `setCustomPrompts` / `setSpecialPrompts`
|
||||
4. Sets `dynamic_menu_order_alphabet = false` in sync storage so the migration does not run again
|
||||
|
||||
This ensures existing users upgrading from the previous alphabetical-default behaviour get the same visible ordering on first run, while subsequent launches keep whatever custom ordering the user has set.
|
||||
|
||||
### Special Prompt Visibility Dependencies
|
||||
|
||||
`getActiveSpecialPromptsIDs()` in `js/mzta-utils.js` maps feature prefs to active special prompt IDs. Notable dependency:
|
||||
|
||||
- `prompt_get_calendar_event_from_clipboard` is emitted only if **both** `get_calendar_event` and `get_calendar_event_from_clipboard` are active. If `get_calendar_event` is off, neither calendar prompt is shown regardless of the clipboard pref.
|
||||
|
||||
### Summarize: Dual-Mode Prompt System
|
||||
|
||||
The summarize feature uses two distinct prompt pathways:
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ Example in a prompt: `"Summarize this email: {%mail_text_body_or_selected%}"`
|
|||
| `identity_signature` | Current identity signature | 0 |
|
||||
| `additional_text[id]` | User input field (dynamic, shows input in popup) | 0 |
|
||||
| `mail_header:name` | Any email header by name (dynamic) | 1 |
|
||||
| `mail_full_headers` | All mail headers (key: value format, newline-separated) | 1 |
|
||||
|
||||
## Dynamic Placeholders
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,40 @@ Content script `js/lib/diff.js` is injected into ChatGPT pages for diff-view sup
|
|||
### Anthropic / Claude (`anthropic_api`)
|
||||
- Module: `js/api/anthropic.js`
|
||||
- Worker: `js/workers/model-worker-anthropic.js`
|
||||
- Settings keys: `anthropic_api_key`, `anthropic_model`, `anthropic_version`, `anthropic_max_tokens`, `anthropic_system_prompt`, `anthropic_temperature`
|
||||
- Settings keys: `anthropic_api_key`, `anthropic_model`, `anthropic_version`, `anthropic_max_tokens`, `anthropic_system_prompt`, `anthropic_temperature`, `anthropic_extended_thinking_budget`
|
||||
- **Extended thinking**: when `anthropic_extended_thinking_budget > 0`, the request body adds `thinking: { type: 'enabled', budget_tokens: N }` and **omits** `temperature` (the Claude API forbids setting temperature with extended thinking). Thinking output arrives in the SSE stream as `content_block_delta` events with `delta.type === 'thinking_delta'` and is forwarded to the webchat UI as `newThinkingToken` messages, captured into a `thinkingAccumulator` in the worker and passed on `tokensDone`.
|
||||
|
||||
## Thinking output in the webchat UI
|
||||
|
||||
Two provider categories emit reasoning/thinking content:
|
||||
|
||||
- **Ollama / OpenAI Compatible**: thinking arrives inline in the normal token stream wrapped in `<think>…</think>` tags. `MessagesArea.flushAccumulatingMessage()` strips these blocks from the rendered text and renders them as a `<details class="thinking-block">` prepended to the answer. If an unterminated `<think>` is detected mid-stream, the flush is deferred until the closing tag arrives.
|
||||
- **Anthropic**: thinking is captured in the worker and posted to the controller as `newThinkingToken`. `MessagesArea` accumulates it and renders the same `<details>` block on final flush.
|
||||
|
||||
The global `hide_thinking` pref (default `true`) controls the **initial open/collapsed state** of the thinking block: `true` → collapsed, `false` → open. The user can always toggle by clicking. Thinking content is never discarded. Other providers (Google Gemini, OpenAI Responses, ChatGPT Web) are not affected by this UI logic.
|
||||
|
||||
## Configuration Validation
|
||||
|
||||
For special prompts (`mzta_specialCommand`), required fields are validated in `initWorker()` (`js/mzta-special-commands.js`) **before** the worker is created. If a required field is empty, an `Error` with `isConfigError = true` is thrown. Validation covers:
|
||||
|
||||
| Provider | Required fields |
|
||||
|----------|----------------|
|
||||
| `chatgpt_api` | `chatgpt_api_key`, `chatgpt_model` |
|
||||
| `google_gemini_api` | `google_gemini_api_key`, `google_gemini_model` |
|
||||
| `ollama_api` | `ollama_host`, `ollama_model` |
|
||||
| `openai_comp_api` | `openai_comp_host`, `openai_comp_model` |
|
||||
| `anthropic_api` | `anthropic_api_key`, `anthropic_model`, `anthropic_version` |
|
||||
|
||||
Validation is skipped when `use_specific_api = true` (i.e., the prompt's own `api_type` overrides the global setting — credentials come from the prompt config, not global prefs).
|
||||
|
||||
The `isConfigError` flag on the thrown error tells callers in `mzta-background.js` to display the error in the panel **without saving it to storage** — so the user can fix settings and retry cleanly.
|
||||
|
||||
Feature-specific routing of `isConfigError`:
|
||||
|
||||
- `summarize` / `translate` / `spamfilter`: the error is shown in their dedicated panel (summary / translation / spam panel) and **not** persisted to storage.
|
||||
- `add_tags`: it has **no dedicated panel**, so the error is routed to the **generic error panel** via `showGenericError(errMsg, source)` in `mzta-background.js`, which broadcasts a `showGenericError` message to all tabs. The content script `js/mzta-compose-script.js` renders it as `#mzta-generic-error` inside `#mzta-container`. The panel is dismissible and reusable by any future feature without its own UI.
|
||||
|
||||
For regular prompts (`openChatGPT()`), validation still happens inside the listener callback after the API webchat window is created (unchanged behavior).
|
||||
|
||||
## Web Worker Pattern
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ chatgpt_api_key, chatgpt_model, chatgpt_developer_messages, chatgpt_temperature,
|
|||
ollama_host, ollama_model, ollama_num_ctx, ollama_temperature, ollama_think
|
||||
openai_comp_host, openai_comp_model, openai_comp_api_key, openai_comp_use_v1, openai_comp_chat_name, openai_comp_temperature
|
||||
google_gemini_api_key, google_gemini_model, google_gemini_system_instruction, google_gemini_thinking_budget, google_gemini_temperature
|
||||
anthropic_api_key, anthropic_model, anthropic_version, anthropic_max_tokens, anthropic_system_prompt, anthropic_temperature
|
||||
anthropic_api_key, anthropic_model, anthropic_version, anthropic_max_tokens, anthropic_system_prompt, anthropic_temperature, anthropic_extended_thinking_budget
|
||||
```
|
||||
|
||||
Plus the global connection selector:
|
||||
|
|
@ -64,8 +64,9 @@ These are generated programmatically at the bottom of `mzta-options-default.js`
|
|||
| `chatgpt_web_custom_gpt` | `''` | Custom GPT URL |
|
||||
| `chatgpt_web_load_wait_time` | `1000` | Wait time (ms) for ChatGPT page |
|
||||
| `dynamic_menu_force_enter` | `false` | Force Enter to submit in popup |
|
||||
| `dynamic_menu_order_alphabet` | `true` | Sort prompts alphabetically |
|
||||
| `dynamic_menu_order_alphabet` | `true` | Internal migration flag only; no UI. Set to `false` by `migrateMenuOrderAlphabetic()` on first boot after upgrade to bootstrap position-based ordering. See `claude-spec/02-prompts.md` for details. |
|
||||
| `placeholders_use_default_value` | `false` | Use placeholder defaults when empty |
|
||||
| `hide_thinking` | `true` | Controls the initial state of the thinking `<details>` block prepended above the answer: `true` = collapsed by default, `false` = open by default. The user can always toggle with a click; thinking content is never discarded. |
|
||||
| `max_prompt_length` | `30000` | Max prompt string length |
|
||||
|
||||
### Feature Flags
|
||||
|
|
@ -126,6 +127,10 @@ The summarize settings page provides:
|
|||
- Each has Save/Reset buttons and placeholder autocomplete
|
||||
- Default text comes from i18n strings (`prompt_summarize_full_text`, etc.)
|
||||
|
||||
### Menu Order Page (`pages/menu_order/`)
|
||||
|
||||
Entry point from the options page via the "Menu Order" button (next to "Manage your prompts"). Provides drag-and-drop reordering and toggle-based visibility control for both the popup and the context menu. See `claude-spec/02-prompts.md` ("Menu Order Page") for the full behaviour, data flow, and exclusion rules.
|
||||
|
||||
### Translate Settings Page (`pages/translate/`)
|
||||
|
||||
The translate settings page provides:
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
BIN
images/context_menu/custom/adventure-game.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
images/context_menu/custom/airport.png
Normal file
|
After Width: | Height: | Size: 994 B |
BIN
images/context_menu/custom/alert-sign.png
Normal file
|
After Width: | Height: | Size: 974 B |
BIN
images/context_menu/custom/calendar.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
images/context_menu/custom/cash.png
Normal file
|
After Width: | Height: | Size: 971 B |
BIN
images/context_menu/custom/clapboard.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
images/context_menu/custom/clock.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
images/context_menu/custom/coins.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
images/context_menu/custom/copywriting.png
Normal file
|
After Width: | Height: | Size: 954 B |
BIN
images/context_menu/custom/customer-service.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/custom/deadline.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
images/context_menu/custom/discount.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
images/context_menu/custom/earth.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
images/context_menu/custom/electric-car.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
images/context_menu/custom/empty_icon.png
Normal file
|
After Width: | Height: | Size: 705 B |
BIN
images/context_menu/custom/experiment.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/custom/express-delivery.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/custom/flammable.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
BIN
images/context_menu/custom/home.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
BIN
images/context_menu/custom/idea.png
Normal file
|
After Width: | Height: | Size: 793 B |
BIN
images/context_menu/custom/info.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/custom/invoice.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/custom/justice-scale.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
images/context_menu/custom/like.png
Normal file
|
After Width: | Height: | Size: 733 B |
BIN
images/context_menu/custom/love-letter.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
BIN
images/context_menu/custom/policeman.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
images/context_menu/custom/printer.png
Normal file
|
After Width: | Height: | Size: 677 B |
BIN
images/context_menu/custom/profit.png
Normal file
|
After Width: | Height: | Size: 664 B |
BIN
images/context_menu/custom/puzzle-game.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
images/context_menu/custom/radiation-hazard.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
images/context_menu/custom/receipt.png
Normal file
|
After Width: | Height: | Size: 838 B |
BIN
images/context_menu/custom/recycle-sign.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
images/context_menu/custom/science.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
images/context_menu/custom/scissors.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
images/context_menu/custom/star.png
Normal file
|
After Width: | Height: | Size: 925 B |
BIN
images/context_menu/custom/start-up.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/custom/sticky-notes.png
Normal file
|
After Width: | Height: | Size: 604 B |
BIN
images/context_menu/custom/target.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
images/context_menu/custom/thermometer.png
Normal file
|
After Width: | Height: | Size: 795 B |
BIN
images/context_menu/custom/trophy.png
Normal file
|
After Width: | Height: | Size: 990 B |
BIN
images/context_menu/getcalendarevent.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
images/context_menu/getcalendareventfromclipboard.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
images/context_menu/gettask.png
Normal file
|
After Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
|
@ -27,6 +27,7 @@ export class Anthropic {
|
|||
system_prompt = '';
|
||||
temperature = '';
|
||||
max_tokens = 4096;
|
||||
extended_thinking_budget = 0;
|
||||
stream = false;
|
||||
|
||||
constructor({
|
||||
|
|
@ -36,6 +37,7 @@ export class Anthropic {
|
|||
system_prompt = '',
|
||||
temperature = '',
|
||||
max_tokens = 4096,
|
||||
extended_thinking_budget = 0,
|
||||
stream = false,
|
||||
} = {}) {
|
||||
this.apiKey = apiKey;
|
||||
|
|
@ -44,6 +46,7 @@ export class Anthropic {
|
|||
this.system_prompt = system_prompt;
|
||||
this.temperature = temperature;
|
||||
this.max_tokens = max_tokens > 0 ? max_tokens : 4096;
|
||||
this.extended_thinking_budget = extended_thinking_budget;
|
||||
this.stream = stream;
|
||||
}
|
||||
|
||||
|
|
@ -97,9 +100,15 @@ export class Anthropic {
|
|||
stream: this.stream,
|
||||
};
|
||||
|
||||
const tempFloat = parseFloat(this.temperature);
|
||||
const thinkingBudget = parseInt(this.extended_thinking_budget);
|
||||
const thinkingEnabled = !Number.isNaN(thinkingBudget) && thinkingBudget > 0;
|
||||
|
||||
if(this.temperature != '' && !Number.isNaN(tempFloat)) claude_body.temperature = tempFloat;
|
||||
if (thinkingEnabled) {
|
||||
claude_body.thinking = { type: 'enabled', budget_tokens: thinkingBudget };
|
||||
} else {
|
||||
const tempFloat = parseFloat(this.temperature);
|
||||
if(this.temperature != '' && !Number.isNaN(tempFloat)) claude_body.temperature = tempFloat;
|
||||
}
|
||||
|
||||
// console.log(">>>>>>>>>>>>>>>>> [ThunderAI] Anthropic API request: " + JSON.stringify(claude_body));
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ function _ensureContainer() {
|
|||
|
||||
const toolbar = document.createElement('div');
|
||||
toolbar.id = 'mzta-toolbar';
|
||||
toolbar.style.cssText = `display: none; align-items: center; gap: 8px; padding: 6px 0.5rem; background-color: ${colors.toolbar.bg}; border-bottom: 1px solid ${colors.toolbar.border}; font-size: 13px; color: ${colors.toolbar.text};`;
|
||||
toolbar.style.cssText = `display: none; align-items: flex-start; justify-content: flex-end; gap: 8px; padding: 4px 0.2rem;; background-color: ${colors.toolbar.bg}; border-bottom: 1px solid ${colors.toolbar.border}; font-size: 13px; color: ${colors.toolbar.text};`;
|
||||
container.appendChild(toolbar);
|
||||
|
||||
const panels = document.createElement('div');
|
||||
|
|
@ -102,12 +102,6 @@ function _updateToolbarVisibility() {
|
|||
if (!toolbar) return;
|
||||
const hasItems = toolbar.querySelector('#mzta-toolbar-spam, #mzta-toolbar-summary, #mzta-toolbar-translation');
|
||||
toolbar.style.display = hasItems ? 'flex' : 'none';
|
||||
// Push the first button (summary or translation) to the right
|
||||
const summary = document.getElementById('mzta-toolbar-summary');
|
||||
const translation = document.getElementById('mzta-toolbar-translation');
|
||||
const firstBtn = summary || translation;
|
||||
if (summary) summary.style.marginLeft = (firstBtn === summary) ? 'auto' : '';
|
||||
if (translation) translation.style.marginLeft = (firstBtn === translation) ? 'auto' : '';
|
||||
}
|
||||
|
||||
const _TOOLBAR_SLOT_ORDER = ['mzta-toolbar-spam', 'mzta-toolbar-summary', 'mzta-toolbar-translation'];
|
||||
|
|
@ -137,6 +131,7 @@ function _removeToolbarItem(id) {
|
|||
}
|
||||
|
||||
const _PANEL_ORDER = [
|
||||
'mzta-generic-error',
|
||||
'mzta-spam-check-progress', 'mzta-spam-report-banner',
|
||||
'mzta-translation-generating', 'mzta-translation-banner',
|
||||
'mzta-summary-generating', 'mzta-summary-banner'
|
||||
|
|
@ -580,7 +575,7 @@ switch (message.command) {
|
|||
case "getTags":
|
||||
// console.log(">>>>>>>>>>>>>> getTags: " + JSON.stringify(message.tags));
|
||||
|
||||
// ===== These methods are also defined in the file /js/mzta-addatags-exclusion-list.js
|
||||
// ===== These methods are also defined in the file /js/mzta-addtags-exclusion-list.js
|
||||
async function addTags_getExclusionList() {
|
||||
let prefs_excluded_tags = await browser.storage.local.get({add_tags_exclusions: []});
|
||||
// console.log(">>>>>>>>>>>>>>> addTags_getExclusionList prefs_excluded_tags: " + JSON.stringify(prefs_excluded_tags));
|
||||
|
|
@ -872,6 +867,53 @@ switch (message.command) {
|
|||
|
||||
break;
|
||||
|
||||
case "showGenericError": {
|
||||
const { message: errMsg, source } = message.data || {};
|
||||
const colors = _getThemeColors();
|
||||
const ec = colors.summaryErr;
|
||||
|
||||
const panel = document.createElement('div');
|
||||
panel.style.cssText = `background-color: ${ec.bg}; color: ${ec.text}; padding: 0.5rem; border-radius: 4px; border: 1px solid ${ec.border}; font-size: 14px; display: flex; align-items: flex-start; gap: 8px;`;
|
||||
|
||||
const icon = document.createElement('span');
|
||||
icon.textContent = '\u26A0';
|
||||
icon.style.cssText = 'font-size: 16px; flex-shrink: 0; line-height: 1.4;';
|
||||
|
||||
const textWrap = document.createElement('div');
|
||||
textWrap.style.cssText = 'flex: 1; min-width: 0; line-height: 1.4;';
|
||||
|
||||
const prefix = document.createElement('strong');
|
||||
prefix.textContent = `[ThunderAI${source ? ' | ' + source : ''}] `;
|
||||
const body = document.createElement('span');
|
||||
body.textContent = errMsg || '';
|
||||
textWrap.appendChild(prefix);
|
||||
textWrap.appendChild(body);
|
||||
|
||||
const rightGroup = document.createElement('span');
|
||||
rightGroup.style.cssText = 'display: flex; align-items: center; gap: 5px; margin-left: auto;';
|
||||
const dismissMenu = createThreeDotsMenu(colors.isDark, [
|
||||
{
|
||||
icon: '\u00D7',
|
||||
label: browser.i18n.getMessage("generic_error_dismiss") || 'Dismiss',
|
||||
hoverColor: '#cc0000',
|
||||
onClick: () => { _removePanel('mzta-generic-error'); }
|
||||
}
|
||||
], { bg: ec.bg, border: ec.border, text: ec.text });
|
||||
rightGroup.appendChild(dismissMenu);
|
||||
|
||||
panel.appendChild(icon);
|
||||
panel.appendChild(textWrap);
|
||||
panel.appendChild(rightGroup);
|
||||
|
||||
_addPanel('mzta-generic-error', panel);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "clearGenericError": {
|
||||
_removePanel('mzta-generic-error');
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showSpamCheckInProgress": {
|
||||
_removePanel('mzta-spam-report-banner');
|
||||
_removeToolbarItem('mzta-toolbar-spam');
|
||||
|
|
@ -881,7 +923,7 @@ switch (message.command) {
|
|||
|
||||
// Loading badge in toolbar
|
||||
const badge = document.createElement('div');
|
||||
badge.style.cssText = `background-color: ${colors.spamLoading.bg}; color: ${colors.spamLoading.text}; border: 1px solid ${colors.spamLoading.border}; border-radius: 4px; padding: 2px 8px; font-size: 12px; display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;`;
|
||||
badge.style.cssText = `background-color: ${colors.spamLoading.bg}; color: ${colors.spamLoading.text}; border: 1px solid ${colors.spamLoading.border}; border-radius: 4px; padding: 2px 8px; font-size: 12px; display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; margin-right: auto;`;
|
||||
const badgeLoading = document.createElement('img');
|
||||
badgeLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||
badgeLoading.style.cssText = "height: 14px; width: 14px;";
|
||||
|
|
@ -903,44 +945,44 @@ switch (message.command) {
|
|||
const colors = _getThemeColors(data.spamValue, data.SpamThreshold);
|
||||
const sc = colors.spam;
|
||||
|
||||
// Spam badge in toolbar (clickable to toggle explanation panel)
|
||||
const explanationText = data.spamValue == -999
|
||||
? data.explanation
|
||||
: browser.i18n.getMessage("Explanation") + ": " + data.explanation;
|
||||
|
||||
// Single toolbar item: score + truncated explanation + chevron + branding + menu
|
||||
// Outer wrapper: flex-direction column, but initially only topRow is visible (no height from brandingRow)
|
||||
const badge = document.createElement('div');
|
||||
badge.title = browser.i18n.getMessage("spam_badge_tooltip");
|
||||
badge.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; border: 1px solid ${sc.border}; border-radius: 4px; padding: 2px 8px; font-size: 12px; font-weight: bold; display: inline-flex; align-items: center; gap: 4px; cursor: pointer; white-space: nowrap; transition: opacity 0.2s;`;
|
||||
badge.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; border: 1px solid ${sc.border}; border-radius: 4px; padding: 4px 8px; font-size: 12px; font-weight: bold; display: inline-flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; box-sizing: border-box; align-self: stretch;`;
|
||||
|
||||
// Top row (always visible): score + text + chevron + branding + menu
|
||||
const topRow = document.createElement('div');
|
||||
topRow.style.cssText = 'display: flex; align-items: center; gap: 4px; width: 100%; min-width: 0;';
|
||||
|
||||
const scoreSpan = document.createElement('span');
|
||||
scoreSpan.style.cssText = 'white-space: nowrap; flex-shrink: 0;';
|
||||
if (data.spamValue == -999) {
|
||||
badge.textContent = browser.i18n.getMessage("apiwebchat_error");
|
||||
scoreSpan.textContent = browser.i18n.getMessage("apiwebchat_error");
|
||||
} else {
|
||||
badge.textContent = ((data.spamValue >= (data.SpamThreshold || 50)) ? "\u26A0\uFE0F " + browser.i18n.getMessage("Spam") : "\uD83D\uDEE1\uFE0F " + browser.i18n.getMessage("Valid")) + " [" + data.spamValue + "/100]";
|
||||
scoreSpan.textContent = ((data.spamValue >= (data.SpamThreshold || 50)) ? "\u26A0\uFE0F " + browser.i18n.getMessage("Spam") : "\uD83D\uDEE1\uFE0F " + browser.i18n.getMessage("Valid")) + " [" + data.spamValue + "/100]";
|
||||
}
|
||||
topRow.appendChild(scoreSpan);
|
||||
|
||||
const badgeText = document.createElement('span');
|
||||
badgeText.style.cssText = 'overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0; font-weight: normal;';
|
||||
badgeText.textContent = explanationText;
|
||||
topRow.appendChild(badgeText);
|
||||
|
||||
// Chevron: expands once, then disappears
|
||||
const chevron = document.createElement('span');
|
||||
chevron.textContent = ' \u25BC';
|
||||
chevron.style.cssText = 'font-size: 10px; transition: transform 0.2s; transform: rotate(-90deg);';
|
||||
badge.appendChild(chevron);
|
||||
chevron.textContent = '\u25BC';
|
||||
chevron.style.cssText = 'font-size: 10px; flex-shrink: 0; cursor: pointer;';
|
||||
topRow.appendChild(chevron);
|
||||
|
||||
let spamExpanded = false;
|
||||
badge.onclick = () => {
|
||||
const panel = document.getElementById('mzta-spam-report-banner');
|
||||
if (panel) {
|
||||
spamExpanded = !spamExpanded;
|
||||
panel.style.display = spamExpanded ? 'flex' : 'none';
|
||||
chevron.style.transform = spamExpanded ? '' : 'rotate(-90deg)';
|
||||
}
|
||||
};
|
||||
badge.onmouseover = () => { badge.style.opacity = '0.8'; };
|
||||
badge.onmouseout = () => { badge.style.opacity = '1'; };
|
||||
|
||||
_addToolbarItem('mzta-toolbar-spam', badge);
|
||||
|
||||
// Explanation panel (collapsed by default)
|
||||
const panel = document.createElement('div');
|
||||
panel.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; border: 1px solid ${sc.border}; border-radius: 4px; padding: 8px 0.5rem; font-size: 13px; display: none; align-items: center; gap: 15px; width: 100%; box-sizing: border-box;`;
|
||||
|
||||
const reasonText = document.createElement('span');
|
||||
if (data.spamValue == -999) {
|
||||
reasonText.textContent = data.explanation;
|
||||
} else {
|
||||
reasonText.textContent = browser.i18n.getMessage("Explanation") + ": " + data.explanation;
|
||||
}
|
||||
const branding = document.createElement('span');
|
||||
branding.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5; white-space: nowrap; flex-shrink: 0; font-weight: normal; display: none;';
|
||||
branding.textContent = browser.i18n.getMessage("antispam_by") + " ThunderAI";
|
||||
topRow.appendChild(branding);
|
||||
|
||||
const spamMenu = createThreeDotsMenu(colors.isDark, [
|
||||
{
|
||||
|
|
@ -963,19 +1005,56 @@ switch (message.command) {
|
|||
}
|
||||
}
|
||||
], { bg: sc.bg, border: sc.border, text: sc.text });
|
||||
spamMenu.style.fontWeight = 'normal';
|
||||
spamMenu.style.display = 'none';
|
||||
topRow.appendChild(spamMenu);
|
||||
|
||||
const rightGroup = document.createElement('span');
|
||||
rightGroup.style.cssText = 'margin-left: auto; display: flex; align-items: center; gap: 5px;';
|
||||
const branding = document.createElement('span');
|
||||
branding.textContent = browser.i18n.getMessage("antispam_by") + " ThunderAI";
|
||||
branding.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5;';
|
||||
rightGroup.appendChild(branding);
|
||||
rightGroup.appendChild(spamMenu);
|
||||
badge.appendChild(topRow);
|
||||
|
||||
panel.appendChild(reasonText);
|
||||
panel.appendChild(rightGroup);
|
||||
// Bottom row (only when expanded): branding right-aligned, hidden via zero height
|
||||
const brandingRow = document.createElement('div');
|
||||
brandingRow.style.cssText = 'display: flex; justify-content: flex-end; width: 100%; overflow: hidden; max-height: 0; opacity: 0; transition: max-height 0.3s ease, opacity 0.3s ease;';
|
||||
const brandingExpanded = document.createElement('span');
|
||||
brandingExpanded.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5; font-weight: normal;';
|
||||
brandingExpanded.textContent = browser.i18n.getMessage("antispam_by") + " ThunderAI";
|
||||
brandingRow.appendChild(brandingExpanded);
|
||||
badge.appendChild(brandingRow);
|
||||
|
||||
chevron.onclick = (e) => {
|
||||
e.stopPropagation();
|
||||
_spamResizeObserver.disconnect();
|
||||
badgeText.style.whiteSpace = 'normal';
|
||||
badgeText.style.overflow = 'hidden';
|
||||
badgeText.style.textOverflow = 'unset';
|
||||
topRow.style.alignItems = 'flex-start';
|
||||
spamMenu.style.display = '';
|
||||
chevron.style.display = 'none';
|
||||
brandingRow.style.maxHeight = '2em';
|
||||
brandingRow.style.opacity = '1';
|
||||
};
|
||||
badge.onmouseover = () => { badge.style.opacity = '0.8'; };
|
||||
badge.onmouseout = () => { badge.style.opacity = '1'; };
|
||||
|
||||
_addToolbarItem('mzta-toolbar-spam', badge);
|
||||
|
||||
const _updateSpamVisibility = () => {
|
||||
if (badgeText.style.whiteSpace === 'normal') return; // already expanded, don't interfere
|
||||
if (badgeText.scrollWidth > badgeText.clientWidth) {
|
||||
chevron.style.display = 'inline';
|
||||
branding.style.display = 'none';
|
||||
spamMenu.style.display = 'none';
|
||||
} else {
|
||||
chevron.style.display = 'none';
|
||||
branding.style.display = '';
|
||||
spamMenu.style.display = '';
|
||||
}
|
||||
};
|
||||
|
||||
requestAnimationFrame(_updateSpamVisibility);
|
||||
|
||||
const _spamResizeObserver = new ResizeObserver(_updateSpamVisibility);
|
||||
_spamResizeObserver.observe(badge);
|
||||
|
||||
_addPanel('mzta-spam-report-banner', panel);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
|
|
@ -1446,6 +1525,7 @@ switch (message.command) {
|
|||
}
|
||||
|
||||
case "showTranslationButton": {
|
||||
_removePanel('mzta-translation-generating');
|
||||
if (document.getElementById('mzta-toolbar-translation')) return Promise.resolve(true);
|
||||
|
||||
const colors = _getThemeColors();
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ import {
|
|||
cleanupNewlines,
|
||||
checkIfTagLabelExists,
|
||||
getConnectionType,
|
||||
getContextMenuIcon,
|
||||
} from './mzta-utils.js'
|
||||
import { taPromptUtils } from './mzta-utils-prompt.js';
|
||||
import { taLogger } from './mzta-logger.js';
|
||||
|
|
@ -76,7 +77,6 @@ export class mzta_Menus {
|
|||
this.shortcutMenu = [];
|
||||
this.menu_listeners = {};
|
||||
this.allPrompts = await getPrompts(true,also_special);
|
||||
this.allPrompts.sort((a, b) => a.name.localeCompare(b.name));
|
||||
this.allPrompts.forEach((prompt) => {
|
||||
this.addAction(prompt)
|
||||
});
|
||||
|
|
@ -219,7 +219,7 @@ export class mzta_Menus {
|
|||
|
||||
// const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
// add custom text if needed
|
||||
//browser.runtime.sendMessage({command: "chatgpt_open", prompt: fullPrompt, action: curr_prompt.action, tabId: tabs[0].id});
|
||||
// browser.runtime.sendMessage({command: "chatgpt_open", prompt: fullPrompt, action: curr_prompt.action, tabId: tabs[0].id});
|
||||
if(curr_prompt.is_special == '1'){ // Special prompts
|
||||
switch(curr_prompt.id){
|
||||
case 'prompt_add_tags': { // Add tags to the email
|
||||
|
|
@ -495,15 +495,77 @@ export class mzta_Menus {
|
|||
}
|
||||
|
||||
addShortcutMenu(prompt) {
|
||||
let curr_menu_entry = {id: prompt.id, label: i18nConditionalGet(prompt.name), type: prompt.type};
|
||||
let curr_menu_entry = {
|
||||
id: prompt.id,
|
||||
label: i18nConditionalGet(prompt.name),
|
||||
type: prompt.type,
|
||||
show_in: prompt.show_in || "popup",
|
||||
is_special: prompt.is_special,
|
||||
position_display: prompt.position_display,
|
||||
position_compose: prompt.position_compose,
|
||||
position_context: prompt.position_context,
|
||||
};
|
||||
this.shortcutMenu.push(curr_menu_entry);
|
||||
}
|
||||
|
||||
async loadContextMenus() {
|
||||
await browser.menus.removeAll();
|
||||
const contextPrompts = this.allPrompts.filter(p => {
|
||||
const showIn = p.show_in || "popup";
|
||||
// Only show prompts that should appear in context menu and are for reading context (type 0 or 1)
|
||||
return (showIn === "context" || showIn === "both") && (String(p.type) === "0" || String(p.type) === "1");
|
||||
});
|
||||
|
||||
if (contextPrompts.length === 0) {
|
||||
this.logger.log("No prompts for context menu");
|
||||
return;
|
||||
}
|
||||
|
||||
// Create parent menu
|
||||
await new Promise(resolve =>
|
||||
browser.menus.create({
|
||||
id: 'mzta-context-parent',
|
||||
title: 'ThunderAI',
|
||||
contexts: ["message_list"],
|
||||
}, resolve)
|
||||
);
|
||||
|
||||
// Sort by position_context if available, otherwise alphabetically
|
||||
contextPrompts.sort((a, b) => {
|
||||
const posA = a.position_context || 9999;
|
||||
const posB = b.position_context || 9999;
|
||||
if (posA !== posB) return posA - posB;
|
||||
const nameA = i18nConditionalGet(a.name);
|
||||
const nameB = i18nConditionalGet(b.name);
|
||||
return nameA.localeCompare(nameB);
|
||||
});
|
||||
|
||||
// Create child menu items
|
||||
for (const prompt of contextPrompts) {
|
||||
const title = i18nConditionalGet(prompt.name);
|
||||
const iconPath = getContextMenuIcon(prompt);
|
||||
const menuOpts = {
|
||||
id: 'mzta-ctx-' + prompt.id,
|
||||
title: title,
|
||||
contexts: ["message_list"],
|
||||
parentId: 'mzta-context-parent',
|
||||
};
|
||||
if (iconPath) {
|
||||
menuOpts.icons = iconPath;
|
||||
}
|
||||
await new Promise(resolve =>
|
||||
browser.menus.create(menuOpts, resolve)
|
||||
);
|
||||
}
|
||||
this.logger.log("Context menus loaded: " + contextPrompts.length + " items");
|
||||
}
|
||||
|
||||
async loadMenus(also_special = []) {
|
||||
await this.initialize(also_special);
|
||||
await this.addMenu(this.rootMenu);
|
||||
this.addClickListener();
|
||||
this.loadShortcutMenu();
|
||||
await this.loadContextMenus();
|
||||
this.logger.log("Menus loaded");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -127,6 +127,15 @@ const defaultPlaceholders = [
|
|||
is_dynamic: "1",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'mail_full_headers',
|
||||
name: "__MSG_placeholder_mail_full_headers__",
|
||||
default_value: "",
|
||||
type: 1,
|
||||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'selected_text',
|
||||
name: "__MSG_placeholder_selected_text__",
|
||||
|
|
@ -568,6 +577,9 @@ export const placeholdersUtils = {
|
|||
case 'mail_headers':
|
||||
finalSubs['mail_headers:' + currPH.custom_value] = placeholdersUtils.failSafePlaceholders(sanitizeMailHeaders(await getMailHeader(curr_message, currPH.custom_value)));
|
||||
break;
|
||||
case 'mail_full_headers':
|
||||
finalSubs['mail_full_headers'] = placeholdersUtils.failSafePlaceholders(sanitizeMailHeaders(await getMailHeader(curr_message)));
|
||||
break;
|
||||
case 'selected_text':
|
||||
finalSubs['selected_text'] = placeholdersUtils.failSafePlaceholders(selection_text);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -62,6 +62,12 @@
|
|||
summaryTabId (set by _openSummaryWebchat in mzta-background.js):
|
||||
The tab ID of the message display tab to update with the saved summary.
|
||||
|
||||
Show in menu (show_in attribute):
|
||||
"popup": Show only in the popup menu
|
||||
"context": Show only in the context menu
|
||||
"both": Show in both popup and context menus
|
||||
"none": Do not show in any menu
|
||||
|
||||
================ USER PROPERTIES
|
||||
Enabled (enabled attribute):
|
||||
0: Disabled
|
||||
|
|
@ -108,6 +114,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_reply_advanced',
|
||||
|
|
@ -126,6 +133,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_reply_custom_command',
|
||||
|
|
@ -144,6 +152,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_rewrite_polite',
|
||||
|
|
@ -162,6 +171,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_rewrite_formal',
|
||||
|
|
@ -180,6 +190,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_classify',
|
||||
|
|
@ -198,24 +209,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
},
|
||||
{
|
||||
id: 'prompt_summarize_this',
|
||||
name: "__MSG_prompt_summarize_this__",
|
||||
text: "prompt_summarize_this_full_text",
|
||||
type: "0",
|
||||
action: "0",
|
||||
need_selected: "0",
|
||||
need_signature: "0",
|
||||
need_custom_text: "0",
|
||||
define_response_lang: "1",
|
||||
use_diff_viewer: "0",
|
||||
chatgpt_web_model: '',
|
||||
chatgpt_web_project: '',
|
||||
chatgpt_web_custom_gpt: '',
|
||||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_proofread_this',
|
||||
|
|
@ -234,6 +228,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_this',
|
||||
|
|
@ -252,6 +247,7 @@ const defaultPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "0",
|
||||
show_in: "popup",
|
||||
},
|
||||
];
|
||||
|
||||
|
|
@ -270,6 +266,7 @@ const specialPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "both",
|
||||
},
|
||||
{
|
||||
id: 'prompt_get_calendar_event',
|
||||
|
|
@ -285,6 +282,7 @@ const specialPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_get_calendar_event_from_clipboard',
|
||||
|
|
@ -300,6 +298,7 @@ const specialPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_get_task',
|
||||
|
|
@ -315,6 +314,7 @@ const specialPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "popup",
|
||||
},
|
||||
{
|
||||
id: 'prompt_spamfilter',
|
||||
|
|
@ -330,6 +330,7 @@ const specialPrompts = [
|
|||
api_type: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "context",
|
||||
},
|
||||
{
|
||||
id: 'prompt_summarize',
|
||||
|
|
@ -346,6 +347,7 @@ const specialPrompts = [
|
|||
api_model: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "context",
|
||||
},
|
||||
{
|
||||
id: 'prompt_summarize_email_template',
|
||||
|
|
@ -362,6 +364,7 @@ const specialPrompts = [
|
|||
api_model: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "none",
|
||||
},
|
||||
{
|
||||
id: 'prompt_summarize_email_separator',
|
||||
|
|
@ -378,6 +381,7 @@ const specialPrompts = [
|
|||
api_model: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "none",
|
||||
},
|
||||
{
|
||||
id: 'prompt_translate_this',
|
||||
|
|
@ -394,6 +398,7 @@ const specialPrompts = [
|
|||
api_model: '',
|
||||
is_default: "1",
|
||||
is_special: "1",
|
||||
show_in: "context",
|
||||
}
|
||||
];
|
||||
|
||||
|
|
@ -464,7 +469,7 @@ export function preparePromptsForExport(prompts, include_api_settings = false){
|
|||
}
|
||||
|
||||
if(prompt.is_default == 1){
|
||||
let allowedKeys = ['id', 'enabled', 'position_compose', 'position_display', 'need_custom_text'];
|
||||
let allowedKeys = ['id', 'enabled', 'position_compose', 'position_display', 'position_context', 'need_custom_text', 'show_in', 'custom_icon'];
|
||||
if(include_api_settings){
|
||||
allowedKeys.push('api_type');
|
||||
for (const [integration, options] of Object.entries(integration_options_config)) {
|
||||
|
|
@ -517,6 +522,7 @@ async function getDefaultPrompts_withProps() {
|
|||
prompt.text = browser.i18n.getMessage(prompt.text);
|
||||
prompt.position_display = pos;
|
||||
prompt.position_compose = pos;
|
||||
prompt.position_context = pos;
|
||||
prompt.enabled = 1;
|
||||
pos++;
|
||||
})
|
||||
|
|
@ -528,15 +534,19 @@ async function getDefaultPrompts_withProps() {
|
|||
if(prefs._default_prompts_properties?.[prompt.id]){
|
||||
prompt.position_compose = prefs._default_prompts_properties[prompt.id].position_compose;
|
||||
prompt.position_display = prefs._default_prompts_properties[prompt.id].position_display;
|
||||
prompt.position_context = prefs._default_prompts_properties[prompt.id]?.position_context || prompt.position_display;
|
||||
prompt.enabled = prefs._default_prompts_properties[prompt.id].enabled;
|
||||
prompt.need_custom_text = prefs._default_prompts_properties[prompt.id].need_custom_text;
|
||||
prompt.chatgpt_web_model = prefs._default_prompts_properties[prompt.id].chatgpt_web_model;
|
||||
prompt.chatgpt_web_project = prefs._default_prompts_properties[prompt.id].chatgpt_web_project;
|
||||
prompt.chatgpt_web_custom_gpt = (prefs._default_prompts_properties[prompt.id]?.chatgpt_web_custom_gpt || '').trim();
|
||||
prompt.api_type = (prefs._default_prompts_properties[prompt.id]?.api_type || '').trim();
|
||||
prompt.show_in = prefs._default_prompts_properties[prompt.id]?.show_in || prompt.show_in;
|
||||
prompt.custom_icon = prefs._default_prompts_properties[prompt.id]?.custom_icon || "";
|
||||
}else{
|
||||
prompt.position_display = pos;
|
||||
prompt.position_compose = pos;
|
||||
prompt.position_context = pos;
|
||||
prompt.enabled = 1;
|
||||
pos++;
|
||||
}
|
||||
|
|
@ -569,6 +579,12 @@ async function getCustomPrompts() {
|
|||
if(prompt.api_type === undefined){
|
||||
prompt.api_type = "";
|
||||
}
|
||||
if(prompt.show_in === undefined){
|
||||
prompt.show_in = "popup";
|
||||
}
|
||||
if(prompt.custom_icon === undefined){
|
||||
prompt.custom_icon = "";
|
||||
}
|
||||
});
|
||||
return prefs._custom_prompt;
|
||||
}
|
||||
|
|
@ -580,12 +596,15 @@ export async function setDefaultPromptsProperties(prompts) {
|
|||
default_prompts_properties[prompt.id] = {
|
||||
position_compose: (prompt.position_compose === undefined || prompt.position_compose === "undefined") ? "" : prompt.position_compose,
|
||||
position_display: (prompt.position_display === undefined || prompt.position_display === "undefined") ? "" : prompt.position_display,
|
||||
position_context: (prompt.position_context === undefined || prompt.position_context === "undefined") ? "" : prompt.position_context,
|
||||
enabled: (prompt.enabled === undefined || prompt.enabled === "undefined") ? "" : prompt.enabled,
|
||||
need_custom_text: (prompt.need_custom_text === undefined || prompt.need_custom_text === "undefined") ? "" : prompt.need_custom_text,
|
||||
chatgpt_web_model: (prompt.chatgpt_web_model === undefined || prompt.chatgpt_web_model === "undefined") ? "" : prompt.chatgpt_web_model,
|
||||
chatgpt_web_project: (prompt.chatgpt_web_project === undefined || prompt.chatgpt_web_project === "undefined") ? "" : prompt.chatgpt_web_project,
|
||||
chatgpt_web_custom_gpt: (prompt.chatgpt_web_custom_gpt === undefined || prompt.chatgpt_web_custom_gpt === "undefined") ? "" : prompt.chatgpt_web_custom_gpt,
|
||||
api_type: (prompt.api_type === undefined || prompt.api_type === "undefined") ? "" : prompt.api_type,
|
||||
show_in: (prompt.show_in === undefined || prompt.show_in === "undefined") ? "popup" : prompt.show_in,
|
||||
custom_icon: (prompt.custom_icon === undefined || prompt.custom_icon === "undefined") ? "" : prompt.custom_icon,
|
||||
};
|
||||
});
|
||||
//console.log('>>>>>>>>>>>>>> default_prompts_properties: ' + JSON.stringify(default_prompts_properties));
|
||||
|
|
@ -616,6 +635,13 @@ export async function getSpecialPrompts(){
|
|||
updatedPrompts.push(newPrompt);
|
||||
}
|
||||
});
|
||||
// Migrate: add show_in if missing from saved special prompts
|
||||
updatedPrompts.forEach((prompt) => {
|
||||
if (prompt.show_in === undefined) {
|
||||
prompt.show_in = "both";
|
||||
}
|
||||
});
|
||||
|
||||
// console.log(">>>>>>>>>>>>> getSpecialPrompts updatedPrompts: " + JSON.stringify(updatedPrompts));
|
||||
if (updatedPrompts.length !== prefs._special_prompts.length) {
|
||||
await browser.storage.local.set({ _special_prompts: updatedPrompts });
|
||||
|
|
@ -630,6 +656,56 @@ export async function setSpecialPrompts(prompts) {
|
|||
await browser.storage.local.set({_special_prompts: prompts});
|
||||
}
|
||||
|
||||
export function getHiddenSpecialPromptIds() {
|
||||
return specialPrompts.filter(p => p.show_in === "none").map(p => p.id);
|
||||
}
|
||||
|
||||
// Migration: if dynamic_menu_order_alphabet was true (or unset), assign initial positions
|
||||
// so that prompts appear alphabetically with special prompts first, then disable the flag
|
||||
// to switch to position-based ordering permanently.
|
||||
export async function migrateMenuOrderAlphabetic() {
|
||||
const prefs = await browser.storage.sync.get({ dynamic_menu_order_alphabet: true });
|
||||
if (!prefs.dynamic_menu_order_alphabet) {
|
||||
return;
|
||||
}
|
||||
|
||||
const allPrompts = await getPrompts(false, [], true);
|
||||
const hiddenSpecialIds = getHiddenSpecialPromptIds();
|
||||
const visiblePrompts = allPrompts.filter(p => !hiddenSpecialIds.includes(p.id));
|
||||
|
||||
const resolveName = (p) => {
|
||||
const n = p.name || '';
|
||||
if (n.startsWith('__MSG_') && n.endsWith('__')) {
|
||||
return browser.i18n.getMessage(n.substring(6, n.length - 2));
|
||||
}
|
||||
return n;
|
||||
};
|
||||
|
||||
const specials = visiblePrompts.filter(p => String(p.is_special) === '1')
|
||||
.sort((a, b) => resolveName(a).localeCompare(resolveName(b)));
|
||||
const others = visiblePrompts.filter(p => String(p.is_special) !== '1')
|
||||
.sort((a, b) => resolveName(a).localeCompare(resolveName(b)));
|
||||
const ordered = specials.concat(others);
|
||||
|
||||
ordered.forEach((prompt, idx) => {
|
||||
const pos = idx + 1;
|
||||
prompt.position_display = pos;
|
||||
prompt.position_compose = pos;
|
||||
prompt.position_context = pos;
|
||||
});
|
||||
|
||||
const defaultPromptsToSave = ordered.filter(p => String(p.is_default) === '1' && String(p.is_special) !== '1');
|
||||
const customPromptsToSave = ordered.filter(p => String(p.is_default) === '0' && String(p.is_special) !== '1');
|
||||
const visibleSpecialsToSave = ordered.filter(p => String(p.is_special) === '1');
|
||||
const hiddenSpecialsToPreserve = allPrompts.filter(p => hiddenSpecialIds.includes(p.id));
|
||||
|
||||
await setDefaultPromptsProperties(defaultPromptsToSave);
|
||||
await setCustomPrompts(customPromptsToSave);
|
||||
await setSpecialPrompts(visibleSpecialsToSave.concat(hiddenSpecialsToPreserve));
|
||||
|
||||
await browser.storage.sync.set({ dynamic_menu_order_alphabet: false });
|
||||
}
|
||||
|
||||
export async function getSpamFilterPrompt(){
|
||||
return (await getSpecialPrompts()).find(prompt => prompt.id == 'prompt_spamfilter');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,33 @@
|
|||
} from "../options/mzta-options-default.js";
|
||||
import { taLogger } from './mzta-logger.js';
|
||||
|
||||
function validateAPIConfig(llm, prefs) {
|
||||
switch (llm) {
|
||||
case 'chatgpt_api':
|
||||
if (!prefs.chatgpt_api_key) return browser.i18n.getMessage('chatgpt_empty_apikey');
|
||||
if (!prefs.chatgpt_model) return browser.i18n.getMessage('chatgpt_empty_model');
|
||||
break;
|
||||
case 'google_gemini_api':
|
||||
if (!prefs.google_gemini_api_key) return browser.i18n.getMessage('google_gemini_empty_apikey');
|
||||
if (!prefs.google_gemini_model) return browser.i18n.getMessage('google_gemini_empty_model');
|
||||
break;
|
||||
case 'ollama_api':
|
||||
if (!prefs.ollama_host) return browser.i18n.getMessage('ollama_empty_host');
|
||||
if (!prefs.ollama_model) return browser.i18n.getMessage('ollama_empty_model');
|
||||
break;
|
||||
case 'openai_comp_api':
|
||||
if (!prefs.openai_comp_host) return browser.i18n.getMessage('OpenAIComp_empty_host');
|
||||
if (!prefs.openai_comp_model) return browser.i18n.getMessage('OpenAIComp_empty_model');
|
||||
break;
|
||||
case 'anthropic_api':
|
||||
if (!prefs.anthropic_api_key) return browser.i18n.getMessage('anthropic_empty_apikey');
|
||||
if (!prefs.anthropic_model) return browser.i18n.getMessage('anthropic_empty_model');
|
||||
if (!prefs.anthropic_version) return browser.i18n.getMessage('anthropic_empty_version');
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export class mzta_specialCommand {
|
||||
|
||||
prompt = "";
|
||||
|
|
@ -92,6 +119,15 @@
|
|||
|
||||
const prefs_api = await browser.storage.sync.get(prefsToGet);
|
||||
|
||||
if (!use_specific_api) {
|
||||
const configError = validateAPIConfig(this.llm, prefs_api);
|
||||
if (configError) {
|
||||
const err = new Error(configError);
|
||||
err.isConfigError = true;
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
let workerInitMessage = {
|
||||
type: 'init',
|
||||
do_debug: this.do_debug,
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ export const taPromptUtils = {
|
|||
|
||||
const messages_list = [];
|
||||
for (let entry of messageDataArray) {
|
||||
const bodyHtml = getMailBody(entry.fullMessage);
|
||||
const bodyHtml = await getMailBody(entry.fullMessage);
|
||||
let bodyText = htmlBodyToPlainText(bodyHtml.html);
|
||||
if (bodyText.length === 0) {
|
||||
bodyText = bodyHtml.text || '';
|
||||
|
|
@ -182,7 +182,7 @@ export const taPromptUtils = {
|
|||
promptText = browser.i18n.getMessage('prompt_translate_this_full_text');
|
||||
}
|
||||
|
||||
const bodyHtml = getMailBody(fullMessage);
|
||||
const bodyHtml = await getMailBody(fullMessage);
|
||||
const mailSubject = fullMessage.headers?.subject?.[0] || '';
|
||||
|
||||
const finalSubs = await placeholdersUtils.getPlaceholdersValues({
|
||||
|
|
|
|||
137
js/mzta-utils.js
|
|
@ -16,24 +16,69 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { prefs_default, getDynamicSettingValue } from '../options/mzta-options-default.js';
|
||||
import {
|
||||
prefs_default,
|
||||
getDynamicSettingValue
|
||||
} from '../options/mzta-options-default.js';
|
||||
|
||||
import { customMenuIconsPath } from '../pages/menu_order/mzta-custom-menu-icons.js'
|
||||
|
||||
const sparks_min = '1.2.0'; // Minimum version of ThunderAI-Sparks required for the add-on to work
|
||||
const MICZ_IT_LOCALIZED_LANGS = ['es', 'de', 'fr', 'it'];
|
||||
|
||||
export const getMenuContextCompose = () => 'compose_action_menu';
|
||||
export const getMenuContextDisplay = () => 'message_display_action_menu';
|
||||
|
||||
export const contextMenuID_GetCalendarEvent = 'mzta-get-calendar-event';
|
||||
export const contextMenuID_GetCalendarEventFromClipboard = 'mzta-get-calendar-event-from-clipboard';
|
||||
export const contextMenuID_GetTask = 'mzta-get-task';
|
||||
export const contextMenuID_AddTags = 'mzta-add-tags';
|
||||
export const contextMenuID_Spamfilter = 'mzta-spamfilter';
|
||||
export const contextMenuID_Summarize = 'mzta-summarize';
|
||||
export const contextMenuID_Translate = 'mzta-translate';
|
||||
export const contextMenuIconsPath = {
|
||||
[contextMenuID_AddTags]: 'moz-extension:images/menu_autotags.png',
|
||||
[contextMenuID_Spamfilter]: 'moz-extension:images/menu_spamfilter.png',
|
||||
[contextMenuID_Summarize]: 'moz-extension:images/menu_summarize.png',
|
||||
[contextMenuID_Translate]: 'moz-extension:images/menu_translate.png',
|
||||
[contextMenuID_GetCalendarEvent]: 'moz-extension:images/context_menu/getcalendarevent.png',
|
||||
[contextMenuID_GetCalendarEventFromClipboard]: 'moz-extension:images/context_menu/getcalendareventfromclipboard.png',
|
||||
[contextMenuID_GetTask]: 'moz-extension:images/context_menu/gettask.png',
|
||||
[contextMenuID_AddTags]: 'moz-extension:images/context_menu/autotags.png',
|
||||
[contextMenuID_Spamfilter]: 'moz-extension:images/context_menu/spamfilter.png',
|
||||
[contextMenuID_Summarize]: 'moz-extension:images/context_menu/summarize.png',
|
||||
[contextMenuID_Translate]: 'moz-extension:images/context_menu/translate.png',
|
||||
};
|
||||
|
||||
// Map from special prompt IDs to context menu IDs
|
||||
export const specialPromptToContextMenuID = {
|
||||
'prompt_get_calendar_event': contextMenuID_GetCalendarEvent,
|
||||
'prompt_get_calendar_event_from_clipboard': contextMenuID_GetCalendarEventFromClipboard,
|
||||
'prompt_get_task': contextMenuID_GetTask,
|
||||
'prompt_add_tags': contextMenuID_AddTags,
|
||||
'prompt_spamfilter': contextMenuID_Spamfilter,
|
||||
'prompt_summarize': contextMenuID_Summarize,
|
||||
'prompt_translate_this': contextMenuID_Translate,
|
||||
};
|
||||
|
||||
// const defaultContextMenuIcon = 'moz-extension:images/icon-32px.png';
|
||||
const defaultContextMenuIcon = '';
|
||||
|
||||
export function getContextMenuIcon(prompt) {
|
||||
// Back-compat: accept a plain id string too
|
||||
const promptId = (typeof prompt === 'string') ? prompt : prompt?.id;
|
||||
const isSpecial = (typeof prompt === 'object' && prompt !== null) ? String(prompt.is_special) === '1' : true;
|
||||
|
||||
if (isSpecial) {
|
||||
const contextMenuId = specialPromptToContextMenuID[promptId];
|
||||
if (contextMenuId && contextMenuIconsPath[contextMenuId]) {
|
||||
return contextMenuIconsPath[contextMenuId];
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof prompt === 'object' && prompt !== null && prompt.custom_icon) {
|
||||
return 'moz-extension:' + customMenuIconsPath + prompt.custom_icon;
|
||||
}
|
||||
|
||||
return defaultContextMenuIcon;
|
||||
}
|
||||
|
||||
export function getLanguageDisplayName(languageCode) {
|
||||
const languageDisplay = new Intl.DisplayNames([languageCode], {type: 'language'});
|
||||
let lang_string = languageDisplay.of(languageCode);
|
||||
|
|
@ -146,38 +191,52 @@ export async function getMailSubject(tab){
|
|||
}
|
||||
|
||||
function extractTextParts(fullMessage) {
|
||||
const textParts = [];
|
||||
|
||||
const textParts = []
|
||||
function walkParts(parts) {
|
||||
for (const part of parts) {
|
||||
if (part.parts && part.parts.length > 0) {
|
||||
// Recursively walk through sub-parts
|
||||
walkParts(part.parts);
|
||||
} else {
|
||||
// Check if contentType starts with "text/"
|
||||
if (part.contentType && part.contentType.startsWith("text/")) {
|
||||
textParts.push(part);
|
||||
}
|
||||
walkParts(part.parts)
|
||||
}
|
||||
// console.log(">>>>>>>>>>>> extractTextParts: part.contentType: " + part.contentType + ", part.decryptionStatus: " + part.decryptionStatus + ", part.body: " + part.body);
|
||||
if (part.contentType && part.contentType.startsWith('text/')) {
|
||||
textParts.push(part)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fullMessage.parts && fullMessage.parts.length > 0) {
|
||||
walkParts(fullMessage.parts);
|
||||
walkParts(fullMessage.parts)
|
||||
}
|
||||
|
||||
return textParts;
|
||||
return textParts
|
||||
}
|
||||
|
||||
export function getMailBody(fullMessage){
|
||||
function smartDecode(buf) {
|
||||
try {
|
||||
return new TextDecoder('utf-8', { fatal: true }).decode(buf);
|
||||
} catch (e) {
|
||||
return new TextDecoder('windows-1252').decode(buf);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getMailBody(fullMessage, messageId) {
|
||||
const textParts = extractTextParts(fullMessage);
|
||||
let text = "";
|
||||
let html = "";
|
||||
// console.log(">>>>>>>>>>>>>> getMailBody: textParts: " + JSON.stringify(textParts));
|
||||
// console.log(">>>>>>>>>>>>>> getMailBody: fullMessage: " + JSON.stringify(fullMessage));
|
||||
for (const part of textParts) {
|
||||
let body = part.body;
|
||||
if ((body === undefined || body === "") && messageId && part.partName) {
|
||||
const file = await browser.messages.getAttachmentFile(messageId, part.partName);
|
||||
const buf = await file.arrayBuffer();
|
||||
//const buf = new TextDecoder('utf-8').decode(buf);
|
||||
body = smartDecode(buf);
|
||||
}
|
||||
if (part.contentType === "text/plain") {
|
||||
text += part.body;
|
||||
// console.log(">>>>>>>>>>>>>> getMailBody: part.body (TEXT): " + body);
|
||||
text += body ?? "";
|
||||
} else if (part.contentType === "text/html") {
|
||||
html += part.body;
|
||||
// console.log(">>>>>>>>>>>>>> getMailBody: part.body (HTML): " + (body ? body.substring(0, 80) : body));
|
||||
html += body ?? "";
|
||||
}
|
||||
}
|
||||
if(html === "") {
|
||||
|
|
@ -215,13 +274,21 @@ export async function replaceBody(tabId, replyHtml) {
|
|||
await messenger.compose.setComposeDetails(tabId, {body: fullBody});
|
||||
}
|
||||
|
||||
export async function getMailHeader(curr_message, mail_header_id) {
|
||||
export async function getMailHeader(curr_message, mail_header_id = false) {
|
||||
let mail_header_value = "";
|
||||
let full_message = await browser.messages.getFull(curr_message.id);
|
||||
// console.log(">>>>>>>>>>>> getMailHeader full_message: " + JSON.stringify(full_message));
|
||||
if(full_message.hasOwnProperty("headers") && Object.keys(full_message.headers).some(header => header.toLowerCase() === mail_header_id.toLowerCase())){
|
||||
const raw_value = full_message.headers[Object.keys(full_message.headers).find(header => header.toLowerCase() === mail_header_id.toLowerCase())];
|
||||
mail_header_value = Array.isArray(raw_value) ? raw_value.join(", ") : raw_value;
|
||||
if(full_message.hasOwnProperty("headers")) {
|
||||
if(mail_header_id) {
|
||||
if(Object.keys(full_message.headers).some(header => header.toLowerCase() === mail_header_id.toLowerCase())){
|
||||
const raw_value = full_message.headers[Object.keys(full_message.headers).find(header => header.toLowerCase() === mail_header_id.toLowerCase())];
|
||||
mail_header_value = Array.isArray(raw_value) ? raw_value.join(", ") : raw_value;
|
||||
}
|
||||
} else {
|
||||
mail_header_value = Object.entries(full_message.headers)
|
||||
.map(([key, value]) => key + ": " + (Array.isArray(value) ? value.join(", ") : value))
|
||||
.join("\n");
|
||||
}
|
||||
}
|
||||
// console.log(">>>>>>>>>>>> getMailHeader mail_header_value: " + mail_header_value)
|
||||
return mail_header_value;
|
||||
|
|
@ -590,10 +657,11 @@ export function getActiveSpecialPromptsIDs(args = {}) {
|
|||
get_calendar_event = false,
|
||||
get_calendar_event_from_clipboard = false,
|
||||
get_task = false,
|
||||
spamfilter = false,
|
||||
summarize = false,
|
||||
translate = false,
|
||||
is_chatgpt_web = false
|
||||
} = args;
|
||||
// The Antispam filter is not here, because this method is used only
|
||||
// to reload the ThunderAI button menu, not the context menu
|
||||
let output = [];
|
||||
// console.log(">>>>>>>>>> getActiveSpecialPromptsIDs args: " + JSON.stringify(args));
|
||||
if (is_chatgpt_web) {
|
||||
|
|
@ -607,13 +675,22 @@ export function getActiveSpecialPromptsIDs(args = {}) {
|
|||
}
|
||||
if (get_calendar_event) {
|
||||
output.push('prompt_get_calendar_event');
|
||||
}
|
||||
if (get_calendar_event_from_clipboard) {
|
||||
output.push('prompt_get_calendar_event_from_clipboard');
|
||||
if (get_calendar_event_from_clipboard) {
|
||||
output.push('prompt_get_calendar_event_from_clipboard');
|
||||
}
|
||||
}
|
||||
if (get_task) {
|
||||
output.push('prompt_get_task');
|
||||
}
|
||||
if (spamfilter) {
|
||||
output.push('prompt_spamfilter');
|
||||
}
|
||||
if (summarize) {
|
||||
output.push('prompt_summarize');
|
||||
}
|
||||
if (translate) {
|
||||
output.push('prompt_translate_this');
|
||||
}
|
||||
// console.log(">>>>>>>>>> getActiveSpecialPromptsIDs output: " + JSON.stringify(output));
|
||||
return output;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ let taLog = null;
|
|||
|
||||
let conversationHistory = [];
|
||||
let assistantResponseAccumulator = '';
|
||||
let thinkingAccumulator = '';
|
||||
|
||||
self.onmessage = async function(event) {
|
||||
if (event.data.type === 'init') {
|
||||
|
|
@ -83,7 +84,8 @@ self.onmessage = async function(event) {
|
|||
taLog.log("AI full response [STOPPED]: " + assistantResponseAccumulator);
|
||||
conversationHistory.push({ role: 'assistant', content: assistantResponseAccumulator });
|
||||
assistantResponseAccumulator = '';
|
||||
postMessage({ type: 'tokensDone' });
|
||||
postMessage({ type: 'tokensDone', payload: { thinking: thinkingAccumulator } });
|
||||
thinkingAccumulator = '';
|
||||
break;
|
||||
}
|
||||
const { done, value } = await reader.read();
|
||||
|
|
@ -91,7 +93,8 @@ self.onmessage = async function(event) {
|
|||
taLog.log("AI full response: " + assistantResponseAccumulator);
|
||||
conversationHistory.push({ role: 'assistant', content: assistantResponseAccumulator });
|
||||
assistantResponseAccumulator = '';
|
||||
postMessage({ type: 'tokensDone' });
|
||||
postMessage({ type: 'tokensDone', payload: { thinking: thinkingAccumulator } });
|
||||
thinkingAccumulator = '';
|
||||
break;
|
||||
}
|
||||
// lots of low-level Claude response parsing stuff
|
||||
|
|
@ -124,7 +127,11 @@ self.onmessage = async function(event) {
|
|||
// Events handling
|
||||
switch (parsedData.type) {
|
||||
case 'content_block_delta':
|
||||
if (parsedData.delta && parsedData.delta.text) {
|
||||
if (parsedData.delta && parsedData.delta.type === 'thinking_delta' && typeof parsedData.delta.thinking === 'string') {
|
||||
const token = parsedData.delta.thinking;
|
||||
thinkingAccumulator += token;
|
||||
postMessage({ type: 'newThinkingToken', payload: { token } });
|
||||
} else if (parsedData.delta && typeof parsedData.delta.text === 'string') {
|
||||
const token = parsedData.delta.text;
|
||||
assistantResponseAccumulator += token;
|
||||
postMessage({ type: 'newToken', payload: { token } });
|
||||
|
|
@ -143,7 +150,8 @@ self.onmessage = async function(event) {
|
|||
taLog.log("AI full response: " + assistantResponseAccumulator);
|
||||
conversationHistory.push({ role: 'assistant', content: assistantResponseAccumulator });
|
||||
assistantResponseAccumulator = '';
|
||||
postMessage({ type: 'tokensDone' });
|
||||
postMessage({ type: 'tokensDone', payload: { thinking: thinkingAccumulator } });
|
||||
thinkingAccumulator = '';
|
||||
return; // end the loop
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
"manifest_version": 2,
|
||||
"name": "ThunderAI",
|
||||
"description": "__MSG_extensionDescription__",
|
||||
"version": "4.1.0pre3",
|
||||
"version": "4.1.0",
|
||||
"author": "Mic (m@micz.it)",
|
||||
"homepage_url": "https://micz.it/thunderbird-addon-thunderai/",
|
||||
"browser_specific_settings": {
|
||||
|
|
|
|||
|
|
@ -42,24 +42,19 @@ import {
|
|||
getMessages,
|
||||
getMailBody,
|
||||
extractJsonObject,
|
||||
contextMenuID_AddTags,
|
||||
contextMenuID_Spamfilter,
|
||||
contextMenuID_Summarize,
|
||||
contextMenuID_Translate,
|
||||
contextMenuIconsPath,
|
||||
sanitizeChatGPTModelData,
|
||||
sanitizeChatGPTWebCustomData,
|
||||
stripHtmlKeepLines,
|
||||
htmlBodyToPlainText,
|
||||
convertNewlinesToParagraphs,
|
||||
getConnectionType,
|
||||
checkAPIIntegration,
|
||||
hasSpecificIntegration,
|
||||
} from './js/mzta-utils.js';
|
||||
import { taPromptUtils } from './js/mzta-utils-prompt.js';
|
||||
import { mzta_specialCommand } from './js/mzta-special-commands.js';
|
||||
import {
|
||||
getSpamFilterPrompt
|
||||
getSpamFilterPrompt,
|
||||
migrateMenuOrderAlphabetic
|
||||
} from './js/mzta-prompts.js';
|
||||
import { taSpamReport } from './js/mzta-spamreport.js';
|
||||
import { taSummaryStore } from './js/mzta-summarystore.js';
|
||||
|
|
@ -68,7 +63,7 @@ import { taWorkingStatus } from './js/mzta-working-status.js';
|
|||
import {
|
||||
addTags_getExclusionList,
|
||||
checkExcludedTag
|
||||
} from './js/mzta-addatags-exclusion-list.js';
|
||||
} from './js/mzta-addtags-exclusion-list.js';
|
||||
|
||||
browser.runtime.onInstalled.addListener(({ reason, previousVersion }) => {
|
||||
// console.log(">>>>>>>>>>> onInstalled: " + JSON.stringify(reason) + ", previousVersion: " + previousVersion);
|
||||
|
|
@ -105,6 +100,9 @@ let special_prompts_ids = getActiveSpecialPromptsIDs({
|
|||
get_calendar_event: doGetSparkFeature(prefs_init.get_calendar_event),
|
||||
get_calendar_event_from_clipboard: doGetSparkFeature(prefs_init.get_calendar_event_from_clipboard),
|
||||
get_task: doGetSparkFeature(prefs_init.get_task),
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
|
||||
|
|
@ -169,7 +167,7 @@ function preparePopupMenu(tab) {
|
|||
}
|
||||
|
||||
async function _reload_menus() {
|
||||
let prefs_reload = await browser.storage.sync.get({add_tags: prefs_default.add_tags, get_calendar_event: prefs_default.get_calendar_event, get_calendar_event_from_clipboard: prefs_default.get_calendar_event_from_clipboard, get_task: prefs_default.get_task, connection_type: prefs_default.connection_type});
|
||||
let prefs_reload = await browser.storage.sync.get({add_tags: prefs_default.add_tags, get_calendar_event: prefs_default.get_calendar_event, get_calendar_event_from_clipboard: prefs_default.get_calendar_event_from_clipboard, get_task: prefs_default.get_task, connection_type: prefs_default.connection_type, spamfilter: prefs_default.spamfilter, summarize: prefs_default.summarize, translate: prefs_default.translate});
|
||||
let getCalendarEvent = doGetSparkFeature(prefs_reload.get_calendar_event);
|
||||
let getCalendarEventFromClipboard = doGetSparkFeature(prefs_reload.get_calendar_event_from_clipboard);
|
||||
let getTask = doGetSparkFeature(prefs_reload.get_task);
|
||||
|
|
@ -179,6 +177,9 @@ async function _reload_menus() {
|
|||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_reload.spamfilter,
|
||||
summarize: prefs_reload.summarize,
|
||||
translate: prefs_reload.translate,
|
||||
is_chatgpt_web: (prefs_reload.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
|
|
@ -186,6 +187,24 @@ async function _reload_menus() {
|
|||
return true;
|
||||
}
|
||||
|
||||
async function _getActiveSpecialIds() {
|
||||
let prefs_reload = await browser.storage.sync.get({add_tags: prefs_default.add_tags, get_calendar_event: prefs_default.get_calendar_event, get_calendar_event_from_clipboard: prefs_default.get_calendar_event_from_clipboard, get_task: prefs_default.get_task, connection_type: prefs_default.connection_type, spamfilter: prefs_default.spamfilter, summarize: prefs_default.summarize, translate: prefs_default.translate});
|
||||
let getCalendarEvent = doGetSparkFeature(prefs_reload.get_calendar_event);
|
||||
let getCalendarEventFromClipboard = doGetSparkFeature(prefs_reload.get_calendar_event_from_clipboard);
|
||||
let getTask = doGetSparkFeature(prefs_reload.get_task);
|
||||
return getActiveSpecialPromptsIDs({
|
||||
addtags: prefs_reload.add_tags,
|
||||
addtags_api: hasSpecificIntegration(prefs_init.add_tags_use_specific_integration, prefs_init.add_tags_connection_type),
|
||||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_reload.spamfilter,
|
||||
summarize: prefs_reload.summarize,
|
||||
translate: prefs_reload.translate,
|
||||
is_chatgpt_web: (prefs_reload.connection_type === "chatgpt_web")
|
||||
});
|
||||
}
|
||||
|
||||
async function _assign_tags(_data, create_new_tags = true, exclusions_exact_match = false) {
|
||||
let all_tags_list = await getTagsList();
|
||||
all_tags_list = all_tags_list[1];
|
||||
|
|
@ -266,6 +285,8 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
case 'triggerSummaryGeneration':
|
||||
async function _triggerSummaryGeneration(message) {
|
||||
let tabId = sender.tab.id;
|
||||
// Fire the inline loading indicator immediately, before any await
|
||||
browser.tabs.sendMessage(tabId, { command: "showSummaryGenerating" });
|
||||
await _generateSummaryForMessage(message.headerMessageId, tabId);
|
||||
}
|
||||
_triggerSummaryGeneration(message);
|
||||
|
|
@ -286,11 +307,14 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
case 'refreshSummary':
|
||||
async function _refreshSummary(message) {
|
||||
let tabId = sender.tab.id;
|
||||
await summaryStore.removeSummary(message.headerMessageId);
|
||||
let prefs_refresh = await browser.storage.sync.get({ summarize_display_mode: prefs_default.summarize_display_mode });
|
||||
if (prefs_refresh.summarize_display_mode === 'webchat') {
|
||||
await summaryStore.removeSummary(message.headerMessageId);
|
||||
await _openSummaryWebchat(message.headerMessageId, tabId);
|
||||
} else {
|
||||
// Fire the inline loading indicator immediately, before any await
|
||||
browser.tabs.sendMessage(tabId, { command: "showSummaryGenerating" });
|
||||
await summaryStore.removeSummary(message.headerMessageId);
|
||||
await _generateSummaryForMessage(message.headerMessageId, tabId);
|
||||
}
|
||||
}
|
||||
|
|
@ -375,6 +399,8 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
case 'triggerTranslationGeneration':
|
||||
async function _triggerTranslationGeneration(message) {
|
||||
let tabId = sender.tab.id;
|
||||
// Fire the inline loading indicator immediately, before any await
|
||||
browser.tabs.sendMessage(tabId, { command: "showTranslationGenerating" });
|
||||
let prefs_tl = await browser.storage.sync.get({
|
||||
translate_lang: prefs_default.translate_lang,
|
||||
default_chatgpt_lang: prefs_default.default_chatgpt_lang
|
||||
|
|
@ -393,6 +419,8 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
case 'refreshTranslation':
|
||||
async function _refreshTranslation(message) {
|
||||
let tabId = sender.tab.id;
|
||||
// Fire the inline loading indicator immediately, before any await
|
||||
browser.tabs.sendMessage(tabId, { command: "showTranslationGenerating" });
|
||||
await translationStore.removeTranslation(message.headerMessageId);
|
||||
await _generateTranslationForMessage(message.headerMessageId, tabId);
|
||||
}
|
||||
|
|
@ -507,8 +535,26 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
case 'reload_menus':
|
||||
return _reload_menus();
|
||||
break;
|
||||
case 'get_active_special_ids':
|
||||
return _getActiveSpecialIds();
|
||||
break;
|
||||
case 'shortcut_do_prompt':
|
||||
taLog.log("Executing shortcut, promptId: " + message.promptId);
|
||||
if (message.promptId !== 'prompt_add_tags' && specialContextMenuActions[message.promptId]) { //TODO Add an option here if you want the user to decide to use the autotagging also in the popup menu
|
||||
async function _shortcut_special() {
|
||||
let tabId = message.tabId;
|
||||
if (!tabId) {
|
||||
let tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
if (tabs.length === 0) return false;
|
||||
tabId = tabs[0].id;
|
||||
}
|
||||
let displayedMessage = await browser.messageDisplay.getDisplayedMessage(tabId);
|
||||
if (!displayedMessage) return false;
|
||||
taLog.log("Displayed message found.");
|
||||
return specialContextMenuActions[message.promptId]([displayedMessage]);
|
||||
}
|
||||
return _shortcut_special();
|
||||
}
|
||||
return menus.executeMenuAction(message.promptId);
|
||||
break;
|
||||
case 'popup_menu_ready':
|
||||
|
|
@ -659,7 +705,7 @@ async function _generateSummaryForMessage(headerMessageId, tabId = null, options
|
|||
|
||||
} catch (error) {
|
||||
console.error("[ThunderAI] Error generating summary:", error);
|
||||
await summaryStore.saveError(headerMessageId, error.message || String(error));
|
||||
if (!error.isConfigError) await summaryStore.saveError(headerMessageId, error.message || String(error));
|
||||
if (tabId) browser.tabs.sendMessage(tabId, { command: "showSummary", data: { error: true, message: error.message || "Failed to generate summary" } });
|
||||
taWorkingStatus.stopWorking();
|
||||
}
|
||||
|
|
@ -738,10 +784,10 @@ async function _generateTranslationForMessage(headerMessageId, tabId = null, opt
|
|||
let translatedSubject = '';
|
||||
let translationStatus = '';
|
||||
try {
|
||||
const parsed = JSON.parse(aiResponse);
|
||||
const parsed = extractJsonObject(aiResponse);
|
||||
translatedBody = parsed.body || '';
|
||||
translatedSubject = parsed.subject || '';
|
||||
translationStatus = String(parsed.status || '');
|
||||
translationStatus = String(parsed.status ?? '');
|
||||
} catch (e) {
|
||||
translatedBody = aiResponse;
|
||||
}
|
||||
|
|
@ -759,7 +805,7 @@ async function _generateTranslationForMessage(headerMessageId, tabId = null, opt
|
|||
|
||||
} catch (error) {
|
||||
console.error("[ThunderAI] Error generating translation:", error);
|
||||
await translationStore.saveError(headerMessageId, error.message || String(error));
|
||||
if (!error.isConfigError) await translationStore.saveError(headerMessageId, error.message || String(error));
|
||||
if (tabId) browser.tabs.sendMessage(tabId, { command: "showTranslation", data: { error: true, message: error.message || "Failed to generate translation" } });
|
||||
taWorkingStatus.stopWorking();
|
||||
}
|
||||
|
|
@ -799,7 +845,7 @@ async function _generateSpamReportForMessage(headerMessageId, options = {}) {
|
|||
}
|
||||
message = messageResult.messages[0];
|
||||
curr_fullMessage = await browser.messages.getFull(message.id);
|
||||
msg_text = getMailBody(curr_fullMessage);
|
||||
msg_text = await getMailBody(curr_fullMessage);
|
||||
body_text = htmlBodyToPlainText(msg_text.html);
|
||||
if (body_text.length == 0) {
|
||||
body_text = msg_text.text.replace(/\s+/g, ' ').trim();
|
||||
|
|
@ -938,8 +984,12 @@ async function _generateSpamReportForMessage(headerMessageId, options = {}) {
|
|||
|
||||
} catch (error) {
|
||||
console.error("[ThunderAI] Error generating spam report:", error);
|
||||
let err_data = await spamReport.saveError(headerMessageId, error.message || String(error));
|
||||
await updateSpamPanel(headerMessageId, "showSpamReport", err_data);
|
||||
if (error.isConfigError) {
|
||||
await updateSpamPanel(headerMessageId, "showSpamReport", { spamValue: -999, explanation: error.message || String(error) });
|
||||
} else {
|
||||
let err_data = await spamReport.saveError(headerMessageId, error.message || String(error));
|
||||
await updateSpamPanel(headerMessageId, "showSpamReport", err_data);
|
||||
}
|
||||
return { success: false };
|
||||
}
|
||||
}
|
||||
|
|
@ -1436,6 +1486,9 @@ function setupStorageChangeListener() {
|
|||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
|
|
@ -1453,6 +1506,9 @@ function setupStorageChangeListener() {
|
|||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
|
|
@ -1470,6 +1526,9 @@ function setupStorageChangeListener() {
|
|||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
|
|
@ -1487,6 +1546,69 @@ function setupStorageChangeListener() {
|
|||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
}
|
||||
|
||||
// Process 'spamfilter' changes
|
||||
if (changes.spamfilter) {
|
||||
const newSpamfilter = changes.spamfilter.newValue;
|
||||
let getCalendarEvent = doGetSparkFeature(prefs_init.get_calendar_event);
|
||||
let getCalendarEventFromClipboard = doGetSparkFeature(prefs_init.get_calendar_event_from_clipboard);
|
||||
let getTask = doGetSparkFeature(prefs_init.get_task);
|
||||
const special_prompts_ids = getActiveSpecialPromptsIDs({
|
||||
addtags: prefs_init.add_tags,
|
||||
addtags_api: hasSpecificIntegration(prefs_init.add_tags_use_specific_integration, prefs_init.add_tags_connection_type),
|
||||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: newSpamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
}
|
||||
|
||||
// Process 'summarize' changes
|
||||
if (changes.summarize) {
|
||||
const newSummarize = changes.summarize.newValue;
|
||||
let getCalendarEvent = doGetSparkFeature(prefs_init.get_calendar_event);
|
||||
let getCalendarEventFromClipboard = doGetSparkFeature(prefs_init.get_calendar_event_from_clipboard);
|
||||
let getTask = doGetSparkFeature(prefs_init.get_task);
|
||||
const special_prompts_ids = getActiveSpecialPromptsIDs({
|
||||
addtags: prefs_init.add_tags,
|
||||
addtags_api: hasSpecificIntegration(prefs_init.add_tags_use_specific_integration, prefs_init.add_tags_connection_type),
|
||||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: newSummarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
}
|
||||
|
||||
// Process 'translate' changes
|
||||
if (changes.translate) {
|
||||
const newTranslate = changes.translate.newValue;
|
||||
let getCalendarEvent = doGetSparkFeature(prefs_init.get_calendar_event);
|
||||
let getCalendarEventFromClipboard = doGetSparkFeature(prefs_init.get_calendar_event_from_clipboard);
|
||||
let getTask = doGetSparkFeature(prefs_init.get_task);
|
||||
const special_prompts_ids = getActiveSpecialPromptsIDs({
|
||||
addtags: prefs_init.add_tags,
|
||||
addtags_api: hasSpecificIntegration(prefs_init.add_tags_use_specific_integration, prefs_init.add_tags_connection_type),
|
||||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: newTranslate,
|
||||
is_chatgpt_web: (prefs_init.connection_type === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
|
|
@ -1504,14 +1626,15 @@ function setupStorageChangeListener() {
|
|||
get_calendar_event: getCalendarEvent,
|
||||
get_calendar_event_from_clipboard: getCalendarEventFromClipboard,
|
||||
get_task: getTask,
|
||||
spamfilter: prefs_init.spamfilter,
|
||||
summarize: prefs_init.summarize,
|
||||
translate: prefs_init.translate,
|
||||
is_chatgpt_web: (newConnectionType === "chatgpt_web")
|
||||
});
|
||||
menus.reload(special_prompts_ids);
|
||||
}
|
||||
|
||||
reload_pref_init().then(() => {
|
||||
addContextMenuItems();
|
||||
});
|
||||
reload_pref_init();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -1540,97 +1663,34 @@ function setupPermissionsRemovedListener() {
|
|||
setupPermissionsRemovedListener();
|
||||
|
||||
// Menus handling
|
||||
await migrateMenuOrderAlphabetic();
|
||||
const menus = new mzta_Menus(openChatGPT, prefs_init.do_debug);
|
||||
menus.loadMenus(special_prompts_ids);
|
||||
|
||||
// Context Menus
|
||||
function addContextMenu(menu_id) {
|
||||
browser.menus.remove(menu_id);
|
||||
browser.menus.create({
|
||||
id: menu_id,
|
||||
title: browser.i18n.getMessage("context_menu_" + menu_id),
|
||||
contexts: ["message_list"],
|
||||
icons: contextMenuIconsPath[menu_id],
|
||||
});
|
||||
taLog.log("Context menu added: " + menu_id);
|
||||
// console.log(">>>>>>> contextMenuIconsPath[menu_id]: " + contextMenuIconsPath[menu_id]);
|
||||
}
|
||||
// Context menu click handling
|
||||
// Context menus are now created dynamically by mzta_Menus.loadContextMenus()
|
||||
// based on each prompt's show_in property. The menu item IDs use the format 'mzta-ctx-<prompt_id>'.
|
||||
// Special prompts (add_tags, spamfilter, summarize, translate) are routed to processEmails()
|
||||
// for batch processing. Regular prompts are executed via menus.executeMenuAction().
|
||||
|
||||
function removeContextMenu(menu_id) {
|
||||
browser.menus.remove(menu_id);
|
||||
taLog.log("Context menu removed: " + menu_id);
|
||||
}
|
||||
const specialContextMenuActions = {
|
||||
'prompt_add_tags': (messages) => processEmails({ messages, addTagsAuto: true }),
|
||||
'prompt_spamfilter': (messages) => processEmails({ messages, spamFilter: true }),
|
||||
'prompt_summarize': (messages) => processEmails({ messages, summarize: true }),
|
||||
'prompt_translate_this': (messages) => processEmails({ messages, translate: true }),
|
||||
};
|
||||
|
||||
function addContextMenuItems() {
|
||||
let itemsToAdd = [];
|
||||
browser.menus.onClicked.addListener((info, tab) => {
|
||||
const menuItemId = info.menuItemId;
|
||||
if (typeof menuItemId !== 'string' || !menuItemId.startsWith('mzta-ctx-')) {
|
||||
return;
|
||||
}
|
||||
const promptId = menuItemId.replace('mzta-ctx-', '');
|
||||
|
||||
// Add Context menu: Add tags
|
||||
if(prefs_init.add_tags && checkAPIIntegration(prefs_init.connection_type, prefs_init.add_tags_use_specific_integration,prefs_init.add_tags_connection_type)){
|
||||
itemsToAdd.push(contextMenuID_AddTags);
|
||||
if (specialContextMenuActions[promptId]) {
|
||||
specialContextMenuActions[promptId](getMessages(info.selectedMessages));
|
||||
} else {
|
||||
removeContextMenu(contextMenuID_AddTags);
|
||||
}
|
||||
|
||||
// Add Context menu: Spamfilter
|
||||
if(prefs_init.spamfilter && checkAPIIntegration(prefs_init.connection_type, prefs_init.spamfilter_use_specific_integration,prefs_init.spamfilter_connection_type)){
|
||||
itemsToAdd.push(contextMenuID_Spamfilter);
|
||||
} else {
|
||||
removeContextMenu(contextMenuID_Spamfilter);
|
||||
}
|
||||
|
||||
// Add Context menu: Summarize
|
||||
if(prefs_init.summarize && checkAPIIntegration(prefs_init.connection_type, prefs_init.summarize_use_specific_integration, prefs_init.summarize_connection_type)) {
|
||||
itemsToAdd.push(contextMenuID_Summarize);
|
||||
} else {
|
||||
removeContextMenu(contextMenuID_Summarize);
|
||||
}
|
||||
|
||||
// Add Context menu: Translate
|
||||
if(prefs_init.translate && checkAPIIntegration(prefs_init.connection_type, prefs_init.translate_use_specific_integration, prefs_init.translate_connection_type)){
|
||||
itemsToAdd.push(contextMenuID_Translate);
|
||||
} else {
|
||||
removeContextMenu(contextMenuID_Translate);
|
||||
}
|
||||
|
||||
itemsToAdd.sort((a, b) => {
|
||||
let titleA = browser.i18n.getMessage("context_menu_" + a);
|
||||
let titleB = browser.i18n.getMessage("context_menu_" + b);
|
||||
return titleA.localeCompare(titleB);
|
||||
});
|
||||
|
||||
itemsToAdd.forEach(menu_id => {
|
||||
addContextMenu(menu_id);
|
||||
});
|
||||
}
|
||||
|
||||
addContextMenuItems();
|
||||
|
||||
// Listen for context menu item clicks
|
||||
browser.menus.onClicked.addListener( (info, tab) => {
|
||||
let _add_tags = false
|
||||
let _spamfilter = false
|
||||
let _summarize = false;
|
||||
let _translate = false;
|
||||
if(info.menuItemId === contextMenuID_AddTags){
|
||||
_add_tags = true;
|
||||
}
|
||||
if(info.menuItemId === contextMenuID_Spamfilter){
|
||||
_spamfilter = true;
|
||||
}
|
||||
if(info.menuItemId === contextMenuID_Summarize) {
|
||||
_summarize = true;
|
||||
}
|
||||
if(info.menuItemId === contextMenuID_Translate) {
|
||||
_translate = true;
|
||||
}
|
||||
if(_add_tags || _spamfilter || _summarize || _translate){
|
||||
processEmails({
|
||||
messages: getMessages(info.selectedMessages),
|
||||
addTagsAuto: _add_tags,
|
||||
spamFilter: _spamfilter,
|
||||
summarize: _summarize,
|
||||
translate: _translate
|
||||
});
|
||||
menus.executeMenuAction(promptId);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -1655,7 +1715,8 @@ const newEmailListener = (folder, messagesList) => {
|
|||
addTagsAuto: add_tags_auto_enabled,
|
||||
spamFilter: prefs_init.spamfilter,
|
||||
summarizeOnReceive: prefs_init.summarize && prefs_init.summarize_auto === 3,
|
||||
translateOnReceive: prefs_init.translate && prefs_init.translate_auto === 3
|
||||
translateOnReceive: prefs_init.translate && prefs_init.translate_auto === 3,
|
||||
isAutoMode: true,
|
||||
});
|
||||
|
||||
if(prefs_init.spamfilter){
|
||||
|
|
@ -1666,6 +1727,16 @@ const newEmailListener = (folder, messagesList) => {
|
|||
return _newEmailListener();
|
||||
}
|
||||
|
||||
async function showGenericError(errMsg, source) {
|
||||
let tabs = await browser.tabs.query({});
|
||||
for (const tab of tabs) {
|
||||
browser.tabs.sendMessage(tab.id, {
|
||||
command: "showGenericError",
|
||||
data: { message: errMsg, source: source }
|
||||
}).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
async function updateSpamPanel(messageId, command, data = null) {
|
||||
if (prefs_init.spamfilter_show_msg_panel) {
|
||||
let tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
|
|
@ -1691,7 +1762,8 @@ async function processEmails(args) {
|
|||
summarize = false,
|
||||
summarizeOnReceive = false,
|
||||
translateOnReceive = false,
|
||||
translate = false
|
||||
translate = false,
|
||||
isAutoMode = false,
|
||||
} = args;
|
||||
|
||||
taWorkingStatus.startWorking();
|
||||
|
|
@ -1727,7 +1799,7 @@ async function processEmails(args) {
|
|||
|
||||
if (addTagsAuto || spamFilter) {
|
||||
curr_fullMessage = await browser.messages.getFull(message.id);
|
||||
msg_text = getMailBody(curr_fullMessage);
|
||||
msg_text = await getMailBody(curr_fullMessage);
|
||||
taLog.log("Starting from the HTML body if present and converting to plain text...");
|
||||
body_text = htmlBodyToPlainText(msg_text.html);
|
||||
if( body_text.length == 0 ){
|
||||
|
|
@ -1737,69 +1809,85 @@ async function processEmails(args) {
|
|||
}
|
||||
|
||||
if (addTagsAuto) {
|
||||
if(prefs_aats.add_tags_enabled_accounts.length > 0){
|
||||
let skipAddTags = false;
|
||||
if(isAutoMode && prefs_aats.add_tags_enabled_accounts.length > 0){
|
||||
let accountId = message.folder.accountId;
|
||||
if(!prefs_aats.add_tags_enabled_accounts.includes(accountId)){
|
||||
taLog.log("Account " + accountId + " not enabled for add_tags, skipping...");
|
||||
continue;
|
||||
skipAddTags = true;
|
||||
}
|
||||
}
|
||||
let specialFullPrompt_add_tags = '';
|
||||
let curr_prompt_add_tags = menus.allPrompts.find(p => p.id === 'prompt_add_tags');
|
||||
let tags_full_list = await getTagsList();
|
||||
// console.log(">>>>>>>>>>>>> curr_prompt_add_tags: " + JSON.stringify(curr_prompt_add_tags));
|
||||
let chatgpt_lang = await taPromptUtils.getDefaultLang(curr_prompt_add_tags);
|
||||
specialFullPrompt_add_tags = await taPromptUtils.preparePrompt({
|
||||
curr_prompt: curr_prompt_add_tags,
|
||||
curr_message: message,
|
||||
chatgpt_lang: chatgpt_lang,
|
||||
body_text: body_text,
|
||||
subject_text: curr_fullMessage.headers.subject,
|
||||
msg_text: msg_text,
|
||||
tags_full_list: tags_full_list
|
||||
});
|
||||
specialFullPrompt_add_tags = taPromptUtils.finalizePrompt_add_tags(specialFullPrompt_add_tags, prefs_aats.add_tags_maxnum, prefs_aats.add_tags_force_lang, prefs_aats.default_chatgpt_lang, prefs_aats.add_tags_auto_uselist, prefs_aats.add_tags_auto_uselist_list);
|
||||
taLog.log("Special prompt: " + specialFullPrompt_add_tags);
|
||||
// console.log(">>>>>>>>>> curr_prompt_add_tags.model: " + curr_prompt_add_tags.model);
|
||||
// console.log(">>>>>>>>>>>>>>>>> getConnectionType add_tags:" + JSON.stringify(getConnectionType(prefs_aats, curr_prompt_add_tags, 'add_tags')));
|
||||
let cmd_addTags = new mzta_specialCommand({
|
||||
prompt: specialFullPrompt_add_tags,
|
||||
llm: getConnectionType(prefs_aats, curr_prompt_add_tags, 'add_tags'),
|
||||
custom_model: curr_prompt_add_tags.model ? curr_prompt_add_tags.model : '',
|
||||
do_debug: prefs_aats.do_debug,
|
||||
config: curr_prompt_add_tags
|
||||
});
|
||||
await cmd_addTags.initWorker();
|
||||
let tags_current_email = [];
|
||||
try {
|
||||
tags_current_email = taPromptUtils.getTagsFromResponse(await cmd_addTags.sendPrompt(), prefs_aats.add_tags_auto_uselist, prefs_aats.add_tags_auto_uselist_list);
|
||||
} catch (err) {
|
||||
console.error("[ThunderAI | Auto add_tags] Error getting tags: ", err);
|
||||
if (!skipAddTags) {
|
||||
let specialFullPrompt_add_tags = '';
|
||||
let curr_prompt_add_tags = menus.allPrompts.find(p => p.id === 'prompt_add_tags');
|
||||
let tags_full_list = await getTagsList();
|
||||
// console.log(">>>>>>>>>>>>> curr_prompt_add_tags: " + JSON.stringify(curr_prompt_add_tags));
|
||||
let chatgpt_lang = await taPromptUtils.getDefaultLang(curr_prompt_add_tags);
|
||||
specialFullPrompt_add_tags = await taPromptUtils.preparePrompt({
|
||||
curr_prompt: curr_prompt_add_tags,
|
||||
curr_message: message,
|
||||
chatgpt_lang: chatgpt_lang,
|
||||
body_text: body_text,
|
||||
subject_text: curr_fullMessage.headers.subject,
|
||||
msg_text: msg_text,
|
||||
tags_full_list: tags_full_list
|
||||
});
|
||||
specialFullPrompt_add_tags = taPromptUtils.finalizePrompt_add_tags(specialFullPrompt_add_tags, prefs_aats.add_tags_maxnum, prefs_aats.add_tags_force_lang, prefs_aats.default_chatgpt_lang, prefs_aats.add_tags_auto_uselist, prefs_aats.add_tags_auto_uselist_list);
|
||||
taLog.log("Special prompt: " + specialFullPrompt_add_tags);
|
||||
// console.log(">>>>>>>>>> curr_prompt_add_tags.model: " + curr_prompt_add_tags.model);
|
||||
// console.log(">>>>>>>>>>>>>>>>> getConnectionType add_tags:" + JSON.stringify(getConnectionType(prefs_aats, curr_prompt_add_tags, 'add_tags')));
|
||||
let cmd_addTags = new mzta_specialCommand({
|
||||
prompt: specialFullPrompt_add_tags,
|
||||
llm: getConnectionType(prefs_aats, curr_prompt_add_tags, 'add_tags'),
|
||||
custom_model: curr_prompt_add_tags.model ? curr_prompt_add_tags.model : '',
|
||||
do_debug: prefs_aats.do_debug,
|
||||
config: curr_prompt_add_tags
|
||||
});
|
||||
let addTagsInitFailed = false;
|
||||
try {
|
||||
await cmd_addTags.initWorker();
|
||||
} catch (err) {
|
||||
addTagsInitFailed = true;
|
||||
if (err.isConfigError) {
|
||||
await showGenericError(err.message, browser.i18n.getMessage('prompt_add_tags') || 'Add tags');
|
||||
} else {
|
||||
console.error("[ThunderAI | Auto add_tags] initWorker error: ", err);
|
||||
}
|
||||
}
|
||||
if (!addTagsInitFailed) {
|
||||
let tags_current_email = [];
|
||||
try {
|
||||
tags_current_email = taPromptUtils.getTagsFromResponse(await cmd_addTags.sendPrompt(), prefs_aats.add_tags_auto_uselist, prefs_aats.add_tags_auto_uselist_list);
|
||||
} catch (err) {
|
||||
console.error("[ThunderAI | Auto add_tags] Error getting tags: ", err);
|
||||
}
|
||||
taLog.log("tags_current_email: " + JSON.stringify(tags_current_email));
|
||||
let _data = { messageId: message.id, tags: tags_current_email };
|
||||
_assign_tags(_data, !prefs_aats.add_tags_auto_force_existing, prefs_aats.add_tags_exclusions_exact_match);
|
||||
}
|
||||
}
|
||||
taLog.log("tags_current_email: " + JSON.stringify(tags_current_email));
|
||||
let _data = { messageId: message.id, tags: tags_current_email };
|
||||
_assign_tags(_data, !prefs_aats.add_tags_auto_force_existing, prefs_aats.add_tags_exclusions_exact_match);
|
||||
}
|
||||
|
||||
if (spamFilter) {
|
||||
if(prefs_aats.spamfilter_enabled_accounts.length > 0){
|
||||
let skipSpamFilter = false;
|
||||
if(isAutoMode && prefs_aats.spamfilter_enabled_accounts.length > 0){
|
||||
let accountId = message.folder.accountId;
|
||||
if(!prefs_aats.spamfilter_enabled_accounts.includes(accountId)){
|
||||
taLog.log("Account " + accountId + " not enabled for spamfilter, skipping...");
|
||||
continue;
|
||||
skipSpamFilter = true;
|
||||
}
|
||||
}
|
||||
|
||||
let result = await _generateSpamReportForMessage(
|
||||
message.headerMessageId,
|
||||
{
|
||||
messageData: { message, fullMessage: curr_fullMessage, body_text, msg_text },
|
||||
prefs: prefs_aats,
|
||||
autoMove: true,
|
||||
skip_addresses: spamfilter_skip_addresses,
|
||||
skip_addressbook: spamfilter_skip_addressbook
|
||||
});
|
||||
if (!result.success) continue;
|
||||
if (!skipSpamFilter) {
|
||||
await _generateSpamReportForMessage(
|
||||
message.headerMessageId,
|
||||
{
|
||||
messageData: { message, fullMessage: curr_fullMessage, body_text, msg_text },
|
||||
prefs: prefs_aats,
|
||||
autoMove: true,
|
||||
skip_addresses: spamfilter_skip_addresses,
|
||||
skip_addressbook: spamfilter_skip_addressbook
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (summarizeOnReceive) {
|
||||
|
|
@ -1830,8 +1918,6 @@ async function processEmails(args) {
|
|||
}
|
||||
|
||||
if (summarize) {
|
||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
const tabId = tabs[0].id;
|
||||
let summarize_prefs = await browser.storage.sync.get({ summarize_display_mode: prefs_default.summarize_display_mode });
|
||||
|
||||
// Collect messages into array to check count
|
||||
|
|
@ -1840,9 +1926,19 @@ async function processEmails(args) {
|
|||
messageArray.push(msg);
|
||||
}
|
||||
|
||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
const tabId = tabs[0].id;
|
||||
|
||||
// Inline mode for single message: generate inline summary in the message pane
|
||||
if (summarize_prefs.summarize_display_mode === 'inline' && messageArray.length === 1) {
|
||||
await _generateSummaryForMessage(messageArray[0].headerMessageId, tabId);
|
||||
// Fire the inline loading indicator immediately, before any heavy work
|
||||
browser.tabs.sendMessage(tabId, { command: "showSummaryGenerating" });
|
||||
|
||||
const msg = messageArray[0];
|
||||
const fullMessage = await browser.messages.getFull(msg.id);
|
||||
await _generateSummaryForMessage(msg.headerMessageId, tabId, {
|
||||
messageData: { message: msg, fullMessage }
|
||||
});
|
||||
} else {
|
||||
// Webchat mode, or inline with multiple messages (fallback to webchat)
|
||||
const messageDataArray = [];
|
||||
|
|
|
|||
|
|
@ -55,7 +55,8 @@ export const integration_options_config = {
|
|||
version: '2023-06-01',
|
||||
max_tokens: 4096,
|
||||
system_prompt: '',
|
||||
temperature: ''
|
||||
temperature: '',
|
||||
extended_thinking_budget: 0
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -114,8 +115,8 @@ export const prefs_default = {
|
|||
chatgpt_web_custom_gpt: '',
|
||||
chatgpt_web_load_wait_time: 1000,
|
||||
dynamic_menu_force_enter: false,
|
||||
dynamic_menu_order_alphabet: true,
|
||||
placeholders_use_default_value: false,
|
||||
hide_thinking: true,
|
||||
max_prompt_length: 30000, // max string length for prompt
|
||||
add_tags: false,
|
||||
add_tags_maxnum: 3,
|
||||
|
|
@ -139,7 +140,8 @@ export const prefs_default = {
|
|||
spamfilter_threshold: 70,
|
||||
spamfilter_enabled_accounts: [],
|
||||
spamfilter_skip_addresses: [],
|
||||
spamfilter_skip_addressbook: false,
|
||||
spamfilter_skip_addressbook: true,
|
||||
spamfilter_show_msg_panel: true,
|
||||
summarize: false,
|
||||
summarize_auto: 1, // 0: disabled, 1: manual button, 2: automatic on message open, 3: generate on email receive
|
||||
summarize_display_mode: 'inline', // 'inline' or 'webchat'
|
||||
|
|
@ -150,6 +152,5 @@ export const prefs_default = {
|
|||
translate_max_display_length: 0, // 0 = no limit, otherwise max chars shown inline
|
||||
translate_lang: '', // target language, fallback on default_chatgpt_lang
|
||||
translate_exclude_lang: '', // languages to do not translate
|
||||
spamfilter_show_msg_panel: true,
|
||||
...generated_prefs
|
||||
}
|
||||
|
|
|
|||
|
|
@ -117,12 +117,11 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td><label>
|
||||
<span class="opt_title">__MSG_prefs_OptionText_dynamic_menu_order_alphabet__</span>
|
||||
<span class="opt_title">__MSG_menu_order_title__</span>
|
||||
</label></td>
|
||||
<td>
|
||||
<label>
|
||||
<input type="checkbox" id="dynamic_menu_order_alphabet" name="dynamic_menu_order_alphabet" class="option-input" />
|
||||
<span>__MSG_prefs_OptionText_dynamic_menu_order_alphabet_info__</span>
|
||||
<button id="btnMenuOrder">__MSG_menu_order_btn_label__</button>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -148,6 +147,17 @@
|
|||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label>
|
||||
<span class="opt_title">__MSG_prefs_OptionText_hide_thinking__</span>
|
||||
</label></td>
|
||||
<td>
|
||||
<label>
|
||||
<input type="checkbox" id="hide_thinking" name="hide_thinking" class="option-input" />
|
||||
<span>__MSG_prefs_OptionText_hide_thinking_info__</span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label>
|
||||
<span class="opt_title">__MSG_prefs_OptionText_composing_plain_text__</span>
|
||||
|
|
|
|||
|
|
@ -410,6 +410,10 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
openTab('/pages/customdataplaceholders/mzta-custom-dataplaceholders.html');
|
||||
});
|
||||
|
||||
document.getElementById('btnMenuOrder').addEventListener('click', () => {
|
||||
openTab('/pages/menu_order/mzta-menu-order.html');
|
||||
});
|
||||
|
||||
document.getElementById('btnManageTagsInfo').addEventListener('click', () => {
|
||||
openTab('/pages/addtags/mzta-add-tags.html');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -7,19 +7,41 @@
|
|||
<body>
|
||||
<div id="miczBackPrefs"><a href="mzta-options.html">__MSG_backToOptionsText__</a></div>
|
||||
<div id="miczRelNotes"><h1>ThunderAI Release Notes</h1>
|
||||
<h2>Version 4.1.0 - ??/??/2026</h2>
|
||||
<h2>Version 4.1.0 - 13/05/2026</h2>
|
||||
<ul>
|
||||
<li>Antispam information are now permanently saved for each message [<a href="https://github.com/micz/ThunderAI/issues/675">#675</a>].</li>
|
||||
<li><i>[All APIs]</i> A summary has been added above the mail content [<a href="https://github.com/micz/ThunderAI/issues/580">#580</a>].</li>
|
||||
<li><i>[All APIs]</i> Added inline auto translation for emails [<a href="https://github.com/micz/ThunderAI/issues/247">#247</a>].</li>
|
||||
<li>Custom menus configuration added. Now it's possibile to define which prompts show in the ThunderAI menu, which ones in the context menu and in which order [<a href="https://github.com/micz/ThunderAI/issues/49">#49</a>, <a href="https://github.com/micz/ThunderAI/issues/184">#184</a>, <a href="https://github.com/micz/ThunderAI/issues/680">#680</a>].</li>
|
||||
<li>Now the popup menu closes immediatly and the working indicator is in the button icon [<a href="https://github.com/micz/ThunderAI/issues/247">#677</a>].</li>
|
||||
<li><i>[All APIs]</i> Error messages added also for background operations when the API has not been configured correctly [<a href="https://github.com/micz/ThunderAI/issues/766">#766</a>].</li>
|
||||
<li><i>[Ollama API]</i> Added <i>format: json</i> option [<a href="https://github.com/micz/ThunderAI/issues/703">#703</a>].</li>
|
||||
<li>Fix: The "Important Information" section in the options page now updates correctly when choosing an integration [<a href="https://github.com/micz/ThunderAI/issues/730">#730</a>].</li>
|
||||
<li>In the options page now is visible if a special prompt is using a specific API integration [<a href="https://github.com/micz/ThunderAI/issues/676">#676</a>].</li>
|
||||
<li>Added an antispam skip list to ensure messages from designated addresses are not forwarded to the AI [<a href="https://github.com/micz/ThunderAI/issues/743">#743</a>].</li>
|
||||
<li>Fix: Correctly setting the end date for a new calendar event [<a href="https://github.com/micz/ThunderAI/issues/750">#750</a>].</li>
|
||||
<li>Now it's possibile to use different date and time formats in the AI output when creating a calendar event [<a href="https://github.com/micz/ThunderAI/issues/737">#737</a>].</li>
|
||||
<li>...</li>
|
||||
<li>Added the <i>{%mail_full_headers%}</i> placeholder to retrieve all the email headers at once [<a href="https://github.com/micz/ThunderAI/issues/713">#713</a>].</li>
|
||||
<li><i>[All APIs]</i> In the API webchat the status messages have different colors [<a href="https://github.com/micz/ThunderAI/issues/3">#3</a>].</li>
|
||||
<li>Account exclusion lists for add tags and antispam are enforced only for automatic analysis of incoming emails and not for the context menu action that is always executed [<a href="https://github.com/micz/ThunderAI/issues/749">#749</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.7 - 17/04/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Correctly parsing the body of HTML base64 encoded mails [<a href="https://github.com/micz/ThunderAI/issues/757">#757</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.6 - 01/04/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Now it's possibile to create a tag also with accented characters in the label [<a href="https://github.com/micz/ThunderAI/issues/738">#738</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.5 - 27/03/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: HTML part of the mail body used in prompt is displayed as HTML code and it is not rendered. This a display fix, there is no change on how the prompt is sent to the AI [<a href="https://github.com/micz/ThunderAI/issues/711">#711</a>].</li>
|
||||
<li>Fix: HTML elements added by ThunderAI (like the antispam banner) are now not present in HTML or text data placeholders [<a href="https://github.com/micz/ThunderAI/issues/710">#710</a>].</li>
|
||||
<li><i>[All APIs]</i> The API webchat window now has a dynamic title [<a href="https://github.com/micz/ThunderAI/issues/696">#696</a>]</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.4 - 26/03/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Correctly showing the selected model in the special prompt pages.</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.3 - 20/03/2026</h2>
|
||||
<ul>
|
||||
|
|
|
|||
|
|
@ -549,6 +549,15 @@ export async function injectConnectionUI({
|
|||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="conntype_anthropic_api${tr_class ? ` ${tr_class}` : ''}">
|
||||
<td><span class="opt_title">__MSG_prefs_OptionText_anthropic_extended_thinking_budget__</span></td>
|
||||
<td>
|
||||
<label>
|
||||
<input type="number" id="${modelId_prefix ? `${modelId_prefix}` : ''}anthropic_extended_thinking_budget" name="${modelId_prefix ? `${modelId_prefix}` : ''}anthropic_extended_thinking_budget" class="option-input" />
|
||||
<br>__MSG_prefs_OptionText_anthropic_extended_thinking_budget_Info__
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
`;
|
||||
|
||||
const template = document.createElement('template');
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Tom Select v2.5.2
|
||||
* Tom Select v2.6.1
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
*/
|
||||
|
||||
|
|
@ -1685,7 +1685,8 @@
|
|||
var init_textbox = () => {
|
||||
const data_raw = input.getAttribute(attr_data);
|
||||
if (!data_raw) {
|
||||
var value = input.value.trim() || '';
|
||||
var _input$value$trim, _input$value;
|
||||
var value = (_input$value$trim = input == null || (_input$value = input.value) == null ? void 0 : _input$value.trim()) != null ? _input$value$trim : '';
|
||||
if (!settings.allowEmptyOption && !value.length) return;
|
||||
const values = value.split(settings.delimiter);
|
||||
iterate(values, value => {
|
||||
|
|
@ -1725,6 +1726,7 @@
|
|||
this.isFocused = false;
|
||||
this.isInputHidden = false;
|
||||
this.isSetup = false;
|
||||
this.isDropdownContentStale = true;
|
||||
this.ignoreFocus = false;
|
||||
this.ignoreHover = false;
|
||||
this.hasOptions = false;
|
||||
|
|
@ -2023,13 +2025,6 @@
|
|||
self.close(false);
|
||||
self.inputState();
|
||||
self.isSetup = true;
|
||||
if (input.disabled) {
|
||||
self.disable();
|
||||
} else if (input.readOnly) {
|
||||
self.setReadOnly(true);
|
||||
} else {
|
||||
self.enable(); //sets tabIndex
|
||||
}
|
||||
self.on('change', this.onChange);
|
||||
addClasses(input, 'tomselected', 'ts-hidden-accessible');
|
||||
self.trigger('initialize');
|
||||
|
|
@ -2139,6 +2134,13 @@
|
|||
self.setupOptions(settings.options, settings.optgroups);
|
||||
self.setValue(settings.items || [], true); // silent prevents recursion
|
||||
|
||||
if (self.input.disabled) {
|
||||
self.disable();
|
||||
} else if (self.input.readOnly) {
|
||||
self.setReadOnly(true);
|
||||
} else {
|
||||
self.enable(); //sets tabIndex
|
||||
}
|
||||
self.lastQuery = null; // so updated options will be displayed in dropdown
|
||||
}
|
||||
|
||||
|
|
@ -2452,7 +2454,7 @@
|
|||
} else {
|
||||
value = option.dataset.value;
|
||||
if (typeof value !== 'undefined') {
|
||||
self.lastQuery = null;
|
||||
self.isDropdownContentStale = self.settings.hideSelected;
|
||||
self.addItem(value);
|
||||
if (self.settings.closeAfterSelect) {
|
||||
self.close();
|
||||
|
|
@ -2534,7 +2536,7 @@
|
|||
loadCallback(options, optgroups) {
|
||||
const self = this;
|
||||
self.loading = Math.max(self.loading - 1, 0);
|
||||
self.lastQuery = null;
|
||||
self.isDropdownContentStale = true;
|
||||
self.clearActiveOption(); // when new results load, focus should be on first option
|
||||
self.setupOptions(options, optgroups);
|
||||
self.refreshOptions(self.isFocused && !self.isInputHidden);
|
||||
|
|
@ -2814,14 +2816,19 @@
|
|||
var self = this;
|
||||
if (self.isDisabled || self.isReadOnly) return;
|
||||
self.ignoreFocus = true;
|
||||
if (self.control_input.offsetWidth) {
|
||||
self.control_input.focus();
|
||||
} else {
|
||||
self.focus_node.focus();
|
||||
}
|
||||
const focusTarget = this.control_input.offsetWidth ? this.control_input : this.focus_node;
|
||||
focusTarget.focus();
|
||||
setTimeout(() => {
|
||||
self.ignoreFocus = false;
|
||||
self.onFocus();
|
||||
// Fix https://github.com/orchidjs/tom-select/issues/806
|
||||
// Only proceed if this instance's element is still the active element. If Edge autofill
|
||||
// (or anything else) has moved focus to a different element in the interim, calling
|
||||
// onFocus() here would steal focus back and restart the cascade loop.
|
||||
const root = focusTarget.getRootNode();
|
||||
if (root.activeElement !== focusTarget) {
|
||||
return;
|
||||
}
|
||||
this.onFocus();
|
||||
}, 0);
|
||||
}
|
||||
|
||||
|
|
@ -2887,7 +2894,7 @@
|
|||
}
|
||||
|
||||
// perform search
|
||||
if (query !== self.lastQuery) {
|
||||
if (self.isDropdownContentStale || query !== self.lastQuery) {
|
||||
self.lastQuery = query;
|
||||
// temp fix for https://github.com/orchidjs/tom-select/issues/987
|
||||
// UI crashed when more than 30 same chars in a row, prevent search and return empt result
|
||||
|
|
@ -3053,6 +3060,7 @@
|
|||
});
|
||||
dropdown_content.innerHTML = '';
|
||||
append(dropdown_content, html);
|
||||
self.isDropdownContentStale = false;
|
||||
|
||||
// highlight matching terms inline
|
||||
if (self.settings.highlight) {
|
||||
|
|
@ -3155,12 +3163,13 @@
|
|||
}
|
||||
const key = hash_key(data[self.settings.valueField]);
|
||||
if (key === null || self.options.hasOwnProperty(key)) {
|
||||
self.updateOption(data[self.settings.valueField], data);
|
||||
return false;
|
||||
}
|
||||
data.$order = data.$order || ++self.order;
|
||||
data.$id = self.inputId + '-opt-' + data.$order;
|
||||
self.options[key] = data;
|
||||
self.lastQuery = null;
|
||||
self.isDropdownContentStale = true;
|
||||
if (user_created) {
|
||||
self.userOptions[key] = user_created;
|
||||
self.trigger('option_add', key, data);
|
||||
|
|
@ -3283,8 +3292,8 @@
|
|||
replaceNode(item, item_new);
|
||||
}
|
||||
|
||||
// invalidate last query because we might have updated the sortField
|
||||
self.lastQuery = null;
|
||||
// we might have updated the sortField
|
||||
self.isDropdownContentStale = true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3297,7 +3306,7 @@
|
|||
self.uncacheValue(value);
|
||||
delete self.userOptions[value];
|
||||
delete self.options[value];
|
||||
self.lastQuery = null;
|
||||
self.isDropdownContentStale = true;
|
||||
self.trigger('option_remove', value);
|
||||
self.removeItem(value, silent);
|
||||
}
|
||||
|
|
@ -3317,7 +3326,7 @@
|
|||
}
|
||||
});
|
||||
this.options = this.sifter.items = selected;
|
||||
this.lastQuery = null;
|
||||
this.isDropdownContentStale = true;
|
||||
this.trigger('option_clear');
|
||||
}
|
||||
|
||||
|
|
@ -3501,7 +3510,7 @@
|
|||
removeClasses(item, 'active');
|
||||
}
|
||||
self.items.splice(i, 1);
|
||||
self.lastQuery = null;
|
||||
self.isDropdownContentStale = true;
|
||||
if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {
|
||||
self.removeOption(value, silent);
|
||||
}
|
||||
|
|
@ -3582,7 +3591,7 @@
|
|||
*/
|
||||
refreshItems() {
|
||||
var self = this;
|
||||
self.lastQuery = null;
|
||||
self.isDropdownContentStale = true;
|
||||
if (self.isSetup) {
|
||||
self.addItems(self.items);
|
||||
}
|
||||
|
|
|
|||
2
pages/_lib/tom-select.default.min.css
vendored
|
|
@ -30,7 +30,7 @@ import { textareaAutocomplete } from "../../js/mzta-placeholders-autocomplete.js
|
|||
import {
|
||||
addTags_getExclusionList,
|
||||
addTags_setExclusionList
|
||||
} from "../../js/mzta-addatags-exclusion-list.js";
|
||||
} from "../../js/mzta-addtags-exclusion-list.js";
|
||||
import {
|
||||
getAccountsList,
|
||||
normalizeStringList,
|
||||
|
|
|
|||
|
|
@ -51,6 +51,14 @@
|
|||
<option value="2">__MSG_customPrompts_add_to_menu_composing__</option>
|
||||
</select>
|
||||
<br><br>
|
||||
<label for="selectShowInNew" class="field_title">__MSG_show_in__:</label>
|
||||
<br>
|
||||
<select id="selectShowInNew" name="show_in" tabindex="4">
|
||||
<option value="popup">__MSG_show_in_popup__</option>
|
||||
<option value="context">__MSG_show_in_context__</option>
|
||||
<option value="both">__MSG_show_in_both__</option>
|
||||
</select>
|
||||
<br><br>
|
||||
<label for="selectActionNew" class="field_title">__MSG_customPrompts_form_label_Action__:</label>
|
||||
<br>
|
||||
<select id="selectActionNew" name="action" tabindex="5">
|
||||
|
|
|
|||
|
|
@ -288,7 +288,8 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
position_display: positionMax_display + 1,
|
||||
is_default: 0,
|
||||
idnum: idnumMax + 1,
|
||||
api_type: document.getElementById('new_prompt_api_type').value
|
||||
api_type: document.getElementById('new_prompt_api_type').value,
|
||||
show_in: document.getElementById('selectShowInNew').value,
|
||||
};
|
||||
|
||||
switch(prefs.connection_type) {
|
||||
|
|
@ -663,6 +664,8 @@ function showItemRowEditor(tr) {
|
|||
tr.querySelector('.api_additional_info_show').style.display = 'none';
|
||||
tr.querySelector('.type_output').style.display = 'inline';
|
||||
tr.querySelector('.type_show').style.display = 'none';
|
||||
tr.querySelector('.show_in_output').style.display = 'inline';
|
||||
tr.querySelector('.show_in_show').style.display = 'none';
|
||||
const action_output = tr.querySelector('.action_output')
|
||||
action_output.style.display = 'inline';
|
||||
action_output.addEventListener('change', toggleDiffviewer);
|
||||
|
|
@ -688,6 +691,8 @@ function hideItemRowEditor(tr) {
|
|||
toggleAdditionalPropertiesShow(tr);
|
||||
tr.querySelector('.type_output').style.display = 'none';
|
||||
tr.querySelector('.type_show').style.display = 'inline';
|
||||
tr.querySelector('.show_in_output').style.display = 'none';
|
||||
tr.querySelector('.show_in_show').style.display = 'inline';
|
||||
const action_output = tr.querySelector('.action_output')
|
||||
action_output.style.display = 'none';
|
||||
action_output.addEventListener('change', toggleDiffviewer);
|
||||
|
|
@ -824,6 +829,7 @@ function handleCancelClick(e) {
|
|||
tr.querySelector('.text_output').value = sanitizeHtml(tr.querySelector('.text_show').innerHTML).replace(/<br\s*\/?>/gi, "\n");
|
||||
tr.querySelector('.type_output').value = tr.querySelector('.type').innerText;
|
||||
// tr.querySelector('.type_output').selectedOptions[0].text = tr.querySelector('.type_show').innerText;
|
||||
tr.querySelector('.show_in_output').value = tr.querySelector('.show_in').innerText || 'popup';
|
||||
tr.querySelector('.action_output').value = tr.querySelector('.action').innerText;
|
||||
// tr.querySelector('.action_output').selectedOptions[0].text = tr.querySelector('.action_show').innerText;
|
||||
tr.querySelector('.chatgpt_web_model_output').value = tr.querySelector('.chatgpt_web_model_show').innerText;
|
||||
|
|
@ -850,6 +856,7 @@ function handleConfirmClick(e) {
|
|||
newValues.name = tr.querySelector('.name_output').value.trim();
|
||||
newValues.text = tr.querySelector('.text_output').value;
|
||||
newValues.type = tr.querySelector('.type_output').value;
|
||||
newValues.show_in = tr.querySelector('.show_in_output').value;
|
||||
newValues.action = tr.querySelector('.action_output').value;
|
||||
newValues.need_selected = tr.querySelector('.need_selected').checked ? 1 : 0;
|
||||
newValues.need_signature = tr.querySelector('.need_signature').checked ? 1 : 0;
|
||||
|
|
@ -876,6 +883,8 @@ function handleConfirmClick(e) {
|
|||
// Update item data
|
||||
tr.querySelector('.type').innerText = tr.querySelector('.type_output').value;
|
||||
tr.querySelector('.type_show').innerText = tr.querySelector('.type_output').selectedOptions[0].text;
|
||||
tr.querySelector('.show_in').innerText = tr.querySelector('.show_in_output').value;
|
||||
tr.querySelector('.show_in_show').innerText = tr.querySelector('.show_in_output').selectedOptions[0].text;
|
||||
tr.querySelector('.action').innerText = tr.querySelector('.action_output').value;
|
||||
tr.querySelector('.action_show').innerText = tr.querySelector('.action_output').selectedOptions[0].text;
|
||||
if (newValues.api_type !== '') {
|
||||
|
|
@ -951,6 +960,7 @@ function handleCopyClick(e) {
|
|||
document.getElementById('txtNameNew').value = name + ' (' + browser.i18n.getMessage("copy_text") + ')';
|
||||
document.getElementById('txtTextNew').value = text;
|
||||
document.getElementById('selectTypeNew').value = type;
|
||||
document.getElementById('selectShowInNew').value = tr.querySelector('.show_in_output').value || 'popup';
|
||||
document.getElementById('selectActionNew').value = action;
|
||||
|
||||
document.getElementById('checkboxNeedSelectedNew').checked = need_selected;
|
||||
|
|
@ -1019,7 +1029,7 @@ function loadPromptsList(values){
|
|||
}
|
||||
|
||||
let options = {
|
||||
valueNames: [ { data: ['idnum'] }, 'is_default', 'id', 'name', 'text', 'type', 'action', 'position_compose', 'position_display', { name: 'need_selected', attr: 'checked_val'}, { name: 'need_signature', attr: 'checked_val'}, { name: 'need_custom_text', attr: 'checked_val'}, { name: 'define_response_lang', attr: 'checked_val'}, { name: 'use_diff_viewer', attr: 'checked_val'}, { name: 'enabled', attr: 'checked_val'}, 'api_type', ...api_fields ],
|
||||
valueNames: [ { data: ['idnum'] }, 'is_default', 'id', 'name', 'text', 'type', 'action', 'position_compose', 'position_display', 'show_in', { name: 'need_selected', attr: 'checked_val'}, { name: 'need_signature', attr: 'checked_val'}, { name: 'need_custom_text', attr: 'checked_val'}, { name: 'define_response_lang', attr: 'checked_val'}, { name: 'use_diff_viewer', attr: 'checked_val'}, { name: 'enabled', attr: 'checked_val'}, 'api_type', ...api_fields ],
|
||||
item: function(values) {
|
||||
let type_output = '';
|
||||
switch(String(values.type)){
|
||||
|
|
@ -1046,7 +1056,18 @@ function loadPromptsList(values){
|
|||
action_output = `__MSG_customPrompts_substitute_text__`;
|
||||
break;
|
||||
}
|
||||
//console.log('>>>>>>>>>>>>> action_output: ' + JSON.stringify(action_output));
|
||||
let show_in_output = '';
|
||||
switch(String(values.show_in || 'popup')){
|
||||
case "popup":
|
||||
show_in_output = `__MSG_show_in_popup__`;
|
||||
break;
|
||||
case "context":
|
||||
show_in_output = `__MSG_show_in_context__`;
|
||||
break;
|
||||
case "both":
|
||||
show_in_output = `__MSG_show_in_both__`;
|
||||
break;
|
||||
}
|
||||
|
||||
let output = `<tr ` + ((values.is_default == 1) ? 'class="is_default"':'') + `>
|
||||
<td class="w08"><span class="id id_show"></span><input type="text" class="hiddendata id_output" value="` + values.id + `" /></td>
|
||||
|
|
@ -1095,6 +1116,16 @@ function loadPromptsList(values){
|
|||
</select>` +
|
||||
`<span class="type hiddendata"></span>
|
||||
<br><br>
|
||||
<span class="field_title_s">__MSG_show_in__:</span>
|
||||
<br>
|
||||
<span class="show_in_show">` + show_in_output + `</span>
|
||||
<select class="show_in_output hiddendata input_mod">
|
||||
<option value="popup"` + ((values.show_in == "popup" || !values.show_in) ? ' selected':'') + `>__MSG_show_in_popup__</option>
|
||||
<option value="context"` + ((values.show_in == "context") ? ' selected':'') + `>__MSG_show_in_context__</option>
|
||||
<option value="both"` + ((values.show_in == "both") ? ' selected':'') + `>__MSG_show_in_both__</option>
|
||||
</select>` +
|
||||
`<span class="show_in hiddendata"></span>
|
||||
<br><br>
|
||||
<span class="field_title_s">__MSG_customPrompts_form_label_Action__:</span>
|
||||
<br><span class="action_show">` + action_output + `</span>
|
||||
<select class="action_output hiddendata">
|
||||
|
|
@ -1251,6 +1282,7 @@ function clearFields() {
|
|||
document.getElementById('chatGPTWebProjectNew').value = '';
|
||||
document.getElementById('chatGPTWebCustomGPTNew').value = '';
|
||||
document.getElementById('selectTypeNew').value = '0';
|
||||
document.getElementById('selectShowInNew').value = 'popup';
|
||||
document.getElementById('selectActionNew').value = '0';
|
||||
document.getElementById('checkboxNeedSelectedNew').value = '0';
|
||||
document.getElementById('checkboxNeedSignatureNew').value = '0';
|
||||
|
|
|
|||