Compare commits
640 commits
| 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 | ||
|
|
9c50345127 | ||
|
|
fc1091bd0c | ||
|
|
7e9ef4c378 | ||
|
|
7f2de50726 | ||
|
|
db2d31a7bc | ||
|
|
200e035f6b | ||
|
|
c625f2f351 | ||
|
|
e29974af14 | ||
|
|
01e5226524 | ||
|
|
7ae4aa1899 | ||
|
|
e6d6a095ac | ||
|
|
a988a16bec | ||
|
|
cba4eb2490 | ||
|
|
678b1c0723 | ||
|
|
a3b8ccd588 | ||
|
|
50dbc6a6d9 | ||
|
|
551e697478 | ||
|
|
33c60ec189 | ||
|
|
7c7e83457f | ||
|
|
31283f7f7e | ||
|
|
e48f3a339d | ||
|
|
cfda255495 | ||
|
|
01fda7a43a | ||
|
|
5310be1059 | ||
|
|
024260009d | ||
|
|
fd8afc5d1b | ||
|
|
df0e26ebee | ||
|
|
b0b85b3353 | ||
|
|
fbedb7dfd9 | ||
|
|
c9625ef8c6 | ||
|
|
7a5de636b5 | ||
|
|
5ea940ee74 | ||
|
|
14bf5cfd10 | ||
|
|
2f0d4331d6 | ||
|
|
f31edbc569 | ||
|
|
13c8aeb86e | ||
|
|
79e63a6bd5 | ||
|
|
869054c6f7 | ||
|
|
6cbd97f717 | ||
|
|
09aa9b4942 | ||
|
|
8740438c2d | ||
|
|
d91e5b5499 | ||
|
|
f0ca5807a2 | ||
|
|
7855250d84 | ||
|
|
796a599cc6 | ||
|
|
bfe206295f | ||
|
|
79f34b6ed8 | ||
|
|
c3d0610d94 | ||
|
|
41697280ca | ||
|
|
474e58097c | ||
|
|
0dc9ecce38 | ||
|
|
a92d2f4c55 | ||
|
|
78c629a1bc | ||
|
|
c6eb5aaa0e | ||
|
|
80d9765080 | ||
|
|
ff7d097fda | ||
|
|
b17d094d0c | ||
|
|
ffcb1e1b9c | ||
|
|
eac4f0565f | ||
|
|
6a87381b3c | ||
|
|
bddd630bb9 | ||
|
|
9366ac226d | ||
|
|
3c9c8a55d1 | ||
|
|
3b4426f530 | ||
|
|
4ab2af98a3 | ||
|
|
1494651de6 | ||
|
|
85047f80c6 | ||
|
|
9ac56c1fd6 | ||
|
|
613cbc2179 | ||
|
|
010b9ad9df | ||
|
|
774c63ef9e | ||
|
|
f64d49ccf1 | ||
|
|
983d1e3fcf | ||
|
|
ce041fad64 | ||
|
|
ca56c2d971 | ||
|
|
28e61d7a40 | ||
|
|
742034ce82 | ||
|
|
c1396ebfb4 | ||
|
|
89de33ebde | ||
|
|
01ef569d4d | ||
|
|
34eaabda74 | ||
|
|
6f74c32c2e | ||
|
|
78dfaae3f1 | ||
|
|
e33095ca23 | ||
|
|
c50406bae0 | ||
|
|
f1f8d4d3eb | ||
|
|
a87420c155 | ||
|
|
da82fb0b6d | ||
|
|
9df3667e75 | ||
|
|
83f856d1ae | ||
|
|
c0ebc646b8 | ||
|
|
38f6b1987d | ||
|
|
894d3475dd | ||
|
|
c5c7694d51 | ||
|
|
7e5ba820c2 | ||
|
|
41071e3256 | ||
|
|
473d41d110 | ||
|
|
5eab777885 | ||
|
|
0b5d410afd | ||
|
|
f1b42f8714 | ||
|
|
4ce2a0fc6e | ||
|
|
45da8622aa | ||
|
|
1018fa777d | ||
|
|
0945ea7d6e | ||
|
|
a1632f628e | ||
|
|
1650322f4d | ||
|
|
374d598d70 | ||
|
|
226599ed2a | ||
|
|
7580efb661 | ||
|
|
03c241c974 | ||
|
|
69654fcb31 | ||
|
|
13d82d8dbf | ||
|
|
fa6b5c95a9 | ||
|
|
1b0da7ce61 | ||
|
|
f10beb8097 | ||
|
|
2d478edfb9 | ||
|
|
6c6b57e6ea | ||
|
|
a931c864d2 | ||
|
|
a8c69d4426 | ||
|
|
61916c1a85 | ||
|
|
b4e41c0ba0 | ||
|
|
92b8853861 | ||
|
|
13681c297b | ||
|
|
ef7483031d | ||
|
|
32abc00693 | ||
|
|
681f0f0f18 | ||
|
|
a908efc88d | ||
|
|
2066a82622 | ||
|
|
99b07fb5d2 | ||
|
|
12eb740219 | ||
|
|
2460e40bf7 | ||
|
|
9f929ff003 | ||
|
|
0b3c66b78d | ||
|
|
29ed9e6df6 | ||
|
|
61eb858f5a | ||
|
|
942c5a6143 | ||
|
|
5301d1c898 | ||
|
|
1d8543627e | ||
|
|
7d2b811926 | ||
|
|
43ffdd32e1 | ||
|
|
b1b02312e9 | ||
|
|
696ef5aa3c | ||
|
|
0e9790ccf4 | ||
|
|
3623b92ea5 | ||
|
|
63f52703b7 | ||
|
|
36d606bbc6 | ||
|
|
40235e5df4 | ||
|
|
afdae833dc | ||
|
|
0d51829c8e | ||
|
|
fadae81328 | ||
|
|
7e9b507f0f | ||
|
|
3cb1fb0972 | ||
|
|
8a0e6e5cae | ||
|
|
1522e2c04c | ||
|
|
a1bd5d71e6 | ||
|
|
021e317a37 | ||
|
|
7cde1f9b62 | ||
|
|
33fecf3afe | ||
|
|
e29079ddc9 | ||
|
|
d7a362f5df | ||
|
|
8ba35a34ba | ||
|
|
d2486f7f5e | ||
|
|
b2eb872557 | ||
|
|
d66c897ad1 | ||
|
|
c0a5be76b7 | ||
|
|
6bfeeca90d | ||
|
|
ea0d1e5e86 | ||
|
|
0ea8c02202 | ||
|
|
8494113886 | ||
|
|
db41bce928 | ||
|
|
6b37ba894b | ||
|
|
630938e30f | ||
|
|
438670d28c | ||
|
|
e02a8b1c14 | ||
|
|
9a00477067 | ||
|
|
fe0804a9dd | ||
|
|
8d166b314e | ||
|
|
9e0fb5bf73 | ||
|
|
b08b8563d0 | ||
|
|
a505f22261 | ||
|
|
6e30ea9159 | ||
|
|
58437ad168 | ||
|
|
7bac86cc82 | ||
|
|
83b8544404 | ||
|
|
6d53e108d0 | ||
|
|
d2604518ea | ||
|
|
65bf9c440c | ||
|
|
1ccd3d3123 | ||
|
|
170dddfb78 | ||
|
|
eba28e0919 | ||
|
|
1ea548a61d | ||
|
|
55240868dd | ||
|
|
b30da27c84 | ||
|
|
038e6f6fed | ||
|
|
08f9568955 | ||
|
|
e95808d1fe | ||
|
|
bb43f37815 | ||
|
|
64bb41633e | ||
|
|
bc3acef47b | ||
|
|
216bdb3022 | ||
|
|
cf5ba3450a | ||
|
|
b7f3b15b2a | ||
|
|
c2653ce3aa | ||
|
|
61c8282a0d | ||
|
|
f5118e250b | ||
|
|
cb1e0d0d47 | ||
|
|
adc65fd07a | ||
|
|
65b4346ec3 | ||
|
|
14e3d9b0c7 | ||
|
|
c29b4d473b | ||
|
|
5d30181af7 | ||
|
|
bbea54b822 | ||
|
|
cf5997ace6 | ||
|
|
11e8d5b8c2 | ||
|
|
3352eac090 | ||
|
|
9181b11ca1 | ||
|
|
4f738b7ce6 | ||
|
|
931e95d314 | ||
|
|
6ca4687b3e | ||
|
|
2534c499d0 | ||
|
|
0a3e697011 | ||
|
|
910f55dc19 | ||
|
|
e788f305a0 | ||
|
|
50d8e8e41f | ||
|
|
c275625111 | ||
|
|
2e5581414b | ||
|
|
bc08959593 | ||
|
|
e089669eec | ||
|
|
018684cf02 | ||
|
|
b505dc7747 | ||
|
|
67189c4f6f | ||
|
|
9242acd37a | ||
|
|
8031e75867 | ||
|
|
a48c315fea | ||
|
|
6e4258f43b | ||
|
|
4b097ce666 | ||
|
|
bdcc54195a | ||
|
|
6cdfb489c8 | ||
|
|
629688b6b8 | ||
|
|
1ea2d47e61 | ||
|
|
9248249181 | ||
|
|
10af566931 | ||
|
|
557f6741c3 | ||
|
|
19c2258e69 | ||
|
|
9fcfd2dad0 | ||
|
|
17572a573f | ||
|
|
83a147fdea | ||
|
|
a401626805 | ||
|
|
2485611f1f | ||
|
|
d2c9797e16 | ||
|
|
7176880589 | ||
|
|
eadc69d755 | ||
|
|
60d4425f9b | ||
|
|
79712957a3 | ||
|
|
a90b20052a | ||
|
|
af6927c012 | ||
|
|
c5aa576229 | ||
|
|
da70ea70c4 | ||
|
|
61375d91b6 | ||
|
|
7390764764 | ||
|
|
7048164ee0 | ||
|
|
0300c873fd | ||
|
|
7dfdc2ea54 | ||
|
|
3c38b224a8 | ||
|
|
c8e6c0356f | ||
|
|
698942c8ee | ||
|
|
fc66a99722 | ||
|
|
a95a8c7b50 | ||
|
|
1be31c5d37 | ||
|
|
ca07cf5ed0 | ||
|
|
c32563337e | ||
|
|
2df835d46e | ||
|
|
28af4aac92 | ||
|
|
68ac804290 | ||
|
|
6b583651a6 | ||
|
|
fb6b1d6b8e | ||
|
|
d3246417a9 | ||
|
|
49c5791d64 | ||
|
|
a355dfb6d6 | ||
|
|
4f84da4256 | ||
|
|
d95bd37fbf | ||
|
|
c569795098 | ||
|
|
6dc7b052c1 | ||
|
|
e65699386c | ||
|
|
fe5f1db7b6 | ||
|
|
c2e2336f4d | ||
|
|
cad0cc59cc | ||
|
|
9894c2114c | ||
|
|
470b78ce90 | ||
|
|
67a922ee02 | ||
|
|
ba457adb98 | ||
|
|
6aca668d11 | ||
|
|
0a8b2de10f | ||
|
|
48b5dc0f75 | ||
|
|
2e89ddef65 | ||
|
|
04e3388fc8 | ||
|
|
3c45d136fd | ||
|
|
8380970da3 | ||
|
|
a59d346d42 | ||
|
|
f0c9777ace | ||
|
|
fc47603f1f | ||
|
|
45b1927490 | ||
|
|
9384c0574e | ||
|
|
3d3581dc26 | ||
|
|
e302367f9c | ||
|
|
f7e7367f60 | ||
|
|
a071321055 | ||
|
|
79bbcda6ca | ||
|
|
04b69a73c4 | ||
|
|
228e2b4102 | ||
|
|
526be71348 | ||
|
|
b36658153d | ||
|
|
7e758a51e6 | ||
|
|
b60e758802 | ||
|
|
2ba069e1be | ||
|
|
4231df0259 | ||
|
|
c3f5e2be7e | ||
|
|
490427802d | ||
|
|
296fcf21be | ||
|
|
b551692768 | ||
|
|
dc5e23a4d5 | ||
|
|
c4176ebfec | ||
|
|
bd72c45df2 | ||
|
|
ae44596106 | ||
|
|
25a979e9fb | ||
|
|
519628b6f3 | ||
|
|
fb83ad86fd | ||
|
|
7fce9906b8 | ||
|
|
33901882cf | ||
|
|
ca2323ba88 | ||
|
|
a7a17b7cb5 | ||
|
|
8fcd9fab69 | ||
|
|
5c310d1cb0 | ||
|
|
ae26e9288b | ||
|
|
5bbe379c0c | ||
|
|
cac639e257 | ||
|
|
d76f1d9d12 | ||
|
|
17ec054e15 | ||
|
|
d5d11e3c0c | ||
|
|
0ac6ae6650 | ||
|
|
0740d94c79 | ||
|
|
12206f0557 | ||
|
|
d00e242509 | ||
|
|
28e3b65028 | ||
|
|
28afa0fc45 | ||
|
|
774ffc2287 | ||
|
|
41dbb5d009 | ||
|
|
1630b7c071 | ||
|
|
e30d073bca | ||
|
|
1f3691fab2 | ||
|
|
73d1795dc7 | ||
|
|
c764a1ee2f | ||
|
|
ded59f14f7 | ||
|
|
3213a71eba | ||
|
|
c29b4b3352 | ||
|
|
b1282c9562 | ||
|
|
5fcf21a5e9 | ||
|
|
378395d324 | ||
|
|
4fecbe8087 | ||
|
|
fa10a68337 | ||
|
|
0e4ca443aa | ||
|
|
fc578c42a4 | ||
|
|
edd22529a2 | ||
|
|
34e8e242f6 | ||
|
|
2740fe3ee9 | ||
|
|
b4ae956b82 | ||
|
|
0550077567 | ||
|
|
7d843c0732 | ||
|
|
545b6db6d5 | ||
|
|
3be8fad6db | ||
|
|
45cc823171 | ||
|
|
b713f4fd48 | ||
|
|
bf29673600 | ||
|
|
e7995952df | ||
|
|
ef9a6a0e07 | ||
|
|
3bbe1a5351 | ||
|
|
500572fee1 | ||
|
|
a940228a43 | ||
|
|
10a26210d0 | ||
|
|
ae010478ba | ||
|
|
6c49008441 | ||
|
|
4dda9fb5ff | ||
|
|
7fb74d23e1 | ||
|
|
f5d278183b | ||
|
|
816118ed34 | ||
|
|
454789149f | ||
|
|
c9820bbb56 | ||
|
|
62ab34526c | ||
|
|
9edae00b91 | ||
|
|
4b5768c990 | ||
|
|
6b9ad17d7c | ||
|
|
4bf5016824 | ||
|
|
3cf8d1a804 | ||
|
|
2a04c1af1f | ||
|
|
954f1e3d8a | ||
|
|
cf7c58852e | ||
|
|
c34fe07e66 | ||
|
|
d7321fb0a9 | ||
|
|
feaaac5e01 | ||
|
|
829f87a510 | ||
|
|
6bbe521e12 | ||
|
|
f13ba84444 | ||
|
|
1844560027 | ||
|
|
7c971218a3 | ||
|
|
20d23cc951 | ||
|
|
632bf6c38a | ||
|
|
db8cada6e6 | ||
|
|
5a39f1e298 | ||
|
|
6cb52e4403 | ||
|
|
942c88d00e | ||
|
|
fc67e4c221 | ||
|
|
fdba78bbcb | ||
|
|
d0fe616e42 | ||
|
|
e105ead516 | ||
|
|
1fa6d2eed5 | ||
|
|
a44842af2f | ||
|
|
f56e967e00 | ||
|
|
d975e5c249 | ||
|
|
f5dcebefb2 | ||
|
|
b632206d24 | ||
|
|
d99d0829b3 | ||
|
|
6ebc50b005 | ||
|
|
5e58dc940f | ||
|
|
7fe0840296 | ||
|
|
80c72301c6 | ||
|
|
2b8a9b9881 | ||
|
|
73d6fdedc8 | ||
|
|
3e176f00b1 | ||
|
|
32e3e40cfc | ||
|
|
ef3ea4a2c0 | ||
|
|
4409faf66a | ||
|
|
dd9b116f0a | ||
|
|
098528b323 | ||
|
|
3d6d325ca5 | ||
|
|
11f00d99c9 | ||
|
|
3427611162 | ||
|
|
6805efb22a | ||
|
|
1e245b3784 | ||
|
|
ceb8432c69 | ||
|
|
1b66d6cc1f | ||
|
|
5b16e51f89 | ||
|
|
4318f09b10 | ||
|
|
c0c29e6581 | ||
|
|
07da54b3d2 | ||
|
|
06e42a841b | ||
|
|
ffafa2b796 | ||
|
|
30b94e2b49 | ||
|
|
b3be32106d | ||
|
|
d87694a45b | ||
|
|
f526684beb | ||
|
|
92063056c7 | ||
|
|
656def1b1c | ||
|
|
b5cf8072d5 | ||
|
|
903cac77dc | ||
|
|
3d3e1aa336 | ||
|
|
b2a5b32f1d | ||
|
|
50eaa3d28d | ||
|
|
db8691e017 | ||
|
|
a720ad31ba | ||
|
|
b37df075ae | ||
|
|
04150fcbbf | ||
|
|
2bc292e414 | ||
|
|
2d93672d8f | ||
|
|
29bdd248b1 | ||
|
|
ccdfb39f43 | ||
|
|
e20e57381f | ||
|
|
33f39fb3ba | ||
|
|
cc3542a13e | ||
|
|
819e0c5655 | ||
|
|
f58c122c16 | ||
|
|
5348cdc25e | ||
|
|
bae2e0f012 | ||
|
|
7bab6c7b78 | ||
|
|
6463e180af | ||
|
|
72737d538b | ||
|
|
310dbf8818 | ||
|
|
bd12e430bd | ||
|
|
0b7e81cd7b | ||
|
|
3ba98c7d90 | ||
|
|
f489e65483 | ||
|
|
63b80d4e42 | ||
|
|
fca6558133 | ||
|
|
4576549bab | ||
|
|
f6fcaac0bb | ||
|
|
b247dad80f | ||
|
|
7202b5a3e2 | ||
|
|
cb6c93625b | ||
|
|
f147a0453b | ||
|
|
90dcf8437b | ||
|
|
8679e1cb08 | ||
|
|
51c81418a3 | ||
|
|
d601121852 | ||
|
|
30a7de3756 | ||
|
|
c261c1da90 | ||
|
|
c6bf2edba5 | ||
|
|
24edcc09e6 | ||
|
|
66cc35746f | ||
|
|
3d2c2b9320 | ||
|
|
c3e27f0356 | ||
|
|
7595c70a38 | ||
|
|
f29d8337ad | ||
|
|
fe427c29ee | ||
|
|
7eb9a2cf56 | ||
|
|
2c07aa6336 | ||
|
|
8abb7e349b | ||
|
|
02787e2f25 | ||
|
|
4ab6da2faf | ||
|
|
050a3fd1f7 | ||
|
|
84a65acd8f | ||
|
|
ce33cc178a | ||
|
|
0ceaf79aa7 | ||
|
|
64069958a2 | ||
|
|
af2ae047dd | ||
|
|
e5f5d08582 | ||
|
|
90efefd363 | ||
|
|
3f63cc3580 | ||
|
|
a34394d442 | ||
|
|
ea402a688b | ||
|
|
bd66a37d35 | ||
|
|
dcbf9d3dcd |
4
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
|
@ -8,7 +8,7 @@ body:
|
|||
|
||||
If you have a feature or enhancement request, please use the [feature request][fr] form.
|
||||
|
||||
[fr]: https://github.com/micz/ThunderAI/issues/new?assignees=&labels=&projects=&template=feature_request.md&title=
|
||||
[fr]: https://github.com/micz/ThunderAI/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=
|
||||
- type: textarea
|
||||
validations:
|
||||
required: true
|
||||
|
|
@ -36,7 +36,7 @@ body:
|
|||
attributes:
|
||||
label: Which version of Thunderbird are you using?
|
||||
description: >
|
||||
Thunderbird version like 115.14.0 or 128.1.
|
||||
Thunderbird version like 140.0 or 147.0.1.
|
||||
- type: input
|
||||
id: version
|
||||
validations:
|
||||
|
|
|
|||
80
.github/scripts/tom-select-update.js
vendored
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
const fs = require('fs');
|
||||
const https = require('https');
|
||||
const path = require('path');
|
||||
|
||||
// --- Utility: fetch URL following redirects ---
|
||||
function fetchUrl(url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
https.get(url, { headers: { 'User-Agent': 'ThunderAI-vendor-updater' } }, (res) => {
|
||||
if (res.statusCode === 301 || res.statusCode === 302) {
|
||||
return fetchUrl(res.headers.location).then(resolve).catch(reject);
|
||||
}
|
||||
const chunks = [];
|
||||
res.on('data', chunk => chunks.push(chunk));
|
||||
res.on('end', () => resolve({ status: res.statusCode, body: Buffer.concat(chunks) }));
|
||||
}).on('error', reject);
|
||||
});
|
||||
}
|
||||
|
||||
// --- Read VENDORS.md ---
|
||||
const vendorsPath = 'VENDORS.md';
|
||||
const content = fs.readFileSync(vendorsPath, 'utf8');
|
||||
|
||||
// --- Find all entries: file + source ---
|
||||
const entryRegex = /file:\s*(.+?)\r?\nsource:\s*(https?:\/\/.+)/g;
|
||||
const entries = [];
|
||||
let match;
|
||||
while ((match = entryRegex.exec(content)) !== null) {
|
||||
entries.push({
|
||||
file: match[1].trim(),
|
||||
source: match[2].trim(),
|
||||
});
|
||||
}
|
||||
|
||||
// --- Filter tom-select entries only ---
|
||||
const filteredEntries = entries.filter(e => e.file.toLowerCase().includes('tom-select'));
|
||||
|
||||
if (filteredEntries.length === 0) {
|
||||
console.log('No entries found in VENDORS.md');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// --- Main ---
|
||||
(async () => {
|
||||
let hasErrors = false;
|
||||
|
||||
for (const entry of filteredEntries) {
|
||||
const filePath = entry.file.replace(/\\/g, '/');
|
||||
console.log(`\nProcessing: ${filePath}`);
|
||||
console.log(` Source: ${entry.source}`);
|
||||
|
||||
// Create directory if it doesn't exist
|
||||
const dir = path.dirname(filePath);
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
console.log(` → Directory created: ${dir}`);
|
||||
}
|
||||
|
||||
// Download file
|
||||
try {
|
||||
const res = await fetchUrl(entry.source);
|
||||
if (res.status === 200) {
|
||||
fs.writeFileSync(filePath, res.body);
|
||||
console.log(` ✓ File updated (${res.body.length} bytes)`);
|
||||
} else {
|
||||
console.error(` ✗ Download failed: HTTP ${res.status}`);
|
||||
hasErrors = true;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(` ✗ Error: ${err.message}`);
|
||||
hasErrors = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasErrors) {
|
||||
console.error('\nSome files were not updated.');
|
||||
process.exit(1);
|
||||
} else {
|
||||
console.log('\nAll files updated successfully.');
|
||||
}
|
||||
})();
|
||||
|
|
@ -2,7 +2,7 @@ name: pre-release comment issues
|
|||
|
||||
on:
|
||||
release:
|
||||
types: [published, edited]
|
||||
types: [published]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ name: Check Tom-Select Latest Release
|
|||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Check every day at midnight
|
||||
- cron: '0 19 * * *' # Check every day at 19:00
|
||||
workflow_dispatch: # Allows manual triggering for testing purposes
|
||||
|
||||
permissions:
|
||||
|
|
@ -48,13 +48,14 @@ jobs:
|
|||
owner,
|
||||
repo,
|
||||
title: issueTitle,
|
||||
labels: ['enhancement'],
|
||||
body: `Update Tom Select to version **${latestTag}**.
|
||||
|
||||
https://cdn.jsdelivr.net/npm/tom-select@${latestTag}/dist/js/tom-select.base.js
|
||||
|
||||
https://cdn.jsdelivr.net/npm/tom-select@${latestTag}/dist/css/tom-select.default.min.css
|
||||
|
||||
Remeber also to update the VENDORS.md file.`
|
||||
Change the VENDORS.md file to trigger the library update.`
|
||||
});
|
||||
core.info(`New issue created for version ${latestTag}.`);
|
||||
}
|
||||
|
|
|
|||
81
.github/workflows/tom-select-update.yml
vendored
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
name: Update Tom Select Files
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'VENDORS.md'
|
||||
|
||||
jobs:
|
||||
tom-select-update:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
- name: Check and update vendor files
|
||||
run: node .github/scripts/tom-select-update.js
|
||||
|
||||
- name: Commit and push to PR branch
|
||||
id: commit
|
||||
run: |
|
||||
BASE_BRANCH="${{ github.ref_name }}"
|
||||
PR_BRANCH="tom-select-update-${BASE_BRANCH}"
|
||||
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
# If there are no changes, exit without doing anything
|
||||
if git diff --quiet; then
|
||||
echo "No changes to vendor files."
|
||||
echo "has_changes=false" >> $GITHUB_OUTPUT
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Crea o aggiorna la branch PR
|
||||
git checkout -B "$PR_BRANCH"
|
||||
git add -A
|
||||
git commit -m "Update Tom Select files from VENDORS.md"
|
||||
git push origin "$PR_BRANCH" --force
|
||||
|
||||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||
echo "pr_branch=$PR_BRANCH" >> $GITHUB_OUTPUT
|
||||
echo "base_branch=$BASE_BRANCH" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create Pull Request via API
|
||||
if: steps.commit.outputs.has_changes == 'true'
|
||||
run: |
|
||||
# Try to create the PR; if it already exists (422) ignore the error
|
||||
HTTP_CODE=$(curl -s -o /tmp/pr_response.json -w "%{http_code}" \
|
||||
-X POST \
|
||||
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
https://api.github.com/repos/${{ github.repository }}/pulls \
|
||||
-d "{
|
||||
\"title\": \"Update Tom Select files from VENDORS.md\",
|
||||
\"body\": \"Tom Select files updated automatically after a change to \`VENDORS.md\`.\n\nPlease review the downloaded files before merging.\",
|
||||
\"head\": \"${{ steps.commit.outputs.pr_branch }}\",
|
||||
\"base\": \"${{ steps.commit.outputs.base_branch }}\"
|
||||
}")
|
||||
|
||||
cat /tmp/pr_response.json
|
||||
|
||||
if [ "$HTTP_CODE" = "201" ]; then
|
||||
echo "PR created successfully."
|
||||
elif [ "$HTTP_CODE" = "422" ]; then
|
||||
echo "PR already exists, updated with the new commit."
|
||||
else
|
||||
echo "Error creating PR: HTTP $HTTP_CODE"
|
||||
exit 1
|
||||
fi
|
||||
30
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode
|
||||
.vscode/*
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
*.tsbuildinfo
|
||||
dist
|
||||
|
||||
.claude
|
||||
75
CHANGELOG.md
|
|
@ -3,7 +3,79 @@
|
|||
|
||||
|
||||
|
||||
|
||||
<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>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>
|
||||
<li>Fixed a bug in creating new tags [<a href="https://github.com/micz/ThunderAI/issues/698">#698</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.2 - 11/03/2026</h2>
|
||||
<ul>
|
||||
<li>Now it's possible to automatically save the AI window position [<a href="https://github.com/micz/ThunderAI/issues/685">#685</a>].</li>
|
||||
<li><i>[OpenAI API]</i> Fix: Correctly showing failed response errors during streaming [<a href="https://github.com/micz/ThunderAI/issues/690">#690</a>].</li>
|
||||
<li>Fix: Correctly adding tags with non-ASCII characters [<a href="https://github.com/micz/ThunderAI/issues/689">#689</a>].</li>
|
||||
<li>Improved the spacing between lines when displaying the AI response in the API webchat [<a href="https://github.com/micz/ThunderAI/issues/686">#686</a>].</li>
|
||||
<li>Some minor improvments.</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.1 - 27/02/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Correctly handling additional text without a placeholder [<a href="https://github.com/micz/ThunderAI/issues/681">#681</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 4.0.0 - 24/02/2026</h2>
|
||||
<ul>
|
||||
<li>ThunderAI is now compatible only with Thunderbird 140 and later [<a href="https://github.com/micz/ThunderAI/issues/616">#616</a>].</li>
|
||||
<li><i>[All APIs]</i> It's now possibile to define a specific API integration for calendar and task recognition [<a href="https://github.com/micz/ThunderAI/issues/498">#498</a>].</li>
|
||||
<li>Added a new model selector with a search functionality to dynamically filter the list [<a href="https://github.com/micz/ThunderAI/issues/603">#603</a>].</li>
|
||||
<li><i>[All APIs]</i> Added a special prompt to summarize one or more emails, using a context menu command [<a href="https://github.com/micz/ThunderAI/issues/615">#615</a>]. Thanks to <a href="https://github.com/gdkrmr">Guido Kraemer</a> for his great work on this feature.</li>
|
||||
<li><i>[All APIs]</i> "Analyze for spam" and "Add tags" context menu items are always shown when the corresponding feature is enabled [<a href="https://github.com/micz/ThunderAI/issues/609">#609</a>].</li>
|
||||
<li><i>[OpenAI Comp API][Ollama API]</i> Asking for the single host for permission to avoid CORS errors, instead of <i>all_urls</i>, as requested by the Thunderbird Review Team [<a href="https://github.com/micz/ThunderAI/issues/524">#524</a>].</li>
|
||||
<li>Fix: Using also the mail folder owner to search for the right identity to use when composing a reply [<a href="https://github.com/micz/ThunderAI/issues/627">#627</a>].</li>
|
||||
<li>Context menu items are always ordered alfabetically [<a href="https://github.com/micz/ThunderAI/issues/630">#630</a>].</li>
|
||||
<li>The prompt export now includes an option to incorporate specific API settings, when present [<a href="https://github.com/micz/ThunderAI/issues/624">#624</a>].</li>
|
||||
<li>Added the <i>{%mail_text_body_or_selected%}</i> placeholder to retrieve the selected text or the full text body of the email if no selection is present [<a href="https://github.com/micz/ThunderAI/issues/641">#641</a>].</li>
|
||||
<li>Added the <i>{%mail_html_body_or_selected%}</i> placeholder to retrieve the selected HTML or the full HTML body of the email if no selection is present [<a href="https://github.com/micz/ThunderAI/issues/641">#641</a>].</li>
|
||||
<li><i>[All APIs]</i> Added an option to get a calendar event without selecting some text, but using the full text body of the email [<a href="https://github.com/micz/ThunderAI/issues/518">#518</a>].</li>
|
||||
<li><i>[All APIs]</i> Added a new menu item to create a calendar event from the text saved in the clipboard [<a href="https://github.com/micz/ThunderAI/issues/362">#362</a>].</li>
|
||||
<li>Added a button to copy a prompt in the Custom Prompts page [<a href="https://github.com/micz/ThunderAI/issues/598">#598</a>].</li>
|
||||
<li><i>[All APIs]</i> Showing the spam filter info at the top of the message. The data is saved only for the session in which the message has been checked for spam [<a href="https://github.com/micz/ThunderAI/issues/506">#506</a>, <a href="https://github.com/micz/ThunderAI/issues/658">#658</a>].</li>
|
||||
<li>Fix: Now it's possibile to use multiple <i>additional_text</i> placeholders in a single prompt, also using custom placeholders [<a href="https://github.com/micz/ThunderAI/issues/554">#554</a>].</li>
|
||||
<li>When using the <i>additional_text</i> placeholder is now possibile to specify an ID that will be shown in the form asking for the text [<a href="https://github.com/micz/ThunderAI/issues/525">#525</a>].</li>
|
||||
<li><i>[ChatGPT Web]</i> Added an option to define a custom time to wait for the page load. Sometimes, on slow PCs, the ChatGPT page loads slowly and ThunderAI inject its content too early. With this option you can adjust the waiting time [<a href="https://github.com/micz/ThunderAI/issues/634">#634</a>].</li>
|
||||
</ul>
|
||||
<h2>Version 3.8.5 - 22/02/2026</h2>
|
||||
<ul>
|
||||
<li>Fix: Correctly showing email addresses when using mail headers in data placeholders [<a href="https://github.com/micz/ThunderAI/issues/672">#672</a>].</li>
|
||||
|
|
@ -83,6 +155,7 @@
|
|||
<ul>
|
||||
<li><i>[All APIs]</i> It's now possibile to define a list of tags to be used when autotagging received emails [<a href="https://github.com/micz/ThunderAI/issues/436">#436</a>]. The tags are are now shown in the information header in the AI API chat [<a href="https://github.com/micz/ThunderAI/issues/289">#289</a>].</li>
|
||||
<li><i>[All APIs]</i> The prompt id and name are now shown in the information header in the AI API chat [<a href="https://github.com/micz/ThunderAI/issues/436">#436</a>].</li>
|
||||
<li><i>[All APIs]</i> It's now possibile to define a specific API integration for spamfilter and auto tagging [<a href="https://github.com/micz/ThunderAI/issues/438">#438</a>].</li>
|
||||
<li>Added the <i>{%mail_attachments_info%}</i> placeholder to retrieve the name, type and file size of the mail attachments [<a href="https://github.com/micz/ThunderAI/issues/446">#446</a>].</li>
|
||||
<li><i>[Google Gemini API]</i> Support for the thinkingBudget parameter has been added [<a href="https://github.com/micz/ThunderAI/issues/494">#494</a>].</li>
|
||||
<li><i>[OpenAI Comp API]</i> Added DeepSeek configuration [<a href="https://github.com/micz/ThunderAI/issues/486">#486</a>].</li>
|
||||
|
|
|
|||
65
CLAUDE.md
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
# ThunderAI - Claude Code Guide
|
||||
|
||||
## Project Overview
|
||||
ThunderAI is a **Thunderbird WebExtension (Manifest V2)** that integrates multiple AI providers (ChatGPT Web, OpenAI API, Google Gemini, Claude/Anthropic, Ollama, and OpenAI-compatible APIs) directly into the Thunderbird email client.
|
||||
|
||||
- **Extension ID:** `thunderai@micz.it`
|
||||
- **Min Thunderbird:** 140.0+
|
||||
- **Language:** Plain ES6+ JavaScript modules — no build tools, no transpilation, no npm
|
||||
- **License:** GPLv3
|
||||
|
||||
## Key Rules
|
||||
|
||||
1. **Localization:** Modify ONLY `_locales/en/messages.json`. All other locale files are managed via Weblate — never touch them.
|
||||
2. **No build system:** There is no bundler, compiler, or package manager. All JS files are plain ES6 modules loaded directly by the browser engine.
|
||||
3. **Module imports:** Use relative paths with `.js` extension (e.g., `import { foo } from '../js/mzta-utils.js'`).
|
||||
4. **Placeholder format:** Placeholders in prompt text use the `{%placeholder_id%}` syntax (e.g., `{%mail_text_body_or_selected%}`).
|
||||
5. **No test suite:** There is no automated test framework. Testing is done manually in Thunderbird.
|
||||
6. **Settings defaults:** All new preferences must be added to `options/mzta-options-default.js` in `prefs_default`.
|
||||
7. **Keep spec files up to date:** When making code changes that affect a subsystem described in claude-spec/, update the relevant spec file to reflect the new behavior. Read the spec before modifying, update it after.
|
||||
|
||||
## Directory Map
|
||||
|
||||
```
|
||||
/
|
||||
├── mzta-background.js # Background script (main entry point)
|
||||
├── mzta-background.html # Loads the background script
|
||||
├── manifest.json # Extension manifest
|
||||
├── js/ # Core modules
|
||||
│ ├── api/ # AI API integration modules
|
||||
│ ├── workers/ # Web Workers (one per API provider)
|
||||
│ ├── lib/ # Third-party libraries (diff.js)
|
||||
│ └── mzta-*.js # Core utilities, menus, prompts, placeholders
|
||||
├── options/ # Settings UI
|
||||
│ ├── mzta-options.html/.js/.css
|
||||
│ ├── mzta-options-default.js # ALL default preference values
|
||||
│ └── mzta-release-notes.html
|
||||
├── pages/ # Feature-specific settings pages
|
||||
│ ├── addtags/
|
||||
│ ├── customprompts/
|
||||
│ ├── customdataplaceholders/
|
||||
│ ├── get-calendar-event/
|
||||
│ ├── get-task/
|
||||
│ ├── spamfilter/
|
||||
│ ├── summarize/
|
||||
│ └── onboarding/
|
||||
├── popup/ # Popup menu (shown on toolbar click)
|
||||
│ └── mzta-popup.html/.js/.css
|
||||
├── _locales/ # Localization
|
||||
│ ├── en/messages.json # ← ONLY THIS FILE is edited directly
|
||||
│ └── [15 other languages managed by Weblate]
|
||||
├── images/ # Icons and graphical assets
|
||||
└── api_webchat/ # Web chat API interface
|
||||
```
|
||||
|
||||
## Spec Files
|
||||
|
||||
For detailed documentation see [`claude-spec/`](claude-spec/):
|
||||
|
||||
- [01-architecture.md](claude-spec/01-architecture.md) — Module structure and data flow
|
||||
- [02-prompts.md](claude-spec/02-prompts.md) — Prompt system (types, actions, properties)
|
||||
- [03-placeholders.md](claude-spec/03-placeholders.md) — Placeholder system
|
||||
- [04-api-integrations.md](claude-spec/04-api-integrations.md) — AI provider integrations
|
||||
- [05-options.md](claude-spec/05-options.md) — Settings and preferences system
|
||||
- [06-localization.md](claude-spec/06-localization.md) — i18n rules and workflow
|
||||
- [99-thunderbird-team-spec.md](claude-spec/99-thunderbird-team-spec.md) — Thunderbird WebExtensions development guidelines (API usage, experiments, review requirements)
|
||||
45
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
|
||||
|
|
@ -88,20 +100,20 @@ Are you using this addon in your Thunderbird?
|
|||
## Attributions
|
||||
|
||||
### Translations
|
||||
- Chinese (Simplified) (zh_Hans): [jeklau](https://github.com/jeklau) <img src="https://micz.it/weblate/thunderai/zh_Hans.svg">
|
||||
- Chinese (Traditional) (zh_Hant): [evez](https://github.com/evez) <img src="https://micz.it/weblate/thunderai/zh_Hant.svg">
|
||||
- Croatian (hr): Petar Jedvaj <img src="https://micz.it/weblate/thunderai/hr.svg">
|
||||
- Czech (cs): [Fjuro](https://hosted.weblate.org/user/Fjuro/), [Jaroslav Staněk](https://hosted.weblate.org/user/jaroush/) <img src="https://micz.it/weblate/thunderai/cs.svg">
|
||||
- French (fr): Generated automatically, [Noam](https://github.com/noam-sc) <img src="https://micz.it/weblate/thunderai/fr.svg">
|
||||
- German (de): Generated automatically <img src="https://micz.it/weblate/thunderai/de.svg">
|
||||
- Greek (el): [ChristosK.](https://github.com/christoskaterini) <img src="https://micz.it/weblate/thunderai/el.svg">
|
||||
- Italian (it): [Mic](https://github.com/micz) <img src="https://micz.it/weblate/thunderai/it.svg">
|
||||
- Japanese (ja): [Taichi Ito](https://github.com/watya1) <img src="https://micz.it/weblate/thunderai/ja.svg">
|
||||
- Polski (pl): [neexpl](https://github.com/neexpl), [makkacprzak](https://github.com/makkacprzak) <img src="https://micz.it/weblate/thunderai/pl.svg">
|
||||
- Português Brasileiro (pt-br): Bruno Pereira de Souza <img src="https://micz.it/weblate/thunderai/pt-br.svg">
|
||||
- Russian (ru): [Maksim](https://hosted.weblate.org/user/law820314/) <img src="https://micz.it/weblate/thunderai/ru.svg">
|
||||
- Spanish (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 (sv): [Andreas Pettersson](https://hosted.weblate.org/user/Andy_tb/) <img src="https://micz.it/weblate/thunderai/sv.svg">
|
||||
- Brazilian Portuguese - Português Brasileiro (pt-br): Bruno Pereira de Souza <img src="https://micz.it/weblate/thunderai/pt-br.svg">
|
||||
- Chinese (Simplified) - Jiǎntǐ Zhōngwén (简体中文) (zh_Hans): [jeklau](https://github.com/jeklau), [Min9X1n](https://github.com/Min9X1n) <img src="https://micz.it/weblate/thunderai/zh_Hans.svg">
|
||||
- Chinese (Traditional) - Fántǐ Zhōngwén (繁體中文) (zh_Hant): [evez](https://github.com/evez) <img src="https://micz.it/weblate/thunderai/zh_Hant.svg">
|
||||
- Croatian - Hrvatski (hr): Petar Jedvaj <img src="https://micz.it/weblate/thunderai/hr.svg">
|
||||
- Czech - Čeština (cs): [Fjuro](https://hosted.weblate.org/user/Fjuro/), [Jaroslav Staněk](https://hosted.weblate.org/user/jaroush/) <img src="https://micz.it/weblate/thunderai/cs.svg">
|
||||
- French - Français (fr): Generated automatically, [Noam](https://github.com/noam-sc) <img src="https://micz.it/weblate/thunderai/fr.svg">
|
||||
- German - Deutsch (de): Generated automatically <img src="https://micz.it/weblate/thunderai/de.svg">
|
||||
- Greek - Elliniká (Ελληνικά) (el): [ChristosK.](https://github.com/christoskaterini) <img src="https://micz.it/weblate/thunderai/el.svg">
|
||||
- Italian - Italiano (it): [Mic](https://github.com/micz) <img src="https://micz.it/weblate/thunderai/it.svg">
|
||||
- Japanese - Nihongo (日本語) (ja): [Taichi Ito](https://github.com/watya1) <img src="https://micz.it/weblate/thunderai/ja.svg">
|
||||
- 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">
|
||||
<br>
|
||||
|
||||
Do you want to help translate this addon? [Find out how!](https://micz.it/thunderbird-addon-thunderai/translate/) <br>
|
||||
|
|
@ -117,6 +129,11 @@ _The language status represents the percentage of translated strings in the late
|
|||
- [JessiGue](https://www.flaticon.com/authors/jessigue) for the show/hide icon for api key fields
|
||||
- [Iconka.com](https://www.iconarchive.com/artist/iconka.html) for the autotag context menu icon
|
||||
- [Icojam](https://www.iconarchive.com/artist/icojam.html) for the spam filter context menu icon
|
||||
- [Roundicons](https://www.flaticon.com/authors/roundicons) for the summarize context menu icon
|
||||
- [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>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
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@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.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"
|
||||
},
|
||||
|
|
@ -296,9 +293,6 @@
|
|||
"chatgpt_empty_model": {
|
||||
"message": "Nevybrali jste model pro ChatGPT API. Vyberte jej prosím na stránce s možnostmi."
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Pokouším se připojit k OpenAI ChatGPT pomocí poskytnutého klíče API"
|
||||
},
|
||||
"chagpt_api_send_button": {
|
||||
"message": "Používám model"
|
||||
},
|
||||
|
|
@ -335,12 +329,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Nevybrali jste model pro Ollama API. Prosím, vyberte jej na stránce s nastavením."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Pokouším se připojit k lokálnímu serveru Ollama pomocí hostitele"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "a model"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "Spojení se serverem bylo neočekávaně přerušeno"
|
||||
},
|
||||
|
|
@ -368,9 +356,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Nevybrali jste model pro API kompatibilní s OpenAI. Prosím, vyberte jej na stránce s nastavením."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Pokouším se připojit k lokálnímu serveru API kompatibilního s OpenAI pomocí hostitele"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "Požadavek na OpenAI Comp API selhal"
|
||||
},
|
||||
|
|
@ -407,9 +392,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Použít aktuální model"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Odesílání výzvy..."
|
||||
},
|
||||
"AddTags_prompt_text_title": {
|
||||
"message": "Aktuální text výzvy"
|
||||
},
|
||||
|
|
@ -438,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."
|
||||
|
|
@ -479,7 +461,7 @@
|
|||
"Spam_Value": {
|
||||
"message": "Hodnota spamu"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Ne"
|
||||
},
|
||||
"prefsInfoDesc_4": {
|
||||
|
|
@ -510,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\""
|
||||
|
|
@ -539,7 +521,7 @@
|
|||
"Date": {
|
||||
"message": "Datum"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Ano"
|
||||
},
|
||||
"Report_Date": {
|
||||
|
|
@ -590,9 +572,6 @@
|
|||
"GoogleGemini_Models_Fetch": {
|
||||
"message": "Aktualizovat seznam modelů Google Gemini"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Probíhá pokus o připojení ke Google Gemini pomocí zadaného API klíče"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Nezadali jste API klíč pro Google Gemini API. Vložte jej na stránce možností."
|
||||
},
|
||||
|
|
@ -644,7 +623,7 @@
|
|||
"prefs_OptionText_add_tags_auto_only_inbox_Info": {
|
||||
"message": "Pokud je zaškrtnuto, AI bude přidávat štítky pouze e-mailům přijatým ve složce Doručená pošta."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Výchozí jazyk podle nastavení ThunderAI."
|
||||
},
|
||||
"StorageSpace": {
|
||||
|
|
@ -659,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."
|
||||
},
|
||||
|
|
@ -734,9 +707,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Zdá se, že alespoň jeden z vašich účtů používá doplněk Owl for Exchange. Mezi Thunderbirdem a Owlem je známý problém, který se v současné době řeší. V tuto chvíli můžete používat ThunderAI při psaní e-mailů, ale ne při jejich čtení."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Kliknutím na hodnotu ji nastavíte."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Odpovězte na následující e-mail. Odpovězte pouze potřebným textem a bez dalších komentářů nebo jiného textu."
|
||||
},
|
||||
|
|
@ -761,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."
|
||||
|
|
@ -789,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ů"
|
||||
|
|
@ -810,7 +777,7 @@
|
|||
"message": "Spravovat nastavení štítků"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Z následujícího textu extrahuj všechny relevantní podrobnosti potřebné k vygenerování události kalendáře. Extrahované informace by měly zahrnovat:\n- Název události\n- Datum a čas zahájení (včetně časového pásma, pokud je uvedeno)\n- Datum a čas ukončení (včetně časového pásma, pokud je uvedeno)\n- Celý den (pokud je zmíněn)\n- Účastníci\nZajisti, aby byla data formátována jasně a konzistentně, aby je bylo možné přímo použít k vytvoření události kalendáře.\nPokud existují relativní časové odkazy, vezmi v úvahu, že datum a čas e-mailu jsou \"{%mail_datetime%}\". Vypočítej datum a čas zahájení na základě tohoto odkazu. Pokud jsou vypočítané datum a čas zahájení dřívější než \"{%current_datetime%}\", přepočti datum a čas zahájení pomocí \"{%current_datetime%}\" jako základu.\nPokud není zadána doba trvání, nastav ji na jednu hodinu.\nToto jsou účastníci: {%author%}, {%recipients%}, {%cc_list%}. Pokud je přítomna, nezahrnuj mou adresu: {%account_email_address%}.\nPokud nejsi schopen získat jednu nebo více požadovaných informací, odpověz prázdným řetězcem.\nVygeneruj odpověď pouze ve formátu JSON. Nezahrnuj žádný další text ani vysvětlení; poskytni pouze JSON. Zde je formát, který se má použít:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Zde je souhrn události kalendáře\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nZde je text:\"{%selected_text%}\""
|
||||
"message": "Z následujícího textu extrahuj všechny relevantní podrobnosti potřebné k vygenerování události kalendáře. Extrahované informace by měly zahrnovat:\n- Název události\n- Datum a čas zahájení (včetně časového pásma, pokud je uvedeno)\n- Datum a čas ukončení (včetně časového pásma, pokud je uvedeno)\n- Celý den (pokud je zmíněn)\n- Účastníci\nZajisti, aby byla data formátována jasně a konzistentně, aby je bylo možné přímo použít k vytvoření události kalendáře.\nPokud existují relativní časové odkazy, vezmi v úvahu, že datum a čas e-mailu jsou \"{%mail_datetime%}\". Vypočítej datum a čas zahájení na základě tohoto odkazu. Pokud jsou vypočítané datum a čas zahájení dřívější než \"{%current_datetime%}\", přepočti datum a čas zahájení pomocí \"{%current_datetime%}\" jako základu.\nPokud není zadána doba trvání, nastav ji na jednu hodinu.\nToto jsou účastníci: {%author%}, {%recipients%}, {%cc_list%}. Pokud je přítomna, nezahrnuj mou adresu: {%account_email_address%}.\nPokud se jedná o celodenní událost, musí být endDate jeden den po startDate s časem nastaveným na \"T000000\".\nPokud nejsi schopen získat jednu nebo více požadovaných informací, odpověz prázdným řetězcem.\nVygeneruj odpověď pouze ve formátu JSON. Nezahrnuj žádný další text ani vysvětlení; poskytni pouze JSON. Zde je formát, který se má použít:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Zde je souhrn události kalendáře\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nZde je text:\"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Přidat novou událost do kalendáře z vybraného textu"
|
||||
|
|
@ -848,9 +815,6 @@
|
|||
"calendar_opening_dialog_error": {
|
||||
"message": "Chyba při otevírání dialogu události kalendáře"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks není nainstalován!"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto": {
|
||||
"message": "Přidávat štítky automaticky"
|
||||
},
|
||||
|
|
@ -858,28 +822,10 @@
|
|||
"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\"spamValue\": <celé číslo od 0 do 100>,\n\"explanation\": \"Stručné vysvětlení vašeho zdůvodnění\"\n}\nZde jsou informace o e-mailu:\nOdesílatel: \"{%author%}\"\nPředmět: \"{%mail_subject%}\"\nText HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Přidat štítky"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analýza spamu"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Zobrazit v nabídce položku „Přidat štítky“"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Zobrazit v nabídce položku „Analýza spamu“"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Po zaškrtnutí bude po kliknutí pravým tlačítkem na e-mail v seznamu zpráv v kontextové nabídce zobrazena položka „Analýza spamu“."
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Po zaškrtnutí bude po kliknutí pravým tlačítkem na e-mail v seznamu zpráv v kontextové nabídce zobrazena položka „Přidat štítky“."
|
||||
"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%}\""
|
||||
},
|
||||
"get_calendar_event_prompt_prefs_title": {
|
||||
"message": "Možnosti události kalendáře"
|
||||
|
|
@ -1046,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."
|
||||
|
|
@ -1091,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"
|
||||
|
|
@ -1120,17 +1066,11 @@
|
|||
"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?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Stiskněte tlačítko níže a udělte oprávnění <all_urls>, abyste se vyhnuli jakýmkoli problémům s CORS."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Udělit oprávnění \"všechny URL\""
|
||||
},
|
||||
"maybe_CORS_openai_comp": {
|
||||
"message": "Používání API kompatibilního s OpenAI může vyžadovat nastavení CORS na serveru."
|
||||
},
|
||||
|
|
@ -1166,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"
|
||||
},
|
||||
|
|
@ -327,9 +324,6 @@
|
|||
"chagpt_api_send_button": {
|
||||
"message": "Modell wird verwendet"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Versuch, eine Verbindung zu OpenAI ChatGPT mit dem bereitgestellten API-Schlüssel herzustellen"
|
||||
},
|
||||
"Debug": {
|
||||
"message": "Debuggen"
|
||||
},
|
||||
|
|
@ -363,12 +357,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Sie haben kein Modell für die Ollama API ausgewählt. Bitte wählen Sie eines auf der Optionsseite aus."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Versuch, eine Verbindung zum Ollama-Lokalserver über den Host herzustellen"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "und Modell"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "Die Verbindung zum Server wurde unerwartet unterbrochen"
|
||||
},
|
||||
|
|
@ -399,9 +387,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Sie haben kein Modell für die OpenAI-kompatible API ausgewählt. Bitte wählen Sie eines auf der Optionsseite aus."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Versuche, eine Verbindung zum OpenAI-kompatiblen lokalen API-Server über den Host herzustellen"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "OpenAI-kompatible API-Anfrage fehlgeschlagen"
|
||||
},
|
||||
|
|
@ -423,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."
|
||||
},
|
||||
|
|
@ -498,9 +477,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Aktuelles Modell verwenden"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Sende Eingabe..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Erlaubte Werte"
|
||||
},
|
||||
|
|
@ -516,9 +492,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Es scheint, dass mindestens eines Ihrer Konten das Add-on Eule für Exchange verwendet. Es gibt ein bekanntes Problem zwischen Thunderbird und Eule, das derzeit behoben wird. Derzeit können Sie ThunderAI beim Verfassen von E-Mails verwenden, jedoch nicht beim Lesen."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Klicken Sie auf einen Wert, um ihn festzulegen."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Antworten Sie auf die folgende E-Mail. Antworten Sie nur mit dem benötigten Text und ohne zusätzliche Kommentare oder andere Texte."
|
||||
},
|
||||
|
|
@ -543,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."
|
||||
|
|
@ -559,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}"
|
||||
|
|
@ -681,9 +651,6 @@
|
|||
"google_gemini_api_request_failed": {
|
||||
"message": "Google Gemini API-Anfrage fehlgeschlagen"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Versuch, eine Verbindung zu Google Gemini mit dem bereitgestellten API-Schlüssel herzustellen"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Sie haben keinen API-Schlüssel für die Google Gemini API hinzugefügt. Bitte fügen Sie einen auf der Optionsseite ein."
|
||||
},
|
||||
|
|
@ -712,7 +679,7 @@
|
|||
"message": "Ein neues Kalenderevent hinzufügen"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Extrahieren Sie alle relevanten Details, die erforderlich sind, um ein Kalenderevent aus dem folgenden Text zu erstellen. Die extrahierten Informationen sollten Folgendes enthalten:\n- Ereignistitel\n- Startdatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Enddatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Ganztägig (falls erwähnt)\n- Teilnehmer\nStellen Sie sicher, dass die Daten klar und konsistent formatiert sind, sodass sie direkt für die Erstellung eines Kalenderevents verwendet werden können.\nFalls relative Zeitangaben enthalten sind, beachten Sie, dass Datum und Uhrzeit der E-Mail \"{%mail_datetime%}\" sind. Berechnen Sie das Startdatum und die Startzeit basierend auf diesem Bezugspunkt. Falls das berechnete Startdatum und die Startzeit vor \"{%current_datetime%}\" liegen, berechnen Sie Startdatum und -zeit erneut, wobei Sie \"{%current_datetime%}\" als Grundlage verwenden.\nFalls keine Dauer angegeben ist, setzen Sie sie auf eine Stunde.\nDas sind die Teilnehmer: {%author%}, {%recipients%}, {%cc_list%}. Falls vorhanden, meine Adresse ausschließen: {%account_email_address%}.\nFalls Sie eine oder mehrere der erforderlichen Informationen nicht erhalten können, antworten Sie mit einem leeren String.\nErstellen Sie eine Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; geben Sie nur das JSON an. Verwenden Sie folgendes Format:\n{\n \"startDate\": \"YYYYMMDDTHHMMSS\",\n \"endDate\": \"YYYYMMDDTHHMMSS\",\n \"summary\": \"Zusammenfassung des Kalenderevents hier\",\n \"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHier ist der Text: \"{%selected_text%}\""
|
||||
"message": "Extrahieren Sie alle relevanten Details, die erforderlich sind, um ein Kalenderevent aus dem folgenden Text zu erstellen. Die extrahierten Informationen sollten Folgendes enthalten:\n- Ereignistitel\n- Startdatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Enddatum und -uhrzeit (einschließlich Zeitzone, falls angegeben)\n- Ganztägig (falls erwähnt)\n- Teilnehmer\nStellen Sie sicher, dass die Daten klar und konsistent formatiert sind, sodass sie direkt für die Erstellung eines Kalenderevents verwendet werden können.\nFalls relative Zeitangaben enthalten sind, beachten Sie, dass Datum und Uhrzeit der E-Mail \"{%mail_datetime%}\" sind. Berechnen Sie das Startdatum und die Startzeit basierend auf diesem Bezugspunkt. Falls das berechnete Startdatum und die Startzeit vor \"{%current_datetime%}\" liegen, berechnen Sie Startdatum und -zeit erneut, wobei Sie \"{%current_datetime%}\" als Grundlage verwenden.\nFalls keine Dauer angegeben ist, setzen Sie sie auf eine Stunde.\nDas sind die Teilnehmer: {%author%}, {%recipients%}, {%cc_list%}. Falls vorhanden, meine Adresse ausschließen: {%account_email_address%}.\nWenn es sich um ein ganztägiges Ereignis handelt, muss endDate ein Tag nach startDate liegen und die Zeit auf \"T000000\" eingestellt sein.\nFalls Sie eine oder mehrere der erforderlichen Informationen nicht erhalten können, antworten Sie mit einem leeren String.\nErstellen Sie eine Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; geben Sie nur das JSON an. Verwenden Sie folgendes Format:\n{\n \"startDate\": \"YYYYMMDDTHHMMSS\",\n \"endDate\": \"YYYYMMDDTHHMMSS\",\n \"summary\": \"Zusammenfassung des Kalenderevents hier\",\n \"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHier ist der Text: \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Ein neues Kalenderevent aus ausgewähltem Text hinzufügen"
|
||||
|
|
@ -768,7 +735,7 @@
|
|||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Standardsignatur wie in den ThunderAI-Optionen definiert."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Standardsprache wie in den ThunderAI-Optionen definiert."
|
||||
},
|
||||
"prefs_OptionText_spamfilter": {
|
||||
|
|
@ -787,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"
|
||||
|
|
@ -825,18 +792,15 @@
|
|||
"Report_Date": {
|
||||
"message": "Berichtsdatum"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Ja"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Nein"
|
||||
},
|
||||
"spamfilter_threshold_too_low": {
|
||||
"message": "Der Spam-Schwellenwert ist zu niedrig! Sie werden wahrscheinlich zu viele E-Mails als Spam markieren!"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks nicht installiert!"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_force_existing_Info": {
|
||||
"message": "Wenn aktiviert, fügt die KI nur vorhandene Tags hinzu und erstellt keine neuen Tags."
|
||||
},
|
||||
|
|
@ -844,32 +808,20 @@
|
|||
"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."
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analysieren Sie die folgende E-Mail und bestimmen Sie, ob es sich um Spam handelt oder nicht. Berücksichtigen Sie Faktoren wie verdächtige Schlüsselwörter, übermäßige Werbesprache, irreführende Betreffzeilen, Anfragen nach persönlichen Informationen und ungewöhnliche Absenderadressen.\nGeben Sie einen Wert von 0 (kein Spam) bis 100 (Spam) und eine Erklärung mit maximal 10 Wörtern an.\nFalls Nachrichtendaten fehlen, setzen Sie den Wert auf 0 (kein Spam) und geben Sie den Grund an.\nGenerieren Sie die Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; liefern Sie nur das JSON. Hier ist das zu verwendende Format:\n{\n\"spamValue\": <Ganzzahl von 0 bis 100>,\n\"explanation\": \"Kurze Erklärung Ihrer Begründung\"\n}\nHier sind die Mail-Informationen:\nAbsender: \"{%author%}\"\nBetreff: \"{%mail_subject%}\"\nHTML-Inhalt: \"{%mail_html_body%}\""
|
||||
"message": "Analysieren Sie die folgende E-Mail und bestimmen Sie, ob es sich um Spam handelt oder nicht. Berücksichtigen Sie Faktoren wie verdächtige Schlüsselwörter, übermäßige Werbesprache, irreführende Betreffzeilen, Anfragen nach persönlichen Informationen und ungewöhnliche Absenderadressen.\nGeben Sie einen Wert von 0 (kein Spam) bis 100 (Spam) und eine Erklärung mit maximal 10 Wörtern an.\nFalls Nachrichtendaten fehlen, setzen Sie den Wert auf 0 (kein Spam) und geben Sie den Grund an.\nGenerieren Sie die Antwort ausschließlich im JSON-Format. Fügen Sie keinen zusätzlichen Text oder Erklärungen hinzu; liefern Sie nur das JSON. Hier ist das zu verwendende Format:\n{\n\"explanation\": \"Kurze Erklärung Ihrer Begründung\",\n\"spamValue\": <Ganzzahl von 0 bis 100>\n}\nHier sind die Mail-Informationen:\nAbsender: \"{%author%}\"\nBetreff: \"{%mail_subject%}\"\nHTML-Inhalt: \"{%mail_html_body%}\""
|
||||
},
|
||||
"prefs_OptionText_openai_comp_info_remote": {
|
||||
"message": "Hier können Sie auch die Adresse eines entfernten Servers eingeben."
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Wenn aktiviert, wird beim Rechtsklick auf eine E-Mail in der Nachrichtenliste der Eintrag \"Tags hinzufügen\" angezeigt."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Wenn aktiviert, wird beim Rechtsklick auf eine E-Mail in der Nachrichtenliste der Eintrag \"Auf Spam analysieren\" angezeigt."
|
||||
},
|
||||
"prefs_OptionText_calendar_enforce_timezone": {
|
||||
"message": "Erzwinge die angegebene Zeitzone"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Tags hinzufügen"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Auf Spam analysieren"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Kein bearbeitbarer Kalender gefunden!"
|
||||
},
|
||||
|
|
@ -882,12 +834,6 @@
|
|||
"prefs_OptionText_calendar_enforce_timezone_Info": {
|
||||
"message": "Wenn aktiviert, wird die angegebene Zeitzone für die Kalendereinträge und Aufgaben erzwungen."
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "\"Tags hinzufügen\" im Kontextmenü anzeigen"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "\"Auf Spam analysieren\" im Kontextmenü anzeigen"
|
||||
},
|
||||
"apiwebchat_you": {
|
||||
"message": "Du"
|
||||
},
|
||||
|
|
@ -930,12 +876,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "Probleme beim Einrichten von CORS?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Drücke den Button unten, um die Berechtigung <all_urls> zu erteilen und CORS-Probleme zu vermeiden."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Gib die Berechtigung für \"alle URLs\""
|
||||
},
|
||||
"remember_CORS": {
|
||||
"message": "Denk daran, du musst die CORS-Einstellungen auf dem Server konfigurieren!"
|
||||
},
|
||||
|
|
@ -1039,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"
|
||||
|
|
@ -1250,7 +1190,7 @@
|
|||
"message": "Antworten Sie auf die folgende E-Mail „{%mail_text_body%}“. {%additional_text%}. Antworten Sie nur mit dem erforderlichen Text und ohne zusätzliche Kommentare oder anderen Text."
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Mit Befehl antworten"
|
||||
"message": "Mit Befehl antworten..."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_br_replace_info": {
|
||||
"message": "Bitte beachten Sie, dass alle <br>-Tags in der Antwort der KI durch Zeilenumbrüche ersetzt werden."
|
||||
|
|
@ -1338,5 +1278,537 @@
|
|||
},
|
||||
"prefs_anthropic_temperature_Info": {
|
||||
"message": "Grad der Zufälligkeit in der Antwort. Der Standardwert ist 1,0. Der Bereich liegt zwischen 0,0 und 1,0. Verwenden Sie eine Temperatur näher an 0,0 für analytische Aufgaben oder Multiple-Choice-Fragen und näher an 1,0 für kreative und generative Aufgaben. Beachten Sie, dass die Ergebnisse selbst bei einer Temperatur von 0,0 nicht vollständig deterministisch sind."
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "E-Mail-Inhalt oder markierter Text"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "E-Mail-Inhalt oder markiertes HTML"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Wartezeit für das Laden der Seite"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Wartezeit in Millisekunden, bis die ChatGPT-Seite geladen ist, bevor zusätzliche Inhalte geladen werden. Der Standardwert beträgt 1000 ms. Falls un Custom GPT oder ein Project definiert ist, werden diesem Wert zusätzliche 1000 ms hinzugefügt."
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Termin aus Zwischenablage erstellen"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Zwischenablage konnte nicht gelesen werden. Bitte Berechtigungen prüfen."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Zwischenablage leer. Bitte kopieren Sie zuerst einen Text."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Zugriff auf die Zwischenablage wurde verweigert. Bitte aktiviere die Funktion in den Einstellungen erneut, um die Berechtigung zu erteilen."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Fehler bei der Berechtigungsanfrage. Bitte erneut versuchen."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Termin aus Zwischenablage abrufen"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Zusätzlichen Menüpunkt einblenden: Kalendertermine aus Zwischenablagen-Text erstellen."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Zusammenfassungseinstellungen"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Zusammenfassen"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"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"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "Von: {%author%}\nAn: {%recipients%}\nCC: {%cc_list%}\nBetreff: {%mail_subject%}\nDatum: {%mail_datetime%}\nAnhänge:\n{%mail_attachments_info%}\n\nInhalt:\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "E-Mail-Separator"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- NÄCHSTE E-MAIL ----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Sie können den Prompt nach Belieben anpassen: Das erste Feld ist der Haupt-Prompt, das zweite Feld ist die Vorlage für eine einzelne E-Mail. Die Liste der E-Mails wird an den Haupt-Prompt angehängt. Die E-Mails werden durch das im dritten Feld angegebene Trennzeichen voneinander getrennt."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "Der Haupt-Prompt, der die Aufgabe für alle ausgewählten E-Mails beschreibt:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "Die Vorlage für eine einzelne E-Mail:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "Das Trennzeichen zwischen E-Mails:"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Wenn aktiviert, werden das unten angegebene Modell und die API zum Erstellen von Kalenderereignissen verwendet, unabhängig von der Auswahl auf der ThunderAI-Optionsseite."
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "E-Mail zusammenfassen"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Wenn aktiviert, werden das unten angegebene Modell und die API zum Zusammenfassen von E-Mails verwendet, unabhängig von der Auswahl auf der ThunderAI-Optionsseite."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Wenn aktiviert, wird dem Kontextmenü eine Option zum Zusammenfassen von E-Mails hinzugefügt."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Zusammenfassung verwalten"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Zusammenfassungseinstellungen verwalten"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "Auf dieser Seite können Sie den Standard-Prompt für die Zusammenfassung von E-Mails bearbeiten."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Aktueller Prompt-Text"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Spam-Bericht-Panel anzeigen"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Wenn aktiviert, wird oben über der Nachricht ein Panel mit dem Spam-Bericht angezeigt."
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Spam"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Zulässig"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Berechtigung für den aktuellen Host erteilen"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Wenn Sie localhost oder 127.0.0.1 verwenden, da der KI-Server auf Ihrem PC gehostet wird, ist die Berechtigung <all_urls> erforderlich."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Möchten Sie die API-Einstellungen in den Export einbeziehen? Bitte beachten Sie, dass auch der API-Schlüssel in der Datei gespeichert wird!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Nicht zur Textauswahl auffordern"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Wenn aktiviert, ist keine Textauswahl erforderlich. Der gesamte Nachrichtentext wird verwendet, um das Kalenderereignis zu erstellen."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Kopieren"
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "kopie"
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Spam-Prüfung läuft..."
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Möchtest du schöne Statistiken zu deinen E-Mails erhalten?"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Hier klicken! Probiere ThunderStats aus!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "Der Prompt muss den Platzhalter {%mail_text_body_or_selected%} oder {%mail_html_body_or_selected%} enthalten, um diese Option zu aktivieren. Bitte fügen Sie einen dieser Platzhalter zum Prompt hinzu oder setzen Sie ihn auf den Standardwert zurück."
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam von"
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Dokumentation"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Einrichtungsleitfäden"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Tutorial für benutzerdefinierte Prompts"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Die Willkommensseite öffnen"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "Position des KI-Chatfensters"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Oben"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Links"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Fensterposition beim Schließen automatisch speichern."
|
||||
},
|
||||
"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)"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
"message": "Απάντηση σε αυτό το νήμα"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Απάντηση με εντολή"
|
||||
"message": "Απάντηση με εντολή..."
|
||||
},
|
||||
"prompt_rewrite_polite": {
|
||||
"message": "Ξαναγράψε ευγενικά"
|
||||
|
|
@ -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 εάν δεν θέλετε να καθορίσετε το μέγεθος του παραθύρου."
|
||||
},
|
||||
|
|
@ -512,9 +503,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Χρησιμοποιήστε το τρέχον μοντέλο"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Αποστολή προτροπής..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Επιτρεπόμενες τιμές"
|
||||
},
|
||||
|
|
@ -533,9 +521,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Φαίνεται ότι τουλάχιστον ένας από τους λογαριασμούς σας χρησιμοποιεί το πρόσθετο Owl for Exchange. Υπάρχει ένα γνωστό πρόβλημα μεταξύ του Thunderbird και του Owl, το οποίο αντιμετωπίζεται αυτήν τη στιγμή. Προς το παρόν, μπορείτε να χρησιμοποιήσετε το ThunderAI κατά τη σύνταξη email, αλλά όχι κατά την ανάγνωσή τους."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Κάντε κλικ σε μια τιμή για να την ορίσετε."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Απαντήστε στο ακόλουθο μήνυμα ηλεκτρονικού ταχυδρομείου. Απαντήστε μόνο με το απαραίτητο κείμενο και χωρίς επιπλέον σχόλια ή άλλο κείμενο."
|
||||
},
|
||||
|
|
@ -564,7 +549,7 @@
|
|||
"message": "Προσθήκη νέου συμβάντος ημερολογίου"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Εξαγάγετε όλες τις σχετικές λεπτομέρειες που απαιτούνται για τη δημιουργία ενός συμβάντος ημερολογίου από το ακόλουθο κείμενο. Οι εξαγόμενες πληροφορίες θα πρέπει να περιλαμβάνουν:\n- Τίτλο συμβάντος\n- Ημερομηνία και ώρα έναρξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ημερομηνία και ώρα λήξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ολόκληρη ημέρα (εάν αναφέρεται)\n- Συμμετέχοντες\nΒεβαιωθείτε ότι τα δεδομένα έχουν μορφοποιηθεί με σαφήνεια και συνέπεια, ώστε να μπορούν να χρησιμοποιηθούν άμεσα για τη δημιουργία ενός συμβάντος ημερολογίου.\nΕάν υπάρχουν σχετικές χρονικές αναφορές, λάβετε υπόψη ότι η ημερομηνία και η ώρα του email είναι \"{%mail_datetime%}\". Υπολογίστε την ημερομηνία και την ώρα έναρξης με βάση αυτήν την αναφορά. Εάν η υπολογισμένη ημερομηνία και ώρα έναρξης είναι προγενέστερες από το \"{%current_datetime%}\", υπολογίστε ξανά την ημερομηνία και την ώρα έναρξης χρησιμοποιώντας το \"{%current_datetime%}\" ως βάση.\nΕάν η διάρκεια δεν έχει καθοριστεί, ορίστε την σε μία ώρα.\nΑυτοί είναι οι συμμετέχοντες: {%author%}, {%recipients%}, {%cc_list%}. Εάν υπάρχει, εξαιρέστε τη διεύθυνσή μου: {%account_email_address%}.\nΕάν δεν μπορείτε να λάβετε μία ή περισσότερες από τις απαιτούμενες πληροφορίες, απαντήστε με μια κενή συμβολοσειρά.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξηγήσεις. Δώστε μόνο το JSON. Η μορφή που θα χρησιμοποιηθεί είναι η εξής:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Σύνοψη συμβάντος ημερολογίου εδώ\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nΤο κείμενο είναι: \"{%selected_text%}\""
|
||||
"message": "Εξαγάγετε όλες τις σχετικές λεπτομέρειες που απαιτούνται για τη δημιουργία ενός συμβάντος ημερολογίου από το ακόλουθο κείμενο. Οι εξαγόμενες πληροφορίες θα πρέπει να περιλαμβάνουν:\n- Τίτλο συμβάντος\n- Ημερομηνία και ώρα έναρξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ημερομηνία και ώρα λήξης (συμπεριλαμβανομένης της ζώνης ώρας, εάν καθορίζεται)\n- Ολόκληρη ημέρα (εάν αναφέρεται)\n- Συμμετέχοντες\nΒεβαιωθείτε ότι τα δεδομένα έχουν μορφοποιηθεί με σαφήνεια και συνέπεια, ώστε να μπορούν να χρησιμοποιηθούν άμεσα για τη δημιουργία ενός συμβάντος ημερολογίου.\nΕάν υπάρχουν σχετικές χρονικές αναφορές, λάβετε υπόψη ότι η ημερομηνία και η ώρα του email είναι \"{%mail_datetime%}\". Υπολογίστε την ημερομηνία και την ώρα έναρξης με βάση αυτήν την αναφορά. Εάν η υπολογισμένη ημερομηνία και ώρα έναρξης είναι προγενέστερες από το \"{%current_datetime%}\", υπολογίστε ξανά την ημερομηνία και την ώρα έναρξης χρησιμοποιώντας το \"{%current_datetime%}\" ως βάση.\nΕάν η διάρκεια δεν έχει καθοριστεί, ορίστε την σε μία ώρα.\nΑυτοί είναι οι συμμετέχοντες: {%author%}, {%recipients%}, {%cc_list%}. Εάν υπάρχει, εξαιρέστε τη διεύθυνσή μου: {%account_email_address%}.\nΕάν το συμβάν είναι ολοήμερο, η ημερομηνία λήξης (endDate) πρέπει να είναι μία ημέρα μετά την ημερομηνία έναρξης (startDate) με την ώρα να έχει οριστεί σε \"T000000\".\nΕάν δεν μπορείτε να λάβετε μία ή περισσότερες από τις απαιτούμενες πληροφορίες, απαντήστε με μια κενή συμβολοσειρά.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξηγήσεις. Δώστε μόνο το JSON. Η μορφή που θα χρησιμοποιηθεί είναι η εξής:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Σύνοψη συμβάντος ημερολογίου εδώ\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nΤο κείμενο είναι: \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prompt_get_task": {
|
||||
"message": "Προσθήκη νέας εργασίας"
|
||||
|
|
@ -692,7 +677,7 @@
|
|||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Προεπιλεγμένη υπογραφή όπως ορίζεται στις επιλογές ThunderAI."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Προεπιλεγμένη γλώσσα όπως ορίζεται στις επιλογές ThunderAI."
|
||||
},
|
||||
"placeholder_mail_attachments_info": {
|
||||
|
|
@ -720,10 +705,10 @@
|
|||
"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\"spamValue\": <ακέραιος αριθμός από 0 έως 100>,\n\"explanation\": \"Σύντομη εξήγηση του συλλογισμού σας\"\n}\nΕδώ βρίσκονται οι πληροφορίες του email:\nΑποστολέας: \"{%author%}\"\nΘέμα: \"{%mail_subject%}\"\nΣώμα Html: \"{%mail_html_body%}\""
|
||||
"message": "Αναλύστε το ακόλουθο email και προσδιορίστε εάν είναι spam ή όχι. Λάβετε υπόψη παράγοντες όπως ύποπτες λέξεις-κλειδιά, υπερβολική διαφημιστική γλώσσα, παραπλανητικές γραμμές θέματος, αιτήματα για προσωπικά στοιχεία και ασυνήθιστες διευθύνσεις αποστολέα.\nΔώστε μια τιμή από 0 (όχι spam) έως 100 (spam) και μια εξήγηση που δεν υπερβαίνει τις 10 λέξεις.\nΣε περίπτωση που λείπουν δεδομένα μηνύματος, ορίστε την τιμή σε 0 (όχι spam) και δώστε τον λόγο.\nΔημιουργήστε μια απάντηση μόνο σε μορφή JSON. Μην συμπεριλάβετε κανένα επιπλέον κείμενο ή εξήγηση. Δώστε μόνο το JSON. Ακολουθεί η μορφή που θα χρησιμοποιηθεί:\n{\n\"explanation\": \"Σύντομη εξήγηση του συλλογισμού σας\",\n\"spamValue\": <ακέραιος αριθμός από 0 έως 100>\n}\nΕδώ βρίσκονται οι πληροφορίες του email:\nΑποστολέας: \"{%author%}\"\nΘέμα: \"{%mail_subject%}\"\nΣώμα Html: \"{%mail_html_body%}\""
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Επιλογές φίλτρου ανεπιθύμητης αλληλογραφίας"
|
||||
|
|
@ -747,7 +732,7 @@
|
|||
"message": "Το όριο ανεπιθύμητης αλληλογραφίας είναι μηδέν! Θα επισημάνετε όλα τα μηνύματα ως ανεπιθύμητα!"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "Δεν έχουν ελεγχθεί ακόμη μηνύματα για ανεπιθύμητα. Εδώ θα βρείτε μια λίστα με τις τελευταίες 100 αναφορές ανεπιθύμητων μηνυμάτων μόνο για την τρέχουσα συνεδρία."
|
||||
"message": "Δεν έχουν ελεγχθεί ακόμη μηνύματα για ανεπιθύμητα. Εδώ θα βρείτε μια λίστα με τις τελευταίες 100 αναφορές ανεπιθύμητων μηνυμάτων."
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
"message": "Αναφορές φίλτρου ανεπιθύμητης αλληλογραφίας"
|
||||
|
|
@ -773,30 +758,12 @@
|
|||
"Report_Date": {
|
||||
"message": "Ημερομηνία αναφοράς"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Ναί"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Οχι"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Προσθήκη ετικετών"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Ανάλυση για ανεπιθύμητα μηνύματα"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Εμφάνιση του στοιχείου μενού \"Προσθήκη ετικετών\""
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, το στοιχείο μενού \"Προσθήκη ετικετών\" θα εμφανίζεται όταν κάνετε δεξί κλικ σε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη λίστα μηνυμάτων."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Εμφάνιση του στοιχείου μενού \"Ανάλυση για ανεπιθύμητα μηνύματα\""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, το στοιχείο μενού \"Ανάλυση για ανεπιθύμητα μηνύματα\" θα εμφανίζεται όταν κάνετε δεξί κλικ σε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στη λίστα μηνυμάτων."
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Δεν βρέθηκε επεξεργάσιμο ημερολόγιο!"
|
||||
},
|
||||
|
|
@ -836,12 +803,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "Προβλήματα με τη ρύθμιση του CORS;"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Πατήστε το παρακάτω κουμπί για να δώσετε στο <all_urls> την άδεια να αποφύγει οποιοδήποτε πρόβλημα CORS."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Δώστε άδεια σε \"όλες τις διευθύνσεις URL\""
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text": {
|
||||
"message": "Σύνταξη σε απλό κείμενο"
|
||||
},
|
||||
|
|
@ -1071,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": "Απαντήστε μόνο με το απαραίτητο κείμενο και χωρίς επιπλέον σχόλια ή άλλο κείμενο."
|
||||
|
|
@ -1087,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}"
|
||||
|
|
@ -1304,5 +1262,537 @@
|
|||
},
|
||||
"prefs_anthropic_temperature_Info": {
|
||||
"message": "Ποσότητα τυχαιότητας που εισάγεται στην απόκριση. Προεπιλογή 1,0. Εύρος από 0,0 έως 1,0. Χρησιμοποιήστε θερμοκρασία πιο κοντά στο 0,0 για αναλυτική ανάλυση."
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Σώμα μηνύματος ή επιλεγμένο κείμενο"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Σώμα μηνύματος ή επιλεγμένη HTML"
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Προσθήκη συμβάντος ημερολογίου από το πρόχειρο"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Δεν ήταν δυνατή η ανάγνωση του προχείρου. Ελέγξτε τα δικαιώματα."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Το πρόχειρο είναι άδειο. Παρακαλώ αντιγράψτε πρώτα κάποιο κείμενο."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Η άδεια χρήσης του πρόχειρου απορρίφθηκε. Ενεργοποιήστε ξανά τη λειτουργία στις ρυθμίσεις για να παραχωρήσετε άδεια."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Σφάλμα κατά την αίτηση άδειας στο πρόχειρο. Δοκιμάστε ξανά."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Λήψη συμβάντος ημερολογίου από το πρόχειρο"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Εμφάνιση ενός επιπλέον στοιχείου μενού για τη δημιουργία συμβάντων ημερολογίου από περιεχόμενο κειμένου στο πρόχειρο."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Επιλογές σύνοψης"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Συνοψίστε"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Δώστε μια συνοπτική περίληψη των ακόλουθων μηνυμάτων ηλεκτρονικού ταχυδρομείου. Η περίληψη πρέπει να έχει μέγιστο μήκος 3-5 προτάσεις και να καταγράφει τα κύρια σημεία. Γράψτε σε απλές παραγράφους χωρίς κουκκίδες, λίστες ή μορφοποίηση markdown:\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Σύνοψη προτύπου email"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"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"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- ΕΠΟΜΕΝΟ EMAIL -----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Μπορείτε να αλλάξετε την προτροπή όπως επιθυμείτε. Το πρώτο πεδίο είναι η κύρια προτροπή, το δεύτερο πεδίο είναι το πρότυπο για ένα μόνο μήνυμα ηλεκτρονικού ταχυδρομείου. Η λίστα των email θα προσαρτηθεί στην κύρια προτροπή. Τα email θα διαχωρίζονται με το διαχωριστικό που καθορίζεται στο τρίτο πεδίο."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "Η κύρια προτροπή που περιγράφει την εργασία που θα εκτελεστεί σε όλα τα επιλεγμένα email:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "Το πρότυπο για ένα μόνο email:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "Το διαχωριστικό μεταξύ των email:"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Εάν επιλεγεί, το μοντέλο και το API που καθορίζονται παρακάτω θα χρησιμοποιηθούν για τη δημιουργία συμβάντων ημερολογίου, ανεξάρτητα από αυτό που έχει επιλεγεί στη σελίδα επιλογών ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Σύνοψη αλληλογραφίας"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Εάν επιλεγεί, το μοντέλο και το API που καθορίζονται παρακάτω θα χρησιμοποιηθούν για τη σύνοψη email(s), ανεξάρτητα από αυτό που έχει επιλεγεί στη σελίδα επιλογών ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, προσθέτει μια επιλογή στο μενού περιβάλλοντος για τη σύνοψη της αλληλογραφίας."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Διαχείριση ρυθμίσεων σύνοψης"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Διαχείριση ρυθμίσεων σύνοψης"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "Σε αυτήν τη σελίδα μπορείτε να τροποποιήσετε την προεπιλεγμένη προτροπή που χρησιμοποιείται για τη σύνοψη των μηνυμάτων ηλεκτρονικού ταχυδρομείου."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Τρέχον κείμενο προτροπής"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Εμφάνιση πλαισίου αναφοράς ανεπιθύμητων μηνυμάτων"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, θα εμφανίζεται ένα πλαίσιο με την αναφορά ανεπιθύμητης αλληλογραφίας στο επάνω μέρος του μηνύματος."
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Ανεπιθύμητα μηνύματα"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Έγκυρα Μηνύματα"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Πατήστε το παρακάτω κουμπί για να δώσετε άδεια στον τρέχοντα κεντρικό υπολογιστή να αποφύγει οποιοδήποτε πρόβλημα με το CORS."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Δώστε άδεια στον τρέχοντα κεντρικό υπολογιστή"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Εάν χρησιμοποιείτε localhost ή 127.0.0.1 επειδή ο διακομιστής AI φιλοξενείται στον υπολογιστή σας, απαιτείται το δικαίωμα <all_urls>."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Θέλετε να συμπεριλάβετε τις ρυθμίσεις API στην εξαγωγή; Λάβετε υπόψη ότι και το Κλειδί API θα αποθηκευτεί στο αρχείο!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Μην ζητάτε να επιλέξετε κείμενο"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Εάν είναι επιλεγμένο, δεν χρειάζεται να επιλέξετε κάποιο κείμενο. Το πλήρες σώμα του μηνύματος θα χρησιμοποιηθεί για τη λήψη του συμβάντος ημερολογίου."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Αντιγραφή"
|
||||
},
|
||||
"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": "(τίποτα)"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Reply with command",
|
||||
"message": "Reply with command...",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_rewrite_polite": {
|
||||
|
|
@ -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": ""
|
||||
|
|
@ -235,6 +247,10 @@
|
|||
"message": "Close",
|
||||
"description": ""
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Save as Summary",
|
||||
"description": "Button label in the webchat window to save the AI response as a message summary"
|
||||
},
|
||||
"chatgpt_textarea_not_found_error": {
|
||||
"message": "It seems that the ChatGPT page is taking too long to load. If it finishes loading, click the button on the right. If the problem persists, please check the service status.",
|
||||
"description": ""
|
||||
|
|
@ -327,6 +343,35 @@
|
|||
"message": "Manage your data placeholders",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Storage",
|
||||
"description": "Title for storage management section in options"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "The storage is used to save information about spam score, summaries and translations of each message.",
|
||||
"description": "Info text for storage management section in options"
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Storage size",
|
||||
"description": "Label for storage size display"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Clear Storage",
|
||||
"description": "Button to clear all stored message data"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Are you sure you want to clear all stored data (summaries, spam reports, translations)? This action cannot be undone.",
|
||||
"description": "Confirmation dialog for clearing storage"
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "$COUNT$ records removed.",
|
||||
"description": "Message shown after storage is cleared",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoTitle": {
|
||||
"message": "Important Information",
|
||||
"description": ""
|
||||
|
|
@ -355,6 +400,14 @@
|
|||
"message": "You can change the shortcut clicking on the cogwheel icon at the top right of this page and choosing \"Manage Extension Shortcut\".",
|
||||
"description": ""
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "To use the Google Gemini API, you need a Google Gemini API Key and must choose a model.",
|
||||
"description": ""
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "To use the Claude API, you need an Anthropic Claude API Key and must choose a model.",
|
||||
"description": ""
|
||||
},
|
||||
"prefsDonation_1": {
|
||||
"message": "Do you like this addon?",
|
||||
"description": ""
|
||||
|
|
@ -571,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": ""
|
||||
|
|
@ -627,6 +672,10 @@
|
|||
"message": "Mail headers",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "All mail headers",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_selected_text": {
|
||||
"message": "Selected text",
|
||||
"description": ""
|
||||
|
|
@ -659,6 +708,14 @@
|
|||
"message": "Account email address",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Mail body or selected text",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Mail body or selected HTML",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_placeholders_use_default_value": {
|
||||
"message": "Placeholders: use default value",
|
||||
"description": ""
|
||||
|
|
@ -667,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": ""
|
||||
|
|
@ -691,12 +760,16 @@
|
|||
"message": "If checked, the temporary chat will be used in the ChatGPT Web Interface.",
|
||||
"description": ""
|
||||
},
|
||||
"chatgpt_btn_model": {
|
||||
"message": "Use the current model",
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Wait time for page load",
|
||||
"description": ""
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Sending prompt...",
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Time in milliseconds to wait for the ChatGPT page to load before loading the additional content. Default is 1000ms. If a Custom GPT or Project is defined, additional 1000ms will be added to this value.",
|
||||
"description": ""
|
||||
},
|
||||
"chatgpt_btn_model": {
|
||||
"message": "Use the current model",
|
||||
"description": ""
|
||||
},
|
||||
"AllowedValues": {
|
||||
|
|
@ -723,10 +796,6 @@
|
|||
"message": "It appears that at least one of your accounts is using the Owl for Exchange add-on. There is a known issue between Thunderbird and Owl, which is currently being addressed. At this time, you can use ThunderAI while composing emails, but not when reading them.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Click on a value to set it.",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Reply to the following email. Reply with only the needed text and with no extra comments or other text.",
|
||||
"description": ""
|
||||
|
|
@ -763,12 +832,8 @@
|
|||
"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 following email in",
|
||||
"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": ""
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
|
|
@ -784,7 +849,7 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "Add tags to this email",
|
||||
"message": "Add tags",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_add_tags_full_text": {
|
||||
|
|
@ -915,6 +980,22 @@
|
|||
"message": "Click here, it only takes a minute!",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Documentation",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Setup Guides",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Custom Prompt Tutorial",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Open the Welcome Page",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OpenAIComp_ForceModel": {
|
||||
"message": "Manually insert model",
|
||||
"description": ""
|
||||
|
|
@ -1000,7 +1081,63 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Extract all relevant details required to generate a calendar event from the following text. The extracted information should include:\n- Event Title\n- Start Date and Time (including timezone, if specified)\n- End Date and Time (including timezone, if specified)\n- Full day (if mentioned)\n- Attendees\nEnsure the data is formatted clearly and consistently so that it can be directly used for creating a calendar event.\nIf there are relative time references, consider that the date and time of the email are \"{%mail_datetime%}\". Calculate the start date and time based on this reference. If the calculated start date and time are earlier than \"{%current_datetime%}\", recalculate the start date and time using \"{%current_datetime%}\" as the base.\nIf the duration is not specified, set it to one hour.\nThese are the attendees: {%author%}, {%recipients%}, {%cc_list%}. If present, exclude my address: {%account_email_address%}.\nIf you're not able to get one or more of the required information, please respond with an empty string.\nGenerate a response in JSON format only. Do not include any additional text or explanations; provide only the JSON. Here is the format to be used:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Calendar event summary here\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHere's the text:\"{%selected_text%}\"",
|
||||
"message": "Extract all relevant details required to generate a calendar event from the following text. The extracted information should include:\n- Event Title\n- Start Date and Time (including timezone, if specified)\n- End Date and Time (including timezone, if specified)\n- Full day (if mentioned)\n- Attendees\nEnsure the data is formatted clearly and consistently so that it can be directly used for creating a calendar event.\nIf there are relative time references, consider that the date and time of the email are \"{%mail_datetime%}\". Calculate the start date and time based on this reference. If the calculated start date and time are earlier than \"{%current_datetime%}\", recalculate the start date and time using \"{%current_datetime%}\" as the base.\nIf the duration is not specified, set it to one hour.\nThese are the attendees: {%author%}, {%recipients%}, {%cc_list%}. If present, exclude my address: {%account_email_address%}.\nIf the event is a full day event, endDate must be one day after startDate with time set to \"T000000\".\nIf you're not able to get one or more of the required information, please respond with an empty string.\nGenerate a response in JSON format only. Do not include any additional text or explanations; provide only the JSON. Here is the format to be used:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Calendar event summary here\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHere's the text:\"{%mail_text_body_or_selected%}\"",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Add calendar event from clipboard",
|
||||
"description": ""
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Could not read clipboard. Please check permissions.",
|
||||
"description": ""
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Clipboard is empty. Please copy some text first.",
|
||||
"description": ""
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Clipboard permission was denied. Please enable the feature again in settings to grant permission.",
|
||||
"description": ""
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Error requesting clipboard permission. Please try again.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Get calendar event from clipboard",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Show an additional menu item to create calendar events from clipboard text content.",
|
||||
"description": ""
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Summarization Options",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Summarize",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "Provide a concise summary of the following email message(s). The summary should be 3-5 sentences maximum and capture the main points. Write in plain paragraphs without bullet points, lists, or markdown formatting:\n\n",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Summarize email template",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "From: {%author%}\nTo: {%recipients%}\nCC: {%cc_list%}\nSubject: {%mail_subject%}\nDate: {%mail_datetime%}\nAttachments:\n{%mail_attachments_info%}\n\nBody:\n{%mail_text_body%}",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "Email separator",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- NEXT EMAIL ----------\n\n",
|
||||
"description": ""
|
||||
},
|
||||
"prompt_get_task": {
|
||||
|
|
@ -1067,6 +1204,22 @@
|
|||
"message": "You can change the prompt as you wish, but the response received from the AI must be in JSON format as specified in the default prompt!",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "You can change the prompt as you wish, the first field is the main prompt, the second field is the template for a single mail. The list of emails will be appended to the main prompt. Emails will be separated by the separator specified in the third field.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "The main prompt describing the task to be performed on all selected emails:",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "The template for a single email:",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "The separator between emails:",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_Sparks_not_present": {
|
||||
"message": "To use the calendar event and task features, please install the ThunderAI Sparks addon.",
|
||||
"description": ""
|
||||
|
|
@ -1167,14 +1320,26 @@
|
|||
"message": "If checked, the Model and API specified below will be used for adding tags to emails, regardless the one choosen in the ThunderAI options page.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "If checked, the Model and API specified below will be used for creating calendar events, regardless the one choosen in the ThunderAI options page.",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Default signature as defined in ThunderAI options.",
|
||||
"description": ""
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Default language as defined in ThunderAI options.",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "The language to be used in the mail translations.",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "The languages code to do not translate when found.",
|
||||
"description": ""
|
||||
},
|
||||
"placeholder_mail_attachments_info": {
|
||||
"message": "Information about the attachments in the email",
|
||||
"description": ""
|
||||
|
|
@ -1195,6 +1360,22 @@
|
|||
"message": "Manage spam filter settings",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Summarize email",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "If checked, the Model and API specified below will be used for summarizing email(s), regardless the one choosen in the ThunderAI options page.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "If checked, adds an option to context menu to summarize email(s).",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Manage summarize settings",
|
||||
"description": ""
|
||||
},
|
||||
"SpamFilter_PageTitle": {
|
||||
"message": "Manage Spam Filter Settings",
|
||||
"description": ""
|
||||
|
|
@ -1208,17 +1389,29 @@
|
|||
"description": ""
|
||||
},
|
||||
"prompt_spamfilter" : {
|
||||
"message" : "Detect spam emails",
|
||||
"message" : "Analyze for spam",
|
||||
"description" : ""
|
||||
},
|
||||
"prompt_spamfilter_full_text" : {
|
||||
"message" : "Analyze the following email and determine if it is spam or not. Consider factors such as suspicious keywords, excessive promotional language, misleading subject lines, requests for personal information, and unusual sender addresses.\nProvide a value from 0 (not spam) to 100 (spam) and an explanation of no more than 10 words.\nIn case of missing message data, set the value to 0 (not spam), and give the reason.\nGenerate a response in JSON format only. Do not include any additional text or explanation; provide only the JSON. Here is the format to be used:\n{\n\"spamValue\": <integer from 0 to 100>,\n\"explanation\": \"Brief explanation of your reasoning\"\n}\nHere there are the mail information:\nSender: \"{%author%}\"\nSubject: \"{%mail_subject%}\"\nHtml body: \"{%mail_html_body%}\"",
|
||||
"message" : "Analyze the following email and determine if it is spam or not. Consider factors such as suspicious keywords, excessive promotional language, misleading subject lines, requests for personal information, and unusual sender addresses.\nProvide a value from 0 (not spam) to 100 (spam) and an explanation of no more than 10 words.\nIn case of missing message data, set the value to 0 (not spam), and give the reason.\nGenerate a response in JSON format only. Do not include any additional text or explanation; provide only the JSON. Here is the format to be used:\n{\n\"explanation\": \"Brief explanation of your reasoning\",\n\"spamValue\": <integer from 0 to 100>\n}\nHere there are the mail information:\nSender: \"{%author%}\"\nSubject: \"{%mail_subject%}\"\nHtml body: \"{%mail_html_body%}\"",
|
||||
"description" : ""
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Spam Filter Options",
|
||||
"description": ""
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Manage Summarize Settings",
|
||||
"description": ""
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "In this page you can modify the default prompt used to summarize emails.",
|
||||
"description": ""
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Current prompt text",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_use_specific_integration": {
|
||||
"message": "Use specific Model and API",
|
||||
"description": ""
|
||||
|
|
@ -1235,6 +1428,14 @@
|
|||
"message": "If the value returned by the AI is above this threshold, the email will be moved to the spam folder.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Show spam report panel",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "If checked, a panel with the spam report will be shown on top of the message.",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_threshold_too_low": {
|
||||
"message": "The spam threshold is too low! You will likely mark too much mails as spam!",
|
||||
"description": ""
|
||||
|
|
@ -1244,7 +1445,43 @@
|
|||
"description": ""
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "No messages have screened for spam yet. Here you'll find a list of the last 100 spam reports for the current session only.",
|
||||
"message": "No messages have screened for spam yet. Here you'll find a list of the last 100 spam reports.",
|
||||
"description": ""
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Email address skip list",
|
||||
"description": ""
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "Emails from these addresses will not be sent to the AI for spam filtering.",
|
||||
"description": ""
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Add one email address per line, or separated by a comma.",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "The sender is in the email address antispam skip list.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Skip address books addresses",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "If checked, emails from senders in your address books will not be sent to the AI for spam filtering.",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "The sender is a contact in the address book.",
|
||||
"description": ""
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Address book permission was denied. Please enable the feature again to grant permission.",
|
||||
"description": ""
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Error requesting address book permission. Please try again.",
|
||||
"description": ""
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
|
|
@ -1267,6 +1504,14 @@
|
|||
"message": "Spam Value",
|
||||
"description": ""
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Spam",
|
||||
"description": ""
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Valid",
|
||||
"description": ""
|
||||
},
|
||||
"Moved_to_Spam": {
|
||||
"message": "Moved to Spam",
|
||||
"description": ""
|
||||
|
|
@ -1279,38 +1524,14 @@
|
|||
"message": "Report Date",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Yes",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "No",
|
||||
"description": ""
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Add tags",
|
||||
"description": ""
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analyze for spam",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Show the \"Add tags\" context menu item",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "If checked, the \"Add tags\" context menu item will be shown when right-clicking on an email in the messages list.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Show the \"Analyze for spam\" context menu item",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "If checked, the \"Analyze for spam\" context menu item will be shown when right-clicking on an email in the messages list.",
|
||||
"description": ""
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "No editable calendar found!",
|
||||
"description": ""
|
||||
|
|
@ -1347,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": ""
|
||||
|
|
@ -1363,12 +1588,16 @@
|
|||
"message": "Problems setting CORS?",
|
||||
"description": ""
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Press the button below to give the <all_urls> permission to avoid any CORS problem.",
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Press the button below to give the permission to the current host to avoid any CORS problem.",
|
||||
"description": ""
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Give \"all URLs\" permission",
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Give permission to the current host",
|
||||
"description": ""
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "If you are using localhost or 127.0.0.1 because the AI server is hosted on your PC, the <all_urls> permission is required.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text": {
|
||||
|
|
@ -1424,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": {
|
||||
|
|
@ -1511,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": ""
|
||||
|
|
@ -1597,6 +1834,14 @@
|
|||
"message": "If checked, the Model will think before answering. This option works only with models that support the 'think' feature.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Force JSON output",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "If checked, Ollama will be forced to return a valid JSON response. This option works only with models that support structured output.",
|
||||
"description": ""
|
||||
},
|
||||
"chatgpt_win_change_reply_type": {
|
||||
"message": "Click to change the reply type",
|
||||
"description": ""
|
||||
|
|
@ -1701,6 +1946,15 @@
|
|||
"message": "To use this feature, you need an API integration rather than the ChatGPT Web Integration. You can define a specific API in the feature settings page by first checking the checkbox above and then clicking the button on the left.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Using $1",
|
||||
"description": "Indicator near settings button when a special prompt uses a specific API.",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_google_gemini_thinking_budget": {
|
||||
"message": "Thinking Budget",
|
||||
"description": ""
|
||||
|
|
@ -1736,5 +1990,401 @@
|
|||
"Optional_Permission_Denied_Model_Fetching": {
|
||||
"message": "You have denied the optional permission needed to fetch models for this integration.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Enable automatic AI summarization for message previews",
|
||||
"description": "Label for the option to enable automatic AI summarization of email messages"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "If checked, ThunderAI will automatically generate and display AI summaries above email messages when they are opened. Note that this means all messages you preview will immediately be sent to the configured AI service.",
|
||||
"description": "Tooltip/info text explaining the automatic AI summarization option and its privacy implications"
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "ThunderAI Summary",
|
||||
"description": "Title heading shown above the automatically generated AI summary in the message pane"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Generating AI summary...",
|
||||
"description": "Status message shown while the AI summary is being generated"
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "Failed to generate AI summary. Please confirm your settings and try again.",
|
||||
"description": "Error message shown when the automatic AI summary generation fails"
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Do you want to include the API settings in the export? Be aware that also the API Key will be saved in the file!",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Do not ask to select text",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "If checked there is no need to select some text. The full message body will be used to get the calendar event.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "The prompt must contain the placeholder {%mail_text_body_or_selected%} or {%mail_html_body_or_selected%} to enable this option. Please add one of these placeholders to the prompt or reset it to the default.",
|
||||
"description": ""
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Copy",
|
||||
"description": ""
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "copy",
|
||||
"description": ""
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Spam check in progress...",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Auto-summarize messages",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Choose whether to automatically generate summaries when viewing messages. Requires an API-based connection (not ChatGPT Web).",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Display summary in",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Choose where the summary result is displayed. Inline mode shows a summary banner directly in the message pane. Chat window mode opens the AI chat window.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Max display length",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Maximum number of characters to display in the inline summary. Set to 0 for no limit.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Strip formatting",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Remove HTML and Markdown formatting from the AI-generated summary, showing plain text only.",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "See more",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "See less",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "ThunderAI Overview",
|
||||
"description": ""
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "AI Summary",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Collapse summary",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Generating summary...",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Failed to generate summary",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Click here to generate a summary",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Auto-summary requires an API-based connection. Please configure an API connection in ThunderAI settings.",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Refresh summary",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Refresh spam report",
|
||||
"description": ""
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Delete spam report",
|
||||
"description": ""
|
||||
},
|
||||
"summarize_delete": {
|
||||
"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": ""
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "If checked, the Model and API specified below will be used for translating email(s), regardless the one chosen in the ThunderAI options page.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "If checked, adds a translate button in the message body.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Manage translate settings",
|
||||
"description": ""
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Manage Translation Settings",
|
||||
"description": ""
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "In this page you can modify the default prompt used to translate emails.",
|
||||
"description": ""
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Current prompt text",
|
||||
"description": ""
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Translation Options",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Auto-translate messages",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Disabled",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Manual button only",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "When the email is opened",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Choose when to translate messages: disabled, only when clicking the button, or automatically when opening a message.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Message pane (inline)",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Chat window",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Maximum length of displayed translation",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Maximum number of characters shown in the inline translation. 0 = no limit. When set, longer text is truncated with a \"See more\" toggle.",
|
||||
"description": ""
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "See more",
|
||||
"description": ""
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "See less",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Translation target language",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Language to translate emails into. If empty, uses the default language setting.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Exclude languages",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Comma-separated list of language codes (e.g., en, fr, it) to skip for automatic translation. If the email is in one of these languages, it won't be translated automatically or the manual button won't be shown.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "The prompt describing the translation task:",
|
||||
"description": ""
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Translating...",
|
||||
"description": ""
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Click here to translate this email",
|
||||
"description": ""
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "AI Translation",
|
||||
"description": ""
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "Auto-translation requires an API-based connection. Please configure an API connection in ThunderAI settings.",
|
||||
"description": ""
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Refresh translation",
|
||||
"description": ""
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Delete translation",
|
||||
"description": ""
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "AI Translation",
|
||||
"description": ""
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Translation failed.",
|
||||
"description": ""
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "Translation language is not configured. Please set a language in the Translation settings or set a default language in the General settings.",
|
||||
"description": ""
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Translation skipped: Language excluded or identical to target.",
|
||||
"description": "Shown in the translation banner when the email language matches the excluded or target language"
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam by",
|
||||
"description": ""
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Spam score — Click to see the explanation",
|
||||
"description": "Tooltip shown on the spam score badge in the toolbar"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Summary by",
|
||||
"description": ""
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Translation by",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Do you want beautiful statistics about your emails?",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Click here! Try ThunderStats!",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text":{
|
||||
"message": "AI chat window position",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top":{
|
||||
"message": "Top",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left":{
|
||||
"message": "Left",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Automatically save the window position when using the close button.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_chatgpt_win_position_info":{
|
||||
"message": "Leave empty to use the default position.",
|
||||
"description": ""
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "When the email is received",
|
||||
"description": ""
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
"From": {
|
||||
"message": "De"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Ne"
|
||||
},
|
||||
"apiwebchat_stopping": {
|
||||
|
|
@ -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"
|
||||
},
|
||||
|
|
@ -122,7 +119,7 @@
|
|||
"Explanation": {
|
||||
"message": "Klarigo"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Jes"
|
||||
},
|
||||
"apiwebchat_you": {
|
||||
|
|
@ -168,7 +165,7 @@
|
|||
"message": "Malelekti ĉion"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Respondi per komando"
|
||||
"message": "Respondi per komando..."
|
||||
},
|
||||
"customPrompts_substitute_text": {
|
||||
"message": "Anstataŭigi tekston"
|
||||
|
|
|
|||
|
|
@ -20,9 +20,6 @@
|
|||
"prompt_rewrite_formal": {
|
||||
"message": "Reescribe de manera formal"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Resume esto"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traducir esto"
|
||||
},
|
||||
|
|
@ -30,7 +27,7 @@
|
|||
"message": "Clasificar"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Responder con comando"
|
||||
"message": "Responder con comando..."
|
||||
},
|
||||
"prompt_this": {
|
||||
"message": "Crea un prompt de 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."
|
||||
},
|
||||
|
|
@ -518,9 +509,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Usar el modelo actual"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Enviando solicitud..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Valores permitidos"
|
||||
},
|
||||
|
|
@ -539,9 +527,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Parece que al menos una de sus cuentas está usando el complemento Owl for Exchange. Hay un problema conocido entre Thunderbird y Owl, que se está abordando actualmente. Por el momento, puede usar ThunderAI al redactar correos electrónicos, pero no al leerlos."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Haz clic en un valor para establecerlo."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Responder al siguiente correo electrónico. Responder solo con el texto necesario y sin comentarios extra ni otro texto."
|
||||
},
|
||||
|
|
@ -569,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."
|
||||
|
|
@ -744,7 +726,7 @@
|
|||
"message": "Agregar un nuevo evento de calendario"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Extrae todos los detalles relevantes necesarios para generar un evento de calendario a partir del siguiente texto. La información extraída debe incluir:\n- Título del evento\n- Fecha y hora de inicio (incluyendo zona horaria, si se especifica)\n- Fecha y hora de fin (incluyendo zona horaria, si se especifica)\n- Día completo (si se menciona)\n- Asistentes\nAsegúrate de que los datos estén formateados de manera clara y consistente para que puedan usarse directamente en la creación de un evento de calendario.\nSi hay referencias de tiempo relativas, considera que la fecha y hora del correo son \"{%mail_datetime%}\". Calcula la fecha y hora de inicio basándote en esta referencia. Si la fecha y hora de inicio calculadas son anteriores a \"{%current_datetime%}\", recalcula la fecha y hora de inicio usando \"{%current_datetime%}\" como base.\nSi la duración no se especifica, establécela en una hora.\nEstos son los asistentes: {%author%}, {%recipients%}, {%cc_list%}. Si están presentes, excluye mi dirección: {%account_email_address%}.\nSi no puedes obtener uno o más de los datos requeridos, responde con una cadena vacía.\nGenera una respuesta solo en formato JSON. No incluyas texto adicional ni explicaciones; proporciona únicamente el JSON. El formato a usar es:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumen del evento de calendario aquí\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEste es el texto:\"{%selected_text%}\""
|
||||
"message": "Extrae todos los detalles relevantes necesarios para generar un evento de calendario a partir del siguiente texto. La información extraída debe incluir:\n- Título del evento\n- Fecha y hora de inicio (incluyendo zona horaria, si se especifica)\n- Fecha y hora de fin (incluyendo zona horaria, si se especifica)\n- Día completo (si se menciona)\n- Asistentes\nAsegúrate de que los datos estén formateados de manera clara y consistente para que puedan usarse directamente en la creación de un evento de calendario.\nSi hay referencias de tiempo relativas, considera que la fecha y hora del correo son \"{%mail_datetime%}\". Calcula la fecha y hora de inicio basándote en esta referencia. Si la fecha y hora de inicio calculadas son anteriores a \"{%current_datetime%}\", recalcula la fecha y hora de inicio usando \"{%current_datetime%}\" como base.\nSi la duración no se especifica, establécela en una hora.\nEstos son los asistentes: {%author%}, {%recipients%}, {%cc_list%}. Si están presentes, excluye mi dirección: {%account_email_address%}.\nSi el evento es de día completo, endDate debe ser un día después de startDate con la hora establecida en \"T000000\".\nSi no puedes obtener uno o más de los datos requeridos, responde con una cadena vacía.\nGenera una respuesta solo en formato JSON. No incluyas texto adicional ni explicaciones; proporciona únicamente el JSON. El formato a usar es:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumen del evento de calendario aquí\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEste es el texto:\"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prompt_get_task": {
|
||||
"message": "Agregar una nueva tarea"
|
||||
|
|
@ -875,7 +857,7 @@
|
|||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Firma predeterminada según lo definido en las opciones de ThunderAI."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Idioma predeterminado según lo definido en las opciones de ThunderAI."
|
||||
},
|
||||
"placeholder_mail_attachments_info": {
|
||||
|
|
@ -906,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\"spamValue\": <entero de 0 a 100>,\n\"explanation\": \"Breve explicación de tu razonamiento\"\n} \nAquí está la información del correo: \nRemitente: \"{%author%}\" \nAsunto: \"{%mail_subject%}\" \nCuerpo HTML: \"{%mail_html_body%}\""
|
||||
"message": "Analiza el siguiente correo electrónico y determina si es spam o no. Considera factores como palabras clave sospechosas, lenguaje promocional excesivo, líneas de asunto engañosas, solicitudes de información personal y direcciones de remitente inusuales.\nProporciona un valor de 0 (no es spam) a 100 (spam) y una explicación de no más de 10 palabras.\nEn caso de que falten datos del mensaje, establece el valor en 0 (no es spam) y da la razón.\nGenera una respuesta únicamente en formato JSON. No incluyas texto adicional ni explicación; proporciona solo el JSON. El formato a usar es:\n{\n\"explanation\": \"Breve explicación de tu razonamiento\",\n\"spamValue\": <entero de 0 a 100>\n}\nAquí está la información del correo:\nRemitente: \"{%author%}\"\nAsunto: \"{%mail_subject%}\"\nCuerpo HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Opciones del filtro de spam"
|
||||
|
|
@ -930,7 +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,30 +938,12 @@
|
|||
"Report_Date": {
|
||||
"message": "Fecha del informe"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Si"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "No"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Añadir etiquetas"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analizar el spam"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Mostrar el elemento del menú contextual “Añadir etiquetas”"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Si está marcado, el elemento del menú contextual “Añadir etiquetas” se mostrará al hacer clic derecho en un correo electrónico de la lista de mensajes."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Mostrar el elemento del menú contextual “Analizar el spam”"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Si está marcado, el elemento del menú contextual “Analizar el spam” se mostrará al hacer clic derecho en un correo electrónico de la lista de mensajes."
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "¡No se encontró un calendario editable!"
|
||||
},
|
||||
|
|
@ -1019,12 +983,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "¿Problemas al configurar CORS?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Presiona el botón a continuación para otorgar el permiso <all_urls> y evitar cualquier problema de CORS."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Otorgar permiso “all URLs”"
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text": {
|
||||
"message": "Redactando en texto plano"
|
||||
},
|
||||
|
|
@ -1065,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"
|
||||
|
|
@ -1304,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"
|
||||
},
|
||||
|
|
@ -327,9 +324,6 @@
|
|||
"chagpt_api_send_button": {
|
||||
"message": "Utilisation du modèle"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Tentative de connexion à OpenAI ChatGPT en utilisant la clé API fournie"
|
||||
},
|
||||
"Debug": {
|
||||
"message": "Debug"
|
||||
},
|
||||
|
|
@ -363,12 +357,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Vous n'avez pas choisi de modèle pour l'API Ollama. Veuillez en choisir un sur la page des options."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Tentative de connexion au serveur local Ollama en utilisant l'hôte"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "et le modèle"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "La connexion au serveur a été interrompue de manière inattendue"
|
||||
},
|
||||
|
|
@ -399,9 +387,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Vous n'avez pas choisi de modèle pour l'API compatible OpenAI. Veuillez en choisir un dans la page des options."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Tentative de connexion au serveur local de l'API compatible OpenAI en utilisant l'hôte"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "La requête de l'API compatible OpenAI a échoué"
|
||||
},
|
||||
|
|
@ -423,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."
|
||||
},
|
||||
|
|
@ -498,9 +477,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Utiliser le modèle actuel"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Envoi de l'invite..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Valeurs autorisées"
|
||||
},
|
||||
|
|
@ -516,9 +492,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Il semble qu'au moins un de vos comptes utilise le module complémentaire Chouette pour Exchange. Il existe un problème connu entre Thunderbird et Chouette, qui est en cours de résolution. Pour le moment, vous pouvez utiliser ThunderAI lors de la rédaction d'e-mails, mais pas lors de leur lecture."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Cliquez sur une valeur pour la définir."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Répondez au courriel suivant. Répondez uniquement avec le texte nécessaire, sans commentaires ou autre texte."
|
||||
},
|
||||
|
|
@ -543,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."
|
||||
|
|
@ -681,9 +651,6 @@
|
|||
"google_gemini_api_request_failed": {
|
||||
"message": "La requête API Google Gemini a échoué"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Tentative de connexion à Google Gemini en utilisant la clé API fournie"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Vous n'avez pas ajouté de clé API pour l'API Google Gemini. Veuillez en insérer une dans la page des options."
|
||||
},
|
||||
|
|
@ -712,7 +679,7 @@
|
|||
"message": "Ajouter un nouvel événement au calendrier"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Extrayez tous les détails pertinents nécessaires pour générer un événement de calendrier à partir du texte suivant. Les informations extraites doivent inclure :\n- Titre de l'événement\n- Date et heure de début (y compris le fuseau horaire, si spécifié)\n- Date et heure de fin (y compris le fuseau horaire, si spécifié)\n- Journée entière (si mentionnée)\n- Participants\nAssurez-vous que les données sont formatées clairement et de manière cohérente afin qu'elles puissent être utilisées directement pour créer un événement de calendrier.\nS'il y a des références temporelles relatives, considérez que la date et l'heure de l'email sont \"{%mail_datetime%}\". Calculez la date et l'heure de début sur cette base. Si la date et l'heure de début calculées sont antérieures à \"{%current_datetime%}\", recalculez-les en utilisant \"{%current_datetime%}\" comme base.\nSi la durée n'est pas spécifiée, définissez-la sur une heure.\nVoici les participants : {%author%}, {%recipients%}, {%cc_list%}. Si elle est présente, exclure mon adresse : {%account_email_address%}.\nSi vous n'êtes pas en mesure d'obtenir une ou plusieurs des informations requises, répondez avec une chaîne vide.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire ; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"startDate\" : \"YYYYMMDDTHHMMSS\",\n\"endDate\" : \"YYYYMMDDTHHMMSS\",\n\"summary\" : \"Résumé de l'événement du calendrier ici\",\n\"forceAllDay\" : false\n\"attendees\" : [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nVoici le texte : \"{%selected_text%}\""
|
||||
"message": "Extrayez tous les détails pertinents nécessaires pour générer un événement de calendrier à partir du texte suivant. Les informations extraites doivent inclure :\n- Titre de l'événement\n- Date et heure de début (y compris le fuseau horaire, si spécifié)\n- Date et heure de fin (y compris le fuseau horaire, si spécifié)\n- Journée entière (si mentionnée)\n- Participants\nAssurez-vous que les données sont formatées clairement et de manière cohérente afin qu'elles puissent être utilisées directement pour créer un événement de calendrier.\nS'il y a des références temporelles relatives, considérez que la date et l'heure de l'email sont \"{%mail_datetime%}\". Calculez la date et l'heure de début sur cette base. Si la date et l'heure de début calculées sont antérieures à \"{%current_datetime%}\", recalculez-les en utilisant \"{%current_datetime%}\" comme base.\nSi la durée n'est pas spécifiée, définissez-la sur une heure.\nVoici les participants : {%author%}, {%recipients%}, {%cc_list%}. Si elle est présente, exclure mon adresse : {%account_email_address%}.\nSi l'événement dure toute la journée, endDate doit être le lendemain de startDate avec l'heure définie sur \"T000000\".\nSi vous n'êtes pas en mesure d'obtenir une ou plusieurs des informations requises, répondez avec une chaîne vide.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire ; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"startDate\" : \"YYYYMMDDTHHMMSS\",\n\"endDate\" : \"YYYYMMDDTHHMMSS\",\n\"summary\" : \"Résumé de l'événement du calendrier ici\",\n\"forceAllDay\" : false\n\"attendees\" : [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nVoici le texte : \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Ajouter un nouvel événement au calendrier à partir du texte sélectionné"
|
||||
|
|
@ -792,7 +759,7 @@
|
|||
"Moved_to_Spam": {
|
||||
"message": "Déplacé dans le spam"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Non"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
|
|
@ -801,9 +768,6 @@
|
|||
"SpamFilter_PageTitle": {
|
||||
"message": "Gérer les paramètres du filtre anti-spam"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks non installé !"
|
||||
},
|
||||
"SpamFilter_info_default": {
|
||||
"message": "Sur cette page, vous pouvez modifier l'invite par défaut utilisée pour détecter les e-mails indésirables."
|
||||
},
|
||||
|
|
@ -816,7 +780,7 @@
|
|||
"SpamReport_Title": {
|
||||
"message": "Rapports du filtre anti-spam"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Oui"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_Info": {
|
||||
|
|
@ -828,7 +792,7 @@
|
|||
"SpamFilter_prompt_text_title": {
|
||||
"message": "Texte du prompt actuelle"
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Langue par défaut telle que définie dans les options de ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_btnManageSpamFilterInfo": {
|
||||
|
|
@ -853,16 +817,7 @@
|
|||
"message": "Date du rapport"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analysez l'e-mail suivant et déterminez s'il s'agit d'un spam ou non. Prenez en compte des facteurs tels que des mots-clés suspects, un langage promotionnel excessif, des lignes d'objet trompeuses, des demandes d'informations personnelles et des adresses d'expéditeurs inhabituelles.\nFournissez une valeur de 0 (non spam) à 100 (spam) et une explication de 10 mots maximum.\nEn cas de données de message manquantes, définissez la valeur à 0 (non spam) et indiquez la raison.\nGénérez une réponse uniquement au format JSON. N'incluez aucun texte ou explication supplémentaire ; fournissez uniquement le JSON. Voici le format à utiliser :\n{\n\"spamValue\" : <entier de 0 à 100>,\n\"explanation\" : \"Brève explication de votre raisonnement\"\n}\nVoici les informations de l'e-mail :\nExpéditeur : \"{%author%}\"\nObjet : \"{%mail_subject%}\"\nCorps HTML : \"{%mail_html_body%}\""
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Ajouter des étiquettes"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Afficher l'option \"Analyser comme spam\" dans le menu contextuel"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Si coché, l'option \"Analyser comme spam\" apparaîtra lors d’un clic droit sur un e-mail dans la liste des messages."
|
||||
"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%}\""
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Aucun calendrier modifiable trouvé !"
|
||||
|
|
@ -879,9 +834,6 @@
|
|||
"prefs_OptionText_calendar_enforce_timezone": {
|
||||
"message": "Forcer le fuseau horaire spécifié"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Si coché, l'option \"Ajouter des étiquettes\" apparaîtra lors d’un clic droit sur un e-mail dans la liste des messages."
|
||||
},
|
||||
"chatgpt_win_diff_title": {
|
||||
"message": "Différences entre le texte original et le texte modifié"
|
||||
},
|
||||
|
|
@ -897,9 +849,6 @@
|
|||
"apiwebchat_error": {
|
||||
"message": "Erreur"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Afficher l'option \"Ajouter des étiquettes\" dans le menu contextuel"
|
||||
},
|
||||
"apiwebchat_use_this_answer": {
|
||||
"message": "Utiliser cette réponse"
|
||||
},
|
||||
|
|
@ -909,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"
|
||||
},
|
||||
|
|
@ -930,12 +876,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "Des problèmes pour configurer le CORS ?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Appuie sur le bouton ci-dessous pour accorder la permission <all_urls> afin d'éviter tout problème lié au CORS."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Accorde la permission \"tous les URLs\""
|
||||
},
|
||||
"remember_CORS": {
|
||||
"message": "N'oublie pas, tu dois configurer les paramètres CORS sur le serveur !"
|
||||
},
|
||||
|
|
@ -1021,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."
|
||||
|
|
@ -1247,7 +1187,7 @@
|
|||
"message": "Gérer les espaces réservés de données"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Répondre avec une commande"
|
||||
"message": "Répondre avec une commande..."
|
||||
},
|
||||
"prompt_reply_custom_command_full_text": {
|
||||
"message": "Répondez à l'e-mail suivant « {%mail_text_body%} ». {%additional_text%}. Répondez uniquement avec le texte nécessaire, sans commentaires ou texte supplémentaire."
|
||||
|
|
@ -1295,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"
|
||||
|
|
@ -1338,5 +1278,537 @@
|
|||
},
|
||||
"reset": {
|
||||
"message": "Réinitialiser"
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Corps de l'e-mail ou texte sélectionné"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Corps de l'e-mail ou HTML sélectionné"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Délai d'attente pour le chargement de la page"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Temps en millisecondes à attendre pour le chargement de la page ChatGPT avant de charger le contenu supplémentaire. La valeur par défaut est 1000ms. Si un GPT personnalisé ou un Projet est défini, 1000ms supplémentaires seront ajoutés à cette valeur."
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Ajouter un événement de calendrier depuis le presse-papiers"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Impossible de lire le presse-papiers. Veuillez vérifier les autorisations."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Le presse-papiers est vide. Veuillez d'abord copier du texte."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "L'autorisation d'accès au presse-papiers a été refusée. Veuillez réactiver la fonctionnalité dans les paramètres per accorder l'autorisation."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Erreur lors de la demande d'autorisation du presse-papiers. Veuillez réessayer."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Obtenir l'événement de calendrier depuis le presse-papiers"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Afficher un élément de menu supplémentaire pour créer des événements de calendrier à partir du contenu textuel du presse-papiers."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Options de résumé"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Résumer cet e-mail ou ces e-mails"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"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"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "De : {%author%}\nÀ : {%recipients%}\nCopie : {%cc_list%}\nObjet : {%mail_subject%}\nDate : {%mail_datetime%}\nPièces jointes :\n{%mail_attachments_info%}\n\nCorps du message :\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "Séparateur d'e-mail"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- E-MAIL SUIVANTE ----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Vous pouvez modifier l’instruction (prompt) comme vous le souhaitez : le premier champ est l’instruction principale, le deuxième est le modèle pour un e-mail individuel. La liste des e-mails sera ajoutée à la suite de l’instruction principale. Les e-mails seront séparés par le séparateur spécifié dans le troisième champ."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "L'instruction principale décrivant la tâche à effectuer sur tous les e-mails sélectionnés :"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "Le modèle pour un e-mail unique :"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "Le séparateur entre les e-mails :"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Si coché, le Modèle et l'API spécifiés ci-dessous seront utilisés pour créer des événements de calendrier, quel que soit celui choisi dans la page des options de ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Résumer l'e-mail"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Si coché, le Modèle et l'API spécifiés ci-dessous seront utilisés pour résumer les e-mails, quel que soit celui choisi dans la page des options de ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Si coché, ajoute une option au menu contextuel pour résumer l'e-mail."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Gérer les paramètres de résumé"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Gestion des paramètres de résumé"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "Sur cette page, vous pouvez modifier le prompt par défaut utilisé pour résumer les e-mails."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Texte actuel du prompt"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Afficher le panneau de rapport de spam"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Si coché, un panneau avec le rapport de spam s'affichera au-dessus du message."
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Indésirables"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Valide"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Donner l'autorisation à l'hôte actuel"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Si vous utilisez localhost ou 127.0.0.1 parce que le serveur d'IA est hébergé sur votre PC, l'autorisation <all_urls> est requise."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Voulez-vous inclure les paramètres API dans l'exportation ? Attention, la clé API sera également enregistrée dans le fichier !"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Ne pas demander de sélectionner du texte"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Si coché, il n'est pas nécessaire de sélectionner du texte. Le corps complet du message sera utilisé pour créer l'événement de calendrier."
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Analyse antispam en cours..."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Copier"
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "copie"
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Voulez-vous de belles statistiques sur vos e-mails ?"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Cliquez ici ! Essayez ThunderStats !"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "L'invite doit contenir l'espace réservé {%mail_text_body_or_selected%} ou {%mail_html_body_or_selected%} pour activer cette option. Veuillez ajouter l'un de ces espaces réservés à l'invite ou rétablir la valeur par défaut."
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam par"
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Documentation"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Guides de configuration"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Tutoriel sur les prompts personnalisés"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Ouvrir la page d'accueil"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "Position de la fenêtre de chat IA"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Haut"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Gauche"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Enregistrer automatiquement la position de la fenêtre lors de la fermeture."
|
||||
},
|
||||
"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"
|
||||
},
|
||||
|
|
@ -327,9 +324,6 @@
|
|||
"chagpt_api_send_button": {
|
||||
"message": "Korištenje modela"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Pokušaj povezivanja na OpenAI ChatGPT pomoću dostavljenog API ključa"
|
||||
},
|
||||
"Debug": {
|
||||
"message": "Otklanjanje pogrešaka"
|
||||
},
|
||||
|
|
@ -363,12 +357,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Niste odabrali model za Ollama API. Odaberite jedan na stranici s mogućnostima."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Pokušaj povezivanja na Ollama lokalni poslužitelj pomoću glavnog računala"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "i model"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "Veza s poslužiteljem je neočekivano prekinuta"
|
||||
},
|
||||
|
|
@ -399,9 +387,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Niste odabrali model za OpenAI kompatibilan API. Odaberite jedan na stranici s opcijama."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Pokušaj povezivanja s OpenAI kompatibilnim API lokalnim poslužiteljem pomoću glavnog računala"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "OpenAI Comp API zahtjev nije uspio"
|
||||
},
|
||||
|
|
@ -423,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."
|
||||
},
|
||||
|
|
@ -498,9 +477,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Koristi trenutni model"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Slanje upita..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Dopuštene vrijednosti"
|
||||
},
|
||||
|
|
@ -516,9 +492,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Čini se da barem jedan od vaših računa koristi dodatak Owl for Exchange. Postoji poznati problem između Thunderbirda i Owl, koji se trenutno rješava. Trenutačno možete koristiti ThunderAI dok sastavljate e-poruke, ali ne i dok ih čitate."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Pritisnite vrijednost da biste je postavili."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Odgovori na sljedeću e-poruku. Odgovorit samo s potrebnim tekstom i bez dodatnih komentara ili drugog teksta."
|
||||
},
|
||||
|
|
@ -543,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."
|
||||
|
|
@ -681,9 +651,6 @@
|
|||
"google_gemini_api_request_failed": {
|
||||
"message": "Google Gemini API zahtjev nije uspio"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Pokušaj povezivanja na Google Gemini pomoću dostavljenog API ključa"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Niste dodali API ključ za Google Gemini API. Unesite jedan na stranicu s mogućnostima."
|
||||
},
|
||||
|
|
@ -712,7 +679,7 @@
|
|||
"message": "Dodaj novi kalendarski događaj"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Izdvoji sve relevantne detalje potrebne za generiranje kalendarskog događaja iz sljedećeg teksta. Izdvojene informacije trebaju uključivati:\n- Naslov događaja\n- Datum i vrijeme početka (uključujući vremensku zonu, ako je navedeno)\n- Datum i vrijeme završetka (uključujući vremensku zonu, ako je navedeno)\n- Cijeli dan (ako je navedeno)\n- Sudionici\nOsiguraj da su podaci oblikovani jasno i dosljedno kako bi se mogli izravno koristiti za stvaranje kalendarskog događaja.\nAko postoje relativne vremenske napomene, smatraj da su datum i vrijeme e-poruke \"{%mail_datetime%}\". Izračunajte datum i vrijeme početka na temelju ove napomene. Ako su izračunati početni datum i vrijeme raniji od \"{%current_datetime%}\", ponovno izračunaj početni datum i vrijeme koristeći \"{%current_datetime%}\" kao osnovu.\nAko trajanje nije navedeno, postavi ga na jedan sat.\nOvo su sudionici: {%author%}, {%recipients%}, {%cc_list%}. Ako je prisutna, isključi moju adresu: {%account_email_address%}.\nAko ne možeš dobiti jednu ili više potrebnih informacija, odgovori praznim nizom.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenja; pruži samo JSON. Ovo je format koji će se koristiti:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Sažetak kalendarskih događaja ovdje\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOvo je tekst:\"{%selected_text%}\""
|
||||
"message": "Izdvoji sve relevantne detalje potrebne za generiranje kalendarskog događaja iz sljedećeg teksta. Izdvojene informacije trebaju uključivati:\n- Naslov događaja\n- Datum i vrijeme početka (uključujući vremensku zonu, ako je navedeno)\n- Datum i vrijeme završetka (uključujući vremensku zonu, ako je navedeno)\n- Cijeli dan (ako je navedeno)\n- Sudionici\nOsiguraj da su podaci oblikovani jasno i dosljedno kako bi se mogli izravno koristiti za stvaranje kalendarskog događaja.\nAko postoje relativne vremenske napomene, smatraj da su datum i vrijeme e-poruke \"{%mail_datetime%}\". Izračunajte datum i vrijeme početka na temelju ove napomene. Ako su izračunati početni datum i vrijeme raniji od \"{%current_datetime%}\", ponovno izračunaj početni datum i vrijeme koristeći \"{%current_datetime%}\" kao osnovu.\nAko trajanje nije navedeno, postavi ga na jedan sat.\nOvo su sudionici: {%author%}, {%recipients%}, {%cc_list%}. Ako je prisutna, isključi moju adresu: {%account_email_address%}.\nAko je događaj cjelodnevni, **endDate** mora biti jedan dan nakon **startDate** s vremenom postavljenim na **\"T000000\"**.\nAko ne možeš dobiti jednu ili više potrebnih informacija, odgovori praznim nizom.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenja; pruži samo JSON. Ovo je format koji će se koristiti:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Sažetak kalendarskih događaja ovdje\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOvo je tekst:\"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Dodaj novi kalendarski događaj iz odabranog teksta"
|
||||
|
|
@ -753,9 +720,6 @@
|
|||
"calendar_opening_dialog_error": {
|
||||
"message": "Pogreška pri otvaranju dijaloškog okvira kalendarskog događaja"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks nije instaliran!"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto": {
|
||||
"message": "Dodajte oznake automatski"
|
||||
},
|
||||
|
|
@ -777,7 +741,7 @@
|
|||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Zadani potpis kako je određeno u mogućnostima ThunderAI."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Zadani jezik kako je određeno u mogućnostima ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_spamfilter": {
|
||||
|
|
@ -802,7 +766,7 @@
|
|||
"message": "Prepoznaj neželjenu poštu"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analiziraj sljedeću e-poruku i utvrdi je li neželjena ili ne. Razmotri čimbenike kao što su sumnjive ključne riječi, pretjerani promotivni jezik, zavaravajuće linije predmeta, zahtjevi za osobnim podacima i neobične adrese pošiljatelja.\nNavedi vrijednost od 0 (nije spam) do 100 (neželjena pošta) i objašnjenje od najviše 10 riječi.\nU slučaju nedostatka podataka poruke, postavite vrijednost na 0 (nije spam) i navedite razlog.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenje; pruži samo JSON. Ovdje je format koji treba koristiti:\n{\n\"spamValue\": <cijeli broj od 0 do 100>,\n\"explanation\": \"Kratko objašnjenje vašeg obrazloženja\"\n}\nOvdje su informacije o e-poruci:\nŠalje: \"{%author%}\"\nNaslov: \"{%mail_subject%}\"\nHtml tijelo: \"{%mail_html_body%}\""
|
||||
"message": "Analiziraj sljedeću e-poruku i utvrdi je li neželjena ili ne. Razmotri čimbenike kao što su sumnjive ključne riječi, pretjerani promotivni jezik, zavaravajuće linije predmeta, zahtjevi za osobnim podacima i neobične adrese pošiljatelja.\nNavedi vrijednost od 0 (nije spam) do 100 (neželjena pošta) i objašnjenje od najviše 10 riječi.\nU slučaju nedostatka podataka poruke, postavite vrijednost na 0 (nije spam) i navedite razlog.\nGeneriraj odgovor samo u JSON formatu. Nemoj uključivati nikakav dodatni tekst ili objašnjenje; pruži samo JSON. Ovdje je format koji treba koristiti:\n{\n\"explanation\": \"Kratko objašnjenje vašeg obrazloženja\",\n\"spamValue\": <cijeli broj od 0 do 100>\n}\nOvdje su informacije o e-poruci:\nŠalje: \"{%author%}\"\nNaslov: \"{%mail_subject%}\"\nHtml tijelo: \"{%mail_html_body%}\""
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Mogućnosti filtera neželjene pošte"
|
||||
|
|
@ -846,10 +810,10 @@
|
|||
"Report_Date": {
|
||||
"message": "Datum izvješća"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Da"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Ne"
|
||||
},
|
||||
"prefs_OptionText_openai_comp_info_remote": {
|
||||
|
|
|
|||
|
|
@ -24,14 +24,11 @@
|
|||
"prompt_classify": {
|
||||
"message": "Classifica"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Riassumi"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Traduci"
|
||||
},
|
||||
"prompt_this": {
|
||||
"message": "Chedi a ChatGPT"
|
||||
"message": "Invia il testo come prompt"
|
||||
},
|
||||
"prompt_selection_needed": {
|
||||
"message": "Per procedere è necessario che selezioni del testo!"
|
||||
|
|
@ -172,7 +169,7 @@
|
|||
"message": "Riprova"
|
||||
},
|
||||
"chatgpt_sendbutton_not_found_error": {
|
||||
"message": "Premi il pulsante per inviare il prompt a ChatGPT."
|
||||
"message": "Premi il pulsante per inviare il prompt."
|
||||
},
|
||||
"chatgpt_user_not_logged_in": {
|
||||
"message": "Non sei connesso a ChatGPT. Effettua l'accesso con le tue credenziali, chiudi la finestra di ChatGPT e poi ripeti l'azione che avevi tentato. Rimarrai connesso in seguito."
|
||||
|
|
@ -327,9 +324,6 @@
|
|||
"chagpt_api_send_button": {
|
||||
"message": "Modello utilizzato"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Tentativo di connessione a OpenAI ChatGPT utilizzando la chiave API fornita"
|
||||
},
|
||||
"Debug": {
|
||||
"message": "Debug"
|
||||
},
|
||||
|
|
@ -363,12 +357,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Non hai scelto un modello per l'API Ollama. Per favore, scegline uno nella pagina delle opzioni."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Tentativo di connettersi al server locale Ollama usando l'host"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "e il modello"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "La connessione al server è stata interrotta inaspettatamente"
|
||||
},
|
||||
|
|
@ -399,9 +387,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Non hai scelto un modello per l'API compatibile con OpenAI. Scegline uno nella pagina delle opzioni."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Tentativo di connessione al server locale dell'API compatibile con OpenAI utilizzando l'host"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "Richiesta all'API compatibile con OpenAI fallita"
|
||||
},
|
||||
|
|
@ -423,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."
|
||||
},
|
||||
|
|
@ -498,9 +477,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Usa il modello corrente"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Invio del prompt..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Valori consentiti"
|
||||
},
|
||||
|
|
@ -516,9 +492,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Sembra che almeno uno dei tuoi account stia utilizzando il componente aggiuntivo Gufo per Exchange. Esiste un problema noto tra Thunderbird e Gufo, che è attualmente in fase di risoluzione. Al momento, puoi utilizzare ThunderAI durante la composizione delle email, ma non durante la loro lettura."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Fai clic su un valore per impostarlo."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Rispondi alla seguente email. Rispondi solo con il testo necessario, senza commenti o altro testo aggiuntivo."
|
||||
},
|
||||
|
|
@ -543,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."
|
||||
|
|
@ -559,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}"
|
||||
|
|
@ -681,9 +651,6 @@
|
|||
"google_gemini_api_request_failed": {
|
||||
"message": "La richiesta all'API Google Gemini è fallita"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Tentativo di connessione a Google Gemini utilizzando la chiave API fornita"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Non hai aggiunto una chiave API per l'API Google Gemini. Inseriscine una nella pagina delle opzioni."
|
||||
},
|
||||
|
|
@ -712,7 +679,7 @@
|
|||
"message": "Aggiungi un nuovo evento al calendario"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Estrai tutti i dettagli rilevanti necessari per generare un evento del calendario dal seguente testo. Le informazioni estratte devono includere:\n- Titolo dell'evento\n- Data e ora di inizio (incluso il fuso orario, se specificato)\n- Data e ora di fine (incluso il fuso orario, se specificato)\n- Giornata intera (se menzionato)\n- I partecipanti\nAssicurati che i dati siano formattati in modo chiaro e coerente in modo che possano essere utilizzati direttamente per creare un evento del calendario.\nSe ci sono riferimenti temporali relativi, considera che la data e l'ora dell'email sono \"{%mail_datetime%}\". Calcola la data e l'ora di inizio in base a questo riferimento. Se la data e l'ora di inizio calcolate sono precedenti a \"{%current_datetime%}\", ricalcolale utilizzando \"{%current_datetime%}\" come base.\nSe la durata non è specificata, impostala a un'ora.\nQuesti sono i partecipanti: {%author%}, {%recipients%}, {%cc_list%}. Se presente, escludi il mio indirizzo: {%account_email_address%}.\nSe non riesci a ottenere una o più delle informazioni richieste, rispondi con una stringa vuota.\nGenera una risposta solo in formato JSON. Non includere testo o spiegazioni aggiuntive; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Riassunto evento calendario qui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEcco il testo: \"{%selected_text%}\""
|
||||
"message": "Estrai tutti i dettagli rilevanti necessari per generare un evento del calendario dal seguente testo. Le informazioni estratte devono includere:\n- Titolo dell'evento\n- Data e ora di inizio (incluso il fuso orario, se specificato)\n- Data e ora di fine (incluso il fuso orario, se specificato)\n- Giornata intera (se menzionato)\n- I partecipanti\nAssicurati che i dati siano formattati in modo chiaro e coerente in modo che possano essere utilizzati direttamente per creare un evento del calendario.\nSe ci sono riferimenti temporali relativi, considera che la data e l'ora dell'email sono \"{%mail_datetime%}\". Calcola la data e l'ora di inizio in base a questo riferimento. Se la data e l'ora di inizio calcolate sono precedenti a \"{%current_datetime%}\", ricalcolale utilizzando \"{%current_datetime%}\" come base.\nSe la durata non è specificata, impostala a un'ora.\nQuesti sono i partecipanti: {%author%}, {%recipients%}, {%cc_list%}. Se presente, escludi il mio indirizzo: {%account_email_address%}.\nSe l'evento dura tutto il giorno, endDate deve essere il giorno successivo a startDate con l'orario impostato su \"T000000\".\nSe non riesci a ottenere una o più delle informazioni richieste, rispondi con una stringa vuota.\nGenera una risposta solo in formato JSON. Non includere testo o spiegazioni aggiuntive; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Riassunto evento calendario qui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nEcco il testo: \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Aggiungi un nuovo evento al calendario dal testo selezionato"
|
||||
|
|
@ -753,9 +720,6 @@
|
|||
"calendar_opening_dialog_error": {
|
||||
"message": "Errore durante l'apertura della finestra di dialogo dell'evento del calendario"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks non installato!"
|
||||
},
|
||||
"Subject": {
|
||||
"message": "Oggetto"
|
||||
},
|
||||
|
|
@ -784,12 +748,12 @@
|
|||
"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"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "No"
|
||||
},
|
||||
"From": {
|
||||
|
|
@ -798,7 +762,7 @@
|
|||
"prefs_OptionText_btnManageSpamFilterInfo": {
|
||||
"message": "Gestisci le impostazioni del filtro antispam"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Sì"
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
|
|
@ -822,11 +786,11 @@
|
|||
"SpamFilter_info_default": {
|
||||
"message": "In questa pagina puoi modificare il prompt predefinito utilizzato per rilevare le email di spam."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"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."
|
||||
|
|
@ -844,7 +808,7 @@
|
|||
"message": "Valore soglia per lo spam"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analizza la seguente email e determina se si tratta di spam o meno. Considera fattori come parole chiave sospette, linguaggio promozionale eccessivo, linee oggetto fuorvianti, richieste di informazioni personali e indirizzi del mittente insoliti.\nFornisci un valore da 0 (non spam) a 100 (spam) e una spiegazione di non più di 10 parole.\nIn caso di dati del messaggio mancanti, imposta il valore a 0 (non spam) e fornisci la motivazione.\nGenera una risposta esclusivamente in formato JSON. Non includere alcun testo o spiegazione aggiuntiva; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"spamValue\": <intero da 0 a 100>,\n\"explanation\": \"Breve spiegazione del tuo ragionamento\"\n}\nQui ci sono le informazioni sull'email:\nMittente: \"{%author%}\"\nOggetto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
|
||||
"message": "Analizza la seguente email e determina se si tratta di spam o meno. Considera fattori come parole chiave sospette, linguaggio promozionale eccessivo, linee oggetto fuorvianti, richieste di informazioni personali e indirizzi del mittente insoliti.\nFornisci un valore da 0 (non spam) a 100 (spam) e una spiegazione di non più di 10 parole.\nIn caso di dati del messaggio mancanti, imposta il valore a 0 (non spam) e fornisci la motivazione.\nGenera una risposta esclusivamente in formato JSON. Non includere alcun testo o spiegazione aggiuntiva; fornisci solo il JSON. Ecco il formato da utilizzare:\n{\n\"explanation\": \"Breve spiegazione del tuo ragionamento\",\n\"spamValue\": <intero da 0 a 100>\n}\nQui ci sono le informazioni sull'email:\nMittente: \"{%author%}\"\nOggetto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_force_existing_Info": {
|
||||
"message": "Se selezionato, l'IA aggiungerà solo i tag esistenti e non creerà nuovi tag."
|
||||
|
|
@ -864,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!"
|
||||
},
|
||||
|
|
@ -879,9 +837,6 @@
|
|||
"btn_show_differences": {
|
||||
"message": "Mostra le differenze"
|
||||
},
|
||||
"apiwebchat_show_differences": {
|
||||
"message": "Mostra le differenze"
|
||||
},
|
||||
"apiwebchat_error": {
|
||||
"message": "Errore"
|
||||
},
|
||||
|
|
@ -894,21 +849,9 @@
|
|||
"prefs_OptionText_calendar_enforce_timezone": {
|
||||
"message": "Forza il fuso orario specificato"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Se selezionato, la voce \"Aggiungi etichette\" verrà mostrata facendo clic con il pulsante destro del mouse su un'email nell'elenco dei messaggi."
|
||||
},
|
||||
"apiwebchat_use_this_answer": {
|
||||
"message": "Usa questa risposta"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Se selezionato, la voce \"Analizza come spam\" verrà mostrata facendo clic con il pulsante destro del mouse su un'email nell'elenco dei messaggi."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Mostra la voce \"Analizza come spam\" nel menu contestuale"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Mostra la voce \"Aggiungi etichette\" nel menu contestuale"
|
||||
},
|
||||
"apiwebchat_info": {
|
||||
"message": "Informazioni"
|
||||
},
|
||||
|
|
@ -933,12 +876,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "Problemi con la configurazione di CORS?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Premi il pulsante qui sotto per concedere il permesso <all_urls> ed evitare qualsiasi problema legato a CORS."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Concedi il permesso \"tutti gli URL\""
|
||||
},
|
||||
"remember_CORS": {
|
||||
"message": "Ricorda, devi configurare le impostazioni CORS sul server!"
|
||||
},
|
||||
|
|
@ -1250,7 +1187,7 @@
|
|||
"message": "I segnaposto di dati esistenti con lo stesso ID verranno sovrascritti. I segnaposto con ID nuovi verranno aggiunti."
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Rispondi con istruzioni aggiuntive"
|
||||
"message": "Rispondi con istruzioni aggiuntive..."
|
||||
},
|
||||
"prompt_reply_custom_command_full_text": {
|
||||
"message": "Rispondi alla seguente email \"{%mail_text_body%}\". {%additional_text%}. Rispondi solo con il testo necessario, senza commenti aggiuntivi o altro testo."
|
||||
|
|
@ -1341,5 +1278,537 @@
|
|||
},
|
||||
"prefs_anthropic_temperature_Info": {
|
||||
"message": "Quantità di casualità iniettata nella risposta. Il valore predefinito è 1,0. L'intervallo va da 0,0 a 1,0. Utilizza una temperatura più vicina a 0,0 per compiti analitici o a scelta multipla, e più vicina a 1,0 per compiti creativi e generativi. Nota che, anche con una temperatura di 0,0, i risultati non saranno completamente deterministici."
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Corpo dell'email o testo selezionato"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Corpo dell'email o HTML selezionato"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Tempo di attesa caricamento pagina"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Tempo di attesa in millisecondi per il caricamento della pagina di ChatGPT prima di caricare i contenuti aggiuntivi. Il valore predefinito è 1000ms. Se viene definito un Custom GPT o un Progetto, verranno aggiunti ulteriori 1000ms a questo valore."
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Aggiungi un evento a calendario dagli appunti"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Impossibile leggere il contenuto copiato negli appunti. Verifica i permessi."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Gli appunti sono vuoti. Copia prima del testo."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Accesso agli appunti negato. Riattiva la funzione nelle impostazioni per concedere il permesso."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Errore durante la richiesta dei permessi per gli appunti. Riprova."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Ottieni un evento del calendario dagli appunti"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Mostra una voce di menu aggiuntiva per creare eventi di calendario dal contenuto di testo negli appunti."
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Impostazioni riassunto"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "Riassumi"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"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"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "Da: {%author%}\nA: {%recipients%}\nCC: {%cc_list%}\nOggetto: {%mail_subject%}\nData: {%mail_datetime%}\nAllegati:\n{%mail_attachments_info%}\n\nCorpo del messaggio:\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "Separatore email"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- PROSSIMA EMAIL ----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Puoi modificare il prompt come desideri: il primo campo è il prompt principale, il secondo è il modello per la singola email. L'elenco delle email sarà aggiunto al prompt principale. Le email saranno divise dal separatore specificato nel terzo campo."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "Il prompt principale che descrive l'attività da eseguire su tutte le email selezionate:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "Il modello per la singola email:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "Il separatore tra le email:"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Se selezionato, il Modello e l'API specificati di seguito verranno utilizzati per creare gli eventi di calendario, indipendentemente da quelli scelti nella pagina delle opzioni di ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Riassumi email"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Se selezionato, il Modello e l'API specificati di seguito verranno utilizzati per riassumere le email, indipendentemente da quelli scelti nella pagina delle opzioni di ThunderAI."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Se selezionato, aggiunge un'opzione al menu contestuale per riassumere le email."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Gestisci le impostazioni di riassunto"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Gestisci Impostazioni di Riassunto"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "In questa pagina puoi modificare il prompt predefinito utilizzato per riassumere le email."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Testo del prompt attuale"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Mostra pannello segnalazione spam"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Se selezionato, verrà mostrato un pannello con il report spam sopra il messaggio."
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Spam"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Valido"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Premi il pulsante qui sotto per concedere le autorizzazioni all'host corrente ed evitare problemi di CORS."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Concedi l'autorizzazione all'host corrente"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Se stai utilizzando localhost o 127.0.0.1 perché il server IA è ospitato sul tuo PC, è necessaria l'autorizzazione <all_urls>."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Vuoi includere le impostazioni API nell'esportazione? Attenzione: anche la Chiave API verrà salvata nel file!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Non chiedere di selezionare del testo"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Se questa opzione viene attivata, non sarà necessario selezionare del testo. Verrà utilizzato l'intero corpo del messaggio per creare l'evento di calendario."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Copia"
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "copia"
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Controllo spam in corso..."
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Desideri delle belle statistiche sulle tue email?"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Clicca qui! Prova ThunderStats!"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "Il prompt deve contenere il segnaposto {%mail_text_body_or_selected%} o {%mail_html_body_or_selected%} per abilitare questa opzione. Per favore, aggiungi uno di questi segnaposto al prompt o ripristina quello predefinito."
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam di"
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Documentazione"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Guide di configurazione"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Tutorial Prompt Personalizzato"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Apri la Pagina di Benvenuto"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "Posizione finestra della chat AI"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Alto"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Sinistra"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Salva automaticamente la posizione della finestra quando si usa il pulsante chiudi."
|
||||
},
|
||||
"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を設定してください。"
|
||||
},
|
||||
|
|
@ -521,9 +512,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "現在のモデルを使用"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "プロンプトを送信中..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "許可される値"
|
||||
},
|
||||
|
|
@ -542,9 +530,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "アカウントの少なくとも1つがOwl for Exchangeアドオンを使用しているようです。ThunderbirdとOwlの間には既知の問題があり、現在対処中です。現時点では、メール作成時にはThunderAIを使用できますが、閲覧時には使用できません。"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "クリックして値を設定してください。"
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "以下のメールに返信してください。必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
|
||||
},
|
||||
|
|
@ -572,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": "必要なテキストのみで、余分なコメントや他のテキストなしで返信してください。"
|
||||
|
|
@ -750,7 +732,7 @@
|
|||
"message": "新しいカレンダーイベントを追加"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "以下のテキストからカレンダーイベントを生成するために必要なすべての関連詳細を抽出してください。抽出情報には以下を含めてください:\n- イベントタイトル\n- 開始日時(指定されている場合はタイムゾーンを含む)\n- 終了日時(指定されている場合はタイムゾーンを含む)\n- 終日(言及されている場合)\n- 出席者\nデータはカレンダーイベントの作成に直接使用できるよう、明確かつ一貫した形式にしてください。\n相対的な時間参照がある場合、メールの日時は「{%mail_datetime%}」であることを考慮してください。この参照に基づいて開始日時を計算してください。計算された開始日時が「{%current_datetime%}」より前の場合、「{%current_datetime%}」を基準として開始日時を再計算してください。\n期間が指定されていない場合は、1時間に設定してください。\n出席者:{%author%}、{%recipients%}、{%cc_list%}。存在する場合、私のアドレス{%account_email_address%}を除外してください。\n必要な情報の1つ以上を取得できない場合は、空の文字列で応答してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"カレンダーイベントの概要をここに\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nテキスト:「{%selected_text%}」"
|
||||
"message": "以下のテキストからカレンダーイベントを生成するために必要なすべての関連詳細を抽出してください。抽出情報には以下を含めてください:\n- イベントタイトル\n- 開始日時(指定されている場合はタイムゾーンを含む)\n- 終了日時(指定されている場合はタイムゾーンを含む)\n- 終日(言及されている場合)\n- 出席者\nデータはカレンダーイベントの作成に直接使用できるよう、明確かつ一貫した形式にしてください。\n相対的な時間参照がある場合、メールの日時は「{%mail_datetime%}」であることを考慮してください。この参照に基づいて開始日時を計算してください。計算された開始日時が「{%current_datetime%}」より前の場合、「{%current_datetime%}」を基準として開始日時を再計算してください。\n期間が指定されていない場合は、1時間に設定してください。\n出席者:{%author%}、{%recipients%}、{%cc_list%}。存在する場合、私のアドレス{%account_email_address%}を除外してください。\n終日イベントの場合、endDateはstartDateの翌日に設定し、時刻を「T000000」とする必要があります。\n必要な情報の1つ以上を取得できない場合は、空の文字列で応答してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"カレンダーイベントの概要をここに\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nテキスト:「{%mail_text_body_or_selected%}」"
|
||||
},
|
||||
"prompt_get_task": {
|
||||
"message": "新しいタスクを追加"
|
||||
|
|
@ -878,7 +860,7 @@
|
|||
"placeholder_thunderai_def_sign": {
|
||||
"message": "ThunderAIオプションで定義されたデフォルトの署名。"
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "ThunderAIオプションで定義されたデフォルト言語。"
|
||||
},
|
||||
"placeholder_mail_attachments_info": {
|
||||
|
|
@ -909,7 +891,7 @@
|
|||
"message": "スパムメールを検出"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "以下のメールを分析し、スパムかどうかを判断してください。不審なキーワード、過度な宣伝文句、誤解を招く件名、個人情報の要求、不審な送信者アドレスなどの要素を考慮してください。\n0(スパムではない)から100(スパム)までの値と、10語以内の説明を提供してください。\nメッセージデータが欠落している場合は、値を0(スパムではない)に設定し、理由を示してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式:\n{\n\"spamValue\": <0から100の整数>,\n\"explanation\": \"判断理由の簡単な説明\"\n}\n以下がメール情報です:\n送信者:「{%author%}」\n件名:「{%mail_subject%}」\nHTML本文:「{%mail_html_body%}」"
|
||||
"message": "以下のメールを分析し、スパムかどうかを判断してください。不審なキーワード、過度な宣伝文句、誤解を招く件名、個人情報の要求、不審な送信者アドレスなどの要素を考慮してください。\n0(スパムではない)から100(スパム)までの値と、10語以内の説明を提供してください。\nメッセージデータが欠落している場合は、値を0(スパムではない)に設定し、理由を示してください。\nJSON形式のみで応答を生成してください。追加のテキストや説明は含めず、JSONのみを提供してください。使用する形式:\n{\n\"explanation\": \"判断理由の簡単な説明\",\n\"spamValue\": <0から100の整数>\n}\n以下がメール情報です:\n送信者:「{%author%}」\n件名:「{%mail_subject%}」\nHTML本文:「{%mail_html_body%}」"
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "スパムフィルターオプション"
|
||||
|
|
@ -959,30 +941,12 @@
|
|||
"Report_Date": {
|
||||
"message": "レポート日"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "はい"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "いいえ"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "タグを追加"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "スパムを分析"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "「タグを追加」コンテキストメニュー項目を表示"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "チェックすると、メッセージリストでメールを右クリックした際に「タグを追加」コンテキストメニュー項目が表示されます。"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "「スパムを分析」コンテキストメニュー項目を表示"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "チェックすると、メッセージリストでメールを右クリックした際に「スパムを分析」コンテキストメニュー項目が表示されます。"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "編集可能なカレンダーが見つかりません!"
|
||||
},
|
||||
|
|
@ -1022,12 +986,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "CORS設定に問題がありますか?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "下のボタンを押して<all_urls>権限を付与し、CORSの問題を回避してください。"
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "「すべてのURL」権限を付与"
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text": {
|
||||
"message": "プレーンテキストで作成"
|
||||
},
|
||||
|
|
|
|||
5
_locales/nl/messages.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"extensionDescription": {
|
||||
"message": "Gebruik ChatGPT, Google Gemini, Claude of Ollama om uw emails te verbeteren."
|
||||
}
|
||||
}
|
||||
|
|
@ -24,9 +24,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "Klasyfikuj"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "Podsumuj to"
|
||||
},
|
||||
"prompt_translate_this": {
|
||||
"message": "Przetłumacz to"
|
||||
},
|
||||
|
|
@ -327,9 +324,6 @@
|
|||
"chagpt_api_send_button": {
|
||||
"message": "Używając modelu"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Próba połączenia z OpenAI ChatGPT przy użyciu podanego klucza API"
|
||||
},
|
||||
"Debug": {
|
||||
"message": "Debugowanie"
|
||||
},
|
||||
|
|
@ -363,12 +357,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Nie wybrałeś modelu dla API Ollama. Proszę wybierz jeden na stronie opcji."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Próba połączenia z lokalnym serwerem Ollama używając hosta"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "i modelu"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "Połączenie z serwerem zostało nieoczekiwanie przerwane"
|
||||
},
|
||||
|
|
@ -399,9 +387,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Nie wybrałeś modelu dla API kompatybilnego z OpenAI. Proszę wybierz jeden na stronie opcji."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Próba połączenia z lokalnym serwerem API kompatybilnym z OpenAI używając hosta"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "Zapytanie do API kompatybilnego z OpenAI nie powiodło się"
|
||||
},
|
||||
|
|
@ -423,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."
|
||||
},
|
||||
|
|
@ -498,9 +477,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Użyj bieżącego modelu"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Wysyłanie polecenia..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Dozwolone wartości"
|
||||
},
|
||||
|
|
@ -516,9 +492,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Wygląda na to, że przynajmniej jedno z Twoich kont używa dodatku Owl for Exchange. Istnieje znany problem między Thunderbirdem a Owl, który jest obecnie rozwiązywany. Na ten moment możesz używać ThunderAI podczas pisania e-maili, ale nie podczas ich czytania."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Kliknij na wartość, aby ją ustawić."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Odpowiedz na poniższy e-mail. Odpowiedz wyłącznie wymaganym tekstem, bez dodatkowych komentarzy ani innego tekstu."
|
||||
},
|
||||
|
|
@ -543,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."
|
||||
|
|
@ -672,9 +642,6 @@
|
|||
"google_gemini_api_request_failed": {
|
||||
"message": "Połączenie do interfejsu API Google Gemini nie powiodło się"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Próba połączenia z Google Gemini przy użyciu dostarczonego klucza API"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Nie dodałeś klucza API dla API Google Gemini. Wstaw go na stronie opcji."
|
||||
},
|
||||
|
|
@ -703,7 +670,7 @@
|
|||
"message": "Dodaj nowe wydarzenie w kalendarzu"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Wyodrębnij wszystkie istotne szczegóły wymagane do wygenerowania wydarzenia w kalendarzu z poniższego tekstu. Wyodrębnione informacje powinny obejmować:\n- Tytuł wydarzenia\n- Datę i godzinę rozpoczęcia (w tym strefę czasową, jeśli została określona)\n- Datę i godzinę zakończenia (w tym strefę czasową, jeśli została określona)\n- Cały dzień (jeśli jest podany)\n- Uczestnicy\nUpewnij się, że dane są sformatowane w sposób jasny i spójny, tak aby można go bezpośrednio wykorzystać do utworzenia wydarzenia w kalendarzu.\nJeśli istnieją odniesienia do czasu względnego, pamiętaj, że data i godzina wysłania wiadomości e-mail to „{%mail_datetime%}”. Oblicz datę i godzinę rozpoczęcia na podstawie tego odniesienia. Jeśli obliczona data i godzina rozpoczęcia są wcześniejsze niż „{%current_datetime%}”, oblicz ponownie datę i godzinę rozpoczęcia, stosując jako podstawę „{%current_datetime%}”.\nJeśli czas trwania nie jest określony, ustaw go na jedną godzinę.\nOto uczestnicy: {%author%}, {%recipients%}, {%cc_list%}. Jeśli jest obecny, wyklucz mój adres: {%account_email_address%}.\nJeśli nie możesz uzyskać co najmniej jednej z wymaganych informacji, w odpowiedzi wpisz pusty ciąg znaków.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dołączaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, którego należy użyć:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Tutaj podsumowanie wydarzenia w kalendarzu\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOto tekst:\"{%selected_text %}\""
|
||||
"message": "Wyodrębnij wszystkie istotne szczegóły wymagane do wygenerowania wydarzenia w kalendarzu z poniższego tekstu. Wyodrębnione informacje powinny obejmować:\n- Tytuł wydarzenia\n- Datę i godzinę rozpoczęcia (w tym strefę czasową, jeśli została określona)\n- Datę i godzinę zakończenia (w tym strefę czasową, jeśli została określona)\n- Cały dzień (jeśli jest podany)\n- Uczestnicy\nUpewnij się, że dane są sformatowane w sposób jasny i spójny, tak aby można go bezpośrednio wykorzystać do utworzenia wydarzenia w kalendarzu.\nJeśli istnieją odniesienia do czasu względnego, pamiętaj, że data i godzina wysłania wiadomości e-mail to „{%mail_datetime%}”. Oblicz datę i godzinę rozpoczęcia na podstawie tego odniesienia. Jeśli obliczona data i godzina rozpoczęcia są wcześniejsze niż „{%current_datetime%}”, oblicz ponownie datę i godzinę rozpoczęcia, stosując jako podstawę „{%current_datetime%}”.\nJeśli wydarzenie jest całodniowe, data zakończenia (endDate) musi przypadać na dzień po dacie rozpoczęcia (startDate), a godzina musi być ustawiona na \"T000000\".\nJeśli czas trwania nie jest określony, ustaw go na jedną godzinę.\nOto uczestnicy: {%author%}, {%recipients%}, {%cc_list%}. Jeśli jest obecny, wyklucz mój adres: {%account_email_address%}.\nJeśli nie możesz uzyskać co najmniej jednej z wymaganych informacji, w odpowiedzi wpisz pusty ciąg znaków.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dołączaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, którego należy użyć:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Tutaj podsumowanie wydarzenia w kalendarzu\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nOto tekst:\"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Dodaj nowe wydarzenie w kalendarzu z zaznaczonego tekstu"
|
||||
|
|
@ -771,7 +738,7 @@
|
|||
"Spam_Value": {
|
||||
"message": "Wartość spamu"
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Domyślny język zgodnie z opcjami ThunderAI."
|
||||
},
|
||||
"prompt_spamfilter": {
|
||||
|
|
@ -792,15 +759,12 @@
|
|||
"Moved_to_Spam": {
|
||||
"message": "Przeniesiono do spamu"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Nie"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_force_existing_Info": {
|
||||
"message": "Jeśli zaznaczone, AI doda tylko istniejące tagi do nowo odebranych e-maili i nie utworzy nowych."
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks nie zainstalowany!"
|
||||
},
|
||||
"SpamFilter_info_default": {
|
||||
"message": "Na tej stronie możesz edytować domyślny prompt używany do wykrywania e-maili spamowych."
|
||||
},
|
||||
|
|
@ -813,7 +777,7 @@
|
|||
"prefs_OptionText_btnManageSpamFilterInfo": {
|
||||
"message": "Zarządzaj ustawieniami filtra spamu"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Tak"
|
||||
},
|
||||
"prefs_OptionText_spamfilter": {
|
||||
|
|
@ -847,7 +811,7 @@
|
|||
"message": "Zarządzaj ustawieniami filtra spamu"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Przeanalizuj poniższy e-mail i określ, czy jest to spam, czy nie. Weź pod uwagę takie czynniki jak podejrzane słowa kluczowe, nadmierny język promocyjny, wprowadzające w błąd tematy, prośby o podanie danych osobowych i nietypowe adresy nadawców.\nPodaj wartość od 0 (nie spam) do 100 (spam) oraz wyjaśnienie nie dłuższe niż 10 słów.\nW przypadku braku danych wiadomości ustaw wartość na 0 (nie spam) i podaj powód.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dodawaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, który należy użyć:\n{\n\"spamValue\": <liczba całkowita od 0 do 100>,\n\"explanation\": \"Krótkie wyjaśnienie twojego rozumowania\"\n}\nOto informacje o e-mailu:\nNadawca: \"{%author%}\"\nTemat: \"{%mail_subject%}\"\nTreść HTML: \"{%mail_html_body%}\""
|
||||
"message": "Przeanalizuj poniższy e-mail i określ, czy jest to spam, czy nie. Weź pod uwagę takie czynniki jak podejrzane słowa kluczowe, nadmierny język promocyjny, wprowadzające w błąd tematy, prośby o podanie danych osobowych i nietypowe adresy nadawców.\nPodaj wartość od 0 (nie spam) do 100 (spam) oraz wyjaśnienie nie dłuższe niż 10 słów.\nW przypadku braku danych wiadomości ustaw wartość na 0 (nie spam) i podaj powód.\nWygeneruj odpowiedź tylko w formacie JSON. Nie dodawaj żadnego dodatkowego tekstu ani wyjaśnień; podaj tylko JSON. Oto format, który należy użyć:\n{\n\"explanation\": \"Krótkie wyjaśnienie twojego rozumowania\",\n\"spamValue\": <liczba całkowita od 0 do 100>\n}\nOto informacje o e-mailu:\nNadawca: \"{%author%}\"\nTemat: \"{%mail_subject%}\"\nTreść HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_threshold_Info": {
|
||||
"message": "Jeśli wartość zwrócona przez AI przekroczy ten próg, e-mail zostanie przeniesiony do folderu spamu."
|
||||
|
|
@ -858,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\"."
|
||||
},
|
||||
|
|
@ -891,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"
|
||||
},
|
||||
|
|
@ -327,9 +324,6 @@
|
|||
"chagpt_api_send_button": {
|
||||
"message": "Usando modelo"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "Tentando conectar ao OpenAI ChatGPT usando a chave de API fornecida"
|
||||
},
|
||||
"Debug": {
|
||||
"message": "Depurar"
|
||||
},
|
||||
|
|
@ -363,12 +357,6 @@
|
|||
"ollama_empty_model": {
|
||||
"message": "Você não escolheu um modelo para a API do Ollama. Por favor, escolha um na página de opções."
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "Tentando conectar ao servidor local do Ollama usando o host"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "e modelo"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "A conexão com o servidor foi interrompida inesperadamente"
|
||||
},
|
||||
|
|
@ -399,9 +387,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "Você não escolheu um modelo para a API Compatível com OpenAI. Por favor, escolha um na página de opções."
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "Tentando conectar ao Servidor Local da API Compatível com OpenAI usando o host"
|
||||
},
|
||||
"OpenAIComp_api_request_failed": {
|
||||
"message": "Solicitação da API Comp do OpenAI falhou"
|
||||
},
|
||||
|
|
@ -423,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."
|
||||
},
|
||||
|
|
@ -498,9 +477,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Usar o modelo atual"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Enviando prompt..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Valores permitidos"
|
||||
},
|
||||
|
|
@ -516,9 +492,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Parece que pelo menos uma das suas contas está usando o complemento Coruja para Exchange. Existe um problema conhecido entre Thunderbird e Coruja, que está sendo resolvido no momento. Por enquanto, você pode usar o ThunderAI ao redigir e-mails, mas não ao lê-los."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Clique em um valor para defini-lo."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Responda ao e-mail a seguir. Responda apenas com o texto necessário e sem comentários adicionais ou outros textos."
|
||||
},
|
||||
|
|
@ -543,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."
|
||||
|
|
@ -681,9 +651,6 @@
|
|||
"google_gemini_api_request_failed": {
|
||||
"message": "A solicitação para a API Google Gemini falhou"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "Tentando conectar ao Google Gemini usando a chave API fornecida"
|
||||
},
|
||||
"google_gemini_empty_apikey": {
|
||||
"message": "Você não adicionou uma chave API para a API Google Gemini. Por favor, insira uma na página de opções."
|
||||
},
|
||||
|
|
@ -712,7 +679,7 @@
|
|||
"message": "Adicionar um novo evento ao calendário"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Extraia todos os detalhes relevantes necessários para gerar um evento de calendário a partir do texto a seguir. As informações extraídas devem incluir:\n- Título do evento\n- Data e hora de início (incluindo fuso horário, se especificado)\n- Data e hora de término (incluindo fuso horário, se especificado)\n- Dia inteiro (se mencionado)\n- Participantes\nCertifique-se de que os dados estejam formatados de maneira clara e consistente para que possam ser usados diretamente para criar um evento de calendário.\nSe houver referências de tempo relativas, considere que a data e a hora do e-mail são \"{%mail_datetime%}\". Calcule a data e a hora de início com base nessa referência. Se a data e a hora de início calculadas forem anteriores a \"{%current_datetime%}\", recalcule a data e a hora de início usando \"{%current_datetime%}\" como base.\nSe a duração não for especificada, defina-a como uma hora.\nEstes são os participantes: {%author%}, {%recipients%}, {%cc_list%}. Se estiver presente, exclua meu endereço: {%account_email_address%}.\nSe você não conseguir obter uma ou mais informações necessárias, responda com uma string vazia.\nGere uma resposta apenas no formato JSON. Não inclua texto ou explicações adicionais; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumo do evento do calendário aqui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nAqui está o texto: \"{%selected_text%}\""
|
||||
"message": "Extraia todos os detalhes relevantes necessários para gerar um evento de calendário a partir do texto a seguir. As informações extraídas devem incluir:\n- Título do evento\n- Data e hora de início (incluindo fuso horário, se especificado)\n- Data e hora de término (incluindo fuso horário, se especificado)\n- Dia inteiro (se mencionado)\n- Participantes\nCertifique-se de que os dados estejam formatados de maneira clara e consistente para que possam ser usados diretamente para criar um evento de calendário.\nSe houver referências de tempo relativas, considere que a data e a hora do e-mail são \"{%mail_datetime%}\". Calcule a data e a hora de início com base nessa referência. Se a data e a hora de início calculadas forem anteriores a \"{%current_datetime%}\", recalcule a data e a hora de início usando \"{%current_datetime%}\" como base.\nSe a duração não for especificada, defina-a como uma hora.\nEstes são os participantes: {%author%}, {%recipients%}, {%cc_list%}. Se estiver presente, exclua meu endereço: {%account_email_address%}.\nSe o evento for de dia inteiro, o campo endDate deve ser o dia seguinte ao startDate com o horário definido como \"T000000\".\nSe você não conseguir obter uma ou mais informações necessárias, responda com uma string vazia.\nGere uma resposta apenas no formato JSON. Não inclua texto ou explicações adicionais; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"Resumo do evento do calendário aqui\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nAqui está o texto: \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Adicionar um novo evento ao calendário a partir do texto selecionado"
|
||||
|
|
@ -795,12 +762,9 @@
|
|||
"Moved_to_Spam": {
|
||||
"message": "Movido para spam"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Não"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks não instalado!"
|
||||
},
|
||||
"prefs_OptionText_btnManageSpamFilterInfo": {
|
||||
"message": "Gerenciar configurações do filtro de spam"
|
||||
},
|
||||
|
|
@ -810,7 +774,7 @@
|
|||
"prefs_OptionText_spamfilter_Info": {
|
||||
"message": "Se marcado, o ThunderAI moverá automaticamente e-mails de spam para a pasta de spam."
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Sim"
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
|
|
@ -832,7 +796,7 @@
|
|||
"message": "Filtro de spam automático"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analise o seguinte e-mail e determine se é spam ou não. Considere fatores como palavras-chave suspeitas, linguagem promocional excessiva, linhas de assunto enganosas, solicitações de informações pessoais e endereços de remetentes incomuns.\nForneça um valor de 0 (não é spam) a 100 (spam) e uma explicação de no máximo 10 palavras.\nEm caso de ausência de dados da mensagem, defina o valor como 0 (não é spam) e informe o motivo.\nGere uma resposta apenas no formato JSON. Não inclua nenhum texto ou explicação adicional; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"spamValue\": <inteiro de 0 a 100>,\n\"explanation\": \"Breve explicação do seu raciocínio\"\n}\nAqui estão as informações do e-mail:\nRemetente: \"{%author%}\"\nAssunto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
|
||||
"message": "Analise o seguinte e-mail e determine se é spam ou não. Considere fatores como palavras-chave suspeitas, linguagem promocional excessiva, linhas de assunto enganosas, solicitações de informações pessoais e endereços de remetentes incomuns.\nForneça um valor de 0 (não é spam) a 100 (spam) e uma explicação de no máximo 10 palavras.\nEm caso de ausência de dados da mensagem, defina o valor como 0 (não é spam) e informe o motivo.\nGere uma resposta apenas no formato JSON. Não inclua nenhum texto ou explicação adicional; forneça apenas o JSON. Aqui está o formato a ser usado:\n{\n\"explanation\": \"Breve explicação do seu raciocínio\",\n\"spamValue\": <inteiro de 0 a 100>\n}\nAqui estão as informações do e-mail:\nRemetente: \"{%author%}\"\nAssunto: \"{%mail_subject%}\"\nCorpo HTML: \"{%mail_html_body%}\""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_threshold_Info": {
|
||||
"message": "Se o valor retornado pela IA estiver acima deste limite, o e-mail será movido para a pasta de spam."
|
||||
|
|
@ -840,7 +804,7 @@
|
|||
"prefs_OptionText_add_tags_auto_only_inbox_Info": {
|
||||
"message": "Se marcado, a IA adicionará tags apenas aos e-mails recebidos na pasta da caixa de entrada."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Idioma padrão conforme definido nas opções do ThunderAI."
|
||||
},
|
||||
"placeholder_thunderai_def_sign": {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
},
|
||||
|
|
@ -156,7 +153,7 @@
|
|||
"message": "Responder"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Responder com o comando"
|
||||
"message": "Responder com o comando..."
|
||||
},
|
||||
"chatgpt_win_close": {
|
||||
"message": "Fechar"
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
"message": "Răspunde la această conversație"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Răspunde cu instrucțiuni suplimentare"
|
||||
"message": "Răspunde cu instrucțiuni suplimentare..."
|
||||
},
|
||||
"prompt_rewrite_polite": {
|
||||
"message": "Rescrie politicos"
|
||||
|
|
@ -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, если вы не хотите указывать размер окна."
|
||||
},
|
||||
|
|
@ -512,9 +503,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Использовать текущую модель"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Отправка запроса..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Разрешенные значения"
|
||||
},
|
||||
|
|
@ -533,9 +521,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Похоже, что по крайней мере одна из ваших учетных записей использует дополнение Owl for Exchange. Существует известная проблема между Thunderbird и Owl, которая в настоящее время решается. На данный момент вы можете использовать ThunderAI при составлении писем, но не при их чтении."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Нажмите на значение, чтобы установить его."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Ответьте на следующее письмо. В ответе указывайте только необходимый текст, без лишних комментариев и прочего."
|
||||
},
|
||||
|
|
@ -560,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": "Отвечайте только нужным текстом, без лишних комментариев и прочего."
|
||||
|
|
@ -735,7 +717,7 @@
|
|||
"message": "Добавьте новое событие календаря"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Извлеките из следующего текста все необходимые сведения, необходимые для создания календарного события. Извлеченная информация должна включать:\n- Название события\n- Дата и время начала (включая часовой пояс, если он указан)\n- Дата и время окончания (включая часовой пояс, если он указан)\n- Полный день (если указано)\n- Участники\nУбедитесь, что данные отформатированы четко и последовательно, чтобы их можно было напрямую использовать для создания календарного события.\nЕсли есть относительные временные ссылки, считайте, что дата и время письма - это \"{%mail_datetime%}\". Рассчитайте дату и время начала на основе этой ссылки. Если вычисленные дата и время начала раньше, чем \"{%current_datetime%}\", пересчитайте дату и время начала, взяв за основу \"{%current_datetime%}\".\nЕсли продолжительность не указана, установите ее равной одному часу.\nК ним относятся: {%author%}, {%recipients%}, {%cc_list%}. Если присутствует, исключите мой адрес: {%account_email_address%}.\nЕсли вы не можете получить одну или несколько требуемых данных, ответьте пустой строкой.\nГенерируйте ответ только в формате JSON. Не включайте никаких дополнительных текстов или пояснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"startDate\": \"ГГГГММДДДХММССС\",\n\"endDate\": \"ГГГГММДДДХММССС\",\n\"summary\": \"Здесь выводится краткое описание события календаря\",\n\"forceAllDay\": false,\n\"attendees\": [участник1@example.com,участник2@example.com,участник3@example.com]\n}\nВот текст: \"{%selected_text%}\""
|
||||
"message": "Извлеките из следующего текста все необходимые сведения, необходимые для создания календарного события. Извлеченная информация должна включать:\n- Название события\n- Дата и время начала (включая часовой пояс, если он указан)\n- Дата и время окончания (включая часовой пояс, если он указан)\n- Полный день (если указано)\n- Участники\nУбедитесь, что данные отформатированы четко и последовательно, чтобы их можно было напрямую использовать для создания календарного события.\nЕсли есть относительные временные ссылки, считайте, что дата и время письма - это \"{%mail_datetime%}\". Рассчитайте дату и время начала на основе этой ссылки. Если вычисленные дата и время начала раньше, чем \"{%current_datetime%}\", пересчитайте дату и время начала, взяв за основу \"{%current_datetime%}\".\nЕсли продолжительность не указана, установите ее равной одному часу.\nК ним относятся: {%author%}, {%recipients%}, {%cc_list%}. Если присутствует, исключите мой адрес: {%account_email_address%}.\nЕсли это полнодневное событие, endDate должен быть на один день позже startDate с указанием времени \"T000000\".\nЕсли вы не можете получить одну или несколько требуемых данных, ответьте пустой строкой.\nГенерируйте ответ только в формате JSON. Не включайте никаких дополнительных текстов или пояснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"startDate\": \"ГГГГММДДДХММССС\",\n\"endDate\": \"ГГГГММДДДХММССС\",\n\"summary\": \"Здесь выводится краткое описание события календаря\",\n\"forceAllDay\": false,\n\"attendees\": [участник1@example.com,участник2@example.com,участник3@example.com]\n}\nВот текст: \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prompt_get_task": {
|
||||
"message": "Добавить новую задачу"
|
||||
|
|
@ -848,7 +830,7 @@
|
|||
"placeholder_thunderai_def_sign": {
|
||||
"message": "Подпись по умолчанию, определенная в опциях ThunderAI."
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Язык по умолчанию, определенный в опциях ThunderAI."
|
||||
},
|
||||
"empty": {
|
||||
|
|
@ -876,7 +858,7 @@
|
|||
"message": "Обнаружение спама в эл. почте"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Проанализируйте следующее письмо и определите, является ли оно спамом или нет. Учитывайте такие факторы, как подозрительные ключевые слова, излишняя рекламная лексика, вводящие в заблуждение тематические строки, запросы личной информации и необычные адреса отправителей.\nУкажите значение от 0 (не спам) до 100 (спам) и объяснение, состоящее не более чем из 10 слов.\nВ случае отсутствия данных о сообщении установите значение 0 (не спам) и укажите причину.\nГенерируйте ответ только в формате JSON. Не включайте никаких доп. текстов или объяснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"spamValue\": <целое число от 0 до 100>,\n\"explanation\": \"Краткое объяснение ваших рассуждений\"\n}\nЗдесь находится информация о почте:\nОтправитель: \"{%author%}\"\nТема: \"{%mail_subject%}\"\nHtml-тело: \"{%mail_html_body%}\""
|
||||
"message": "Проанализируйте следующее письмо и определите, является ли оно спамом или нет. Учитывайте такие факторы, как подозрительные ключевые слова, излишняя рекламная лексика, вводящие в заблуждение тематические строки, запросы личной информации и необычные адреса отправителей.\nУкажите значение от 0 (не спам) до 100 (спам) и объяснение, состоящее не более чем из 10 слов.\nВ случае отсутствия данных о сообщении установите значение 0 (не спам) и укажите причину.\nГенерируйте ответ только в формате JSON. Не включайте никаких доп. текстов или объяснений; предоставляйте только JSON. Вот формат, который следует использовать:\n{\n\"explanation\": \"Краткое объяснение ваших рассуждений\",\n\"spamValue\": <целое число от 0 до 100>\n}\nЗдесь находится информация о почте:\nОтправитель: \"{%author%}\"\nТема: \"{%mail_subject%}\"\nHtml-тело: \"{%mail_html_body%}\""
|
||||
},
|
||||
"SpamFilter_prompt_prefs_title": {
|
||||
"message": "Параметры спам-фильтра"
|
||||
|
|
@ -920,30 +902,12 @@
|
|||
"Report_Date": {
|
||||
"message": "Дата отчета"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Да"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Нет"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Добавить теги"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Анализ на предмет спама"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Показать пункт меню \"Добавить теги\""
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Если флажок установлен, пункт контекстного меню \"Добавить теги\" будет отображаться при щелчке ПКМ на письме в списке сообщений."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Показать пункт контекстного меню \"Анализировать на предмет спама\""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Если флажок установлен, пункт контекстного меню \"Анализировать на спам\" будет отображаться при щелчке ПКМ на письме в списке сообщений."
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Редактируемый календарь не найден!"
|
||||
},
|
||||
|
|
@ -983,12 +947,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "Проблемы с настройкой CORS?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Нажмите кнопку ниже, чтобы дать разрешение <all_urls> во избежание проблем с CORS."
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Дайте разрешение на \"все URL-адреса\""
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text": {
|
||||
"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"
|
||||
|
|
@ -186,7 +183,7 @@
|
|||
"message": "Svara på denna tråd"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "Svara med kommando"
|
||||
"message": "Svara med kommando..."
|
||||
},
|
||||
"prompt_rewrite_polite": {
|
||||
"message": "Skriv om artigt"
|
||||
|
|
@ -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."
|
||||
},
|
||||
|
|
@ -593,9 +584,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "Använd den nuvarande modellen"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "Skickar prompt..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "Tillåtna värden"
|
||||
},
|
||||
|
|
@ -614,9 +602,6 @@
|
|||
"prefs_OptionText_owl_warning": {
|
||||
"message": "Det verkar som att minst ett av dina konton använder tillägget Owl for Exchange. Det finns ett känt problem mellan Thunderbird och Owl, vilket för närvarande åtgärdas. För närvarande kan du använda ThunderAI när du skriver e-postmeddelanden, men inte när du läser dem."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "Klicka på ett värde för att ställa in det."
|
||||
},
|
||||
"prompt_reply_full_text": {
|
||||
"message": "Svara på följande e-postmeddelande. Svara endast med den text som behövs och utan extra kommentarer eller annan text."
|
||||
},
|
||||
|
|
@ -641,11 +626,8 @@
|
|||
"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 följande e-postmeddelande till"
|
||||
"message": "Översätt e-postmeddelandet nedan till {%thunderai_translate_lang%}.\n\nRegler:\n- Översätt både ämnet och brödtexten.\n- Returnera resultatet som ett JSON-objekt med tre fält: \"subject\", \"body\" och \"status\".\n- Om översättningen har gjorts är statusen lika med 1.\n- Om e-postmeddelandet är skrivet på ett av dessa språk \"{%thunderai_translate_exclude_lang%}\" eller på språket {%thunderai_translate_lang%}, returnera en tom sträng för brödtexten och ämnet och sätt statusen till -1.\n- Lägg inte till förklaringar, anteckningar eller någon text utanför JSON.\n\nE-postämne: {%mail_subject%}\n\nE-postbrödtext: {%mail_html_body%}\n\nGenerera ett svar endast i JSON-format. Utdata ska endast vara ett JSON-objekt. Här är ett exempel på JSON-formatet som ska användas:\n{\n\"subject\": \"ämnesöversättning\",\n\"body\": \"översättning av brödtext\",\n\"status\": \"statusresultat\"\n}"
|
||||
},
|
||||
"prompt_this_full_text": {
|
||||
"message": "Svara endast med den text som behövs och utan extra kommentarer eller annan text."
|
||||
|
|
@ -657,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"
|
||||
|
|
@ -734,7 +716,7 @@
|
|||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "Lägg till en ny kalenderhändelse från markerad text"
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "Standardspråk som definierat i ThunderAI-alternativ."
|
||||
},
|
||||
"placeholder_mail_attachments_info": {
|
||||
|
|
@ -759,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,30 +779,12 @@
|
|||
"Report_Date": {
|
||||
"message": "Rapportdatum"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "Ja"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "Nej"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "Lägg till taggar"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "Analysera för skräppost"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "Visa snabbmenyn \"Lägg till taggar\""
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "Om markerat visas snabbmenyn \"Lägg till taggar\" när du högerklickar på ett e-postmeddelande i meddelandelistan."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "Visa snabbmenyalternativet \"Analysera för skräppost\""
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "Om markerat visas snabbmenyn \"Analysera för skräppost\" när du högerklickar på ett e-postmeddelande i meddelandelistan."
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "Ingen redigerbar kalender hittades!"
|
||||
},
|
||||
|
|
@ -860,9 +824,6 @@
|
|||
"CORS_alternative_1": {
|
||||
"message": "Problem med att ställa in CORS?"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "Tryck på knappen nedan för att ge <all_urls> behörighet för att undvika eventuella CORS-problem."
|
||||
},
|
||||
"customPrompts_Properties": {
|
||||
"message": "Egenskaper"
|
||||
},
|
||||
|
|
@ -1102,7 +1063,7 @@
|
|||
"message": "Tröskel skräppost"
|
||||
},
|
||||
"spamfilter_no_reports": {
|
||||
"message": "Inga meddelanden har ännu granskats för skräppost. Här hittar du en lista över de senaste 100 skräppostrapporterna för den aktuella sessionen."
|
||||
"message": "Inga meddelanden har ännu granskats för skräppost. Här hittar du en lista över de senaste 100 skräppostrapporter."
|
||||
},
|
||||
"SpamReport_Title": {
|
||||
"message": "Rapporter om skräppostfilter"
|
||||
|
|
@ -1228,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"
|
||||
|
|
@ -1294,15 +1255,544 @@
|
|||
"message": "Citerad text i meddelandets brödtext"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "Extrahera all relevant information som krävs för att generera en kalenderhändelse från följande text. Den extraherade informationen bör innehålla:\n- Händelsetitel\n- Startdatum och tid (inklusive tidszon, om angiven)\n- Slutdatum och tid (inklusive tidszon, om angiven)\n- Heldag (om angiven)\n- Deltagare\nSe till att informationen är tydligt och konsekvent formaterad så att den kan användas direkt för att skapa en kalenderhändelse.\nOm det finns relativa tidsreferenser, tänk på att datum och tid för e-postmeddelandet är \"{%mail_datetime%}\". Beräkna startdatum och tid baserat på denna referens. Om det beräknade startdatumet och tiden är tidigare än \"{%current_datetime%}\", beräkna om startdatumet och tiden med \"{%current_datetime%}\" som bas.\nOm varaktigheten inte anges, sätt den till en timme.\nDessa är deltagarna: {%author%}, {%recipients%}, {%cc_list%}. Om det finns, exkludera min adress: {%account_email_address%}.\nOm du inte kan få en eller flera av de obligatoriska uppgifterna, vänligen svara med en tom sträng.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaringar; ange endast JSON. Här är formatet som ska användas:\n{\n\"startDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"endDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"summary\": \"Sammanfattning av kalenderhändelse här\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHär är texten: \"{%selected_text%}\""
|
||||
"message": "Extrahera all relevant information som krävs för att generera en kalenderhändelse från följande text. Den extraherade informationen bör innehålla:\n- Händelsetitel\n- Startdatum och tid (inklusive tidszon, om angiven)\n- Slutdatum och tid (inklusive tidszon, om angiven)\n- Heldag (om angiven)\n- Deltagare\nSe till att informationen är tydligt och konsekvent formaterad så att den kan användas direkt för att skapa en kalenderhändelse.\nOm det finns relativa tidsreferenser, tänk på att datum och tid för e-postmeddelandet är \"{%mail_datetime%}\". Beräkna startdatum och tid baserat på denna referens. Om det beräknade startdatumet och tiden är tidigare än \"{%current_datetime%}\", beräkna om startdatumet och tiden med \"{%current_datetime%}\" som bas.\nOm varaktigheten inte anges, sätt den till en timme.\nDessa är deltagarna: {%author%}, {%recipients%}, {%cc_list%}. Om det finns, exkludera min adress: {%account_email_address%}.\nOm händelsen är en heldagshändelse måste endDate vara en dag efter startDate med tiden inställd på \"T000000\".\nOm du inte kan få en eller flera av de obligatoriska uppgifterna, vänligen svara med en tom sträng.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaringar; ange endast JSON. Här är formatet som ska användas:\n{\n\"startDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"endDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"summary\": \"Sammanfattning av kalenderhändelse här\",\n\"forceAllDay\": false,\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\nHär är texten: \"{%mail_text_body_or_selected%}\""
|
||||
},
|
||||
"prompt_get_task_full_text": {
|
||||
"message": "Extrahera alla relevanta detaljer som krävs för att generera en uppgift från följande text. Den extraherade informationen bör innehålla:\n- Förfallodatum och tid (inklusive tidszon, om angiven)\n- Uppgiftssammanfattning\n- Initialt datum och tid (inklusive tidszon, om angiven)\nSe till att informationen är tydligt och konsekvent formaterad så att den kan användas direkt för att skapa en uppgift.\nOm det finns relativa tidsreferenser, tänk på att datum och tid för e-postmeddelandet är \"{%mail_datetime%}\". Beräkna startdatum och tid baserat på denna referens. Om det beräknade startdatumet och tiden är tidigare än \"{%current_datetime%}\", beräkna om startdatumet och tiden med \"{%current_datetime%}\" som bas.\nOm du inte kan få en eller flera av de obligatoriska uppgifterna, vänligen svara med en tom sträng.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaringar; ange endast JSON. Här är formatet som ska användas:\n{\n\"InitialDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"dueDate\": \"ÅÅÅÅMMDDTHHMMSS\",\n\"summary\": \"Uppgiftssammanfattning här\"\n}\nOm det inte finns någon information om datumen, ta bort dem.\nHär är texten: \"{%selected_text%}\""
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "Analysera följande e-postmeddelande och avgör om det är skräppost eller inte. Tänk på faktorer som misstänkta sökord, överdrivet reklamspråk, vilseledande ämnesrader, förfrågningar om personlig information och ovanliga avsändaradresser.\nAnge ett värde från 0 (inte skräppost) till 100 (skräppost) och en förklaring på högst 10 ord.\nOm meddelandedata saknas, sätt värdet till 0 (inte skräppost) och ange orsaken.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaring; ange endast JSON. Här är formatet som ska användas:\n{\n\"spamValue\": <heltal från 0 till 100>,\n\"explanation\": \"Kort förklaring av ditt resonemang\"\n}\nHär är e-postinformationen:\nAvsändare: \"{%author%}\"\nÄmne: \"{%mail_subject%}\"\nHtml-text: \"{%mail_html_body%}\""
|
||||
"message": "Analysera följande e-postmeddelande och avgör om det är skräppost eller inte. Tänk på faktorer som misstänkta sökord, överdrivet reklamspråk, vilseledande ämnesrader, förfrågningar om personlig information och ovanliga avsändaradresser.\nAnge ett värde från 0 (inte skräppost) till 100 (skräppost) och en förklaring på högst 10 ord.\nOm meddelandedata saknas, sätt värdet till 0 (inte skräppost) och ange orsaken.\nGenerera ett svar endast i JSON-format. Inkludera inte ytterligare text eller förklaring; ange endast JSON. Här är formatet som ska användas:\n{\n\"explanation\": \"Kort förklaring av ditt resonemang\",\n\"spamValue\": <heltal från 0 till 100>\n}\nHär är e-postinformationen:\nAvsändare: \"{%author%}\"\nÄmne: \"{%mail_subject%}\"\nHtml-text: \"{%mail_html_body%}\""
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "Ge behörighet för \"alla webbadresser\""
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "Sammanfattningsalternativ"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"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"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "Sammanfattningsmall för e-post"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "Från: {%author%}\nTill: {%recipients%}\nCC: {%cc_list%}\nÄmne: {%mail_subject%}\nDatum: {%mail_datetime%}\nBilagor:\n{%mail_attachments_info%}\n\nBrödtext:\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "E-postavgränsare"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n---------- NÄSTA E-POST ----------\n\n"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "Du kan ändra prompten som du vill, det första fältet är huvudprompten, det andra fältet är mallen för ett enskilt e-postmeddelande. Listan över e-postmeddelanden kommer att läggas till i huvudprompten. E-postmeddelanden kommer att separeras med avgränsaren som anges i det tredje fältet."
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "Huvudprompten som beskriver uppgiften som ska utföras på alla valda e-postmeddelanden:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "Mallen för ett enda e-postmeddelande:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "Avgränsaren mellan e-postmeddelanden:"
|
||||
},
|
||||
"prefs_OptionText_summarize": {
|
||||
"message": "Sammanfatta epostmeddelande"
|
||||
},
|
||||
"prefs_OptionText_summarize_use_specific_integration_Info": {
|
||||
"message": "Om markerat kommer modellen och API:et som anges nedan att användas för att sammanfatta e-postmeddelanden, oavsett vilket som valts på ThunderAI-alternativsidan."
|
||||
},
|
||||
"prefs_OptionText_summarize_Info": {
|
||||
"message": "Om markerad läggs ett alternativ till i snabbmenyn för att sammanfatta epost(meddelanden)."
|
||||
},
|
||||
"prefs_OptionText_btnManageSummarizeInfo": {
|
||||
"message": "Hantera sammanfattningsinställningar"
|
||||
},
|
||||
"Summarize_PageTitle": {
|
||||
"message": "Hantera sammanfattningsinställningar"
|
||||
},
|
||||
"Summarize_info_default": {
|
||||
"message": "På den här sidan kan du ändra standardprompten som används för att sammanfatta e-postmeddelanden."
|
||||
},
|
||||
"Summarize_prompt_text_title": {
|
||||
"message": "Aktuell prompttext"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "Tryck på knappen nedan för att ge den aktuella värden behörighet att undvika CORS-problem."
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "Ge behörighet till den nuvarande värden"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "Om du använder localhost eller 127.0.0.1 eftersom AI-servern finns på din dator krävs behörigheten <all_urls>."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_use_specific_integration_Info": {
|
||||
"message": "Om markerat kommer modellen och API:et som anges nedan att användas för att skapa kalenderhändelser, oavsett vilket som valts på ThunderAI-alternativsidan."
|
||||
},
|
||||
"customPrompts_export_include_api_settings": {
|
||||
"message": "Vill du inkludera API-inställningar i exporten? Tänk på att även API-nyckeln kommer att sparas i filen!"
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "Lägg till kalenderhändelse från urklipp"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "Kunde inte läsa urklipp. Kontrollera behörigheterna."
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "Urklipp är tom. Kopiera lite text först."
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "Åtkomst till urklipp nekades. Aktivera funktionen igen i inställningarna för att ge behörighet."
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "Fel vid begäran om behörighet för urklipp. Försök igen."
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "Hämta kalenderhändelse från urklipp"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "Visa ytterligare ett menyalternativ för att skapa kalenderhändelser från textinnehåll i urklipp."
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection": {
|
||||
"message": "Fråga inte om att markera text"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_Info": {
|
||||
"message": "Om markerad behöver du inte markera någon text. Hela meddelandets innehåll kommer att användas för att hämta kalenderhändelsen."
|
||||
},
|
||||
"customPrompts_btnCopy": {
|
||||
"message": "Kopiera"
|
||||
},
|
||||
"copy_text": {
|
||||
"message": "kopiera"
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "Mejltext eller markerad text"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "Mejltext eller vald HTML"
|
||||
},
|
||||
"Spam": {
|
||||
"message": "Skräppost"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "Giltig"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel": {
|
||||
"message": "Visa panelen för skräppostrapportering"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_show_msg_panel_Info": {
|
||||
"message": "Om markerat visas en panel med skräppostrapporten högst upp i meddelandet."
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "Väntetid för sidinläsning"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "Tid i millisekunder att vänta på att ChatGPT-sidan ska laddas innan ytterligare innehåll laddas. Standardvärdet är 1000 ms. Om en anpassad GPT eller ett anpassat projekt definieras läggs ytterligare 1000 ms till detta värde."
|
||||
},
|
||||
"spam_check_in_progress": {
|
||||
"message": "Skräppostkontroll pågår..."
|
||||
},
|
||||
"prefs_THStats_1": {
|
||||
"message": "Vill du ha snygg statistik om dina e-postmeddelanden?"
|
||||
},
|
||||
"prefs_THStats_2": {
|
||||
"message": "Klicka här! Testa ThunderStats!"
|
||||
},
|
||||
"antispam_by": {
|
||||
"message": "Antispam av"
|
||||
},
|
||||
"prefs_OptionText_calendar_no_selection_missing_placeholder": {
|
||||
"message": "Prompten måste innehålla platshållaren {%mail_text_body_or_selected%} eller {%mail_html_body_or_selected%} för att aktivera det här alternativet. Lägg till en av dessa platshållare i prompten eller återställ den till standard."
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "Dokumentation"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "Installationsguider"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "Handledning för anpassad prompt"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "Öppna välkomstsidan"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_pos_text": {
|
||||
"message": "AI-chattfönstrets position"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_top": {
|
||||
"message": "Överst"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_win_left": {
|
||||
"message": "Vänster"
|
||||
},
|
||||
"prefs_chatgpt_win_save_position": {
|
||||
"message": "Spara automatiskt fönstrets position när stängningsknappen används."
|
||||
},
|
||||
"prefs_chatgpt_win_position_info": {
|
||||
"message": "Lämna tomt för att använda standardpositionen."
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "Spara som sammanfattning"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "Lagring"
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "Lagringsstorlek"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "Rensa lagring"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "Är du säker på att du vill rensa all lagrad data (sammanfattningar, skräppostrapporter, översättningar)? Den här åtgärden kan inte ångras."
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "$COUNT$ register borttagna.",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs_OptionText_auto_summary": {
|
||||
"message": "Aktivera automatisk AI-sammanfattning för förhandsgranskningar av meddelanden"
|
||||
},
|
||||
"prefs_OptionText_auto_summary_Info": {
|
||||
"message": "Om markerat kommer ThunderAI automatiskt att generera och visa AI-sammanfattningar ovanför e-postmeddelanden när de öppnas. Observera att detta innebär att alla meddelanden du förhandsgranskar omedelbart skickas till den konfigurerade AI-tjänsten."
|
||||
},
|
||||
"auto_summary_title": {
|
||||
"message": "ThunderAI sammanfattning"
|
||||
},
|
||||
"auto_summary_generating": {
|
||||
"message": "Genererar AI-sammanfattning..."
|
||||
},
|
||||
"auto_summary_failed": {
|
||||
"message": "Misslyckades att generera AI-sammanfattning. Bekräfta dina inställningar och försök igen."
|
||||
},
|
||||
"prefs_OptionText_summarize_auto": {
|
||||
"message": "Sammanfatta meddelanden automatiskt"
|
||||
},
|
||||
"prefs_OptionText_summarize_auto_Info": {
|
||||
"message": "Välj om sammanfattningar ska genereras automatiskt när meddelanden visas. Kräver en API-baserad anslutning (inte ChatGPT Web)."
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode": {
|
||||
"message": "Visa sammanfattning i"
|
||||
},
|
||||
"prefs_OptionText_summarize_display_mode_Info": {
|
||||
"message": "Välj var sammanfattningsresultatet visas. I infogat läge visas en sammanfattningsbanderoll direkt i meddelandefönstret. I chattfönsterläget öppnas AI-chattfönstret."
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length": {
|
||||
"message": "Max skärmlängd"
|
||||
},
|
||||
"prefs_OptionText_summarize_max_display_length_Info": {
|
||||
"message": "Maximalt antal tecken som ska visas i den inbäddade sammanfattningen. Ange 0 för obegränsad gräns."
|
||||
},
|
||||
"summarize_see_more": {
|
||||
"message": "Se mer"
|
||||
},
|
||||
"summarize_see_less": {
|
||||
"message": "Se mindre"
|
||||
},
|
||||
"summarize_title": {
|
||||
"message": "ThunderAI översikt"
|
||||
},
|
||||
"get_ai_summary": {
|
||||
"message": "AI sammanfattning"
|
||||
},
|
||||
"summarize_collapse": {
|
||||
"message": "Fäll in sammanfattning"
|
||||
},
|
||||
"summarize_generating": {
|
||||
"message": "Genererar sammanfattning..."
|
||||
},
|
||||
"summarize_error": {
|
||||
"message": "Misslyckades att generera sammanfattning"
|
||||
},
|
||||
"summarize_click_to_generate": {
|
||||
"message": "Klicka här för att skapa en sammanfattning"
|
||||
},
|
||||
"summarize_chatgpt_web_not_supported": {
|
||||
"message": "Autosammanfattning kräver en API-baserad anslutning. Konfigurera en API-anslutning i ThunderAI-inställningarna."
|
||||
},
|
||||
"summarize_refresh": {
|
||||
"message": "Uppdatera sammanfattning"
|
||||
},
|
||||
"spamfilter_refresh": {
|
||||
"message": "Uppdatera skräppostrapport"
|
||||
},
|
||||
"spamfilter_delete": {
|
||||
"message": "Ta bort skräppostrapport"
|
||||
},
|
||||
"summarize_delete": {
|
||||
"message": "Ta bort sammanfattning"
|
||||
},
|
||||
"summary_by": {
|
||||
"message": "Sammanfattning av"
|
||||
},
|
||||
"prefs_OptionText_action_auto_batch": {
|
||||
"message": "När e-postmeddelandet tas emot"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "Lagringen används för att spara information om skräppostpoäng, sammanfattningar och översättningar av varje meddelande."
|
||||
},
|
||||
"placeholder_thunderai_translate_lang": {
|
||||
"message": "Språket som ska användas i e-postöversättningarna."
|
||||
},
|
||||
"placeholder_thunderai_translate_exclude_lang": {
|
||||
"message": "Språkkoden ska inte översättas när den hittas."
|
||||
},
|
||||
"prefs_OptionText_translate": {
|
||||
"message": "Översätt e-post"
|
||||
},
|
||||
"prefs_OptionText_translate_use_specific_integration_Info": {
|
||||
"message": "Om markerat kommer modellen och API:et som anges nedan att användas för att översätta e-postmeddelanden, oavsett vilket som valts på ThunderAI-alternativsidan."
|
||||
},
|
||||
"prefs_OptionText_translate_Info": {
|
||||
"message": "Om markerad läggs en översättningsknapp till i meddelandetexten."
|
||||
},
|
||||
"prefs_OptionText_btnManageTranslateInfo": {
|
||||
"message": "Hantera översättningsinställningar"
|
||||
},
|
||||
"Translate_PageTitle": {
|
||||
"message": "Hantera översättningsinställningar"
|
||||
},
|
||||
"Translate_info_default": {
|
||||
"message": "På den här sidan kan du ändra standardprompten som används för att översätta e-postmeddelanden."
|
||||
},
|
||||
"Translate_prompt_text_title": {
|
||||
"message": "Aktuell prompttext"
|
||||
},
|
||||
"Translate_prompt_prefs_title": {
|
||||
"message": "Översättningsalternativ"
|
||||
},
|
||||
"prefs_OptionText_translate_auto": {
|
||||
"message": "Översätt meddelanden automatiskt"
|
||||
},
|
||||
"prefs_OptionText_action_auto_disabled": {
|
||||
"message": "Inaktiverad"
|
||||
},
|
||||
"prefs_OptionText_action_auto_manual": {
|
||||
"message": "Endast manuell knapp"
|
||||
},
|
||||
"prefs_OptionText_action_auto_automatic": {
|
||||
"message": "När e-postmeddelandet öppnas"
|
||||
},
|
||||
"prefs_OptionText_translate_auto_Info": {
|
||||
"message": "Välj när meddelanden ska översättas: inaktiverad, endast när du klickar på knappen eller automatiskt när du öppnar ett meddelande."
|
||||
},
|
||||
"prefs_OptionText_display_mode_inline": {
|
||||
"message": "Meddelandepanel (inbäddad)"
|
||||
},
|
||||
"prefs_OptionText_display_mode_webchat": {
|
||||
"message": "Chattfönster"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length": {
|
||||
"message": "Maximal längd på visad översättning"
|
||||
},
|
||||
"prefs_OptionText_translate_max_display_length_Info": {
|
||||
"message": "Maximalt antal tecken som visas i den inbäddade översättningen. 0 = ingen gräns. När den är inställd avkortas längre text med en \"Visa mer\"-knapp."
|
||||
},
|
||||
"translate_see_more": {
|
||||
"message": "Visa mer"
|
||||
},
|
||||
"translate_see_less": {
|
||||
"message": "Visa mindre"
|
||||
},
|
||||
"prefs_OptionText_translate_lang": {
|
||||
"message": "Översättningens målspråk"
|
||||
},
|
||||
"prefs_OptionText_translate_lang_Info": {
|
||||
"message": "Språk att översätta e-postmeddelanden till. Om tomt används standardspråkinställningen."
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang": {
|
||||
"message": "Uteslut språk"
|
||||
},
|
||||
"prefs_OptionText_translate_exclude_lang_Info": {
|
||||
"message": "Kommaavgränsad lista med språkkoder (t.ex. en, fr, it) som ska hoppas över för automatisk översättning. Om e-postmeddelandet är på ett av dessa språk kommer det inte att översättas automatiskt eller så visas inte den manuella knappen."
|
||||
},
|
||||
"prefs_OptionText_Translate_main_prompt": {
|
||||
"message": "Prompten som beskriver översättningsuppgiften:"
|
||||
},
|
||||
"translate_generating": {
|
||||
"message": "Översätter..."
|
||||
},
|
||||
"translate_click_to_generate": {
|
||||
"message": "Klicka här för att översätta detta e-postmeddelande"
|
||||
},
|
||||
"get_ai_translation": {
|
||||
"message": "AI-översättning"
|
||||
},
|
||||
"translate_chatgpt_web_not_supported": {
|
||||
"message": "Automatisk översättning kräver en API-baserad anslutning. Konfigurera en API-anslutning i ThunderAI-inställningarna."
|
||||
},
|
||||
"translate_refresh": {
|
||||
"message": "Uppdatera översättning"
|
||||
},
|
||||
"translate_delete": {
|
||||
"message": "Ta bort översättning"
|
||||
},
|
||||
"translate_banner_title": {
|
||||
"message": "AI-översättning"
|
||||
},
|
||||
"translate_error": {
|
||||
"message": "Översättning misslyckades."
|
||||
},
|
||||
"translate_no_language_configured": {
|
||||
"message": "Översättningsspråket är inte konfigurerat. Ange ett språk i översättningsinställningarna eller ange ett standardspråk i de allmänna inställningarna."
|
||||
},
|
||||
"translate_skipped": {
|
||||
"message": "Översättning hoppas över: Språk uteslutet eller identiskt med målet."
|
||||
},
|
||||
"spam_badge_tooltip": {
|
||||
"message": "Skräppostpoäng — Klicka för att se förklaring"
|
||||
},
|
||||
"translate_by": {
|
||||
"message": "Översättning av"
|
||||
},
|
||||
"placeholder_string": {
|
||||
"message": "Platshållare"
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "För att använda Google Gemini API behöver du en Google Gemini API-nyckel och måste välja en modell."
|
||||
},
|
||||
"prefs_ollama_format_json": {
|
||||
"message": "Tvinga fram JSON-utdata"
|
||||
},
|
||||
"prefs_ollama_format_json_Info": {
|
||||
"message": "Om markerat kommer Ollama att tvingas returnera ett giltigt JSON-svar. Det här alternativet fungerar bara med modeller som stöder strukturerad utdata."
|
||||
},
|
||||
"prefs_specific_api_indicator": {
|
||||
"message": "Använder $1",
|
||||
"placeholders": {
|
||||
"1": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "För att använda Claude API behöver du en Anthropic Claude API-nyckel och måste välja en modell."
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting": {
|
||||
"message": "Strimla formatering"
|
||||
},
|
||||
"prefs_OptionText_summarize_strip_formatting_Info": {
|
||||
"message": "Ta bort HTML och Markdown formatering från den AI-genererade sammanfattningen, så att endast vanlig text visas."
|
||||
},
|
||||
"SpamFilter_skip_addresses_title": {
|
||||
"message": "Lista över e-postadresser att hoppa över"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline": {
|
||||
"message": "E-postmeddelanden från dessa adresser kommer inte att skickas till AI:n för skräppostfiltrering."
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "Lägg till en e-postadress per rad, eller separera med kommatecken."
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook": {
|
||||
"message": "Hoppa över adressböckernas adresser"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_skip_addressbook_Info": {
|
||||
"message": "Om markerat kommer e-postmeddelanden från avsändare i dina adressböcker inte att skickas till AI:n för skräppostfiltrering."
|
||||
},
|
||||
"spamfilter_skip_addressbook_explanation": {
|
||||
"message": "Avsändaren är en kontakt i adressboken."
|
||||
},
|
||||
"addressbook_permission_denied": {
|
||||
"message": "Adressboksbehörighet nekades. Aktivera funktionen igen för att ge behörighet."
|
||||
},
|
||||
"addressbook_permission_error": {
|
||||
"message": "Fel vid begäran om behörighet till adressboken. Försök igen."
|
||||
},
|
||||
"apiwebchat_done": {
|
||||
"message": "Klar!"
|
||||
},
|
||||
"placeholder_mail_full_headers": {
|
||||
"message": "Alla e-postrubriker"
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "Avsändaren finns i listan över e-postadresser som inte ska skickas med skräppost."
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
20
_locales/tr/messages.json
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"extensionDescription": {
|
||||
"message": "E-postalarınızı geliştirmek için ChatGPT, Google Gemini, Claude veya Ollama’yı kullanın!"
|
||||
},
|
||||
"menu_title": {
|
||||
"message": "YZ"
|
||||
},
|
||||
"customPrompts_managePrompts_info_default": {
|
||||
"message": "Varsayılan promptlar düzenlenemez. Bunları devre dışı bırakabilir, ardından prompt metnini kopyalayıp yeni bir prompta yapıştırarak düzenlenmiş bir sürüm oluşturabilirsiniz."
|
||||
},
|
||||
"customPrompts_managePrompts_info_default_2": {
|
||||
"message": "Promptları içe ve dışa aktarabilirsiniz. Aynı kimliğe (ID) sahip mevcut istemlerin üzerine yazılır. Yeni kimliklere (ID) sahip promptlar eklenir."
|
||||
},
|
||||
"customPrompts_managePrompts_info_default_3": {
|
||||
"message": "Her şey doğruysa, içe aktarma işleminden sonra ‘Tümünü Kaydet’ düğmesine tıklayın."
|
||||
},
|
||||
"customPrompts_start_saving": {
|
||||
"message": "Promptlar kaydediliyor…"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,4 @@
|
|||
{
|
||||
"prompt_summarize_this": {
|
||||
"message": "总结一下这个"
|
||||
},
|
||||
"prompt_reply": {
|
||||
"message": "回复此电子邮件"
|
||||
},
|
||||
|
|
@ -107,9 +104,6 @@
|
|||
"chatgpt_btn_model": {
|
||||
"message": "使用当前模型"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "正在发送提示词..."
|
||||
},
|
||||
"AllowedValues": {
|
||||
"message": "允许的值"
|
||||
},
|
||||
|
|
@ -134,10 +128,10 @@
|
|||
"SpamReport_Title": {
|
||||
"message": "垃圾邮件过滤报告"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "否"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "是"
|
||||
},
|
||||
"prompt_rewrite_polite": {
|
||||
|
|
@ -236,9 +230,6 @@
|
|||
"prefs_OptionText_spamfilter_Info": {
|
||||
"message": "如果选中,ThunderAI将自动将垃圾邮件移至垃圾邮件文件夹。"
|
||||
},
|
||||
"sparks_not_installed": {
|
||||
"message": "ThunderAI Sparks 未安装!"
|
||||
},
|
||||
"chatgpt_textarea_not_found_error": {
|
||||
"message": "看起来 ChatGPT 页面加载时间太长。如果加载完成,请点击右边的按钮。如果问题仍然存在,请检查服务状态。"
|
||||
},
|
||||
|
|
@ -323,9 +314,6 @@
|
|||
"prefs_Connection_type_OpenAI_Comp_API": {
|
||||
"message": "OpenAI 兼容的 API"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "如果勾选此项,菜单中的提示将按字母顺序排列。"
|
||||
},
|
||||
"chatgpt_win_send": {
|
||||
"message": "发送"
|
||||
},
|
||||
|
|
@ -341,9 +329,6 @@
|
|||
"prefs_ChatGPT_API_Key": {
|
||||
"message": "ChatGPT API 密钥"
|
||||
},
|
||||
"chagpt_api_connecting": {
|
||||
"message": "尝试使用提供的 API 密钥连接到 OpenAI ChatGPT"
|
||||
},
|
||||
"prefs_OptionText_release_notes": {
|
||||
"message": "发行说明"
|
||||
},
|
||||
|
|
@ -371,9 +356,6 @@
|
|||
"OpenAIComp_empty_model": {
|
||||
"message": "您尚未选择 OpenAI Compatible API 的模型。请在选项页面中选择一个。"
|
||||
},
|
||||
"OpenAIComp_api_connecting": {
|
||||
"message": "尝试使用主机连接到 OpenAI 兼容 API 本地服务器"
|
||||
},
|
||||
"prefs_OpenAIComp_ChatName": {
|
||||
"message": "对话名称"
|
||||
},
|
||||
|
|
@ -416,15 +398,9 @@
|
|||
"importPrompts_invalidPrompts": {
|
||||
"message": "您尝试导入的文件不包含任何有效提示词。"
|
||||
},
|
||||
"andModel": {
|
||||
"message": "和模型"
|
||||
},
|
||||
"ChatGPT_Models_Error_fetching": {
|
||||
"message": "尝试获取 ChatGPT 模型时出错"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "菜单:按字母顺序排列"
|
||||
},
|
||||
"prefsInfoDesc_2": {
|
||||
"message": "要使用 ChatGPT API,您需要一个 OpenAI ChatGPT API 密钥并且必须选择一个模型。"
|
||||
},
|
||||
|
|
@ -501,7 +477,7 @@
|
|||
"message": "如果在 ThunderAI 窗口中遇到登录问题,请使用右侧的按钮在新标签页中打开 ChatGPT,完成登录后关闭该标签页,然后继续使用 ThunderAI。"
|
||||
},
|
||||
"prompt_translate_this_full_text": {
|
||||
"message": "将以下电子邮件翻译成"
|
||||
"message": "将以下电子邮件翻译成 {%thunderai_translate_lang%}。\n\n规则:\n- 翻译主题和正文。\n- 以包含三个字段(“subject”、“body”和“status”)的 JSON 对象形式返回结果。\n- 如果翻译已完成,则状态等于 1。\n- 如果电子邮件是以这些语言“{%thunderai_translate_exclude_lang%}”之一或 {%thunderai_translate_lang%} 语言编写的,请为主体和主题返回空字符串,并将状态设置为 -1。\n- 请勿在 JSON 之外添加解释、注释或任何文本。\n\n邮件主题:{%mail_subject%}\n\n邮件正文:{%mail_html_body%}\n\n仅以 JSON 格式生成响应。输出应仅为一个 JSON 对象。以下是要使用的 JSON 格式示例:\n\n{\n\n\"subject\": \"主题翻译\",\n\"body\": \"正文翻译\",\n\"status\": \"状态结果\"\n}"
|
||||
},
|
||||
"prompt_add_tags": {
|
||||
"message": "为这封电子邮件添加标签"
|
||||
|
|
@ -569,9 +545,6 @@
|
|||
"placeholder_cc_list": {
|
||||
"message": "抄送列表"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "单击一个值进行设置。"
|
||||
},
|
||||
"prefs_OpenAIComp_ForceModel": {
|
||||
"message": "手动填入模型"
|
||||
},
|
||||
|
|
@ -581,9 +554,6 @@
|
|||
"OpenAIComp_force_model_ask": {
|
||||
"message": "在此处填入您想要使用的模型名称。"
|
||||
},
|
||||
"ollama_api_connecting": {
|
||||
"message": "尝试使用主机连接到 Ollama 本地服务器"
|
||||
},
|
||||
"ollama_api_request_failed": {
|
||||
"message": "Ollama API 请求失败"
|
||||
},
|
||||
|
|
@ -626,7 +596,7 @@
|
|||
"prefs_OptionText_placeholders_use_default_value": {
|
||||
"message": "占位符:使用默认值"
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "ThunderAI 选项中定义的默认语言。"
|
||||
},
|
||||
"prefs_OptionText_openai_comp_info_remote": {
|
||||
|
|
@ -635,14 +605,11 @@
|
|||
"thunderai_warning_title": {
|
||||
"message": "ThunderAI 警告"
|
||||
},
|
||||
"google_gemini_api_connecting": {
|
||||
"message": "尝试使用提供的 API 密钥连接到 Google Gemini"
|
||||
},
|
||||
"prefs_SurveyLinkText2": {
|
||||
"message": "单击此处,只需一分钟!"
|
||||
},
|
||||
"prompt_add_tags_full_text": {
|
||||
"message": "请分析以下电子邮件文本,并生成一个 JSON 数组的标签,总结其内容。请使用主题、关键话题和相关描述词作为标签。确保标签简洁且与邮件内容密切相关。\n邮件文本:{%mail_text_body%}\n考虑以下细节以获取上下文:\n- 发件人:{%author%}\n- 收件人:{%recipients%}\n- 抄送列表:{%cc_list%}\n- 邮件主题:{%mail_subject%}\n请仅根据邮件正文和上下文生成标签,忽略无关信息或琐碎细节。\n请仅以 JSON 格式生成回复。输出应仅包含标签的 JSON 数组,不包含任何额外注释或文本。以下是需使用的 JSON 格式示例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
|
||||
"message": "分析以下邮件正文,并生成一个总结其内容的 JSON 标签数组。使用主题、关键话题和相关描述符作为标签。确保标签简洁且与邮件内容相关。\n邮件正文:{%mail_text_body%}\n考虑以下背景详情:\n- 发件人:{%author%}\n- 收件人:{%recipients%}\n- 抄送列表:{%cc_list%}\n- 邮件主题:{%mail_subject%}\n请根据邮件的正文和背景信息生成标签,忽略不必要的信息或琐碎的细节。\n仅以 JSON 格式生成响应。输出应仅为标签的 JSON 数组,不含任何额外注释或文本。以下是要使用的 JSON 格式示例:\n{\n\"tags\": [\"tag1\", \"tag2\", \"tag3\", \"tag4\", \"tag5\"]\n}"
|
||||
},
|
||||
"placeholder_tags_full_list": {
|
||||
"message": "现有标签"
|
||||
|
|
@ -650,9 +617,6 @@
|
|||
"addtags_dialog_title": {
|
||||
"message": "为电子邮件添加标签"
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "将以下电子邮件总结为要点列表。"
|
||||
},
|
||||
"prompt_rewrite_formal_full_text": {
|
||||
"message": "重写以下文字,使其更加正式。回复时只使用重写的文字,不要添加任何额外的评论或其他文字。"
|
||||
},
|
||||
|
|
@ -783,7 +747,7 @@
|
|||
"message": "管理垃圾邮件过滤器设置"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "从以下文本中提取生成日历事件所需的所有相关细节。提取的信息应包括:\n- 事件标题\n- 开始日期和时间(如果指定时区,则包括时区)\n- 结束日期和时间(如果指定时区,则包括时区)\n- 全天事件(如果提及)\n- 参与者 \n确保数据格式清晰且一致,以便可以直接用于创建日历事件。\n如果存在相对时间的引用,请注意邮件的日期和时间为“{%mail_datetime%}”。基于此参考计算开始日期和时间。如果计算出的开始日期和时间早于“{%current_datetime%}”,则使用“{%current_datetime%}”作为基准重新计算开始日期和时间。\n如果未指定持续时间,请将其设置为一小时。\n以下是参与者:{%author%}, {%recipients%}, {%cc_list%}。如有,请排除我的地址:{%account_email_address%}。\n如果无法获取一个或多个所需信息,请以空字符串响应。\n仅以 JSON 格式生成响应。不要包含任何额外的文本或说明,仅提供 JSON。以下是使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日历事件摘要\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\n以下是文本:“{%selected_text%}”"
|
||||
"message": "从以下文本中提取生成日历事件所需的所有相关细节。提取的信息应包括:\n- 事件标题\n- 开始日期和时间(如果指定时区,则包括时区)\n- 结束日期和时间(如果指定时区,则包括时区)\n- 全天事件(如果提及)\n- 参与者 \n确保数据格式清晰且一致,以便可以直接用于创建日历事件。\n如果存在相对时间的引用,请注意邮件的日期和时间为“{%mail_datetime%}”。基于此参考计算开始日期和时间。如果计算出的开始日期和时间早于“{%current_datetime%}”,则使用“{%current_datetime%}”作为基准重新计算开始日期和时间。\n如果未指定持续时间,请将其设置为一小时。\n以下是参与者:{%author%}, {%recipients%}, {%cc_list%}。如有,请排除我的地址:{%account_email_address%}。\n如果该活动为全天活动,endDate 必须为 startDate 的后一天,且时间设置为 \"T000000\"。\n如果无法获取一个或多个所需信息,请以空字符串响应。\n仅以 JSON 格式生成响应。不要包含任何额外的文本或说明,仅提供 JSON。以下是使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日历事件摘要\",\n\"forceAllDay\": false\n\"attendees\": [attendee1@example.com,attendee2@example.com,attendee3@example.com]\n}\n以下是文本:“{%mail_text_body_or_selected%}”"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event": {
|
||||
"message": "从所选文本添加新日历事件"
|
||||
|
|
@ -828,7 +792,7 @@
|
|||
"message": "获取日历事件数据时出错"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "分析以下邮件并判断它是否为垃圾邮件。考虑因素包括可疑关键词、过多的宣传语言、误导性的主题行、索取个人信息的请求以及异常的发件人地址。\n提供一个从 0(非垃圾邮件)到 100(垃圾邮件)的值,并附上不超过 10 个单词的解释。\n如果消息数据缺失,将数值设为0(非垃圾邮件),并说明原因。\n仅以 JSON 格式生成响应。不要包含任何额外文本或解释;仅提供 JSON。以下是使用的格式:\n{\n\"spamValue\": <0 到 100 的整数>,\n\"explanation\": \"简要说明您的判断理由\"\n}\n以下是邮件信息:\n发件人:“{%author%}”\n主题:“{%mail_subject%}”\nHTML 正文:“{%mail_html_body%}”"
|
||||
"message": "分析以下邮件并判断它是否为垃圾邮件。考虑因素包括可疑关键词、过多的宣传语言、误导性的主题行、索取个人信息的请求以及异常的发件人地址。\n提供一个从 0(非垃圾邮件)到 100(垃圾邮件)的值,并附上不超过 10 个单词的解释。\n如果消息数据缺失,将数值设为0(非垃圾邮件),并说明原因。\n仅以 JSON 格式生成响应。不要包含任何额外文本或解释;仅提供 JSON。以下是使用的格式:\n{\n\"explanation\": \"简要说明您的判断理由\",\n\"spamValue\": <0 到 100 的整数>\n}\n以下是邮件信息:\n发件人:“{%author%}”\n主题:“{%mail_subject%}”\nHTML 正文:“{%mail_html_body%}”"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_threshold_Info": {
|
||||
"message": "如果 AI 返回的值高于此阈值,电子邮件将被移至垃圾邮件文件夹。"
|
||||
|
|
@ -851,29 +815,11 @@
|
|||
"Report_Date": {
|
||||
"message": "报告日期"
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "添加标签"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "显示“添加标签”上下文菜单项"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "显示“分析垃圾邮件”上下文菜单项"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "如果选中,则在邮件列表中右键单击电子邮件时,将显示“分析垃圾邮件”上下文菜单项。"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "分析垃圾邮件"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "如果选中,“添加标签”上下文菜单项将在消息列表中右键单击电子邮件时显示。"
|
||||
},
|
||||
"noActiveCalendar": {
|
||||
"message": "未找到可编辑的日历!"
|
||||
},
|
||||
"customPrompts_form_label_use_diff_viewer": {
|
||||
"message": "启用差异查看器"
|
||||
"message": "启用文本差异查看器"
|
||||
},
|
||||
"get_calendar_event_prompt_prefs_title": {
|
||||
"message": "日历事件选项"
|
||||
|
|
@ -918,6 +864,248 @@
|
|||
"message": "说明"
|
||||
},
|
||||
"customPrompts_form_label_use_diff_viewer_title": {
|
||||
"message": "当操作设置为“替换文本”时,可以选择差异查看器。"
|
||||
"message": "当操作设置为“替换文本”时,可以选择文本差异查看器。"
|
||||
},
|
||||
"prompt_reply_custom_command": {
|
||||
"message": "使用附加的提示词指令..."
|
||||
},
|
||||
"prompt_string": {
|
||||
"message": "提示词"
|
||||
},
|
||||
"prefs_OptionText_reply_type_Info": {
|
||||
"message": "此即回复电子邮件时默认采用的回复类型。您可在后续的回信对话框中另行选择其他选项。"
|
||||
},
|
||||
"prefs_OptionText_btnManageCustomDataPH": {
|
||||
"message": "管理您的数据占位符"
|
||||
},
|
||||
"OpenChatGPTTab_Info2": {
|
||||
"message": "从此处打开 ChatGPT Web 版将应用已配置好的模型、项目及自定义 GPT 相关设置。"
|
||||
},
|
||||
"placeholder_mail_headers": {
|
||||
"message": "邮件头"
|
||||
},
|
||||
"placeholder_selected_html": {
|
||||
"message": "已选中的 HTML"
|
||||
},
|
||||
"webchat_save_as_summary": {
|
||||
"message": "另存为摘要"
|
||||
},
|
||||
"prefs_storage_title": {
|
||||
"message": "存储"
|
||||
},
|
||||
"prefs_storage_info": {
|
||||
"message": "该存储用于保存每条消息的垃圾邮件分数、摘要和翻译。"
|
||||
},
|
||||
"prefs_storage_size": {
|
||||
"message": "存储容量"
|
||||
},
|
||||
"prefs_storage_clear_button": {
|
||||
"message": "清除存储"
|
||||
},
|
||||
"prefs_storage_clear_confirm": {
|
||||
"message": "您确定要清除所有已存储的数据(包含:摘要、垃圾邮件报告、翻译等)吗?此操作无法撤销。"
|
||||
},
|
||||
"prefs_storage_clear_done": {
|
||||
"message": "清除存储后显示的消息",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefsInfoDesc_7": {
|
||||
"message": "要使用 Google Gemini API,您需要一个 Google Gemini API 密钥,并且必须选择一个模型。"
|
||||
},
|
||||
"prefsInfoDesc_8": {
|
||||
"message": "要使用 Claude API,您需要一个 Anthropic Claude API 密钥,并且必须选择一个模型。"
|
||||
},
|
||||
"placeholder_mail_text_body_or_selected": {
|
||||
"message": "邮件正文或选定文本"
|
||||
},
|
||||
"placeholder_mail_html_body_or_selected": {
|
||||
"message": "邮件正文或选定的 HTML"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time": {
|
||||
"message": "页面加载等待时间"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_load_wait_time_info": {
|
||||
"message": "在加载附加内容之前等待 ChatGPT 页面加载的时间(以毫秒为单位)。默认值为 1000 毫秒。如果定义了自定义 GPT 或项目,则该值将额外增加 1000 毫秒。"
|
||||
},
|
||||
"sign_msg_as": {
|
||||
"message": "使用以下身份签名"
|
||||
},
|
||||
"prompt_reply_custom_command_full_text": {
|
||||
"message": "请回复以下邮件 \"{%mail_text_body%}\"。{%additional_text%}。仅回复所需文本,不要包含额外的评论或其他文字。"
|
||||
},
|
||||
"prompt_proofread_this": {
|
||||
"message": "校对这封邮件"
|
||||
},
|
||||
"prompt_proofread_this_full_text": {
|
||||
"message": "请校对以下电子邮件,并纠正任何拼写或语法错误。仅回复更正后的文本,不要包含任何额外评论或其他文字。\n\n“{%mail_typed_text%}”"
|
||||
},
|
||||
"reset": {
|
||||
"message": "重置"
|
||||
},
|
||||
"prefs_doc_title": {
|
||||
"message": "文档"
|
||||
},
|
||||
"prefs_doc_setup_guide": {
|
||||
"message": "设置指南"
|
||||
},
|
||||
"prefs_doc_custom_prompt_tutorial": {
|
||||
"message": "自定义提示词教程"
|
||||
},
|
||||
"prefs_doc_open_welcome": {
|
||||
"message": "打开欢迎页面"
|
||||
},
|
||||
"prompt_add_tags_force_lang": {
|
||||
"message": "标签必须用以下方式编写:"
|
||||
},
|
||||
"placeholder_mail_quoted_text": {
|
||||
"message": "邮件正文中的引用文本"
|
||||
},
|
||||
"prompt_get_calendar_event_from_clipboard": {
|
||||
"message": "从剪贴板添加日历事件"
|
||||
},
|
||||
"clipboard_read_error": {
|
||||
"message": "无法读取剪贴板。请检查权限。"
|
||||
},
|
||||
"clipboard_empty_error": {
|
||||
"message": "剪贴板为空。请先复制一些文本。"
|
||||
},
|
||||
"clipboard_permission_denied": {
|
||||
"message": "剪贴板权限被拒绝。请在设置中重新启用该功能以授予权限。"
|
||||
},
|
||||
"clipboard_permission_error": {
|
||||
"message": "请求剪贴板权限时出错,请重试。"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard": {
|
||||
"message": "从剪贴板获取日历事件"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_from_clipboard_Info": {
|
||||
"message": "显示一个额外的菜单项,用于根据剪贴板文本内容创建日历事件。"
|
||||
},
|
||||
"Summarize_prompt_prefs_title": {
|
||||
"message": "摘要选项"
|
||||
},
|
||||
"prompt_summarize": {
|
||||
"message": "总结这封或这些邮件"
|
||||
},
|
||||
"prompt_summarize_full_text": {
|
||||
"message": "请提供以下电子邮件的简明摘要。摘要应不超过 3-5 句话,并概括要点。请使用纯段落格式,不要使用项目符号、列表或 Markdown 格式。\n\n"
|
||||
},
|
||||
"prompt_summarize_email_template": {
|
||||
"message": "邮件模板摘要"
|
||||
},
|
||||
"prompt_summarize_email_template_full_text": {
|
||||
"message": "发件人:{%author%} \n收件人:{%recipients%} \n抄送:{%cc_list%} \n主题:{%mail_subject%} \n日期:{%mail_datetime%} \n附件: {%mail_attachments_info%} \n\n正文:\n{%mail_text_body%}"
|
||||
},
|
||||
"prompt_summarize_email_separator": {
|
||||
"message": "电子邮件分隔符"
|
||||
},
|
||||
"prompt_summarize_email_separator_full_text": {
|
||||
"message": "\n\n----------下一封邮件----------\n\n"
|
||||
},
|
||||
"prompt_get_task": {
|
||||
"message": "添加新任务"
|
||||
},
|
||||
"prompt_get_task_full_text": {
|
||||
"message": "从以下文本中提取生成任务所需的所有相关详细信息。提取的信息应包括:\n- 截止日期和时间(如果指定,包括时区)\n- 任务摘要\n- 开始日期和时间(如果指定,包括时区)\n- 确保数据格式清晰且一致,以便直接用于创建任务。\n如果存在相对时间引用,请认为电子邮件的日期和时间为“{%mail_datetime%}”。根据此参考计算开始日期和时间。如果计算出的开始日期和时间早于“{%current_datetime%}”,请使用“{%current_datetime%}”作为基准重新计算开始日期和时间。\n如果您无法获取一项或多项所需信息,请回复空字符串。\n仅以 JSON 格式生成响应。不要包含任何额外的文本或说明;仅提供 JSON。以下是要使用的格式:\n{\n\"InitialDate\": \"YYYYMMDDTHHMMSS\",\n\"dueDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"在此处填写任务摘要\"\n}\n如果没有关于日期的信息,请将其删除。\n以下是文本:“{%selected_text%}”"
|
||||
},
|
||||
"prefs_OptionText_get_task": {
|
||||
"message": "从选定文本添加新任务"
|
||||
},
|
||||
"prefs_OptionText_get_task_Info": {
|
||||
"message": "如果选中,则会在菜单中添加一个项目,以便从选定的文本获取任务信息。"
|
||||
},
|
||||
"get_task_prompt_prefs_title": {
|
||||
"message": "任务选项"
|
||||
},
|
||||
"prefs_OptionText_Summarize_infoline2": {
|
||||
"message": "您可以根据需要更改提示词,第一个字段是主提示词,第二个字段是单封邮件的模板。邮件列表将附加到主提示词中。邮件将由第三个字段中指定的间隔符分隔。"
|
||||
},
|
||||
"prefs_OptionText_Summarize_main_prompt": {
|
||||
"message": "针对所有选定电子邮件,描述要执行的任务的主要提示:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_template": {
|
||||
"message": "单封邮件的模板:"
|
||||
},
|
||||
"prefs_OptionText_Summarize_email_separator": {
|
||||
"message": "电子邮件地址之间的分隔符:"
|
||||
},
|
||||
"prefs_OptionText_get_calendar_event_Sparks_wrong_version": {
|
||||
"message": "要使用日历事件和任务功能,请安装最新版本的 ThunderAI Sparks 插件。"
|
||||
},
|
||||
"GetTask_PageTitle": {
|
||||
"message": "管理任务设置"
|
||||
},
|
||||
"GetTask_info_default": {
|
||||
"message": "在此页面中,您可以修改用于从选定文本获取任务的默认提示。"
|
||||
},
|
||||
"prefs_OptionText_btnManageTaskInfo": {
|
||||
"message": "管理任务设置"
|
||||
},
|
||||
"task_getting_data_error": {
|
||||
"message": "获取任务数据时出错"
|
||||
},
|
||||
"task_opening_dialog_error": {
|
||||
"message": "打开任务对话框时出错"
|
||||
},
|
||||
"no_valid_data_received": {
|
||||
"message": "未收到来自 AI 的有效数据。"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_Info2": {
|
||||
"message": "请在页面底部选择要为其激活此功能的帐户。"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_uselist": {
|
||||
"message": "仅使用这些标签"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_uselist_Info": {
|
||||
"message": "如果选中此项,AI 将仅添加以下列表中的标签。"
|
||||
},
|
||||
"prefs_OptionText_add_tags_auto_uselist_list_Info": {
|
||||
"message": "列表中必须至少包含一个标签。每行添加一个标签,标签之间用逗号分隔。"
|
||||
},
|
||||
"prompt_add_tags_use_list": {
|
||||
"message": "仅使用此逗号分隔列表中的标签"
|
||||
},
|
||||
"prefs_OptionText_add_tags_use_specific_integration_Info": {
|
||||
"message": "如果选中此项,则无论在 ThunderAI 选项页面中选择哪个模型和 API,都将使用下面指定的模型和 API 向电子邮件添加标签。"
|
||||
},
|
||||
"SpamFilter_skip_addresses_infoline2": {
|
||||
"message": "每行添加一个电子邮件地址,或用逗号分隔。"
|
||||
},
|
||||
"spamfilter_skip_addresses_explanation": {
|
||||
"message": "发件人已在反垃圾邮件跳过列表中。"
|
||||
},
|
||||
"Valid": {
|
||||
"message": "有效的"
|
||||
},
|
||||
"hyprland_warning": {
|
||||
"message": "如果您在打开 AI 聊天窗口时遇到问题,请尝试将高度和宽度值设置为 0。此问题可能在某些 Linux 环境下出现,例如在使用 Hyprland 时。"
|
||||
},
|
||||
"remember_CORS": {
|
||||
"message": "记住,您需要在服务器上设置 CORS 设置!"
|
||||
},
|
||||
"maybe_CORS_openai_comp": {
|
||||
"message": "使用 OpenAI 兼容 API 可能需要在服务器上设置 CORS 设置。"
|
||||
},
|
||||
"CORS_alternative_1": {
|
||||
"message": "CORS设置有问题吗?"
|
||||
},
|
||||
"CORS_alternative_2_new": {
|
||||
"message": "点击下方按钮授予当前主机权限,以避免任何 CORS 问题。"
|
||||
},
|
||||
"CORS_give_host_perm": {
|
||||
"message": "授予当前主机权限"
|
||||
},
|
||||
"CORS_localhost_warn": {
|
||||
"message": "如果您使用 localhost 或 127.0.0.1,因为 AI 服务器托管在您的 PC 上,则需要 <all_urls> 权限。"
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text": {
|
||||
"message": "以纯文本编写"
|
||||
},
|
||||
"prefs_OptionText_composing_plain_text_Info": {
|
||||
"message": "如果您以纯文本格式编写电子邮件,请选中此选项。"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,9 +32,6 @@
|
|||
"prompt_classify": {
|
||||
"message": "分類"
|
||||
},
|
||||
"prompt_summarize_this": {
|
||||
"message": "摘要這段"
|
||||
},
|
||||
"prompt_this": {
|
||||
"message": "提示這段"
|
||||
},
|
||||
|
|
@ -284,7 +281,7 @@
|
|||
"Spam_Value": {
|
||||
"message": "垃圾訊息評分"
|
||||
},
|
||||
"spamfilter_not_moved": {
|
||||
"no_string": {
|
||||
"message": "否"
|
||||
},
|
||||
"Report_Date": {
|
||||
|
|
@ -387,7 +384,7 @@
|
|||
"Date": {
|
||||
"message": "日期"
|
||||
},
|
||||
"spamfilter_moved": {
|
||||
"yes_string": {
|
||||
"message": "是"
|
||||
},
|
||||
"Custom": {
|
||||
|
|
@ -414,9 +411,6 @@
|
|||
"customPrompts_ExportAll": {
|
||||
"message": "匯出所有提示"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet": {
|
||||
"message": "選單:按字母排序"
|
||||
},
|
||||
"prefs_API_Host": {
|
||||
"message": "主機位址"
|
||||
},
|
||||
|
|
@ -429,12 +423,6 @@
|
|||
"prefs_API_Host_Info": {
|
||||
"message": "類似於"
|
||||
},
|
||||
"SendingPrompt": {
|
||||
"message": "送出提示中..."
|
||||
},
|
||||
"context_menu_mzta-add-tags": {
|
||||
"message": "新增標籤"
|
||||
},
|
||||
"placeholder_mail_subject": {
|
||||
"message": "郵件主旨"
|
||||
},
|
||||
|
|
@ -533,9 +521,6 @@
|
|||
"chatgpt_api_request_failed": {
|
||||
"message": "OpenAI ChatGPT API 請求失敗"
|
||||
},
|
||||
"WaitingServerReponse": {
|
||||
"message": "等待伺服器回應"
|
||||
},
|
||||
"error_connection_interrupted": {
|
||||
"message": "與伺服器的連線意外中斷"
|
||||
},
|
||||
|
|
@ -632,12 +617,6 @@
|
|||
"SpamReport_Title": {
|
||||
"message": "垃圾郵件過濾報告"
|
||||
},
|
||||
"context_menu_mzta-spamfilter": {
|
||||
"message": "檢測垃圾郵件"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu_Info": {
|
||||
"message": "如果勾選,則在訊息清單中點右鍵時,會出現「分析垃圾郵件」快顯功能選單項目。"
|
||||
},
|
||||
"apiwebchat_use_this_answer": {
|
||||
"message": "使用這個答案"
|
||||
},
|
||||
|
|
@ -677,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": "請重寫以下文字,使其更有禮貌。僅回覆重寫的文字,不要提供任何額外的註解或其他文字。"
|
||||
|
|
@ -802,9 +781,6 @@
|
|||
"prefs_OptionText_spamfilter_threshold_Info": {
|
||||
"message": "如果 AI 傳回的值高於此閾值,則電子郵件將被移至垃圾郵件資料夾。"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu": {
|
||||
"message": "顯示「新增標籤」在快顯功能選單"
|
||||
},
|
||||
"remember_CORS": {
|
||||
"message": "記住,您需要在伺服器上設定 CORS 設定!"
|
||||
},
|
||||
|
|
@ -993,9 +969,6 @@
|
|||
"prompt_reply_additional_text": {
|
||||
"message": "不要在回覆中加入主旨。"
|
||||
},
|
||||
"prompt_summarize_this_full_text": {
|
||||
"message": "將以下電子郵件總結為要點清單。"
|
||||
},
|
||||
"prefs_OptionText_placeholders_use_default_value": {
|
||||
"message": "佔位符:使用預設值"
|
||||
},
|
||||
|
|
@ -1005,16 +978,13 @@
|
|||
"prefs_OptionText_btnManageSpamFilterInfo": {
|
||||
"message": "管理垃圾郵件設定"
|
||||
},
|
||||
"CORS_give_allurls_perm": {
|
||||
"message": "授予「所有網址」權限"
|
||||
},
|
||||
"prefs_ollama_num_ctx": {
|
||||
"message": "情境 Token 數量"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_custom_gpt": {
|
||||
"message": "ChatGPT 網頁自訂 GPT"
|
||||
},
|
||||
"thunderai_def_lang": {
|
||||
"placeholder_thunderai_def_lang": {
|
||||
"message": "ThunderAI 選項中定義的預設語言。"
|
||||
},
|
||||
"prefs_SurveyLinkText2": {
|
||||
|
|
@ -1026,12 +996,6 @@
|
|||
"spamfilter_threshold_zero": {
|
||||
"message": "垃圾郵件閾值為零!您將把所有郵件標記為垃圾郵件!"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_model_tooltip": {
|
||||
"message": "點擊一個值來設定它。"
|
||||
},
|
||||
"prefs_OptionText_dynamic_menu_order_alphabet_info": {
|
||||
"message": "如果勾選,選單中的提示將按字母順序排列。"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_Info": {
|
||||
"message": "如果勾選,ThunderAI 將自動將垃圾郵件移至垃圾郵件資料夾。"
|
||||
},
|
||||
|
|
@ -1087,7 +1051,7 @@
|
|||
"message": "您尚未選擇 ChatGPT API 的模型。請在選項頁面中選擇一個。"
|
||||
},
|
||||
"prompt_get_calendar_event_full_text": {
|
||||
"message": "從以下文字中提取所有需要生成日曆事件的相關資訊。 提取的資訊應包含:\n- 事件名稱\n- 起始日期和時間(包含時區,如果指定)\n- 結束日期和時間(包含時間區,如果指定)\n- 整天事件(如果提及\n- 參與者\n確保數據以清晰一致的方式格式化,以便直接用於創建日曆事件。\n如果有相對時間參考,請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。 如果計算出的起日期和時間早於「{%current_datetime%}」,則使用「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果持續時間沒有指定,則設定為一小時。\n參與者:{%author%}, {%recipients%}, {%cc_list%}。如果存在,請排除我的地址:{%account_email_address%}。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不要包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日曆事件摘要在此\",\n\"forceAllDay\": false,\n\"attendees\": [\"attendee1@example.com \",\"attendee2@example.com \",\"attendee3@example.com \"]\n}\n這裡是文字:「{%selected_text%}」"
|
||||
"message": "從以下文字中提取所有需要生成日曆事件的相關資訊。 提取的資訊應包含:\n- 事件名稱\n- 起始日期和時間(包含時區,如果指定)\n- 結束日期和時間(包含時間區,如果指定)\n- 整天事件(如果提及\n- 參與者\n確保數據以清晰一致的方式格式化,以便直接用於創建日曆事件。\n如果有相對時間參考,請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。 如果計算出的起日期和時間早於「{%current_datetime%}」,則使用「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果持續時間沒有指定,則設定為一小時。\n參與者:{%author%}, {%recipients%}, {%cc_list%}。如果存在,請排除我的地址:{%account_email_address%}。\n如果該活動為全天活動,endDate 必須為 startDate 的後一天,且時間設置為 \"T000000\"。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不要包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"startDate\": \"YYYYMMDDTHHMMSS\",\n\"endDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"日曆事件摘要在此\",\n\"forceAllDay\": false,\n\"attendees\": [\"attendee1@example.com \",\"attendee2@example.com \",\"attendee3@example.com \"]\n}\n這裡是文字:「{%mail_text_body_or_selected%}」"
|
||||
},
|
||||
"TranslateText": {
|
||||
"message": "您願意幫忙翻譯這個附加元件嗎?"
|
||||
|
|
@ -1095,9 +1059,6 @@
|
|||
"prompt_get_task_full_text": {
|
||||
"message": "從以下文字中提取所有需要生成任務的相關資訊。 提取的資訊應包含:\n- 截止日期和時間(包括時區,如果指定)\n- 任務總結\n- 初始日期和時間(包括時區,如果指定)\n確保數據以清晰一致的方式格式化,以便直接用於建立任務。\n如果有相對時間參考,請考慮電子郵件的日期和時間是 「{%mail_datetime%}」。 計算基於此參考的起日期和時間。如果計算出的起日期和時間早於「{%current_datetime%}」,則使用 「{%current_datetime%}」作為基準重新計算起日期和時間。\n如果無法獲得其中一個或多個所需的資訊,請回覆一個空字串。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。 以下是將要使用的格式:\n{\n\"InitialDate\": \"YYYYMMDDTHHMMSS\",\n\"dueDate\": \"YYYYMMDDTHHMMSS\",\n\"summary\": \"任務總結在此\"\n}\n如果沒有日期資訊,請刪除這些資訊。\n以下是文字:「{%selected_text%}」"
|
||||
},
|
||||
"prefs_OptionText_spamfilter_context_menu": {
|
||||
"message": "顯示「分析垃圾郵件」在快顯功能選單"
|
||||
},
|
||||
"sign_msg_as": {
|
||||
"message": "簽署訊息為"
|
||||
},
|
||||
|
|
@ -1111,7 +1072,7 @@
|
|||
"message": "ChatGPT 網頁介面可能會發生一些變化,導致附加元件無法正常運作。請查看此頁面底部連結的「服務狀態」頁面。另外,請記住,首次使用 ThunderAI 時,您需要登入 ChatGPT。"
|
||||
},
|
||||
"prompt_spamfilter_full_text": {
|
||||
"message": "分析以下 Email 並判斷是否為垃圾郵件。 考慮因素包括可疑關鍵字、過度推銷性語言、誤導性主旨、要求個人資訊以及異常的寄件人地址。\n提供一個 0 (非垃圾郵件) 到 100 (垃圾郵件) 的分數,並提供一段不超過 10 字的說明。\n如果缺少訊息資料,則設定分數為 0 (非垃圾郵件),並說明原因。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。以下是將要使用的格式:\n{\n\"spamValue\": <由 0 到 100 的整數>,\n\"explanation\": \"簡短說明您的理由\"\n}\n以下是郵件資訊:\n寄件人:「{%author%}」\n主旨:「{%mail_subject%}」\nHTML 內容:「{%mail_html_body%}」"
|
||||
"message": "分析以下 Email 並判斷是否為垃圾郵件。 考慮因素包括可疑關鍵字、過度推銷性語言、誤導性主旨、要求個人資訊以及異常的寄件人地址。\n提供一個 0 (非垃圾郵件) 到 100 (垃圾郵件) 的分數,並提供一段不超過 10 字的說明。\n如果缺少訊息資料,則設定分數為 0 (非垃圾郵件),並說明原因。\n請以 JSON 格式回覆,不包含任何額外的文字或說明,提供僅 JSON。以下是將要使用的格式:\n{\n\"explanation\": \"簡短說明您的理由\",\n\"spamValue\": <由 0 到 100 的整數>\n}\n以下是郵件資訊:\n寄件人:「{%author%}」\n主旨:「{%mail_subject%}」\nHTML 內容:「{%mail_html_body%}」"
|
||||
},
|
||||
"task_getting_data_error": {
|
||||
"message": "取得取得任務資料時出錯"
|
||||
|
|
@ -1137,15 +1098,9 @@
|
|||
"prompt_rewrite_formal_full_text": {
|
||||
"message": "請將以下文字重寫得更正式一些。僅回覆重寫的文字,不要提供任何額外的註解或其他文字。"
|
||||
},
|
||||
"CORS_alternative_2": {
|
||||
"message": "點擊下方按鈕,授予「所有網址」權限,以避免任何 CORS 問題。"
|
||||
},
|
||||
"GoogleGemini_SystemInstruction_Info": {
|
||||
"message": "當您設定系統指示時,您會為模型提供額外情境來理解任務,提供更客製化的回應,並遵守將要發送的提示的特定指南。"
|
||||
},
|
||||
"prefs_OptionText_add_tags_context_menu_Info": {
|
||||
"message": "如果勾選,則右鍵單擊訊息清單中的電子郵件時將顯示「新增標籤」在快顯功能選單。"
|
||||
},
|
||||
"prefs_OptionText_chatgpt_web_custom_gpt_info": {
|
||||
"message": "這是將針對 ChatGPT 網頁介面強制執行的自訂 GPT。"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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,11 @@ 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) + "]";
|
||||
|
||||
let workerInitMessage = {
|
||||
type: 'init',
|
||||
|
|
@ -151,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' }
|
||||
]
|
||||
};
|
||||
|
||||
|
|
@ -236,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);
|
||||
|
|
@ -256,21 +266,29 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|||
promptData = message;
|
||||
//send the received prompt to the llm api
|
||||
if(message.do_custom_text=="1") {
|
||||
messageInput._showCustomTextField();
|
||||
messageInput._showCustomTextField(message.prompt_info?.custom_text_array);
|
||||
}else{
|
||||
sendPrompt(message);
|
||||
}
|
||||
break;
|
||||
case 'api_send_custom_text':
|
||||
let userInput = message.custom_text;
|
||||
let userInput = message.custom_text; // From version 4.0.0 this is an array
|
||||
if(userInput !== null) {
|
||||
if(!placeholdersUtils.hasPlaceholder(promptData.prompt, 'additional_text')){
|
||||
// no additional_text placeholder, do as usual
|
||||
promptData.prompt += " " + userInput;
|
||||
const inputText = Array.isArray(userInput) ? userInput.map(obj => obj.custom_text).join(' ') : userInput;
|
||||
promptData.prompt += " " + inputText;
|
||||
}else{
|
||||
// we have the additional_text placeholder, do the magic!
|
||||
let finalSubs = {};
|
||||
finalSubs["additional_text"] = userInput;
|
||||
|
||||
if (Array.isArray(userInput)) {
|
||||
userInput.forEach(obj => {
|
||||
finalSubs[obj.placeholder.replace(/^{%|%}$/g, '').trim()] = obj.custom_text;
|
||||
});
|
||||
} else {
|
||||
finalSubs["additional_text"] = userInput;
|
||||
}
|
||||
promptData.prompt = placeholdersUtils.replacePlaceholders({
|
||||
text: promptData.prompt,
|
||||
replacements: finalSubs,
|
||||
|
|
@ -282,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;
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
<head>
|
||||
<!-- Other meta tags and stylesheets -->
|
||||
<link rel="stylesheet" type="text/css" href="styles.css">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<!-- Use the custom tags directly -->
|
||||
|
|
|
|||
|
|
@ -66,15 +66,44 @@ messagesInputStyle.textContent = `
|
|||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
background: #F2F2F2;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 3px;
|
||||
}
|
||||
#statusLoggerImg{
|
||||
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:auto;
|
||||
width:50%;
|
||||
min-width:300px;
|
||||
max-width:80%;
|
||||
height:auto;
|
||||
max-height:80%;
|
||||
border-radius:5px;
|
||||
overflow:auto;
|
||||
overflow-y:auto;
|
||||
overflow-x:hidden;
|
||||
position:fixed;
|
||||
top:50%;
|
||||
left:50%;
|
||||
|
|
@ -84,15 +113,18 @@ messagesInputStyle.textContent = `
|
|||
background:#333;
|
||||
color:white;
|
||||
border:3px solid white;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#mzta-custom_loading{
|
||||
height:50px;display:none;
|
||||
}
|
||||
#mzta-custom_textarea{
|
||||
color:black;
|
||||
padding:1px;
|
||||
padding:5px;
|
||||
font-size:15px;
|
||||
width:100%;
|
||||
box-sizing: border-box;
|
||||
resize: vertical;
|
||||
}
|
||||
#mzta-custom_info{
|
||||
text-align:center;
|
||||
|
|
@ -100,6 +132,19 @@ messagesInputStyle.textContent = `
|
|||
padding-bottom:10px;
|
||||
font-size:15px;
|
||||
}
|
||||
#mzta-custom_info span{
|
||||
font-size:0.8em;
|
||||
}
|
||||
#mzta-custom_step{
|
||||
position: absolute;
|
||||
bottom: 5px;
|
||||
right: 10px;
|
||||
font-size: 12px;
|
||||
color: #ccc;
|
||||
}
|
||||
#mzta-custom_btn{
|
||||
margin-top:7px;
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
#messageInputField {
|
||||
background-color: #303030;
|
||||
|
|
@ -109,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);
|
||||
|
|
@ -165,8 +220,14 @@ messageInputTemplate.content.appendChild(stopButton);
|
|||
|
||||
const statusLogger = document.createElement('div');
|
||||
statusLogger.id = 'statusLogger';
|
||||
statusLogger.textContent = '';
|
||||
statusLogger.style.display = 'none';
|
||||
const statusLoggerImg = document.createElement('img');
|
||||
statusLoggerImg.id = 'statusLoggerImg';
|
||||
statusLoggerImg.src = browser.runtime.getURL('/images/mzta-loading.svg');
|
||||
statusLogger.appendChild(statusLoggerImg);
|
||||
const statusLoggerText = document.createElement('span');
|
||||
statusLoggerText.id = 'statusLoggerText';
|
||||
statusLogger.appendChild(statusLoggerText);
|
||||
messageInputTemplate.content.appendChild(statusLogger);
|
||||
|
||||
//div per custom text
|
||||
|
|
@ -178,6 +239,7 @@ customInfo.textContent = browser.i18n.getMessage("chatgpt_win_custom_text");
|
|||
customDiv.appendChild(customInfo);
|
||||
const customTextArea = document.createElement('textarea');
|
||||
customTextArea.id = 'mzta-custom_textarea';
|
||||
customTextArea.rows = 5;
|
||||
customDiv.appendChild(customTextArea);
|
||||
const customLoading = document.createElement('img');
|
||||
customLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||
|
|
@ -188,11 +250,17 @@ customBtn.id = 'mzta-custom_btn';
|
|||
customBtn.textContent = browser.i18n.getMessage("chatgpt_win_send");
|
||||
customBtn.classList.add('mzta-btn');
|
||||
customDiv.appendChild(customBtn);
|
||||
const customStep = document.createElement('div');
|
||||
customStep.id = 'mzta-custom_step';
|
||||
customDiv.appendChild(customStep);
|
||||
messageInputTemplate.content.appendChild(customDiv);
|
||||
|
||||
class MessageInput extends HTMLElement {
|
||||
|
||||
model = '';
|
||||
_doneTimeout = null;
|
||||
_customTextArray = [];
|
||||
_currentCustomTextIndex = 0;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
|
@ -203,6 +271,8 @@ class MessageInput extends HTMLElement {
|
|||
this._sendButton = shadowRoot.querySelector('#sendButton');
|
||||
this._stopButton = shadowRoot.querySelector('#stopButton');
|
||||
this._statusLogger = shadowRoot.querySelector('#statusLogger');
|
||||
this._statusLoggerImg = shadowRoot.querySelector('#statusLoggerImg');
|
||||
this._statusLoggerText = shadowRoot.querySelector('#statusLoggerText');
|
||||
|
||||
this._messageInputField.addEventListener('keydown', this._handleKeyDown.bind(this));
|
||||
this._sendButton.addEventListener('click', this._handleClick.bind(this));
|
||||
|
|
@ -212,8 +282,14 @@ class MessageInput extends HTMLElement {
|
|||
this._customTextArea = shadowRoot.querySelector('#mzta-custom_textarea');
|
||||
this._customLoading = shadowRoot.querySelector('#mzta-custom_loading');
|
||||
this._customBtn = shadowRoot.querySelector('#mzta-custom_btn');
|
||||
this._customStep = shadowRoot.querySelector('#mzta-custom_step');
|
||||
this._customBtn.addEventListener("click", () => { this._customTextBtnClick({customBtn:this._customBtn,customLoading:this._customLoading,customDiv:this._customText}) });
|
||||
this._customTextArea.addEventListener("keydown", (event) => { if(event.code == "Enter" && event.ctrlKey) this._customTextBtnClick({customBtn:this._customBtn,customLoading:this._customLoading,customDiv:this._customText}) });
|
||||
this._customTextArea.addEventListener("keydown", (event) => {
|
||||
if (event.key === "Enter" && !event.shiftKey) {
|
||||
event.preventDefault();
|
||||
this._customTextBtnClick({customBtn:this._customBtn,customLoading:this._customLoading,customDiv:this._customText});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
|
|
@ -240,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');
|
||||
|
|
@ -249,20 +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._statusLogger.textContent = message;
|
||||
this._statusLoggerText.textContent = message;
|
||||
}
|
||||
|
||||
showStatusMessage() {
|
||||
this._statusLogger.style.display = 'block';
|
||||
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) {
|
||||
|
|
@ -298,6 +410,7 @@ class MessageInput extends HTMLElement {
|
|||
this.messagesAreaComponent.appendUserMessage(messageContent);
|
||||
}
|
||||
this.setStatusMessage(browser.i18n.getMessage('WaitingServerResponse') + '...');
|
||||
this._statusLoggerImg.style.display = 'inline';
|
||||
this.showStatusMessage();
|
||||
this.worker.postMessage({ type: 'chatMessage', message: messageContent });
|
||||
}
|
||||
|
|
@ -306,21 +419,64 @@ class MessageInput extends HTMLElement {
|
|||
this._messageInputField.value = msg;
|
||||
}
|
||||
|
||||
_showCustomTextField(){
|
||||
_showCustomTextField(custom_text_array){
|
||||
this._customTextArray = custom_text_array || [];
|
||||
if (this._customTextArray.length === 0) {
|
||||
this._customTextArray.push({ placeholder: "{%additional_text%}", info: "" });
|
||||
}
|
||||
this._currentCustomTextIndex = 0;
|
||||
this._customText.style.display = 'block';
|
||||
this._renderCustomTextStep();
|
||||
}
|
||||
|
||||
_renderCustomTextStep() {
|
||||
const currentItem = this._customTextArray[this._currentCustomTextIndex];
|
||||
const infoDiv = this.shadowRoot.querySelector('#mzta-custom_info');
|
||||
|
||||
this._customTextArea.value = "";
|
||||
infoDiv.textContent = browser.i18n.getMessage("chatgpt_win_custom_text");
|
||||
|
||||
if (currentItem.info && currentItem.info.trim() !== "") {
|
||||
infoDiv.appendChild(document.createElement("br"));
|
||||
const infoSpan = document.createElement("span");
|
||||
infoSpan.textContent = "[" + browser.i18n.getMessage("customPrompts_form_label_ID") + ": " + currentItem.info + "]";
|
||||
infoDiv.appendChild(infoSpan);
|
||||
}
|
||||
|
||||
if(this._customTextArray.length > 1) {
|
||||
this._customStep.textContent = (this._currentCustomTextIndex + 1) + "/" + this._customTextArray.length;
|
||||
this._customStep.style.display = 'block';
|
||||
} else {
|
||||
this._customStep.style.display = 'none';
|
||||
}
|
||||
|
||||
this._customTextArea.focus();
|
||||
}
|
||||
|
||||
async _customTextBtnClick(args) {
|
||||
const customText = this._customTextArea.value;
|
||||
// console.log(">>>>>>>>>>>>>>>> customText: " + customText);
|
||||
args.customBtn.disabled = true;
|
||||
args.customBtn.classList.add('disabled');
|
||||
args.customLoading.style.display = 'inline-block';
|
||||
args.customLoading.style.display = 'none';
|
||||
let tab = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
browser.runtime.sendMessage({ command: "api_send_custom_text", custom_text: customText, tabId: tab[0].id });
|
||||
args.customDiv.style.display = 'none';
|
||||
|
||||
if (this._customTextArray[this._currentCustomTextIndex]) {
|
||||
this._customTextArray[this._currentCustomTextIndex].custom_text = customText;
|
||||
}
|
||||
|
||||
this._currentCustomTextIndex++;
|
||||
|
||||
if (this._currentCustomTextIndex < this._customTextArray.length) {
|
||||
this._renderCustomTextStep();
|
||||
} else {
|
||||
args.customBtn.disabled = true;
|
||||
args.customBtn.classList.add('disabled');
|
||||
args.customLoading.style.display = 'inline-block';
|
||||
|
||||
let tab = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
browser.runtime.sendMessage({ command: "api_send_custom_text", custom_text: this._customTextArray, tabId: tab[0].id });
|
||||
args.customDiv.style.display = 'none';
|
||||
|
||||
args.customBtn.disabled = false;
|
||||
args.customBtn.classList.remove('disabled');
|
||||
args.customLoading.style.display = 'none';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -273,7 +307,11 @@ class MessagesArea extends HTMLElement {
|
|||
const messageElement = document.createElement('div');
|
||||
messageElement.classList.add('message', type);
|
||||
// Replace \n with <br> for correct HTML display
|
||||
messageElement.appendChild(htmlStringToFragment(messageText));
|
||||
if (type === "info") {
|
||||
messageElement.appendChild(htmlStringToFragment(messageText));
|
||||
} else {
|
||||
messageElement.appendChild(textWithBrToFragment(messageText));
|
||||
}
|
||||
// messageElement.textContent = messageText;
|
||||
// // Replace \n with <br> elements for correct HTML display
|
||||
// messageElement.innerHTML = '';
|
||||
|
|
@ -449,11 +487,34 @@ class MessagesArea extends HTMLElement {
|
|||
closeButton.addEventListener('click', async () => {
|
||||
browser.runtime.sendMessage({command: "chatgpt_close", window_id: (await browser.windows.getCurrent()).id}); // close window
|
||||
});
|
||||
if(promptData.action != 0) {
|
||||
if(promptData.action != 0) {
|
||||
actionButtons.appendChild(splitButton);
|
||||
selectionInfo.style.display = "block"; // show selection info
|
||||
}
|
||||
|
||||
// Save as Summary button (only shown for summary webchat sessions)
|
||||
if(promptData.prompt_info?.headerMessageId && promptData.prompt_info?.summaryTabId) {
|
||||
const saveSummaryButton = document.createElement('button');
|
||||
saveSummaryButton.textContent = browser.i18n.getMessage("webchat_save_as_summary");
|
||||
saveSummaryButton.classList.add('action_btn');
|
||||
saveSummaryButton.addEventListener('click', async () => {
|
||||
let finalText = removeAloneBRs(fullTextHTMLAtAssignment);
|
||||
const selectedHTML = this.getCurrentSelectionHTML();
|
||||
if(selectedHTML != "") {
|
||||
finalText = removeAloneBRs(selectedHTML);
|
||||
}
|
||||
await browser.runtime.sendMessage({
|
||||
command: "chatgpt_saveSummary",
|
||||
text: finalText,
|
||||
headerMessageId: promptData.prompt_info.headerMessageId,
|
||||
tabId: promptData.prompt_info.summaryTabId || promptData.tabId,
|
||||
});
|
||||
browser.runtime.sendMessage({command: "chatgpt_close", window_id: (await browser.windows.getCurrent()).id});
|
||||
});
|
||||
actionButtons.appendChild(saveSummaryButton);
|
||||
selectionInfo.style.display = "block";
|
||||
}
|
||||
|
||||
// diff viewer button
|
||||
if(promptData.prompt_info?.use_diff_viewer == "1") {
|
||||
const diffvButton = document.createElement('button');
|
||||
|
|
@ -531,23 +592,67 @@ class MessagesArea extends HTMLElement {
|
|||
this.accumulatingMessageEl.querySelectorAll('.token').forEach(tokenEl => {
|
||||
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 = convertNewlinesToBr(md.render(fullText));
|
||||
const html = md.render(fullText);
|
||||
|
||||
this.fullTextHTML += html;
|
||||
|
||||
// console.log(">>>>>>>>>>>>>>>> flushAccumulatingMessage this.fullTextHTML: " + this.fullTextHTML);
|
||||
|
||||
|
||||
// Create a new DOM parser
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(html, 'text/html');
|
||||
|
||||
convertTextNodeNewlinesToBr(doc.body);
|
||||
|
||||
// Remove existing tokens
|
||||
while (this.accumulatingMessageEl.firstChild) {
|
||||
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 => {
|
||||
|
|
@ -575,6 +680,20 @@ class MessagesArea extends HTMLElement {
|
|||
customElements.define('messages-area', MessagesArea);
|
||||
|
||||
|
||||
function textWithBrToFragment(text) {
|
||||
const fragment = document.createDocumentFragment();
|
||||
const segments = text.split(/<br\s*\/?>/gi);
|
||||
segments.forEach((segment, idx) => {
|
||||
if (segment.length > 0) {
|
||||
fragment.appendChild(document.createTextNode(segment));
|
||||
}
|
||||
if (idx < segments.length - 1) {
|
||||
fragment.appendChild(document.createElement('br'));
|
||||
}
|
||||
});
|
||||
return fragment;
|
||||
}
|
||||
|
||||
function htmlStringToFragment(htmlString) {
|
||||
// console.log(">>>>>>>>>>>>>>>> htmlStringToFragment htmlString: " + htmlString);
|
||||
const normalizedHtml = htmlString.replace(/\n/g, '<br>');
|
||||
|
|
@ -586,8 +705,23 @@ function htmlStringToFragment(htmlString) {
|
|||
return fragment;
|
||||
}
|
||||
|
||||
function convertNewlinesToBr(text) {
|
||||
return text.replace(/\n/g, '<br>');
|
||||
function convertTextNodeNewlinesToBr(element) {
|
||||
element.childNodes.forEach(node => {
|
||||
if (node.nodeType === Node.TEXT_NODE) {
|
||||
if (node.textContent.includes('\n') && node.textContent.trim() !== '') {
|
||||
const fragment = document.createDocumentFragment();
|
||||
node.textContent.split('\n').forEach((part, idx, arr) => {
|
||||
fragment.appendChild(document.createTextNode(part));
|
||||
if (idx < arr.length - 1) {
|
||||
fragment.appendChild(document.createElement('br'));
|
||||
}
|
||||
});
|
||||
node.parentNode.replaceChild(fragment, node);
|
||||
}
|
||||
} else if (node.nodeType === Node.ELEMENT_NODE) {
|
||||
convertTextNodeNewlinesToBr(node);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function removeAloneBRs(htmlString) {
|
||||
|
|
|
|||
230
claude-spec/01-architecture.md
Normal file
|
|
@ -0,0 +1,230 @@
|
|||
# Architecture
|
||||
|
||||
## Extension Structure (Manifest V2)
|
||||
|
||||
ThunderAI runs as a standard Thunderbird WebExtension with three main execution contexts:
|
||||
|
||||
```
|
||||
Background Page → mzta-background.html / mzta-background.js
|
||||
Popup → popup/mzta-popup.html / popup/mzta-popup.js
|
||||
Options Page → options/mzta-options.html / options/mzta-options.js
|
||||
Feature Pages → pages/*/
|
||||
Content Script → js/lib/diff.js (injected into chatgpt.com)
|
||||
Web Workers → js/workers/model-worker-*.js (one per API provider)
|
||||
```
|
||||
|
||||
## Data Flow: User Action → AI Response
|
||||
|
||||
```
|
||||
User clicks popup or presses Ctrl+Alt+A
|
||||
↓
|
||||
popup/mzta-popup.js (renders prompt list, handles selection)
|
||||
↓ (sendMessage to background)
|
||||
mzta-background.js (orchestrates everything)
|
||||
↓
|
||||
js/mzta-placeholders.js (resolves {%placeholder%} values from email data)
|
||||
↓
|
||||
js/mzta-prompts.js (builds final prompt string)
|
||||
↓
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Based on connection_type: │
|
||||
│ chatgpt_web → js/mzta-chatgpt.js │ (opens ChatGPT window)
|
||||
│ chatgpt_api → Web Worker (openai) │
|
||||
│ ollama_api → Web Worker (ollama) │
|
||||
│ google_gemini → Web Worker (gemini) │
|
||||
│ anthropic → Web Worker (anthropic)│
|
||||
│ openai_comp → Web Worker (comp) │
|
||||
└─────────────────────────────────────────┘
|
||||
↓
|
||||
Result returned to background
|
||||
↓
|
||||
js/mzta-compose-script.js (inserts text into Thunderbird compose window and display window)
|
||||
```
|
||||
|
||||
### Data Flow: Inline Summary on Message Display
|
||||
|
||||
The `summarize_display_mode` preference (`'inline'` or `'webchat'`) controls where
|
||||
the summary is displayed. The `summarize_auto` preference controls when it is triggered.
|
||||
|
||||
- `summarize_auto = 2` (automatic) always generates inline, regardless of `summarize_display_mode`.
|
||||
- `summarize_auto = 3` (on receive) pre-caches the summary silently when the email arrives via `onNewMailReceived`. When the user later opens the message, the cache hit triggers an instant display.
|
||||
- `summarize_auto = 1` (manual button) respects `summarize_display_mode`:
|
||||
- `'inline'` → button click triggers inline generation
|
||||
- `'webchat'` → button click opens the AI chat window via `_openSummaryWebchat()`
|
||||
- Context menu summarize also respects `summarize_display_mode`:
|
||||
- `'inline'` with a single message → generates inline via `_generateSummaryForMessage()`
|
||||
- `'webchat'` or multiple messages → opens the AI chat window via `openChatGPT()`
|
||||
|
||||
```
|
||||
User opens/selects a message in Thunderbird
|
||||
↓
|
||||
mzta-compose-script.js (sends "initSummary" to background)
|
||||
↓
|
||||
mzta-background.js (checks summarize_auto + summarize_display_mode prefs)
|
||||
↓
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ summarize_auto = 0 → do nothing │
|
||||
│ summarize_auto = 1 → show "click to generate" button │
|
||||
│ display_mode = inline → click triggers inline gen │
|
||||
│ display_mode = webchat → click opens chat window │
|
||||
│ summarize_auto = 2 → generate immediately (always inline)│
|
||||
│ summarize_auto = 3 → cache hit (pre-cached on receive) │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
↓ (if generating inline)
|
||||
taSummaryStore (check cache / set processing)
|
||||
↓ (cache miss)
|
||||
mzta-special-commands (via Web Worker, NOT chatgpt_web)
|
||||
↓
|
||||
taSummaryStore (save result via taStorage)
|
||||
↓
|
||||
mzta-compose-script.js (render summary banner in message body)
|
||||
```
|
||||
|
||||
### Data Flow: Inline Translation on Message Display
|
||||
|
||||
The `translate_auto` preference controls when translation is triggered.
|
||||
Translation always renders inline (webchat mode has been removed).
|
||||
|
||||
The target language is determined by `translate_lang` (fallback on `default_chatgpt_lang`).
|
||||
|
||||
```
|
||||
User opens/selects a message in Thunderbird
|
||||
↓
|
||||
mzta-compose-script.js (sends "initTranslation" to background)
|
||||
↓
|
||||
mzta-background.js (checks translate + translate_auto prefs)
|
||||
↓
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ translate_auto = 0 → do nothing │
|
||||
│ translate_auto = 1 → show "click to translate" button │
|
||||
│ translate_auto = 2 → generate immediately │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
taTranslationStore (check cache / set processing)
|
||||
↓ (cache miss)
|
||||
mzta-special-commands (via Web Worker, NOT chatgpt_web)
|
||||
↓
|
||||
taTranslationStore (save result via taStorage)
|
||||
↓
|
||||
mzta-compose-script.js (render translation banner in message body)
|
||||
```
|
||||
### Data Flow: Background Summary on Email Receive (summarize_auto = 3)
|
||||
|
||||
When `summarize_auto = 3`, a summary is generated silently when a new email arrives. The flow mirrors `add_tags_auto`:
|
||||
|
||||
```
|
||||
New email arrives
|
||||
↓
|
||||
browser.messages.onNewMailReceived
|
||||
↓
|
||||
newEmailListener (checks _process_incoming, which includes summarize_auto === 3)
|
||||
↓
|
||||
processEmails({ summarizeOnReceive: true })
|
||||
↓ (single loop — shared with addTagsAuto / spamFilter / translateOnReceive)
|
||||
_generateSummaryForMessage(headerMessageId, null, { messageData })
|
||||
← tabId is null → no UI messages sent, silent pre-cache
|
||||
↓
|
||||
taSummaryStore.saveSummary()
|
||||
↓
|
||||
[later] user opens the message → initSummary → cache hit → showSummary instantly
|
||||
```
|
||||
|
||||
### Data Flow: Background Translation on Email Receive (translate_auto = 3)
|
||||
|
||||
When `translate_auto = 3`, a translation is generated silently when a new email arrives. Mirrors the summarize on-receive flow:
|
||||
|
||||
```
|
||||
New email arrives
|
||||
↓
|
||||
browser.messages.onNewMailReceived
|
||||
↓
|
||||
newEmailListener (checks _process_incoming, which includes translate_auto === 3)
|
||||
↓
|
||||
processEmails({ translateOnReceive: true })
|
||||
↓ (single loop — shared with addTagsAuto / spamFilter / summarizeOnReceive)
|
||||
_generateTranslationForMessage(headerMessageId, null, { messageData })
|
||||
← tabId is null → no UI messages sent, silent pre-cache
|
||||
↓
|
||||
taTranslationStore.saveTranslation()
|
||||
↓
|
||||
[later] user opens the message → initTranslation → cache hit → showTranslation instantly
|
||||
```
|
||||
|
||||
## Key Modules
|
||||
|
||||
| File | Role |
|
||||
|------|------|
|
||||
| `mzta-background.js` | Main orchestrator: listens for messages, coordinates all features |
|
||||
| `js/mzta-menus.js` | Context menu creation and management |
|
||||
| `js/mzta-prompts.js` | Prompt definitions (built-in) and custom prompt loading |
|
||||
| `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 (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 |
|
||||
| `js/mzta-i18n.js` | i18n helper (wraps `browser.i18n.getMessage`) |
|
||||
| `js/mzta-logger.js` | Debug logging (gated by `do_debug` pref) |
|
||||
| `js/mzta-store.js` | Storage abstraction helpers |
|
||||
| `js/mzta-storage.js` | Unified per-message storage layer (`taStorage` class) for summary, spam, and translation data |
|
||||
| `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-addtags-exclusion-list.js` | Tag exclusion list management |
|
||||
| `js/mzta-placeholders-autocomplete.js` | Autocomplete for placeholders in prompt editor |
|
||||
|
||||
## API Modules (`js/api/`)
|
||||
|
||||
Each file handles HTTP communication for one provider:
|
||||
|
||||
| File | Provider |
|
||||
|------|----------|
|
||||
| `anthropic.js` | Claude (Anthropic) API |
|
||||
| `google_gemini.js` | Google Gemini API |
|
||||
| `ollama.js` | Ollama (self-hosted) |
|
||||
| `openai_comp.js` | OpenAI-compatible APIs |
|
||||
| `openai_comp_configs.js` | Pre-configured providers (DeepSeek, Grok, Mistral, OpenRouter, Perplexity) |
|
||||
| `openai_responses.js` | OpenAI Responses API |
|
||||
|
||||
## Web Workers (`js/workers/`)
|
||||
|
||||
Each API provider has a dedicated Web Worker so API calls don't block the UI:
|
||||
|
||||
- `model-worker-anthropic.js`
|
||||
- `model-worker-google_gemini.js`
|
||||
- `model-worker-ollama.js`
|
||||
- `model-worker-openai_comp.js`
|
||||
- `model-worker-openai_responses.js`
|
||||
|
||||
Workers receive a message with the prompt and settings, make the API call, and post back the result.
|
||||
|
||||
## Feature Pages (`pages/`)
|
||||
|
||||
Each subdirectory is a self-contained settings/UI page for a specific feature:
|
||||
|
||||
| Directory | Feature |
|
||||
|-----------|---------|
|
||||
| `addtags/` | Auto-tagging configuration |
|
||||
| `customprompts/` | Custom prompt editor |
|
||||
| `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 |
|
||||
| `onboarding/` | First-run welcome page |
|
||||
| `_lib/` | Shared libraries used by pages |
|
||||
|
||||
## Storage
|
||||
|
||||
All preferences are stored via `browser.storage.local`. The keys and default values are defined in `options/mzta-options-default.js` (`prefs_default` export). Custom prompts and custom placeholders are stored separately in storage under their own keys.
|
||||
|
||||
### Per-Message Data Storage
|
||||
|
||||
Per-message data (summaries, spam reports, translations) is stored via `js/mzta-storage.js` (`taStorage` class). Each record is keyed by `msg:<headerMessageId>` in `messenger.storage.local` and follows schema version 1. Records contain optional fields: `summary`, `spam`, `translation`, plus metadata (`v`, `ts`). The `taStorage` class provides typed read/write/delete methods per field, automatic record cleanup when all fields are removed, and age-based cleanup.
|
||||
|
||||
`js/mzta-summarystore.js` (`taSummaryStore` class) wraps `taStorage` for summary-specific operations: load/save/remove summaries, track in-flight generation state via `browser.storage.session`, enforce a 100-entry cache limit with oldest-first truncation, and store error states.
|
||||
|
||||
`js/mzta-translationstore.js` (`taTranslationStore` class) wraps `taStorage` for translation-specific operations: load/save/remove translations, track in-flight generation state via `browser.storage.session`, enforce a 100-entry cache limit with oldest-first truncation, and store error states. Each translation record stores `translated_text`, `lang`, and optional error information.
|
||||
203
claude-spec/02-prompts.md
Normal file
|
|
@ -0,0 +1,203 @@
|
|||
# Prompts System
|
||||
|
||||
## Overview
|
||||
|
||||
Prompts are the core user-facing feature of ThunderAI. Each prompt defines an AI instruction and how it behaves. There are two kinds:
|
||||
|
||||
- **Built-in prompts** — defined in `js/mzta-prompts.js`
|
||||
- **Custom prompts** — created by the user and stored in `browser.storage.local`
|
||||
|
||||
## Prompt Properties
|
||||
|
||||
### Base Properties (built-in only)
|
||||
|
||||
| Property | Type | Description |
|
||||
|----------|------|-------------|
|
||||
| `id` | string | Unique identifier |
|
||||
| `name` | string | `__MSG_key__` i18n reference or plain text |
|
||||
| `prompt` | string | The prompt template text (may contain `{%placeholder%}` tokens) |
|
||||
| `type` | number | `0` = always visible, `1` = reading email only, `2` = composing only |
|
||||
| `action` | number | `0` = close, `1` = reply (open compose), `2` = substitute text in-place |
|
||||
| `need_selected` | number | `0` = use full message body, `1` = requires text selection |
|
||||
| `need_signature` | number | `0` = no signature, `1` = include signature |
|
||||
| `need_custom_text` | number | `0` = no custom input, `1` = show custom text input field |
|
||||
| `define_response_lang` | number | `0` = no language hint, `1` = append response language instruction |
|
||||
| `use_diff_viewer` | number | `0` = normal output, `1` = show diff viewer (ChatGPT Web only) |
|
||||
|
||||
### User Properties (stored per-prompt in storage)
|
||||
|
||||
| Property | Type | Description |
|
||||
|----------|------|-------------|
|
||||
| `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
|
||||
|
||||
Each prompt can override the global API connection. These mirror the keys in `integration_options_config` and `prefs_default`:
|
||||
|
||||
| Property | Description |
|
||||
|----------|-------------|
|
||||
| `connection_type` | Override API type for this prompt |
|
||||
| `chatgpt_web_model` | Override ChatGPT Web model |
|
||||
| `chatgpt_web_project` | Override ChatGPT Web project |
|
||||
| `chatgpt_web_custom_gpt` | Override custom GPT |
|
||||
| All `chatgpt_*`, `ollama_*`, `openai_comp_*`, `google_gemini_*`, `anthropic_*` keys | Override specific API settings |
|
||||
|
||||
## Special Prompts
|
||||
|
||||
Some prompts trigger additional Thunderbird actions beyond just sending text to the AI. They are identified by their `id`:
|
||||
|
||||
| ID | Feature |
|
||||
|----|---------|
|
||||
| `add_tags` | Auto-tag the email after AI response |
|
||||
| `spamfilter` | Classify as spam and optionally move email |
|
||||
| `summarize` | Summarize email content |
|
||||
| `get_calendar_event` | Extract and create a calendar event |
|
||||
| `get_task` | Extract and create a task |
|
||||
| `translate` | Translate email content into a target language |
|
||||
|
||||
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:
|
||||
|
||||
**Context Menu Summarize** (right-click on messages in message list):
|
||||
- Activated via the `summarize` context menu item, controlled by the `summarize` feature flag
|
||||
- Uses 3 special prompts stored in `specialPrompts`:
|
||||
- `prompt_summarize` — the main instruction prompt for the LLM
|
||||
- `prompt_summarize_email_template` — template for formatting each email's content
|
||||
- `prompt_summarize_email_separator` — separator text between multiple emails
|
||||
- Supports multi-email summarization: each selected message is formatted with the email template, joined by the separator, then prepended with the instruction prompt
|
||||
- All 3 prompts support placeholder autocomplete (`{%placeholder%}` syntax)
|
||||
- Result is displayed via `openChatGPT()` in the standard chat output window (not inline)
|
||||
- Default prompt texts are stored as i18n keys: `prompt_summarize_full_text`, `prompt_summarize_email_template_full_text`, `prompt_summarize_email_separator_full_text`
|
||||
|
||||
**Inline Summary on Message Display** (automatic or manual per `summarize_auto` pref):
|
||||
- Uses the same 3 special prompts as webchat mode, via `taPromptUtils.buildSummaryPrompt()` in `js/mzta-utils-prompt.js`
|
||||
- Does **not** support `chatgpt_web` connection type (shows error if configured)
|
||||
- Result is rendered as a styled banner at the top of the message body via `mzta-compose-script.js`
|
||||
- Banner includes a refresh button (↻) to regenerate the summary
|
||||
- Cached per-message via `taSummaryStore` / `taStorage` (max 100 entries)
|
||||
|
||||
**Unified Prompt Building** — `taPromptUtils.buildSummaryPrompt(messageDataArray)`:
|
||||
- All summary paths (inline, webchat single, webchat multi) use this single method
|
||||
- Accepts an array of `{ message, fullMessage }` entries
|
||||
- Returns `{ promptText, promptInfo }` where `promptInfo` is the `prompt_summarize` prompt object
|
||||
|
||||
### Translate: Inline-Only Prompt System
|
||||
|
||||
The translate feature uses a single special prompt (`prompt_translate_this`) for translating emails. Translation always renders inline (no webchat mode).
|
||||
|
||||
**Inline Translation on Message Display** (controlled by `translate_auto` pref):
|
||||
- Uses a single special prompt: `prompt_translate_this`
|
||||
- The prompt uses placeholders (`{%mail_subject%}`, `{%mail_html_body%}`, `{%thunderai_translate_lang%}`, `{%thunderai_translate_exclude_lang%}`) resolved via the standard placeholder system
|
||||
- The AI response is a JSON object: `{ "subject": "...", "body": "...", "status": "1"|"-1" }`
|
||||
- `status = "1"`: translation completed, subject and body are displayed
|
||||
- `status = "-1"`: translation skipped (excluded/target language), a "skipped" message is shown
|
||||
- Target language is determined by `translate_lang` pref, falling back to `default_chatgpt_lang`
|
||||
- Does **not** support `chatgpt_web` connection type (shows error if configured)
|
||||
- Result is rendered as a styled banner (green/teal theme) in the message body via `mzta-compose-script.js`
|
||||
- Banner includes refresh (↻) and delete (×) buttons
|
||||
- Cached per-message via `taTranslationStore` / `taStorage` (max 100 entries)
|
||||
- The prompt was originally a regular prompt (`defaultPrompts`) and was moved to `specialPrompts` with `is_special: "1"` and `type: "1"` (reading email only)
|
||||
|
||||
**Prompt Building** — `taPromptUtils.buildTranslationPrompt(fullMessage)`:
|
||||
- Retrieves the `prompt_translate_this` special prompt text
|
||||
- Resolves placeholders via `placeholdersUtils.getPlaceholdersValues()` + `replacePlaceholders()`
|
||||
- Returns `{ promptText, promptInfo }`
|
||||
|
||||
## Prompt Types Reference
|
||||
|
||||
```
|
||||
type 0 → shown when reading AND composing
|
||||
type 1 → shown only when reading an email (message display)
|
||||
type 2 → shown only when composing an email
|
||||
```
|
||||
|
||||
## Action Types Reference
|
||||
|
||||
```
|
||||
action 0 → no output, just close (e.g. for tag/spam actions handled in background)
|
||||
action 1 → open a reply compose window with AI response
|
||||
action 2 → replace selected text (or insert) in compose window
|
||||
```
|
||||
|
||||
## Adding a New Built-in Prompt
|
||||
|
||||
1. Add the prompt object to the `defaultPrompts` array in `js/mzta-prompts.js`
|
||||
2. Add the `name` string key to `_locales/en/messages.json`
|
||||
3. If the prompt text needs a localized string, add it to `_locales/en/messages.json` as well
|
||||
4. Reference any needed placeholders using `{%placeholder_id%}` syntax in the `prompt` field
|
||||
|
||||
## Custom Prompts
|
||||
|
||||
Custom prompts are stored in `browser.storage.local` and managed via `pages/customprompts/`. They follow the same property structure as built-in prompts but are created/edited/deleted by the user through the UI. Custom placeholders can also be referenced in custom prompt text.
|
||||
79
claude-spec/03-placeholders.md
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
# Placeholders System
|
||||
|
||||
## Overview
|
||||
|
||||
Placeholders are dynamic tokens embedded in prompt text that get replaced with real data at runtime (email content, headers, user input, etc.).
|
||||
|
||||
**Format:** `{%placeholder_id%}`
|
||||
|
||||
Example in a prompt: `"Summarize this email: {%mail_text_body_or_selected%}"`
|
||||
|
||||
## Placeholder Properties
|
||||
|
||||
| Property | Type | Description |
|
||||
|----------|------|-------------|
|
||||
| `id` | string | Unique identifier used in `{%id%}` tokens |
|
||||
| `name` | string | Display name (i18n `__MSG_key__` or plain text) |
|
||||
| `default_value` | string | Value used if placeholder cannot be resolved |
|
||||
| `type` | number | `0` = always, `1` = reading only, `2` = composing only |
|
||||
| `is_default` | string | `"1"` = built-in (not editable/deletable), `"0"` = custom |
|
||||
| `is_dynamic` | string | `"0"` = fixed value, `"1"` = dynamic (takes a parameter after `:`) |
|
||||
| `enabled` | number | `0` = disabled, `1` = enabled |
|
||||
| `text` | string | Content for custom placeholders only |
|
||||
|
||||
## Built-in Placeholders (defined in `js/mzta-placeholders.js`)
|
||||
|
||||
| ID | Description | Type |
|
||||
|----|-------------|------|
|
||||
| `mail_text_body` | Full plain text of the email | 0 |
|
||||
| `mail_html_body` | Full HTML of the email | 0 |
|
||||
| `mail_typed_text` | Text typed so far in compose window | 2 |
|
||||
| `mail_text_body_or_selected` | Plain text body, or selected text if any | 1 |
|
||||
| `mail_html_body_or_selected` | HTML body, or selected HTML if any | 1 |
|
||||
| `mail_selected_text` | Only the selected text | 1 |
|
||||
| `mail_selected_html` | Only the selected HTML | 1 |
|
||||
| `mail_subject` | Email subject line | 0 |
|
||||
| `mail_date` | Email date | 1 |
|
||||
| `mail_author` | Email sender | 0 |
|
||||
| `mail_recipients` | Email recipients | 0 |
|
||||
| `mail_tags` | Current tags on the email | 1 |
|
||||
| `mail_available_tags` | All available tags in Thunderbird | 1 |
|
||||
| `identity_name` | Current identity display name | 0 |
|
||||
| `identity_email` | Current identity email address | 0 |
|
||||
| `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
|
||||
|
||||
Dynamic placeholders use a colon separator to pass a parameter:
|
||||
|
||||
```
|
||||
{%additional_text:my_field_id%} → shows an input field labelled "my_field_id" in the popup
|
||||
{%mail_header:x-spam-score%} → fetches the X-Spam-Score header value
|
||||
```
|
||||
|
||||
The `is_dynamic: "1"` property signals this behavior in the placeholder definition.
|
||||
|
||||
## Custom Placeholders
|
||||
|
||||
Users can define their own placeholders via `pages/customdataplaceholders/`. Custom placeholders:
|
||||
- Have `is_default: "0"`
|
||||
- Have a `text` property containing the replacement value
|
||||
- Are stored in `browser.storage.local`
|
||||
- Are merged with default placeholders at runtime before prompt processing
|
||||
|
||||
## Placeholder Resolution Order
|
||||
|
||||
1. Built-in placeholders are defined in `js/mzta-placeholders.js`
|
||||
2. Custom placeholders are loaded from storage
|
||||
3. At runtime, `mzta-background.js` gathers email data (via Thunderbird APIs)
|
||||
4. Each `{%id%}` token in the prompt string is replaced with the resolved value
|
||||
5. If a value cannot be resolved, `default_value` is used as fallback
|
||||
|
||||
## Adding a New Built-in Placeholder
|
||||
|
||||
1. Add the object to the `defaultPlaceholders` array in `js/mzta-placeholders.js`
|
||||
2. Add the `name` i18n key to `_locales/en/messages.json` as `placeholder_<id>` (or choose a descriptive key)
|
||||
3. Implement the resolution logic in the relevant section of `mzta-background.js`
|
||||
119
claude-spec/04-api-integrations.md
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
# API Integrations
|
||||
|
||||
## Connection Types
|
||||
|
||||
The active AI provider is controlled by the `connection_type` preference. Possible values:
|
||||
|
||||
| `connection_type` value | Provider |
|
||||
|------------------------|----------|
|
||||
| `chatgpt_web` | ChatGPT Web (no API key, opens browser window) |
|
||||
| `chatgpt_api` | OpenAI API (ChatGPT via API key) |
|
||||
| `ollama_api` | Ollama (self-hosted LLM) |
|
||||
| `openai_comp_api` | OpenAI-compatible API |
|
||||
| `google_gemini_api` | Google Gemini API |
|
||||
| `anthropic_api` | Claude (Anthropic) API |
|
||||
|
||||
The global default is `chatgpt_web`. Each special prompt (`add_tags`, `spamfilter`, etc.) can independently override this via its own `{prefix}_connection_type` pref.
|
||||
|
||||
## Provider Configuration
|
||||
|
||||
Each provider has its own settings block in `integration_options_config` (`options/mzta-options-default.js`):
|
||||
|
||||
### ChatGPT Web
|
||||
Controlled via `js/mzta-chatgpt.js`. Opens a browser window to `chatgpt.com`, injects the prompt via DOM automation, and reads back the response. Settings: `chatgpt_web_model`, `chatgpt_web_tempchat`, `chatgpt_web_project`, `chatgpt_web_custom_gpt`, `chatgpt_web_load_wait_time`.
|
||||
|
||||
Content script `js/lib/diff.js` is injected into ChatGPT pages for diff-view support.
|
||||
|
||||
### OpenAI API (`chatgpt_api`)
|
||||
- Module: `js/api/openai_responses.js`
|
||||
- Worker: `js/workers/model-worker-openai_responses.js`
|
||||
- Settings keys: `chatgpt_api_key`, `chatgpt_model`, `chatgpt_developer_messages`, `chatgpt_temperature`, `chatgpt_store`
|
||||
|
||||
### Ollama (`ollama_api`)
|
||||
- Module: `js/api/ollama.js`
|
||||
- Worker: `js/workers/model-worker-ollama.js`
|
||||
- Settings keys: `ollama_host`, `ollama_model`, `ollama_num_ctx`, `ollama_temperature`, `ollama_think`, `ollama_format_json`
|
||||
- Requires CORS to be configured on the Ollama server
|
||||
|
||||
### OpenAI-Compatible (`openai_comp_api`)
|
||||
- Module: `js/api/openai_comp.js`
|
||||
- Worker: `js/workers/model-worker-openai_comp.js`
|
||||
- Settings keys: `openai_comp_host`, `openai_comp_model`, `openai_comp_api_key`, `openai_comp_use_v1`, `openai_comp_chat_name`, `openai_comp_temperature`
|
||||
- Pre-configured providers: `js/api/openai_comp_configs.js` (DeepSeek, Grok, Mistral, OpenRouter, Perplexity)
|
||||
|
||||
### Google Gemini (`google_gemini_api`)
|
||||
- Module: `js/api/google_gemini.js`
|
||||
- Worker: `js/workers/model-worker-google_gemini.js`
|
||||
- Settings keys: `google_gemini_api_key`, `google_gemini_model`, `google_gemini_system_instruction`, `google_gemini_thinking_budget`, `google_gemini_temperature`
|
||||
|
||||
### 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`, `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
|
||||
|
||||
For all API-based providers (everything except ChatGPT Web), the call goes through a Web Worker:
|
||||
|
||||
```
|
||||
mzta-background.js
|
||||
→ creates new Worker('js/workers/model-worker-<provider>.js')
|
||||
→ postMessage({ prompt, settings })
|
||||
→ worker makes HTTP fetch to provider API
|
||||
→ worker postMessage({ result }) back
|
||||
→ background handles result
|
||||
```
|
||||
|
||||
This keeps API calls off the main thread and avoids blocking the Thunderbird UI.
|
||||
|
||||
## Optional Permissions
|
||||
|
||||
API calls require host permissions. These are declared as `optional_permissions` in `manifest.json` and requested at runtime:
|
||||
|
||||
- `https://*.chatgpt.com/*` and `https://*.openai.com/*` for ChatGPT
|
||||
- `https://*.anthropic.com/*` for Claude
|
||||
- `https://*/*` and `http://*/*` for Ollama and OpenAI-compatible endpoints
|
||||
|
||||
## Adding a New Provider
|
||||
|
||||
1. Create `js/api/<provider>.js` with the API call logic
|
||||
2. Create `js/workers/model-worker-<provider>.js` that imports and calls the API module
|
||||
3. Add a new `connection_type` value constant
|
||||
4. Add settings keys to `integration_options_config` in `options/mzta-options-default.js`
|
||||
5. Add UI controls to `options/mzta-options.html` and `options/mzta-options.js`
|
||||
6. Add the new `connection_type` case to the dispatch logic in `mzta-background.js`
|
||||
7. Add required host permissions to `manifest.json` optional_permissions
|
||||
8. Add i18n strings to `_locales/en/messages.json`
|
||||
161
claude-spec/05-options.md
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
# Options & Settings System
|
||||
|
||||
## Overview
|
||||
|
||||
All extension preferences are stored in `browser.storage.local`. Defaults and the full list of valid keys are defined in `options/mzta-options-default.js`.
|
||||
|
||||
## Key Exports from `mzta-options-default.js`
|
||||
|
||||
| Export | Description |
|
||||
|--------|-------------|
|
||||
| `prefs_default` | All preference keys with their default values |
|
||||
| `integration_options_config` | Per-provider API settings structure |
|
||||
| `getDynamicSettingsDefaults(keysFilter)` | Returns per-special-prompt integration defaults |
|
||||
| `getDynamicSettingValue(prefs, prefix, settingName)` | Reads a prefixed setting for a special prompt |
|
||||
|
||||
## Settings Structure
|
||||
|
||||
### Global Integration Settings
|
||||
|
||||
Stored flat in `prefs_default` with `{provider}_{key}` naming:
|
||||
|
||||
```
|
||||
chatgpt_api_key, chatgpt_model, chatgpt_developer_messages, chatgpt_temperature, chatgpt_store
|
||||
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_extended_thinking_budget
|
||||
```
|
||||
|
||||
Plus the global connection selector:
|
||||
```
|
||||
connection_type (default: 'chatgpt_web')
|
||||
use_specific_integration (default: false)
|
||||
```
|
||||
|
||||
### Special Prompt Integration Overrides
|
||||
|
||||
The 6 special prompts (`add_tags`, `spamfilter`, `summarize`, `get_calendar_event`, `get_task`, `translate`) each get their own `use_specific_integration` and `connection_type` keys:
|
||||
|
||||
```
|
||||
{prefix}_use_specific_integration (default: false)
|
||||
{prefix}_connection_type (default: 'chatgpt_api')
|
||||
```
|
||||
|
||||
These are generated programmatically at the bottom of `mzta-options-default.js` using `special_prompts_with_integration` array.
|
||||
|
||||
### UI & Feature Preferences
|
||||
|
||||
| Key | Default | Description |
|
||||
|-----|---------|-------------|
|
||||
| `do_debug` | `false` | Enable debug logging |
|
||||
| `chatgpt_win_height` | `800` | ChatGPT window height |
|
||||
| `chatgpt_win_width` | `700` | ChatGPT window width |
|
||||
| `chatgpt_win_top` | `''` | Window top position |
|
||||
| `chatgpt_win_left` | `''` | Window left position |
|
||||
| `chatgpt_win_save_position` | `false` | Remember window position |
|
||||
| `default_chatgpt_lang` | `''` | Force response language |
|
||||
| `default_sign_name` | `''` | Default signature name |
|
||||
| `reply_type` | `'reply_all'` | Default reply type |
|
||||
| `composing_plain_text` | `false` | Use plain text in compose |
|
||||
| `chatgpt_web_model` | `''` | ChatGPT Web model override |
|
||||
| `chatgpt_web_tempchat` | `false` | Use temporary chat |
|
||||
| `chatgpt_web_project` | `''` | ChatGPT Web project |
|
||||
| `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` | 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
|
||||
|
||||
| Key | Default | Description |
|
||||
|-----|---------|-------------|
|
||||
| `add_tags` | `false` | Enable auto-tagging feature |
|
||||
| `add_tags_maxnum` | `3` | Max tags to apply |
|
||||
| `add_tags_hide_exclusions` | `false` | Hide excluded tags from menu |
|
||||
| `add_tags_exclusions_exact_match` | `false` | Exact match for exclusions |
|
||||
| `add_tags_first_uppercase` | `true` | Capitalize first letter of tags |
|
||||
| `add_tags_force_lang` | `true` | Force language for tags |
|
||||
| `add_tags_auto` | `false` | Auto-tag on message open |
|
||||
| `add_tags_auto_force_existing` | `false` | Only use existing tags |
|
||||
| `add_tags_auto_only_inbox` | `true` | Auto-tag only inbox messages |
|
||||
| `add_tags_auto_uselist` | `false` | Use tag allow-list |
|
||||
| `add_tags_auto_uselist_list` | `''` | Tag allow-list content |
|
||||
| `add_tags_enabled_accounts` | `[]` | Accounts where auto-tag is active |
|
||||
| `get_calendar_event` | `true` | Enable calendar event extraction |
|
||||
| `get_calendar_event_from_clipboard` | `false` | Enable calendar from clipboard |
|
||||
| `get_task` | `true` | Enable task creation |
|
||||
| `calendar_enforce_timezone` | `false` | Force specific timezone |
|
||||
| `calendar_timezone` | `''` | Timezone to enforce |
|
||||
| `calendar_no_selection` | `false` | Skip selection prompt |
|
||||
| `spamfilter` | `false` | Enable spam filter |
|
||||
| `spamfilter_threshold` | `70` | Spam confidence threshold (%) |
|
||||
| `spamfilter_enabled_accounts` | `[]` | Accounts where spam filter is active |
|
||||
| `spamfilter_show_msg_panel` | `true` | Show info panel on spam detection |
|
||||
| `summarize` | `false` | Enable email summarization |
|
||||
| `summarize_auto` | `1` | Auto-summarize mode: `0` = disabled, `1` = manual (show "click to generate" button), `2` = automatic (generate on message open), `3` = generate on email receive (background pre-cache via `onNewMailReceived`, no UI during generation) |
|
||||
| `summarize_display_mode` | `'inline'` | Where to display summaries: `'inline'` = message pane banner, `'webchat'` = AI chat window. Note: `summarize_auto = 2` and `summarize_auto = 3` always use inline regardless of this setting. |
|
||||
| `summarize_max_display_length` | `0` | Maximum characters shown in inline summary before truncation. `0` = no limit (show full text). When set, text is truncated at a word boundary and a "See more"/"See less" toggle link is shown. |
|
||||
| `summarize_strip_formatting` | `false` | Strip HTML and Markdown formatting from AI-generated summaries, showing plain text only. |
|
||||
| `translate` | `true` | Enable email translation |
|
||||
| `translate_auto` | `0` | Auto-translate mode: `0` = disabled, `1` = manual (show button), `2` = automatic (translate on message open), `3` = generate on email receive (background pre-cache via `onNewMailReceived`, no UI during generation) |
|
||||
| `translate_max_display_length` | `0` | Maximum characters shown in inline translation before truncation. `0` = no limit (show full text). When set, text is truncated at a word boundary and a "See more"/"See less" toggle link is shown. |
|
||||
| `translate_lang` | `''` | Target language for translation. Falls back to `default_chatgpt_lang` if empty. |
|
||||
|
||||
### Summarize Settings Page (`pages/summarize/`)
|
||||
|
||||
The summarize settings page provides:
|
||||
|
||||
1. **Specific integration checkbox** — enables per-feature API override (like other special prompts)
|
||||
2. **Auto-summarize dropdown** (`summarize_auto`) — three modes:
|
||||
- `0` (Disabled) — no inline summaries
|
||||
- `1` (Manual) — shows a "Click to generate summary" button in message display
|
||||
- `2` (Automatic) — generates summary immediately when message is opened
|
||||
3. **Display mode dropdown** (`summarize_display_mode`) — controls where summaries are shown:
|
||||
- `'inline'` — summary banner in the message pane (default)
|
||||
- `'webchat'` — opens the AI chat window
|
||||
- Note: `summarize_auto = 2` always generates inline regardless of this setting. Context menu summarize with multiple messages always falls back to webchat.
|
||||
4. **Max display length** (`summarize_max_display_length`) — number input, limits inline summary text to N characters. `0` = no limit. When truncated, a "See more"/"See less" toggle link is appended.
|
||||
5. **Strip formatting** (`summarize_strip_formatting`) — checkbox, removes HTML/Markdown formatting from AI summary responses, displaying plain text only. Default: off.
|
||||
6. **Three editable prompts** (used by context menu summarize and webchat mode):
|
||||
- Summarize instruction prompt (`prompt_summarize`)
|
||||
- Email template prompt (`prompt_summarize_email_template`)
|
||||
- Email separator prompt (`prompt_summarize_email_separator`)
|
||||
- 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:
|
||||
|
||||
1. **Specific integration checkbox** — enables per-feature API override (like other special prompts)
|
||||
2. **Auto-translate dropdown** (`translate_auto`) — three modes:
|
||||
- `0` (Disabled) — no inline translations
|
||||
- `1` (Manual) — shows a "Get AI Translation" button in message display
|
||||
- `2` (Automatic) — generates translation immediately when message is opened
|
||||
3. **Max display length** (`translate_max_display_length`) — number input, limits inline translation text to N characters. `0` = no limit. When truncated, a "See more"/"See less" toggle link is appended.
|
||||
4. **Target language** (`translate_lang`) — text input for the destination language. If empty, falls back to `default_chatgpt_lang`.
|
||||
5. **One editable prompt** — the translation instruction prompt (`prompt_translate_this`) with Save/Reset buttons and placeholder autocomplete. Default text comes from i18n string `prompt_translate_this_full_text`.
|
||||
|
||||
## Adding a New Preference
|
||||
|
||||
1. Add the key and default value to `prefs_default` in `options/mzta-options-default.js`
|
||||
2. Add UI control to `options/mzta-options.html`
|
||||
3. Add load/save logic to `options/mzta-options.js`
|
||||
4. Add i18n label to `_locales/en/messages.json`
|
||||
5. Read the pref in the relevant module via `browser.storage.local.get()`
|
||||
|
||||
## Reading Preferences at Runtime
|
||||
|
||||
```javascript
|
||||
const prefs = await browser.storage.local.get(prefs_default);
|
||||
// prefs now contains all keys with defaults for any unset values
|
||||
const myPref = prefs.my_new_pref;
|
||||
```
|
||||
91
claude-spec/06-localization.md
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
# Localization
|
||||
|
||||
## Golden Rule
|
||||
|
||||
**Only ever modify `_locales/en/messages.json`.**
|
||||
|
||||
All other locale files (`de`, `fr`, `it`, `es`, `zh_Hans`, `zh_Hant`, `pl`, `ru`, `pt-br`, `sv`, `el`, `cs`, `hr`, `ja`, `nb_NO`) are managed by translators through [Weblate](https://hosted.weblate.org/). Never edit them manually.
|
||||
|
||||
## Message File Format
|
||||
|
||||
Each entry in `_locales/en/messages.json` follows the standard WebExtension i18n format:
|
||||
|
||||
```json
|
||||
"key_name": {
|
||||
"message": "The English text",
|
||||
"description": "Context for translators explaining where/how this string is used"
|
||||
}
|
||||
```
|
||||
|
||||
The `description` field is important — it helps Weblate translators understand the context.
|
||||
|
||||
## Using Strings in Code
|
||||
|
||||
### In JavaScript
|
||||
```javascript
|
||||
import { i18n } from './mzta-i18n.js';
|
||||
const text = i18n('key_name');
|
||||
// or directly:
|
||||
const text = browser.i18n.getMessage('key_name');
|
||||
```
|
||||
|
||||
### In HTML
|
||||
```html
|
||||
<span data-i18n="key_name"></span>
|
||||
<!-- or via manifest/attribute references: -->
|
||||
__MSG_key_name__
|
||||
```
|
||||
|
||||
### In manifest.json
|
||||
```json
|
||||
"description": "__MSG_extensionDescription__"
|
||||
```
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
| Prefix | Usage |
|
||||
|--------|-------|
|
||||
| `menu_*` | Context menu and popup menu labels |
|
||||
| `prompt_*` | Built-in prompt names |
|
||||
| `placeholder_*` | Placeholder display names |
|
||||
| `options_*` | Settings page labels |
|
||||
| `pages_*` | Feature page labels |
|
||||
| `error_*` | Error messages |
|
||||
| `info_*` | Informational messages |
|
||||
| `btn_*` | Button labels |
|
||||
|
||||
## Adding a New String
|
||||
|
||||
1. Open `_locales/en/messages.json`
|
||||
2. Add the new key in alphabetical order within the file (or near related keys)
|
||||
3. Include both `message` and `description` fields
|
||||
4. Use the string in code via `browser.i18n.getMessage('key_name')` or `__MSG_key_name__`
|
||||
|
||||
Example:
|
||||
```json
|
||||
"my_new_feature_label": {
|
||||
"message": "My New Feature",
|
||||
"description": "Label for the new feature button in the options page"
|
||||
}
|
||||
```
|
||||
|
||||
## Supported Languages (16)
|
||||
|
||||
| Code | Language |
|
||||
|------|----------|
|
||||
| `en` | English (source) |
|
||||
| `de` | German |
|
||||
| `es` | Spanish |
|
||||
| `fr` | French |
|
||||
| `it` | Italian |
|
||||
| `pl` | Polish |
|
||||
| `ru` | Russian |
|
||||
| `pt-br` | Brazilian Portuguese |
|
||||
| `sv` | Swedish |
|
||||
| `el` | Greek |
|
||||
| `cs` | Czech |
|
||||
| `hr` | Croatian |
|
||||
| `ja` | Japanese |
|
||||
| `nb_NO` | Norwegian Bokmål |
|
||||
| `zh_Hans` | Chinese Simplified |
|
||||
| `zh_Hant` | Chinese Traditional |
|
||||
398
claude-spec/99-thunderbird-team-spec.md
Normal file
|
|
@ -0,0 +1,398 @@
|
|||
# Thunderbird WebExtensions Development Guidelines
|
||||
|
||||
> **Purpose:** This file provides operative guidelines for Claude when helping develop or modify ThunderAI. These rules override general AI assistant behavior and must be followed strictly.
|
||||
|
||||
## ThunderAI-Specific Context
|
||||
|
||||
- ThunderAI uses **Manifest Version 2** — do not suggest or apply any MV3 migration.
|
||||
- No build tools, no transpilation, no npm — plain ES6 modules loaded directly.
|
||||
- The manifest already uses `browser_specific_settings` (not `applications`).
|
||||
- All module imports use relative paths with `.js` extension.
|
||||
- The `mzta-` prefix is used for all core module filenames.
|
||||
|
||||
---
|
||||
|
||||
## Important Guidelines for AI Assistants
|
||||
|
||||
### 1. Always use `browser_specific_settings` in manifest.json
|
||||
|
||||
The `applications` manifest entry is deprecated. Always use `browser_specific_settings`:
|
||||
|
||||
```json
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "ThunderAI",
|
||||
"browser_specific_settings": {
|
||||
"gecko": {
|
||||
"id": "thunderai@micz.it",
|
||||
"strict_min_version": "140.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Do not guess APIs by using Try-Catch
|
||||
|
||||
A widespread antipattern in AI-generated Thunderbird extensions:
|
||||
|
||||
```javascript
|
||||
// WRONG - Never do this!
|
||||
try {
|
||||
await browser.someApi.method({ guessedParam: value });
|
||||
} catch (e) {
|
||||
try {
|
||||
await browser.someApi.method({ differentGuess: value });
|
||||
} catch (e2) {
|
||||
// Giving up silently — this makes debugging impossible
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Why this is harmful:**
|
||||
- Makes code unmaintainable
|
||||
- Hides real errors from developers
|
||||
- Makes debugging extremely difficult
|
||||
|
||||
**The correct approach:**
|
||||
1. Read the API documentation FIRST
|
||||
2. Use the exact parameter names and types specified
|
||||
3. Only use try-catch for expected error conditions with proper handling
|
||||
4. Never suppress errors without logging or handling them
|
||||
|
||||
### 3. Do not use Experiments unnecessarily
|
||||
|
||||
```javascript
|
||||
// WRONG - Using Experiment when standard API exists
|
||||
// Don't use Experiment just because you found example code using it
|
||||
|
||||
// RIGHT - Check if standard API can do it first
|
||||
const folders = await browser.folders.query({ name: "Inbox" });
|
||||
```
|
||||
|
||||
### 4. Handle file storage correctly
|
||||
|
||||
```javascript
|
||||
// WRONG - Trying to use raw filesystem APIs
|
||||
const fs = require('fs'); // Not available!
|
||||
|
||||
// RIGHT - Use storage.local with File objects
|
||||
const file = new File([content], "data.txt", { type: "text/plain" });
|
||||
await browser.storage.local.set({ file });
|
||||
```
|
||||
|
||||
### 5. Do not use async listeners for the runtime.onMessage listener
|
||||
|
||||
See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage
|
||||
|
||||
### 6. Parse vCard, vTodo, vEvent and iCal strings using a 3rd party library
|
||||
|
||||
Follow https://webextension-api.thunderbird.net/en/mv2/guides/vcard.html to parse vCard, vEvent and vTodo strings.
|
||||
|
||||
### 7. Parse Mailbox Strings using messengerUtilities
|
||||
|
||||
Extract email addresses from mailbox strings like "John Doe <john@example.com>":
|
||||
|
||||
```javascript
|
||||
const parsed = await browser.messengerUtilities.parseMailboxString(
|
||||
"John Doe <john@example.com>, Jane <jane@example.com>"
|
||||
);
|
||||
|
||||
// Result:
|
||||
// [
|
||||
// { name: "John Doe", email: "john@example.com" },
|
||||
// { name: "Jane", email: "jane@example.com" }
|
||||
// ]
|
||||
|
||||
// Extract just emails:
|
||||
const emails = parsed.map(p => p.email);
|
||||
```
|
||||
|
||||
**Documentation:** https://webextension-api.thunderbird.net/en/mv2/messengerUtilities.html
|
||||
|
||||
**Options:**
|
||||
- `preserveGroups`: Keep grouped hierarchies
|
||||
- `expandMailingLists`: Expand Thunderbird mailing lists (requires `addressBook` permission)
|
||||
|
||||
### 8. Set correct `strict_min_version` entry
|
||||
|
||||
Make sure `manifest.json` has a `strict_min_version` entry matching the used functions. If a function added in Thunderbird 137 is used, it must be set to `137.0` or higher.
|
||||
|
||||
### 9. Always use background type "module"
|
||||
|
||||
Always use `type: "module"` for background scripts. This allows use of the `import` directive for ES6 modules, and non-ES6 libraries can still be loaded via the `scripts` array:
|
||||
|
||||
```json
|
||||
// RIGHT - Always use type: "module"
|
||||
"background": {
|
||||
"scripts": ["lib/some-non-ES6-lib.js", "background.js"],
|
||||
"type": "module"
|
||||
}
|
||||
```
|
||||
|
||||
Then in `background.js`, import libraries explicitly:
|
||||
```javascript
|
||||
// Import ES6 module with default export
|
||||
import ICAL from "./lib/ical.js";
|
||||
|
||||
// Import ES6 module with named exports
|
||||
import { someFunction, someConstant } from "./lib/somemodule.js";
|
||||
```
|
||||
|
||||
### 10. Verify API return types — do not assume array access
|
||||
|
||||
Many Thunderbird APIs return wrapped objects, not direct arrays. Always verify the return type in the documentation before accessing the data.
|
||||
|
||||
**Common pitfall — MessageList:**
|
||||
```javascript
|
||||
// WRONG - getDisplayedMessages() returns MessageList, not an array
|
||||
const [message] = await browser.messageDisplay.getDisplayedMessages(tabId);
|
||||
|
||||
// RIGHT - MessageList has a .messages array property
|
||||
const { messages: [message] } = await browser.messageDisplay.getDisplayedMessages(tabId);
|
||||
```
|
||||
|
||||
**Common pitfall — HeadersDictionary:**
|
||||
```javascript
|
||||
// WRONG - headers might not exist or might not be an array
|
||||
let returnPath = headers["Return-Path"];
|
||||
|
||||
// RIGHT - keys are lowercase, values are always arrays
|
||||
const returnPathArray = headers["return-path"];
|
||||
const returnPath = returnPathArray?.[0] ?? null;
|
||||
```
|
||||
|
||||
**APIs that return wrapped objects (NOT direct arrays):**
|
||||
|
||||
| API | Returns | Access Pattern |
|
||||
|-----|---------|----------------|
|
||||
| `messageDisplay.getDisplayedMessages()` | `MessageList` | `result.messages[0]` |
|
||||
| `messages.list()` | `MessageList` | `result.messages[0]` |
|
||||
| `messages.query()` | `MessageList` | `result.messages[0]` |
|
||||
| `messages.getHeaders()` | `HeadersDictionary` | `result["header-name"][0]` |
|
||||
| `messages.getFull()` | `MessagePart` | `result.headers["header-name"][0]` |
|
||||
|
||||
**APIs that return direct arrays:**
|
||||
|
||||
| API | Returns | Access Pattern |
|
||||
|-----|---------|----------------|
|
||||
| `tabs.query()` | array of Tab | `result[0]` |
|
||||
| `mailTabs.query()` | array of MailTab | `result[0]` |
|
||||
| `addressBooks.list()` | array of AddressBookNode | `result[0]` |
|
||||
| `contacts.list()` | array of ContactNode | `result[0]` |
|
||||
| `folders.query()` | array of MailFolder | `result[0]` |
|
||||
|
||||
---
|
||||
|
||||
## Official API Documentation
|
||||
|
||||
**Primary resource:** https://webextension-api.thunderbird.net/en/mv2/
|
||||
|
||||
Documentation exists for different channels:
|
||||
- **Release (mv2):** https://webextension-api.thunderbird.net/en/mv2/
|
||||
- **ESR (esr-mv2):** https://webextension-api.thunderbird.net/en/esr-mv2/
|
||||
|
||||
**Key feature:** Search functionality and cross-references between types and functions.
|
||||
|
||||
---
|
||||
|
||||
## Understanding Thunderbird Release Channels
|
||||
|
||||
### Standard Release Channel (Monthly)
|
||||
- Update cadence: ~4 weeks
|
||||
- A new major version with each release (`147.0`, `148.0`, ...)
|
||||
- Gets new features and APIs (and bug fixes & security fixes)
|
||||
|
||||
### ESR Channel (Extended Support Release)
|
||||
- Update cadence: 1 major update per year, with lots of versions "missing" in between (`115.*`, `128.*`, `140.*`, `153.*`, ...)
|
||||
- Receives bug fixes & security fixes on regular basis alongside the major monthly releases, but as minor releases (`140.1`, `140.2`, ...)
|
||||
- No new features or APIs
|
||||
|
||||
### For ThunderAI
|
||||
- Target the Release channel for standard API usage.
|
||||
- Target the ESR channel for add-ons relying on Experiment APIs. Targeting the Release channel with Experiments is acceptable *only* when the developer can guarantee required monthly updates.
|
||||
|
||||
---
|
||||
|
||||
## Experiment APIs
|
||||
|
||||
### What Are Experiment APIs?
|
||||
Experiment APIs allow add-ons to access Thunderbird's core internals directly. They have full access to modify everything in Thunderbird.
|
||||
|
||||
### Critical Rules for Experiments
|
||||
|
||||
**1. Avoid Experiments Unless Absolutely Necessary**
|
||||
- Standard WebExtension APIs should always be your first choice
|
||||
- Only use Experiments when standard APIs genuinely cannot accomplish your goal
|
||||
|
||||
**2. Experiments Require Updates for Each Major Version**
|
||||
- This was manageable with ESR (1x/year)
|
||||
- Became unsustainable with monthly Release channel (12x/year)
|
||||
|
||||
**3. When Suggesting Experiments**
|
||||
- Only if standard APIs cannot accomplish the core goal
|
||||
- Developer must explicitly understand the maintenance burden
|
||||
- **Target ESR channel specifically**
|
||||
- Reference `esr-mv2` documentation
|
||||
|
||||
### Available semi-official Experiment APIs
|
||||
|
||||
#### Calendar Experiment API
|
||||
|
||||
Use this instead of creating a custom Experiment for calendar interactions.
|
||||
|
||||
**Use cases:**
|
||||
- Reading existing event/task items from Thunderbird's calendar
|
||||
- Listening for item updates
|
||||
- Creating/updating/deleting items
|
||||
|
||||
**Setup requirements:**
|
||||
1. Temporarily clone the [webext-experiments](https://github.com/thunderbird/webext-experiments/) repository.
|
||||
2. Add all `experiment_apis` entries found in `calendar/manifest.json` to the project's `manifest.json`.
|
||||
3. Copy `calendar/experiments/calendar/` into the project as `experiments/calendar/`. Do not modify these files.
|
||||
|
||||
**Note:** Always request iCal format:
|
||||
|
||||
```javascript
|
||||
// Always consult schema first, if this example is still correct
|
||||
browser.calendar.items.onCreated.addListener(
|
||||
async (calendarItem) => {
|
||||
if (calendarItem.type === "task") {
|
||||
console.log("Task in iCal format:", calendarItem.item);
|
||||
}
|
||||
},
|
||||
{ returnFormat: "ical" }
|
||||
);
|
||||
```
|
||||
|
||||
### Other Experiment Repositories
|
||||
|
||||
- https://github.com/thunderbird/webext-support — Helper APIs and modules
|
||||
- https://github.com/thunderbird/webext-examples — Example extensions (includes some Experiments)
|
||||
|
||||
---
|
||||
|
||||
## Native File System Access
|
||||
|
||||
### Current Limitations
|
||||
Native filesystem access is NOT available in Thunderbird WebExtensions.
|
||||
|
||||
### Recommended Approach
|
||||
|
||||
**For data persistence:**
|
||||
```javascript
|
||||
await browser.storage.local.set({ myData: someValue });
|
||||
const data = await browser.storage.local.get("myData");
|
||||
```
|
||||
|
||||
**For user file input:**
|
||||
```javascript
|
||||
const file = new File([content], "filename.txt", { type: "text/plain" });
|
||||
await browser.storage.local.set({ file });
|
||||
|
||||
// Retrieve later
|
||||
const data = await browser.storage.local.get("file");
|
||||
console.log(data.file.name);
|
||||
```
|
||||
|
||||
**Important:** File objects can be stored directly in `browser.storage.local` without serialization.
|
||||
|
||||
---
|
||||
|
||||
## Add-on Review Requirements
|
||||
|
||||
**Review policy:** https://thunderbird.github.io/atn-review-policy/
|
||||
|
||||
### Key Requirements
|
||||
|
||||
**1. No Build Tools**
|
||||
- Include 3rd party libraries directly (don't use webpack, rollup, etc.)
|
||||
- Include a `VENDOR.md` file documenting all 3rd party libraries with links to exact versions (not "latest"). Example: https://webextension-api.thunderbird.net/en/mv2/guides/vcard.html
|
||||
|
||||
**2. Permissions**
|
||||
- Only request permissions you actually need
|
||||
- The `tabs` and `activeTab` permissions are almost never needed in Thunderbird
|
||||
- Unnecessary permissions may cause rejection during ATN review
|
||||
|
||||
---
|
||||
|
||||
## Example Repositories
|
||||
|
||||
- https://github.com/thunderbird/webext-examples — Official example extensions
|
||||
- https://github.com/thunderbird/webext-support — Support libraries and helpers
|
||||
|
||||
Use these to see proper code structure, learn common patterns, and understand best practices.
|
||||
|
||||
---
|
||||
|
||||
## Mandatory Checklist Before Providing Code
|
||||
|
||||
Before providing any code, verify ALL of these:
|
||||
|
||||
- [ ] Consulted official API documentation — do NOT guess methods or parameters
|
||||
- [ ] NO try-catch blocks for guessing API parameters
|
||||
- [ ] Used 3rd party libraries or API methods for parsing — minimize manual string parsing or regex
|
||||
- [ ] Used 3rd party libraries are the most recent stable version
|
||||
- [ ] Event listeners registered at file scope (NOT inside init function)
|
||||
- [ ] VENDOR.md includes ALL dependencies with exact version URLs
|
||||
- [ ] Used `browser_specific_settings` (NOT deprecated `applications`)
|
||||
- [ ] Included proper error handling
|
||||
- [ ] Code has comments explaining the approach
|
||||
- [ ] No hardcoded user-facing strings — use the i18n API (`_locales/en/messages.json` only)
|
||||
- [ ] Add-on fulfills all requirements in the "Add-on Review Requirements" section
|
||||
- [ ] All guidelines in "Important Guidelines for AI Assistants" are followed
|
||||
- [ ] Manifest uses correct `strict_min_version`
|
||||
- [ ] If using Experiments: manifest has `strict_max_version` targeting current ESR (fetch https://webextension-api.thunderbird.net/en/esr-mv2/ to get the major version, then use format `"<major>.*"`)
|
||||
|
||||
If ANY checkbox is unchecked, DO NOT provide the code. Fix it first.
|
||||
|
||||
---
|
||||
|
||||
## Mandatory 3rd Party Library Audit
|
||||
|
||||
For EACH 3rd party library included in the project:
|
||||
|
||||
- [ ] Inspect the actual file to determine the export type:
|
||||
- **ES6 default export:** Look for `export default` → use `import LibName from "./lib/file.js"`
|
||||
- **ES6 named exports:** Look for `export { name1, name2 }` → use `import { name1, name2 } from "./lib/file.js"`
|
||||
- **UMD/IIFE (no ES6 exports):** Look for `(function(root, factory)` or assignments to `window`/`globalThis` → load via `scripts` array in manifest
|
||||
- [ ] Always prefer the minified module version
|
||||
- [ ] Output a library audit table:
|
||||
|
||||
| Library | File | Module Type | Import Statement |
|
||||
|---------|------|-------------|------------------|
|
||||
| ical.js | lib/ical.js | ES6 default | `import ICAL from "./lib/ical.js"` |
|
||||
|
||||
- [ ] Update VENDOR.md with the correct file path and version URL
|
||||
|
||||
---
|
||||
|
||||
## Mandatory API Audit
|
||||
|
||||
Before finalizing any code:
|
||||
|
||||
- [ ] List all used API methods
|
||||
- [ ] For EACH API method, fetch its documentation page: `https://webextension-api.thunderbird.net/en/mv2/<api-name>.html`
|
||||
- [ ] For EACH API method, verify:
|
||||
- **Parameters:** Correct names and types
|
||||
- **Return type:** The actual type returned by the Promise
|
||||
- **Access pattern:** How to extract data from the return value
|
||||
- **Required permission:** What permission is needed in manifest.json
|
||||
- [ ] Output an API audit table:
|
||||
|
||||
| API Method | Returns | Access Pattern | Required Permission |
|
||||
|------------|---------|----------------|---------------------|
|
||||
| `browser.messageDisplay.getDisplayedMessages()` | MessageList | `result.messages[0]` | messagesRead |
|
||||
| `browser.messages.getHeaders()` | HeadersDictionary | `result["header-name"][0]` | messagesRead |
|
||||
| `browser.mailTabs.query()` | array of MailTab | `result[0]` | (none) |
|
||||
| `browser.storage.local.get` | object | `result.keyName` | storage |
|
||||
| `browser.i18n.getMessage` | string | direct | (none) |
|
||||
|
||||
- [ ] Update the permissions entry in manifest.json to include ALL required permissions
|
||||
|
||||
---
|
||||
|
||||
## Getting Help
|
||||
|
||||
- **Developer documentation:** https://developer.thunderbird.net/
|
||||
- **Support forum:** https://thunderbird.topicbox.com/groups/addons
|
||||
- **Matrix chat:** #tb-addon-developers:mozilla.org
|
||||
BIN
images/ai_summary.png
Normal file
|
After Width: | Height: | Size: 306 B |
BIN
images/ai_translate.png
Normal file
|
After Width: | Height: | Size: 740 B |
|
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 |
BIN
images/context_menu/summarize.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
images/context_menu/translate.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -7,4 +7,4 @@
|
|||
<circle r="25" fill="#408ee0" cy="50" cx="25">
|
||||
<animate begin="-0.5s" values="25;75;25" keyTimes="0;0.5;1" dur="1s" repeatCount="indefinite" attributeName="cx"></animate>
|
||||
<animate repeatCount="indefinite" dur="1s" keyTimes="0;0.499;0.5;1" calcMode="discrete" values="0;0;1;1" attributeName="fill-opacity"></animate>
|
||||
</circle><g></g></g><!-- [ldio] generated by https://loading.io --></svg>
|
||||
</circle><g></g></g><!-- [ldio] generated by https://loading.io --></svg>
|
||||
|
Before Width: | Height: | Size: 990 B After Width: | Height: | Size: 991 B |
BIN
images/thunderstats.png
Normal file
|
After Width: | Height: | Size: 616 B |
|
|
@ -26,7 +26,8 @@ export class Anthropic {
|
|||
model = '';
|
||||
system_prompt = '';
|
||||
temperature = '';
|
||||
max_tokens = 4096;
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -89,7 +92,7 @@ export class Anthropic {
|
|||
|
||||
try {
|
||||
|
||||
let claude_body = {
|
||||
let claude_body = {
|
||||
model: this.model,
|
||||
max_tokens: parseInt(this.max_tokens),
|
||||
system: this.system_prompt,
|
||||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ export class Ollama {
|
|||
num_ctx = 0;
|
||||
temperature = '';
|
||||
think = false;
|
||||
|
||||
format_json = false;
|
||||
|
||||
constructor({
|
||||
host = '',
|
||||
model = '',
|
||||
|
|
@ -32,6 +33,7 @@ export class Ollama {
|
|||
num_ctx = 0,
|
||||
temperature = '',
|
||||
think = false,
|
||||
format_json = false,
|
||||
} = {}) {
|
||||
this.host = (host || '').trim().replace(/\/+$/, "");
|
||||
this.model = model;
|
||||
|
|
@ -39,6 +41,7 @@ export class Ollama {
|
|||
this.num_ctx = num_ctx;
|
||||
this.temperature = temperature;
|
||||
this.think = think;
|
||||
this.format_json = format_json;
|
||||
}
|
||||
|
||||
fetchModels = async () => {
|
||||
|
|
@ -93,6 +96,7 @@ export class Ollama {
|
|||
messages: messages,
|
||||
stream: this.stream,
|
||||
think: this.think,
|
||||
...(this.format_json ? { format: "json" } : {}),
|
||||
...(this.num_ctx > 0 ? { options: { num_ctx: parseInt(this.num_ctx) } } : {}),
|
||||
...(this.temperature != '' && !Number.isNaN(tempFloat) ? { options: { temperature: tempFloat } } : {}),
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@ let current_mailMessageId = null;
|
|||
let selectionChangeTimeout = null;
|
||||
let isDragging = false;
|
||||
let delay_wait_completion = 7000; // milliseconds
|
||||
let _customTextArray = [];
|
||||
let _currentCustomTextIndex = 0;
|
||||
let lastSelectedHtml = "";
|
||||
|
||||
async function chatgpt_sendMsg(msg, method ='') { // return -1 send button not found, -2 textarea not found
|
||||
|
|
@ -126,6 +128,8 @@ function addCustomDiv(prompt_action,tabId,mailMessageId) {
|
|||
style.textContent += "#mzta-custom_loading{height:50px;display:none;}";
|
||||
style.textContent += "#mzta-custom_textarea{color:black;padding:1px;font-size:15px;width:100%;}";
|
||||
style.textContent += "#mzta-custom_info{text-align:center;width:100%;padding-bottom:10px;font-size:15px;}";
|
||||
style.textContent += "#mzta-custom_info span{font-size:0.8em;}";
|
||||
style.textContent += "#mzta-custom_step{position: absolute;bottom: 5px;right: 10px;font-size: 12px;color: #ccc;}";
|
||||
style.textContent += "#mzta-prompt-name{font-size:13px;font-style:italic;color:#919191;position:fixed;bottom:75px;;left:0;padding-left:5px;}";
|
||||
style.textContent += "#mzta-diff-overlay{position: fixed;top:0;left:0;width:100vw;height:100vh;background: rgba(0, 0, 0, 0.5);display:flex;justify-content:center;align-items:center;z-index:999;}";
|
||||
style.textContent += "#mzta-diff{padding:10px;border:2px solid white;border-radius:1em;position:fixed;top:50%;left:50%;width:80%;height:30em;transform:translate(-50%,-50%);z-index:9999;background-color: #333;color: white;}";
|
||||
|
|
@ -378,6 +382,7 @@ function addCustomDiv(prompt_action,tabId,mailMessageId) {
|
|||
customDiv.appendChild(customInfo);
|
||||
let customTextArea = document.createElement('textarea');
|
||||
customTextArea.id = 'mzta-custom_textarea';
|
||||
customTextArea.rows = 5;
|
||||
customDiv.appendChild(customTextArea);
|
||||
let customLoading = document.createElement('img');
|
||||
customLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||
|
|
@ -390,6 +395,9 @@ function addCustomDiv(prompt_action,tabId,mailMessageId) {
|
|||
customBtn.addEventListener("click", () => { customTextBtnClick({customBtn:customBtn,customLoading:customLoading,customDiv:customDiv}) });
|
||||
customTextArea.addEventListener("keydown", (event) => { if(event.code == "Enter" && event.ctrlKey) customTextBtnClick({customBtn:customBtn,customLoading:customLoading,customDiv:customDiv}) });
|
||||
customDiv.appendChild(customBtn);
|
||||
let customStep = document.createElement('div');
|
||||
customStep.id = 'mzta-custom_step';
|
||||
customDiv.appendChild(customStep);
|
||||
fixedDiv.appendChild(customDiv);
|
||||
|
||||
// light background hint with diagonal thick arrow
|
||||
|
|
@ -466,14 +474,54 @@ function createReplyToAllIcon() {
|
|||
return svg;
|
||||
}
|
||||
|
||||
function renderCustomTextStep() {
|
||||
const currentItem = _customTextArray[_currentCustomTextIndex];
|
||||
const infoDiv = document.getElementById('mzta-custom_info');
|
||||
const customTextArea = document.getElementById('mzta-custom_textarea');
|
||||
const customStep = document.getElementById('mzta-custom_step');
|
||||
|
||||
customTextArea.value = "";
|
||||
infoDiv.textContent = browser.i18n.getMessage("chatgpt_win_custom_text");
|
||||
|
||||
if (currentItem.info && currentItem.info.trim() !== "") {
|
||||
infoDiv.appendChild(document.createElement("br"));
|
||||
const infoSpan = document.createElement("span");
|
||||
infoSpan.textContent = "[" + browser.i18n.getMessage("customPrompts_form_label_ID") + ": " + currentItem.info + "]";
|
||||
infoDiv.appendChild(infoSpan);
|
||||
}
|
||||
|
||||
if(_customTextArray.length > 1) {
|
||||
customStep.textContent = (_currentCustomTextIndex + 1) + "/" + _customTextArray.length;
|
||||
customStep.style.display = 'block';
|
||||
} else {
|
||||
customStep.style.display = 'none';
|
||||
}
|
||||
|
||||
customTextArea.focus();
|
||||
}
|
||||
|
||||
function customTextBtnClick(args) {
|
||||
const customText = document.getElementById('mzta-custom_textarea').value;
|
||||
args.customBtn.disabled = true;
|
||||
args.customBtn.classList.add('disabled');
|
||||
args.customLoading.style.display = 'inline-block';
|
||||
args.customLoading.style.display = 'none';
|
||||
doProceed(current_message,customText);
|
||||
args.customDiv.style.display = 'none';
|
||||
|
||||
if (_customTextArray[_currentCustomTextIndex]) {
|
||||
_customTextArray[_currentCustomTextIndex].custom_text = customText;
|
||||
}
|
||||
|
||||
_currentCustomTextIndex++;
|
||||
|
||||
if (_currentCustomTextIndex < _customTextArray.length) {
|
||||
renderCustomTextStep();
|
||||
} else {
|
||||
args.customBtn.disabled = true;
|
||||
args.customBtn.classList.add('disabled');
|
||||
args.customLoading.style.display = 'inline-block';
|
||||
args.customLoading.style.display = 'none';
|
||||
doProceed(current_message, _customTextArray);
|
||||
args.customDiv.style.display = 'none';
|
||||
|
||||
args.customBtn.disabled = false;
|
||||
args.customBtn.classList.remove('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
function checkGPTModel(model) {
|
||||
|
|
@ -547,8 +595,14 @@ function checkLoggedIn(){
|
|||
}
|
||||
|
||||
function showCustomTextField(){
|
||||
let rawArray = current_message.prompt_info?.custom_text_array;
|
||||
_customTextArray = Array.isArray(rawArray) ? rawArray : [];
|
||||
if (_customTextArray.length === 0) {
|
||||
_customTextArray.push({ placeholder: "{%additional_text%}", info: "" });
|
||||
}
|
||||
_currentCustomTextIndex = 0;
|
||||
document.getElementById('mzta-custom_text').style.display = 'block';
|
||||
document.getElementById('mzta-custom_textarea').focus();
|
||||
renderCustomTextStep();
|
||||
}
|
||||
|
||||
async function doProceed(message, customText = ''){
|
||||
|
|
@ -558,16 +612,31 @@ async function doProceed(message, customText = ''){
|
|||
await checkGPTModel(_gpt_model);
|
||||
}
|
||||
let final_prompt = message.prompt;
|
||||
// console.log(">>>>>>>>>>>> doProceed customText: " + customText);
|
||||
// console.log(">>>>>>>>>>>> doProceed final_prompt: " + final_prompt);
|
||||
// console.log(">>>>>>>>>>>> doProceed mztaPhDefVal: " + JSON.stringify(mztaPhDefVal));
|
||||
//check if there is the additional_text placeholder
|
||||
if(final_prompt.includes('{%additional_text%}')){
|
||||
// console.log(">>>>>>>>>>>> found ph customText: " + customText);
|
||||
final_prompt = final_prompt.replace('{%additional_text%}', customText || (mztaPhDefVal == '1'?'':'{%additional_text%}'));
|
||||
}else{
|
||||
if(customText != ''){
|
||||
final_prompt += ' '+customText;
|
||||
|
||||
if (Array.isArray(customText)) {
|
||||
let anyReplaced = false;
|
||||
customText.forEach(obj => {
|
||||
if (final_prompt.includes(obj.placeholder)) {
|
||||
anyReplaced = true;
|
||||
let escapedPH = obj.placeholder.replace(/[.*+?^{$}()|[\\]\\\\]/g, '\\\\$&');
|
||||
let regex = new RegExp(escapedPH, 'g');
|
||||
final_prompt = final_prompt.replace(regex, obj.custom_text);
|
||||
}
|
||||
});
|
||||
if (!anyReplaced) {
|
||||
const inputText = customText.map(obj => obj.custom_text).join(' ');
|
||||
if (inputText !== '') {
|
||||
final_prompt += ' ' + inputText;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//check if there is the additional_text placeholder
|
||||
if(final_prompt.includes('{%additional_text%}')){
|
||||
final_prompt = final_prompt.replace('{%additional_text%}', customText || (mztaPhDefVal == '1'?'':'{%additional_text%}'));
|
||||
}else{
|
||||
if(customText != ''){
|
||||
final_prompt += ' '+customText;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,256 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// CSS selectors for DOM elements injected by ThunderAI.
|
||||
// These are stripped when retrieving the email body content
|
||||
// to avoid contaminating placeholder values sent to AI providers.
|
||||
// Add new selectors here when new UI elements are injected into the email DOM.
|
||||
const MZTA_INJECTED_SELECTORS = [
|
||||
'#mzta-container',
|
||||
'.mzta_dialog',
|
||||
];
|
||||
|
||||
function getCleanBodyHtml() {
|
||||
const clone = document.body.cloneNode(true);
|
||||
for (const selector of MZTA_INJECTED_SELECTORS) {
|
||||
for (const el of clone.querySelectorAll(selector)) {
|
||||
el.remove();
|
||||
}
|
||||
}
|
||||
for (const table of clone.querySelectorAll('table.moz-main-header')) {
|
||||
let sibling = table.previousElementSibling;
|
||||
while (sibling && sibling.tagName === 'DIV') {
|
||||
const toRemove = sibling;
|
||||
sibling = sibling.previousElementSibling;
|
||||
toRemove.remove();
|
||||
}
|
||||
table.remove();
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
// ── Theme colors ────────────────────────────────────────────────────
|
||||
function _getThemeColors(spamValue, spamThreshold) {
|
||||
const isDark = window.matchMedia?.('(prefers-color-scheme: dark)').matches;
|
||||
const colors = {
|
||||
isDark,
|
||||
toolbar: { bg: isDark ? '#1e1e1e' : '#f5f5f5', text: isDark ? '#ddd' : '#333', border: isDark ? '#444' : '#ddd' },
|
||||
spamLoading: { bg: isDark ? '#003366' : '#e6f2ff', text: isDark ? '#cce5ff' : '#004085', border: isDark ? '#004085' : '#b8daff' },
|
||||
summary: { bg: isDark ? '#2a2a2a' : '#f0f0f0', text: isDark ? '#e0e0e0' : '#333', border: isDark ? '#444' : '#ddd' },
|
||||
summaryErr: { bg: isDark ? '#3a1a1a' : '#f7e6e6', text: isDark ? '#ffcccc' : '#660000', border: '#660000' },
|
||||
translation: { bg: isDark ? '#1a2e2a' : '#e8f5e9', text: isDark ? '#c8e6c9' : '#1b5e20', border: isDark ? '#2e5740' : '#a5d6a7' },
|
||||
translErr: { bg: isDark ? '#3a1a1a' : '#f7e6e6', text: isDark ? '#ffcccc' : '#660000', border: '#660000' },
|
||||
linkColor: isDark ? '#6db3f2' : '#1a5fa8',
|
||||
};
|
||||
// Spam colors depend on the score
|
||||
if (spamValue !== undefined) {
|
||||
const threshold = spamThreshold || 50;
|
||||
if (spamValue == -999) {
|
||||
colors.spam = { bg: isDark ? '#332701' : '#fff3cd', text: isDark ? '#ffeb80' : '#856404', border: isDark ? '#664d03' : '#ffeeba' };
|
||||
} else if (spamValue >= threshold) {
|
||||
colors.spam = { bg: isDark ? '#5a1a1a' : '#ffe6e6', text: isDark ? '#ffcccc' : '#cc0000', border: '#cc0000' };
|
||||
} else {
|
||||
colors.spam = { bg: isDark ? '#1a401a' : '#e6ffe6', text: isDark ? '#ccffcc' : '#006600', border: '#006600' };
|
||||
}
|
||||
}
|
||||
return colors;
|
||||
}
|
||||
|
||||
// ── Container / Toolbar / Panels management ─────────────────────────
|
||||
function _ensureContainer() {
|
||||
let container = document.getElementById('mzta-container');
|
||||
if (!container) {
|
||||
const colors = _getThemeColors();
|
||||
container = document.createElement('div');
|
||||
container.id = 'mzta-container';
|
||||
container.style.cssText = 'font-family: system-ui, -apple-system, sans-serif;';
|
||||
document.body.insertBefore(container, document.body.firstChild);
|
||||
|
||||
const toolbar = document.createElement('div');
|
||||
toolbar.id = 'mzta-toolbar';
|
||||
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');
|
||||
panels.id = 'mzta-panels';
|
||||
panels.style.cssText = 'display: flex; flex-direction: column; gap: 4px; padding: 4px 0;';
|
||||
container.appendChild(panels);
|
||||
}
|
||||
return {
|
||||
toolbar: document.getElementById('mzta-toolbar'),
|
||||
panels: document.getElementById('mzta-panels'),
|
||||
};
|
||||
}
|
||||
|
||||
function _updateToolbarVisibility() {
|
||||
const toolbar = document.getElementById('mzta-toolbar');
|
||||
if (!toolbar) return;
|
||||
const hasItems = toolbar.querySelector('#mzta-toolbar-spam, #mzta-toolbar-summary, #mzta-toolbar-translation');
|
||||
toolbar.style.display = hasItems ? 'flex' : 'none';
|
||||
}
|
||||
|
||||
const _TOOLBAR_SLOT_ORDER = ['mzta-toolbar-spam', 'mzta-toolbar-summary', 'mzta-toolbar-translation'];
|
||||
|
||||
function _addToolbarItem(id, element) {
|
||||
const { toolbar } = _ensureContainer();
|
||||
const existing = document.getElementById(id);
|
||||
if (existing) existing.remove();
|
||||
element.id = id;
|
||||
|
||||
const myIndex = _TOOLBAR_SLOT_ORDER.indexOf(id);
|
||||
let insertBefore = null;
|
||||
for (let i = myIndex + 1; i < _TOOLBAR_SLOT_ORDER.length; i++) {
|
||||
const later = document.getElementById(_TOOLBAR_SLOT_ORDER[i]);
|
||||
if (later) { insertBefore = later; break; }
|
||||
}
|
||||
if (insertBefore) toolbar.insertBefore(element, insertBefore);
|
||||
else toolbar.appendChild(element);
|
||||
|
||||
_updateToolbarVisibility();
|
||||
}
|
||||
|
||||
function _removeToolbarItem(id) {
|
||||
const el = document.getElementById(id);
|
||||
if (el) el.remove();
|
||||
_updateToolbarVisibility();
|
||||
}
|
||||
|
||||
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'
|
||||
];
|
||||
|
||||
function _addPanel(id, element) {
|
||||
const { panels } = _ensureContainer();
|
||||
const existing = document.getElementById(id);
|
||||
if (existing) existing.remove();
|
||||
element.id = id;
|
||||
|
||||
const myIndex = _PANEL_ORDER.indexOf(id);
|
||||
let insertBefore = null;
|
||||
for (let i = myIndex + 1; i < _PANEL_ORDER.length; i++) {
|
||||
const later = document.getElementById(_PANEL_ORDER[i]);
|
||||
if (later) { insertBefore = later; break; }
|
||||
}
|
||||
if (insertBefore) panels.insertBefore(element, insertBefore);
|
||||
else panels.appendChild(element);
|
||||
|
||||
_updatePanelMargins();
|
||||
}
|
||||
|
||||
function _removePanel(id) {
|
||||
const el = document.getElementById(id);
|
||||
if (el) el.remove();
|
||||
_updatePanelMargins();
|
||||
}
|
||||
|
||||
function _updatePanelMargins() {
|
||||
const panels = document.getElementById('mzta-panels');
|
||||
if (!panels) return;
|
||||
let lastPanel = null;
|
||||
for (const child of panels.children) {
|
||||
child.style.marginBottom = '';
|
||||
lastPanel = child;
|
||||
}
|
||||
if (lastPanel) lastPanel.style.marginBottom = '1rem';
|
||||
}
|
||||
|
||||
function _isHtml(text) {
|
||||
return /<[a-z][^>]*>/i.test(text);
|
||||
}
|
||||
|
||||
function _renderSafeHtml(container, html) {
|
||||
container.textContent = '';
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(html, 'text/html');
|
||||
doc.querySelectorAll('script, img').forEach(el => el.remove());
|
||||
while (doc.body.firstChild) {
|
||||
container.appendChild(doc.body.firstChild);
|
||||
}
|
||||
container.querySelectorAll('p').forEach(p => { p.style.marginBlockStart = '0'; });
|
||||
}
|
||||
|
||||
function createThreeDotsMenu(isDark, menuItems, panelColors) {
|
||||
const wrapper = document.createElement('div');
|
||||
wrapper.style.cssText = 'position: relative; display: inline-flex; align-items: center;';
|
||||
|
||||
const dotsBtn = document.createElement('span');
|
||||
dotsBtn.textContent = '\u22EE';
|
||||
dotsBtn.style.cssText = 'cursor: pointer; opacity: 0.7; font-size: 18px; padding: 2px 7px; line-height: 1; user-select: none; transition: opacity 0.2s; display: flex; align-items: center;';
|
||||
dotsBtn.onmouseover = () => dotsBtn.style.opacity = '1';
|
||||
dotsBtn.onmouseout = () => dotsBtn.style.opacity = '0.7';
|
||||
|
||||
const dropdown = document.createElement('div');
|
||||
const dropdownBg = panelColors.bg;
|
||||
const dropdownBorder = panelColors.border;
|
||||
const defaultTextColor = panelColors.text;
|
||||
dropdown.style.cssText = `display: none; position: absolute; right: 0; top: 100%; z-index: 9999; min-width: 180px; background-color: ${dropdownBg}; border: 1px solid ${dropdownBorder}; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); overflow: hidden;`;
|
||||
|
||||
menuItems.forEach(item => {
|
||||
const row = document.createElement('div');
|
||||
row.style.cssText = `display: flex; align-items: center; gap: 8px; padding: 8px 12px; cursor: pointer; font-size: 13px; color: ${defaultTextColor}; transition: background-color 0.15s, color 0.15s;`;
|
||||
|
||||
const iconSpan = document.createElement('span');
|
||||
iconSpan.textContent = item.icon;
|
||||
iconSpan.style.cssText = 'font-size: 15px; width: 18px; text-align: center;';
|
||||
|
||||
const labelSpan = document.createElement('span');
|
||||
labelSpan.textContent = item.label;
|
||||
|
||||
row.appendChild(iconSpan);
|
||||
row.appendChild(labelSpan);
|
||||
|
||||
const hoverBg = item.hoverColor === '#cc0000'
|
||||
? (isDark ? 'rgba(204,0,0,0.2)' : 'rgba(204,0,0,0.1)')
|
||||
: (isDark ? 'rgba(77,157,224,0.2)' : 'rgba(26,95,168,0.1)');
|
||||
|
||||
row.onmouseover = () => {
|
||||
row.style.backgroundColor = hoverBg;
|
||||
row.style.color = item.hoverColor;
|
||||
};
|
||||
row.onmouseout = () => {
|
||||
row.style.backgroundColor = '';
|
||||
row.style.color = defaultTextColor;
|
||||
};
|
||||
|
||||
row.onclick = (e) => {
|
||||
e.stopPropagation();
|
||||
dropdown.style.display = 'none';
|
||||
if (item.disableAfterClick) {
|
||||
row.onclick = null;
|
||||
row.style.opacity = '0.5';
|
||||
row.style.pointerEvents = 'none';
|
||||
}
|
||||
item.onClick();
|
||||
};
|
||||
|
||||
dropdown.appendChild(row);
|
||||
});
|
||||
|
||||
dotsBtn.onclick = (e) => {
|
||||
e.stopPropagation();
|
||||
dropdown.style.display = dropdown.style.display === 'none' ? 'block' : 'none';
|
||||
};
|
||||
|
||||
document.addEventListener('click', (e) => {
|
||||
if (!wrapper.contains(e.target)) {
|
||||
dropdown.style.display = 'none';
|
||||
}
|
||||
}, true);
|
||||
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape' && dropdown.style.display !== 'none') {
|
||||
dropdown.style.display = 'none';
|
||||
}
|
||||
});
|
||||
|
||||
wrapper.appendChild(dotsBtn);
|
||||
wrapper.appendChild(dropdown);
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
browser.runtime.onMessage.addListener((message) => {
|
||||
switch (message.command) {
|
||||
case "getSelectedText": {
|
||||
|
|
@ -60,7 +310,7 @@ switch (message.command) {
|
|||
|
||||
case "getText": {
|
||||
let t = '';
|
||||
const children = window.document.body.childNodes;
|
||||
const children = getCleanBodyHtml().childNodes;
|
||||
for (const node of children) {
|
||||
if (node instanceof Element) {
|
||||
if (node.classList.contains('moz-signature')) {
|
||||
|
|
@ -73,11 +323,11 @@ switch (message.command) {
|
|||
}
|
||||
|
||||
case "getTextOnly": {
|
||||
return Promise.resolve(window.document.body.innerText);
|
||||
return Promise.resolve(getCleanBodyHtml().innerText);
|
||||
}
|
||||
|
||||
case "getFullHtml": {
|
||||
return Promise.resolve(window.document.body.innerHTML);
|
||||
return Promise.resolve(getCleanBodyHtml().innerHTML);
|
||||
}
|
||||
|
||||
case "getOnlyTypedText": {
|
||||
|
|
@ -325,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));
|
||||
|
|
@ -617,9 +867,702 @@ 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');
|
||||
if (document.getElementById('mzta-spam-check-progress')) return Promise.resolve(true);
|
||||
|
||||
const colors = _getThemeColors();
|
||||
|
||||
// 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; margin-right: auto;`;
|
||||
const badgeLoading = document.createElement('img');
|
||||
badgeLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||
badgeLoading.style.cssText = "height: 14px; width: 14px;";
|
||||
badge.appendChild(badgeLoading);
|
||||
const badgeText = document.createElement('span');
|
||||
badgeText.textContent = browser.i18n.getMessage("spam_check_in_progress");
|
||||
badge.appendChild(badgeText);
|
||||
_addToolbarItem('mzta-toolbar-spam', badge);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showSpamReport": {
|
||||
_removePanel('mzta-spam-check-progress');
|
||||
_removeToolbarItem('mzta-toolbar-spam');
|
||||
|
||||
const data = message.data;
|
||||
if (document.getElementById('mzta-spam-report-banner')) return Promise.resolve(true);
|
||||
|
||||
const colors = _getThemeColors(data.spamValue, data.SpamThreshold);
|
||||
const sc = colors.spam;
|
||||
|
||||
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: 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) {
|
||||
scoreSpan.textContent = browser.i18n.getMessage("apiwebchat_error");
|
||||
} else {
|
||||
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; flex-shrink: 0; cursor: pointer;';
|
||||
topRow.appendChild(chevron);
|
||||
|
||||
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, [
|
||||
{
|
||||
icon: '\u21BB',
|
||||
label: browser.i18n.getMessage("spamfilter_refresh") || 'Refresh spam report',
|
||||
hoverColor: colors.isDark ? '#4d9de0' : '#1a5fa8',
|
||||
disableAfterClick: true,
|
||||
onClick: () => {
|
||||
browser.runtime.sendMessage({ command: "refreshSpamReport", headerMessageId: data.headerMessageId });
|
||||
}
|
||||
},
|
||||
{
|
||||
icon: '\u00D7',
|
||||
label: browser.i18n.getMessage("spamfilter_delete") || 'Delete spam report',
|
||||
hoverColor: '#cc0000',
|
||||
onClick: () => {
|
||||
_removePanel('mzta-spam-report-banner');
|
||||
_removeToolbarItem('mzta-toolbar-spam');
|
||||
browser.runtime.sendMessage({ command: "removeSpamReport", headerMessageId: data.headerMessageId });
|
||||
}
|
||||
}
|
||||
], { bg: sc.bg, border: sc.border, text: sc.text });
|
||||
spamMenu.style.fontWeight = 'normal';
|
||||
spamMenu.style.display = 'none';
|
||||
topRow.appendChild(spamMenu);
|
||||
|
||||
badge.appendChild(topRow);
|
||||
|
||||
// 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);
|
||||
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showSummary": {
|
||||
_removePanel('mzta-summary-generating');
|
||||
_removePanel('mzta-summary-banner');
|
||||
_removeToolbarItem('mzta-toolbar-summary');
|
||||
|
||||
const summaryData = message.data;
|
||||
const colors = _getThemeColors();
|
||||
const sc = summaryData.error ? colors.summaryErr : colors.summary;
|
||||
|
||||
const summaryContainer = document.createElement('div');
|
||||
summaryContainer.className = 'thunderai-summary-pane';
|
||||
summaryContainer.style.cssText = `background-color: ${sc.bg}; color: ${sc.text}; padding: 0.5rem; border-radius: 4px; border: 1px solid ${sc.border}; font-size: 14px;`;
|
||||
|
||||
const summaryMenu = createThreeDotsMenu(colors.isDark, [
|
||||
{
|
||||
icon: '\u21BB',
|
||||
label: browser.i18n.getMessage("summarize_refresh") || 'Refresh summary',
|
||||
hoverColor: colors.isDark ? '#4d9de0' : '#1a5fa8',
|
||||
disableAfterClick: true,
|
||||
onClick: () => {
|
||||
browser.runtime.sendMessage({ command: "refreshSummary", headerMessageId: summaryData.headerMessageId });
|
||||
}
|
||||
},
|
||||
{
|
||||
icon: '\u00D7',
|
||||
label: browser.i18n.getMessage("summarize_delete") || 'Delete summary',
|
||||
hoverColor: '#cc0000',
|
||||
onClick: () => {
|
||||
_removePanel('mzta-summary-banner');
|
||||
browser.runtime.sendMessage({ command: "removeSummary", headerMessageId: summaryData.headerMessageId });
|
||||
}
|
||||
}
|
||||
], { bg: sc.bg, border: sc.border, text: sc.text });
|
||||
|
||||
const summaryBranding = document.createElement('span');
|
||||
summaryBranding.textContent = browser.i18n.getMessage("summary_by") + " ThunderAI";
|
||||
summaryBranding.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5; white-space: nowrap;';
|
||||
|
||||
const summaryRightGroup = document.createElement('span');
|
||||
summaryRightGroup.style.cssText = 'display: flex; align-items: center; gap: 5px; float: right; margin-left: 10px;';
|
||||
summaryRightGroup.appendChild(summaryMenu);
|
||||
|
||||
const summaryIcon = document.createElement('img');
|
||||
summaryIcon.src = browser.runtime.getURL("/images/ai_summary.png");
|
||||
summaryIcon.style.cssText = `height: 16px; width: 16px; flex-shrink: 0; margin-top: 2px;${colors.isDark ? ' filter: invert(1);' : ''}`;
|
||||
|
||||
const summaryTextWrapper = document.createElement('div');
|
||||
summaryTextWrapper.style.cssText = 'flex: 1; min-width: 0;';
|
||||
summaryTextWrapper.appendChild(summaryRightGroup);
|
||||
|
||||
const summaryText = document.createElement('div');
|
||||
summaryText.className = 'thunderai-summary-content';
|
||||
const hasHtml = !!summaryData.summary_html && !summaryData.stripFormatting;
|
||||
|
||||
function setSummaryHtml(element, html) {
|
||||
element.textContent = '';
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(html, 'text/html');
|
||||
while (doc.body.firstChild) {
|
||||
element.appendChild(doc.body.firstChild);
|
||||
}
|
||||
element.querySelectorAll('p').forEach(p => { p.style.marginBlockStart = '0'; });
|
||||
}
|
||||
|
||||
if (summaryData.error) {
|
||||
summaryText.textContent = summaryData.message || browser.i18n.getMessage("summarize_error");
|
||||
} else if (hasHtml) {
|
||||
setSummaryHtml(summaryText, summaryData.summary_html);
|
||||
} else {
|
||||
summaryText.textContent = summaryData.summary;
|
||||
}
|
||||
summaryText.style.cssText = 'font-size: 14px; line-height: 1.4;';
|
||||
summaryTextWrapper.appendChild(summaryText);
|
||||
|
||||
const maxLen = summaryData.maxDisplayLength || 0;
|
||||
const fullText = summaryData.summary;
|
||||
if (!summaryData.error && maxLen > 0 && fullText && fullText.length > maxLen) {
|
||||
summaryText.style.overflow = 'hidden';
|
||||
summaryText.style.transition = 'max-height 0.2s ease';
|
||||
|
||||
if (!hasHtml) {
|
||||
let cutPos = fullText.lastIndexOf(' ', maxLen);
|
||||
if (cutPos <= 0) cutPos = maxLen;
|
||||
const truncated = fullText.substring(0, cutPos) + '\u2026';
|
||||
summaryText.textContent = truncated;
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
summaryText.style.maxHeight = summaryText.scrollHeight + 'px';
|
||||
});
|
||||
|
||||
const toggleLink = document.createElement('a');
|
||||
toggleLink.textContent = browser.i18n.getMessage("summarize_see_more") || "See more";
|
||||
toggleLink.href = '#';
|
||||
toggleLink.style.cssText = `display: inline-block; margin-top: 4px; font-size: 13px; color: ${colors.linkColor}; cursor: pointer; text-decoration: underline;`;
|
||||
|
||||
let expanded = false;
|
||||
toggleLink.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
if (!expanded) {
|
||||
summaryText.textContent = fullText;
|
||||
summaryText.style.maxHeight = summaryText.scrollHeight + 'px';
|
||||
toggleLink.textContent = browser.i18n.getMessage("summarize_see_less") || "See less";
|
||||
} else {
|
||||
summaryText.textContent = truncated;
|
||||
const collapsedHeight = summaryText.scrollHeight;
|
||||
summaryText.textContent = fullText;
|
||||
summaryText.style.maxHeight = summaryText.scrollHeight + 'px';
|
||||
requestAnimationFrame(() => {
|
||||
summaryText.style.maxHeight = collapsedHeight + 'px';
|
||||
});
|
||||
summaryText.addEventListener('transitionend', function handler() {
|
||||
summaryText.removeEventListener('transitionend', handler);
|
||||
summaryText.textContent = truncated;
|
||||
});
|
||||
toggleLink.textContent = browser.i18n.getMessage("summarize_see_more") || "See more";
|
||||
}
|
||||
expanded = !expanded;
|
||||
});
|
||||
const toggleContainer = document.createElement('div');
|
||||
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-top: 8px; justify-content: space-between;';
|
||||
toggleContainer.appendChild(toggleLink);
|
||||
toggleContainer.appendChild(summaryBranding);
|
||||
summaryBranding.style.marginRight = '0px';
|
||||
summaryBranding.style.marginBottom = '0px';
|
||||
summaryTextWrapper.appendChild(toggleContainer);
|
||||
} else {
|
||||
const collapsedMaxHeight = '4.2em';
|
||||
summaryText.style.maxHeight = collapsedMaxHeight;
|
||||
|
||||
const toggleLink = document.createElement('a');
|
||||
toggleLink.textContent = browser.i18n.getMessage("summarize_see_more") || "See more";
|
||||
toggleLink.href = '#';
|
||||
toggleLink.style.cssText = `display: inline-block; margin-top: 4px; font-size: 13px; color: ${colors.linkColor}; cursor: pointer; text-decoration: underline;`;
|
||||
|
||||
let expanded = false;
|
||||
toggleLink.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
if (!expanded) {
|
||||
summaryText.style.maxHeight = summaryText.scrollHeight + 'px';
|
||||
toggleLink.textContent = browser.i18n.getMessage("summarize_see_less") || "See less";
|
||||
} else {
|
||||
summaryText.style.maxHeight = collapsedMaxHeight;
|
||||
toggleLink.textContent = browser.i18n.getMessage("summarize_see_more") || "See more";
|
||||
}
|
||||
expanded = !expanded;
|
||||
});
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
if (summaryText.scrollHeight > summaryText.clientHeight) {
|
||||
const toggleContainer = document.createElement('div');
|
||||
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: -6px; justify-content: space-between;';
|
||||
toggleContainer.appendChild(toggleLink);
|
||||
toggleContainer.appendChild(summaryBranding);
|
||||
summaryBranding.style.marginRight = '-4px';
|
||||
summaryBranding.style.marginBottom = '-6px';
|
||||
summaryTextWrapper.appendChild(toggleContainer);
|
||||
} else {
|
||||
summaryText.style.maxHeight = '';
|
||||
summaryText.style.overflow = '';
|
||||
// No toggle, branding goes directly after text
|
||||
const brandingContainer = document.createElement('div');
|
||||
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
|
||||
brandingContainer.appendChild(summaryBranding);
|
||||
summaryTextWrapper.appendChild(brandingContainer);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// No truncation, branding goes directly after text
|
||||
const brandingContainer = document.createElement('div');
|
||||
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
|
||||
brandingContainer.appendChild(summaryBranding);
|
||||
summaryTextWrapper.appendChild(brandingContainer);
|
||||
}
|
||||
|
||||
const summaryBody = document.createElement('div');
|
||||
summaryBody.style.cssText = 'display: flex; gap: 8px; align-items: flex-start;';
|
||||
summaryBody.appendChild(summaryIcon);
|
||||
summaryBody.appendChild(summaryTextWrapper);
|
||||
summaryContainer.appendChild(summaryBody);
|
||||
|
||||
_addPanel('mzta-summary-banner', summaryContainer);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showSummaryGenerating": {
|
||||
if (document.getElementById('mzta-summary-generating')) return Promise.resolve(true);
|
||||
|
||||
_removePanel('mzta-summary-banner');
|
||||
_removeToolbarItem('mzta-toolbar-summary');
|
||||
|
||||
const colors = _getThemeColors();
|
||||
const genContainer = document.createElement('div');
|
||||
genContainer.className = 'thunderai-summary-pane';
|
||||
genContainer.style.cssText = `background-color: ${colors.summary.bg}; color: ${colors.summary.text}; padding: 0.5rem; border-radius: 4px; border: 1px solid ${colors.summary.border}; font-size: 14px; display: flex; align-items: center; gap: 10px;`;
|
||||
|
||||
const genIcon = document.createElement('img');
|
||||
genIcon.src = browser.runtime.getURL("/images/ai_summary.png");
|
||||
genIcon.style.cssText = `height: 16px; width: 16px; flex-shrink: 0;${colors.isDark ? ' filter: invert(1);' : ''}`;
|
||||
|
||||
const genLoading = document.createElement('img');
|
||||
genLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||
genLoading.style.cssText = "height: 16px; width: 16px;";
|
||||
|
||||
const genTitle = document.createElement('span');
|
||||
genTitle.className = 'thunderai-summary-title';
|
||||
genTitle.textContent = browser.i18n.getMessage("summarize_generating");
|
||||
genTitle.style.cssText = 'font-size: 14px;';
|
||||
|
||||
genContainer.appendChild(genIcon);
|
||||
genContainer.appendChild(genLoading);
|
||||
genContainer.appendChild(genTitle);
|
||||
|
||||
_addPanel('mzta-summary-generating', genContainer);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showSummaryButton": {
|
||||
if (document.getElementById('mzta-toolbar-summary')) return Promise.resolve(true);
|
||||
|
||||
const colors = _getThemeColors();
|
||||
const triggerBtn = document.createElement('div');
|
||||
triggerBtn.title = browser.i18n.getMessage("summarize_click_to_generate");
|
||||
triggerBtn.style.cssText = `background-color: ${colors.summary.bg}; border: 1px solid ${colors.summary.border}; border-radius: 4px; padding: 4px 8px; cursor: pointer; font-size: 12px; font-style: italic; opacity: 0.7; transition: opacity 0.2s; color: ${colors.summary.text}; display: inline-flex; align-items: center; gap: 6px;`;
|
||||
|
||||
const triggerIcon = document.createElement('img');
|
||||
triggerIcon.src = browser.runtime.getURL("/images/ai_summary.png");
|
||||
triggerIcon.style.cssText = `height: 14px; width: 14px;${colors.isDark ? ' filter: invert(1);' : ''}`;
|
||||
triggerBtn.appendChild(triggerIcon);
|
||||
|
||||
const triggerLabel = document.createElement('span');
|
||||
triggerLabel.textContent = browser.i18n.getMessage("get_ai_summary");
|
||||
triggerBtn.appendChild(triggerLabel);
|
||||
|
||||
triggerBtn.onmouseover = () => { triggerBtn.style.opacity = '1'; };
|
||||
triggerBtn.onmouseout = () => { triggerBtn.style.opacity = '0.7'; };
|
||||
triggerBtn.onclick = () => {
|
||||
_removeToolbarItem('mzta-toolbar-summary');
|
||||
browser.runtime.sendMessage({
|
||||
command: message.webchat ? "triggerSummaryWebchat" : "triggerSummaryGeneration",
|
||||
headerMessageId: message.headerMessageId
|
||||
});
|
||||
};
|
||||
|
||||
_addToolbarItem('mzta-toolbar-summary', triggerBtn);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showTranslation": {
|
||||
_removePanel('mzta-translation-generating');
|
||||
_removePanel('mzta-translation-banner');
|
||||
_removeToolbarItem('mzta-toolbar-translation');
|
||||
|
||||
const translationData = message.data;
|
||||
const colors = _getThemeColors();
|
||||
const tc = translationData.error ? colors.translErr : colors.translation;
|
||||
|
||||
const translationContainer = document.createElement('div');
|
||||
translationContainer.className = 'thunderai-translation-pane';
|
||||
translationContainer.style.cssText = `background-color: ${tc.bg}; color: ${tc.text}; padding: 0.5rem; border-radius: 4px; border: 1px solid ${tc.border}; font-size: 14px;`;
|
||||
|
||||
const translationHeader = document.createElement('div');
|
||||
translationHeader.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: 6px;';
|
||||
|
||||
const translationIcon = document.createElement('img');
|
||||
translationIcon.src = browser.runtime.getURL("/images/ai_translate.png");
|
||||
translationIcon.style.cssText = `height: 16px; width: 16px; flex-shrink: 0;${colors.isDark ? ' filter: invert(1);' : ''}`;
|
||||
|
||||
const translationTitleSpan = document.createElement('span');
|
||||
translationTitleSpan.style.cssText = `font-weight: bold; font-size: 14px; color: ${tc.text}; flex-grow: 1;`;
|
||||
translationTitleSpan.textContent = browser.i18n.getMessage("translate_banner_title") || "AI Translation";
|
||||
|
||||
const translationMenu = createThreeDotsMenu(colors.isDark, [
|
||||
{
|
||||
icon: '\u21BB',
|
||||
label: browser.i18n.getMessage("translate_refresh") || 'Refresh translation',
|
||||
hoverColor: colors.isDark ? '#4d9de0' : '#1a5fa8',
|
||||
disableAfterClick: true,
|
||||
onClick: () => {
|
||||
browser.runtime.sendMessage({ command: "refreshTranslation", headerMessageId: translationData.headerMessageId });
|
||||
}
|
||||
},
|
||||
{
|
||||
icon: '\u00D7',
|
||||
label: browser.i18n.getMessage("translate_delete") || 'Delete translation',
|
||||
hoverColor: '#cc0000',
|
||||
onClick: () => {
|
||||
_removePanel('mzta-translation-banner');
|
||||
browser.runtime.sendMessage({ command: "removeTranslation", headerMessageId: translationData.headerMessageId });
|
||||
}
|
||||
}
|
||||
], { bg: tc.bg, border: tc.border, text: tc.text });
|
||||
|
||||
const translationBranding = document.createElement('span');
|
||||
translationBranding.textContent = browser.i18n.getMessage("translate_by") + " ThunderAI";
|
||||
translationBranding.style.cssText = 'font-style: italic; font-size: 10px; opacity: 0.5; white-space: nowrap;';
|
||||
|
||||
translationHeader.appendChild(translationIcon);
|
||||
translationHeader.appendChild(translationTitleSpan);
|
||||
translationHeader.appendChild(translationMenu);
|
||||
translationContainer.appendChild(translationHeader);
|
||||
|
||||
const translationTextWrapper = document.createElement('div');
|
||||
translationTextWrapper.style.cssText = 'flex-grow: 1;';
|
||||
|
||||
const translationText = document.createElement('div');
|
||||
translationText.style.cssText = 'white-space: pre-wrap; line-height: 1.5;';
|
||||
if (translationData.error) {
|
||||
translationText.textContent = translationData.message || browser.i18n.getMessage("translate_error");
|
||||
} else if (translationData.translation_status === '-1') {
|
||||
translationText.textContent = browser.i18n.getMessage("translate_skipped");
|
||||
} else {
|
||||
if (translationData.translated_subject) {
|
||||
// const subjectEl = document.createElement('div');
|
||||
// subjectEl.style.cssText = 'font-weight: bold; margin-bottom: 4px;';
|
||||
if (translationData.lang) {
|
||||
translationTitleSpan.textContent = '[' + translationData.lang + '] ';
|
||||
}
|
||||
translationTitleSpan.textContent += translationData.translated_subject;
|
||||
// translationTextWrapper.appendChild(subjectEl);
|
||||
}
|
||||
const bodyText = translationData.translated_text || '';
|
||||
const bodyIsHtml = _isHtml(bodyText);
|
||||
if (bodyIsHtml) {
|
||||
translationText.style.whiteSpace = '';
|
||||
_renderSafeHtml(translationText, bodyText);
|
||||
} else {
|
||||
translationText.textContent = bodyText;
|
||||
}
|
||||
}
|
||||
translationTextWrapper.appendChild(translationText);
|
||||
|
||||
const maxLenTranslation = translationData.maxDisplayLength || 0;
|
||||
const fullTranslationText = translationData.translated_text || '';
|
||||
const fullTranslationIsHtml = _isHtml(fullTranslationText);
|
||||
if (!translationData.error && translationData.translation_status !== '-1' && maxLenTranslation > 0 && fullTranslationText.length > maxLenTranslation) {
|
||||
translationText.style.overflow = 'hidden';
|
||||
translationText.style.transition = 'max-height 0.2s ease';
|
||||
|
||||
const toggleLink = document.createElement('a');
|
||||
toggleLink.textContent = browser.i18n.getMessage("translate_see_more") || "See more";
|
||||
toggleLink.href = '#';
|
||||
toggleLink.style.cssText = `display: inline-block; margin-top: 4px; font-size: 13px; color: ${colors.linkColor}; cursor: pointer; text-decoration: underline;`;
|
||||
|
||||
if (fullTranslationIsHtml) {
|
||||
const collapsedMaxHeight = '4.2em';
|
||||
translationText.style.maxHeight = collapsedMaxHeight;
|
||||
|
||||
let expanded = false;
|
||||
toggleLink.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
if (!expanded) {
|
||||
translationText.style.maxHeight = translationText.scrollHeight + 'px';
|
||||
toggleLink.textContent = browser.i18n.getMessage("translate_see_less") || "See less";
|
||||
} else {
|
||||
translationText.style.maxHeight = collapsedMaxHeight;
|
||||
toggleLink.textContent = browser.i18n.getMessage("translate_see_more") || "See more";
|
||||
}
|
||||
expanded = !expanded;
|
||||
});
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
if (translationText.scrollHeight > translationText.clientHeight) {
|
||||
const toggleContainer = document.createElement('div');
|
||||
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: -6px; justify-content: space-between;';
|
||||
toggleContainer.appendChild(toggleLink);
|
||||
toggleContainer.appendChild(translationBranding);
|
||||
translationBranding.style.marginRight = '-4px';
|
||||
translationBranding.style.marginBottom = '-6px';
|
||||
translationTextWrapper.appendChild(toggleContainer);
|
||||
} else {
|
||||
translationText.style.maxHeight = '';
|
||||
translationText.style.overflow = '';
|
||||
// No toggle, branding goes directly after text
|
||||
const brandingContainer = document.createElement('div');
|
||||
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
|
||||
brandingContainer.appendChild(translationBranding);
|
||||
translationTextWrapper.appendChild(brandingContainer);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
let cutPos = fullTranslationText.lastIndexOf(' ', maxLenTranslation);
|
||||
if (cutPos <= 0) cutPos = maxLenTranslation;
|
||||
const truncatedTranslation = fullTranslationText.substring(0, cutPos) + '\u2026';
|
||||
translationText.textContent = truncatedTranslation;
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
translationText.style.maxHeight = translationText.scrollHeight + 'px';
|
||||
});
|
||||
|
||||
let expanded = false;
|
||||
toggleLink.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
if (!expanded) {
|
||||
translationText.textContent = fullTranslationText;
|
||||
translationText.style.maxHeight = translationText.scrollHeight + 'px';
|
||||
toggleLink.textContent = browser.i18n.getMessage("translate_see_less") || "See less";
|
||||
} else {
|
||||
translationText.textContent = truncatedTranslation;
|
||||
const collapsedHeight = translationText.scrollHeight;
|
||||
translationText.textContent = fullTranslationText;
|
||||
translationText.style.maxHeight = translationText.scrollHeight + 'px';
|
||||
requestAnimationFrame(() => {
|
||||
translationText.style.maxHeight = collapsedHeight + 'px';
|
||||
});
|
||||
translationText.addEventListener('transitionend', function handler() {
|
||||
translationText.removeEventListener('transitionend', handler);
|
||||
translationText.textContent = truncatedTranslation;
|
||||
});
|
||||
toggleLink.textContent = browser.i18n.getMessage("translate_see_more") || "See more";
|
||||
}
|
||||
expanded = !expanded;
|
||||
});
|
||||
const toggleContainer = document.createElement('div');
|
||||
toggleContainer.style.cssText = 'display: flex; align-items: center; gap: 8px; margin-bottom: -6px; justify-content: space-between;';
|
||||
toggleContainer.appendChild(toggleLink);
|
||||
toggleContainer.appendChild(translationBranding);
|
||||
translationBranding.style.marginRight = '-4px';
|
||||
translationBranding.style.marginBottom = '-6px';
|
||||
translationTextWrapper.appendChild(toggleContainer);
|
||||
}
|
||||
} else {
|
||||
// No truncation, branding goes directly after text
|
||||
const brandingContainer = document.createElement('div');
|
||||
brandingContainer.style.cssText = 'display: flex; justify-content: flex-end; margin-right: -4px; margin-bottom: -6px;';
|
||||
brandingContainer.appendChild(translationBranding);
|
||||
translationTextWrapper.appendChild(brandingContainer);
|
||||
}
|
||||
|
||||
translationContainer.appendChild(translationTextWrapper);
|
||||
|
||||
_addPanel('mzta-translation-banner', translationContainer);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showTranslationGenerating": {
|
||||
if (document.getElementById('mzta-translation-generating')) return Promise.resolve(true);
|
||||
|
||||
_removePanel('mzta-translation-banner');
|
||||
_removeToolbarItem('mzta-toolbar-translation');
|
||||
|
||||
const colors = _getThemeColors();
|
||||
const genContainer = document.createElement('div');
|
||||
genContainer.className = 'thunderai-translation-pane';
|
||||
genContainer.style.cssText = `background-color: ${colors.translation.bg}; color: ${colors.translation.text}; padding: 0.5rem; border-radius: 4px; border: 1px solid ${colors.translation.border}; font-size: 14px; display: flex; align-items: center; gap: 10px;`;
|
||||
|
||||
const genIcon = document.createElement('img');
|
||||
genIcon.src = browser.runtime.getURL("/images/ai_translate.png");
|
||||
genIcon.style.cssText = `height: 16px; width: 16px; flex-shrink: 0;${colors.isDark ? ' filter: invert(1);' : ''}`;
|
||||
|
||||
const genLoading = document.createElement('img');
|
||||
genLoading.src = browser.runtime.getURL("/images/loading.gif");
|
||||
genLoading.style.cssText = "height: 16px; width: 16px;";
|
||||
|
||||
const genTitle = document.createElement('span');
|
||||
genTitle.textContent = browser.i18n.getMessage("translate_generating") || "Translating...";
|
||||
genTitle.style.cssText = 'font-size: 14px;';
|
||||
|
||||
genContainer.appendChild(genIcon);
|
||||
genContainer.appendChild(genLoading);
|
||||
genContainer.appendChild(genTitle);
|
||||
|
||||
_addPanel('mzta-translation-generating', genContainer);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
case "showTranslationButton": {
|
||||
_removePanel('mzta-translation-generating');
|
||||
if (document.getElementById('mzta-toolbar-translation')) return Promise.resolve(true);
|
||||
|
||||
const colors = _getThemeColors();
|
||||
const triggerBtn = document.createElement('div');
|
||||
triggerBtn.title = browser.i18n.getMessage("translate_click_to_generate") || "Click to translate this email";
|
||||
triggerBtn.style.cssText = `background-color: ${colors.translation.bg}; border: 1px solid ${colors.translation.border}; border-radius: 4px; padding: 4px 8px; cursor: pointer; font-size: 12px; font-style: italic; opacity: 0.7; transition: opacity 0.2s; color: ${colors.translation.text}; display: inline-flex; align-items: center; gap: 6px;`;
|
||||
|
||||
const triggerIcon = document.createElement('img');
|
||||
triggerIcon.src = browser.runtime.getURL("/images/ai_translate.png");
|
||||
triggerIcon.style.cssText = `height: 14px; width: 14px;${colors.isDark ? ' filter: invert(1);' : ''}`;
|
||||
triggerBtn.appendChild(triggerIcon);
|
||||
|
||||
const triggerLabel = document.createElement('span');
|
||||
triggerLabel.textContent = browser.i18n.getMessage("get_ai_translation") || "Get AI Translation";
|
||||
triggerBtn.appendChild(triggerLabel);
|
||||
|
||||
triggerBtn.onmouseover = () => { triggerBtn.style.opacity = '1'; };
|
||||
triggerBtn.onmouseout = () => { triggerBtn.style.opacity = '0.7'; };
|
||||
triggerBtn.onclick = () => {
|
||||
_removeToolbarItem('mzta-toolbar-translation');
|
||||
browser.runtime.sendMessage({
|
||||
command: "triggerTranslationGeneration",
|
||||
headerMessageId: message.headerMessageId
|
||||
});
|
||||
};
|
||||
|
||||
_addToolbarItem('mzta-toolbar-translation', triggerBtn);
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
default:
|
||||
// do nothing
|
||||
return Promise.resolve(false);
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
browser.runtime.sendMessage({ command: "checkSpamReport" });
|
||||
browser.runtime.sendMessage({ command: "initSummary" });
|
||||
browser.runtime.sendMessage({ command: "initTranslation" });
|
||||
122
js/mzta-menus.js
|
|
@ -31,10 +31,12 @@ import {
|
|||
getMailSubject,
|
||||
getTagsList,
|
||||
extractJsonObject,
|
||||
normalizeDateTimeString,
|
||||
convertNewlinesToBr,
|
||||
cleanupNewlines,
|
||||
checkIfTagLabelExists,
|
||||
getConnectionType,
|
||||
getContextMenuIcon,
|
||||
} from './mzta-utils.js'
|
||||
import { taPromptUtils } from './mzta-utils-prompt.js';
|
||||
import { taLogger } from './mzta-logger.js';
|
||||
|
|
@ -74,8 +76,7 @@ export class mzta_Menus {
|
|||
this.rootMenu = [];
|
||||
this.shortcutMenu = [];
|
||||
this.menu_listeners = {};
|
||||
this.allPrompts = await getPrompts(true,also_special);
|
||||
this.allPrompts.sort((a, b) => a.name.localeCompare(b.name));
|
||||
this.allPrompts = await getPrompts(true,also_special);
|
||||
this.allPrompts.forEach((prompt) => {
|
||||
this.addAction(prompt)
|
||||
});
|
||||
|
|
@ -110,6 +111,25 @@ export class mzta_Menus {
|
|||
taWorkingStatus.startWorking();
|
||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||
const msg_text = await getMailBody(tabs, placeholdersUtils.hasPlaceholder(curr_prompt.text,'mail_typed_text'));
|
||||
|
||||
if (curr_prompt.id === 'prompt_get_calendar_event_from_clipboard') {
|
||||
try {
|
||||
const clipboardText = await navigator.clipboard.readText();
|
||||
if (!clipboardText) {
|
||||
browser.tabs.sendMessage(tabs[0].id, { command: "sendAlert", curr_tab_type: tabs[0].type, message: browser.i18n.getMessage('clipboard_empty_error') });
|
||||
taWorkingStatus.stopWorking();
|
||||
return {ok:'0'};
|
||||
}
|
||||
msg_text.selection = clipboardText;
|
||||
msg_text.text = clipboardText;
|
||||
} catch (e) {
|
||||
console.error("Clipboard read error:", e);
|
||||
browser.tabs.sendMessage(tabs[0].id, { command: "sendAlert", curr_tab_type: tabs[0].type, message: browser.i18n.getMessage('clipboard_read_error') });
|
||||
taWorkingStatus.stopWorking();
|
||||
return {ok:'0'};
|
||||
}
|
||||
}
|
||||
|
||||
// console.log(">>>>>>>>>>>>> msg_text: " + JSON.stringify(msg_text));
|
||||
//check if a selection is needed
|
||||
if(String(curr_prompt.need_selected) == "1" && (msg_text.selection==='')){
|
||||
|
|
@ -173,11 +193,18 @@ export class mzta_Menus {
|
|||
only_quoted_text: only_quoted_text,
|
||||
tags_full_list: tags_full_list
|
||||
});
|
||||
|
||||
curr_prompt.custom_text_array = [];
|
||||
|
||||
if(placeholdersUtils.hasPlaceholder(curr_prompt.text, 'additional_text')){
|
||||
curr_prompt.custom_text_array = placeholdersUtils.getPlaceholdersAdditionalTextArray(curr_prompt.text);
|
||||
}
|
||||
// console.log(">>>>>>>>>>>>>>>>>>> curr_prompt.custom_text_array: " + JSON.stringify(curr_prompt.custom_text_array));
|
||||
|
||||
switch(curr_prompt.id){
|
||||
case 'prompt_translate_this':
|
||||
let prefs2 = await browser.storage.sync.get({default_chatgpt_lang: getLanguageDisplayName(browser.i18n.getUILanguage())});
|
||||
let chatgpt_lang2 = prefs2.default_chatgpt_lang;
|
||||
let prefs2 = await browser.storage.sync.get({default_chatgpt_lang: getLanguageDisplayName(browser.i18n.getUILanguage()), translate_lang: ''});
|
||||
let chatgpt_lang2 = prefs2.translate_lang || prefs2.default_chatgpt_lang;
|
||||
if(chatgpt_lang2 === ''){
|
||||
chatgpt_lang2 = getLanguageDisplayName(browser.i18n.getUILanguage());
|
||||
}
|
||||
|
|
@ -192,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
|
||||
|
|
@ -256,7 +283,8 @@ export class mzta_Menus {
|
|||
return {ok:'1'};
|
||||
break; // Add tags to the email - END
|
||||
}
|
||||
case 'prompt_get_calendar_event': { // Get a calendar event info
|
||||
case 'prompt_get_calendar_event': // Get a calendar event info
|
||||
case 'prompt_get_calendar_event_from_clipboard': { // here from clipboard
|
||||
let calendar_event_data = '';
|
||||
let prefs_at = await browser.storage.sync.get({
|
||||
connection_type: prefs_default.connection_type,
|
||||
|
|
@ -306,6 +334,13 @@ export class mzta_Menus {
|
|||
taWorkingStatus.stopWorking();
|
||||
return {ok:'0'};
|
||||
}
|
||||
// Normalize date strings returned by the LLM
|
||||
if (calendar_event_data_obj.startDate) {
|
||||
calendar_event_data_obj.startDate = normalizeDateTimeString(calendar_event_data_obj.startDate);
|
||||
}
|
||||
if (calendar_event_data_obj.endDate) {
|
||||
calendar_event_data_obj.endDate = normalizeDateTimeString(calendar_event_data_obj.endDate);
|
||||
}
|
||||
// Timezone management
|
||||
calendar_event_data_obj.use_timezone = false;
|
||||
if(prefs_at.calendar_enforce_timezone){
|
||||
|
|
@ -378,10 +413,17 @@ export class mzta_Menus {
|
|||
let task_data_obj = {};
|
||||
try{
|
||||
task_data_obj = extractJsonObject(task_data);
|
||||
if (!task_data_obj.dueDate || isNaN(Date.parse(task_data_obj.dueDate)) || task_data_obj.dueDate == '' ) {
|
||||
// Normalize date strings returned by the LLM
|
||||
if (task_data_obj.dueDate) {
|
||||
task_data_obj.dueDate = normalizeDateTimeString(task_data_obj.dueDate);
|
||||
}
|
||||
if (task_data_obj.InitialDate) {
|
||||
task_data_obj.InitialDate = normalizeDateTimeString(task_data_obj.InitialDate);
|
||||
}
|
||||
if (!task_data_obj.dueDate) {
|
||||
delete task_data_obj.dueDate;
|
||||
}
|
||||
if (!task_data_obj.InitialDate || isNaN(Date.parse(task_data_obj.InitialDate)) || task_data_obj.InitialDate == '' ) {
|
||||
if (!task_data_obj.InitialDate) {
|
||||
delete task_data_obj.InitialDate;
|
||||
}
|
||||
}catch(err){
|
||||
|
|
@ -453,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__",
|
||||
|
|
@ -151,7 +160,7 @@ const defaultPlaceholders = [
|
|||
default_value: "",
|
||||
type: 0,
|
||||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
is_dynamic: "1",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
|
|
@ -253,6 +262,24 @@ const defaultPlaceholders = [
|
|||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'thunderai_translate_lang',
|
||||
name: "__MSG_placeholder_thunderai_translate_lang__",
|
||||
default_value: "",
|
||||
type: 0,
|
||||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'thunderai_translate_exclude_lang',
|
||||
name: "__MSG_placeholder_thunderai_translate_exclude_lang__",
|
||||
default_value: "",
|
||||
type: 0,
|
||||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'empty',
|
||||
name: "__MSG_placeholder_empty__",
|
||||
|
|
@ -270,6 +297,24 @@ const defaultPlaceholders = [
|
|||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'mail_text_body_or_selected',
|
||||
name: "__MSG_placeholder_mail_text_body_or_selected__",
|
||||
default_value: "",
|
||||
type: 0,
|
||||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
},
|
||||
{
|
||||
id: 'mail_html_body_or_selected',
|
||||
name: "__MSG_placeholder_mail_html_body_or_selected__",
|
||||
default_value: "",
|
||||
type: 0,
|
||||
is_default: "1",
|
||||
is_dynamic: "0",
|
||||
enabled: 1,
|
||||
}
|
||||
];
|
||||
|
||||
|
|
@ -412,7 +457,7 @@ export const placeholdersUtils = {
|
|||
// console.log(">>>>>>>>>> replacePlaceholders match: " + JSON.stringify(match));
|
||||
// console.log(">>>>>>>>>> replacePlaceholders p1: " + JSON.stringify(p1));
|
||||
// p1 contains the key inside {% %}
|
||||
if (skip_additional_text && (p1 === 'additional_text')) {
|
||||
if (skip_additional_text && ((p1 === 'additional_text') || (p1.startsWith('additional_text:')))) {
|
||||
return match;
|
||||
}
|
||||
const currPlaceholder = defaultPlaceholders.find(ph => (ph.id === p1) || (ph.is_dynamic == 1 && p1.startsWith(ph.id + ':')));
|
||||
|
|
@ -421,7 +466,7 @@ export const placeholdersUtils = {
|
|||
return match;
|
||||
}
|
||||
// Replace if found, otherwise keep the original or substitute with default value
|
||||
return replacements[p1] || (use_default_value ? currPlaceholder.default_value : match);
|
||||
return replacements[p1] || replacements[currPlaceholder.id] || (use_default_value ? currPlaceholder.default_value : match);
|
||||
});
|
||||
},
|
||||
|
||||
|
|
@ -444,7 +489,7 @@ export const placeholdersUtils = {
|
|||
// If a specific placeholder is provided, we search for it
|
||||
if (placeholder !== "") {
|
||||
// Dynamically build the regex for the specific placeholder
|
||||
regex = new RegExp(`{%\s*${placeholder}\s*%}`);
|
||||
regex = new RegExp(`{%\s*${placeholder}(:.*?)?\s*%}`);
|
||||
} else {
|
||||
// Otherwise, we search for any placeholder in the format {% ... %}
|
||||
regex = /{%\s*(.*?)\s*%}/;
|
||||
|
|
@ -470,6 +515,24 @@ export const placeholdersUtils = {
|
|||
return regex.test(text);
|
||||
},
|
||||
|
||||
getPlaceholdersAdditionalTextArray(prompt_text){
|
||||
const regex = /{%\s*additional_text(?::(.*?))?\s*%}/g;
|
||||
let matches = [];
|
||||
let match;
|
||||
let foundIds = new Set();
|
||||
while ((match = regex.exec(prompt_text)) !== null) {
|
||||
let info = match[1] ? match[1].trim() : "";
|
||||
if (!foundIds.has(info)) {
|
||||
foundIds.add(info);
|
||||
matches.push({
|
||||
placeholder: match[0],
|
||||
info: info
|
||||
});
|
||||
}
|
||||
}
|
||||
return matches;
|
||||
},
|
||||
|
||||
async getPlaceholdersValues(args) {
|
||||
const {
|
||||
prompt_text = "",
|
||||
|
|
@ -514,12 +577,21 @@ 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;
|
||||
case 'selected_html':
|
||||
finalSubs['selected_html'] = placeholdersUtils.failSafePlaceholders(selection_html);
|
||||
break;
|
||||
case 'mail_text_body_or_selected':
|
||||
finalSubs['mail_text_body_or_selected'] = placeholdersUtils.failSafePlaceholders(selection_text || body_text);
|
||||
break;
|
||||
case 'mail_html_body_or_selected':
|
||||
finalSubs['mail_html_body_or_selected'] = placeholdersUtils.failSafePlaceholders(selection_html || msg_text?.html);
|
||||
break;
|
||||
case 'author':
|
||||
finalSubs['author'] = placeholdersUtils.failSafePlaceholders(sanitizeMailHeaders(curr_message.author));
|
||||
break;
|
||||
|
|
@ -557,6 +629,14 @@ export const placeholdersUtils = {
|
|||
let prefs_def_lang = await browser.storage.sync.get({ default_chatgpt_lang: prefs_default.default_chatgpt_lang });
|
||||
finalSubs['thunderai_def_lang'] = placeholdersUtils.failSafePlaceholders(prefs_def_lang.default_chatgpt_lang);
|
||||
break;
|
||||
case 'thunderai_translate_lang':
|
||||
let prefs_translate_lang = await browser.storage.sync.get({ translate_lang: prefs_default.translate_lang });
|
||||
finalSubs['thunderai_translate_lang'] = placeholdersUtils.failSafePlaceholders(prefs_translate_lang.translate_lang);
|
||||
break;
|
||||
case 'thunderai_translate_exclude_lang':
|
||||
let prefs_translate_exclude_lang = await browser.storage.sync.get({ translate_exclude_lang: prefs_default.translate_exclude_lang });
|
||||
finalSubs['thunderai_translate_exclude_lang'] = placeholdersUtils.failSafePlaceholders(prefs_translate_exclude_lang.translate_exclude_lang);
|
||||
break;
|
||||
case 'mail_attachments_info':
|
||||
let attachments_info_string = "";
|
||||
let attachments_info = await browser.messages.listAttachments(curr_message.id);
|
||||
|
|
|
|||