mirror of
https://github.com/zadam/trilium.git
synced 2025-12-21 07:39:55 +01:00
Compare commits
1087 Commits
feat/llm-t
...
feat/push-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
53f31f9c78 | ||
|
|
22c5651eeb | ||
|
|
68a10a9813 | ||
|
|
b204964e57 | ||
|
|
b2c869d7ab | ||
|
|
307e17f9c8 | ||
|
|
ee7052ebc2 | ||
|
|
9059642738 | ||
|
|
fe8e3b4489 | ||
|
|
4e00e5b995 | ||
|
|
05ae0ca9d7 | ||
|
|
ac0116109b | ||
|
|
710ed9dd0e | ||
|
|
267f5105b2 | ||
|
|
a9564f8f38 | ||
|
|
9c5a130ab4 | ||
|
|
c40398df5d | ||
|
|
27fdd9e715 | ||
|
|
59697095b1 | ||
|
|
a16f5f5505 | ||
|
|
922d484a33 | ||
|
|
e1b4a0b720 | ||
|
|
991399fe4f | ||
|
|
27855456a0 | ||
|
|
0687ed9ec4 | ||
|
|
632976e71f | ||
|
|
98addef614 | ||
|
|
c72c9934b5 | ||
|
|
6362f24ae9 | ||
|
|
dc2d2fe25b | ||
|
|
bbc007e6cf | ||
|
|
3dfd195630 | ||
|
|
e3f72baab3 | ||
|
|
1bb19d0d9e | ||
|
|
bc1b69a836 | ||
|
|
0bfa9f0c58 | ||
|
|
498ffa806d | ||
|
|
9bfed2a80d | ||
|
|
ec902c5762 | ||
|
|
bb1d31f877 | ||
|
|
09f938fb72 | ||
|
|
a3e9192998 | ||
|
|
80b7c0b4c9 | ||
|
|
f01d6938f3 | ||
|
|
ab95d707a3 | ||
|
|
6475b4029a | ||
|
|
f646b3dc5c | ||
|
|
bcef0802e4 | ||
|
|
47099cc77b | ||
|
|
83be42f4ea | ||
|
|
ab9fec0186 | ||
|
|
c6dd32ea7b | ||
|
|
1d4cd538ac | ||
|
|
dc99f725f9 | ||
|
|
2f804f3eac | ||
|
|
9d6bb306e7 | ||
|
|
03ab912495 | ||
|
|
d12dfabd0b | ||
|
|
ed748bbebd | ||
|
|
e85858d22d | ||
|
|
0afa9717e5 | ||
|
|
1e2e3498c6 | ||
|
|
59a01b816c | ||
|
|
508f46af42 | ||
|
|
1af865a577 | ||
|
|
74834af222 | ||
|
|
f55e33f303 | ||
|
|
fcb77360e1 | ||
|
|
3d285e105e | ||
|
|
bb55544f25 | ||
|
|
2e9e9a60bf | ||
|
|
f7e77cd6cb | ||
|
|
a7a94789e6 | ||
|
|
864ac1a270 | ||
|
|
fbec6d8873 | ||
|
|
5f647a932d | ||
|
|
6e5046c0d4 | ||
|
|
3c9a8e38d3 | ||
|
|
b3a3196136 | ||
|
|
3229b7d106 | ||
|
|
4213c377f8 | ||
|
|
86365ebd44 | ||
|
|
20cf685174 | ||
|
|
aeb5a7b251 | ||
|
|
47a50bb449 | ||
|
|
a2a5b67496 | ||
|
|
a94cc5bdab | ||
|
|
526c5a6dd8 | ||
|
|
3f5239706f | ||
|
|
d2761abd04 | ||
|
|
57983b54d2 | ||
|
|
703cf8434a | ||
|
|
aa4375e25f | ||
|
|
7d3a672b55 | ||
|
|
c08b30a060 | ||
|
|
d579e39b40 | ||
|
|
b147d4bdeb | ||
|
|
48faa8a813 | ||
|
|
ec646809dd | ||
|
|
ab48a28635 | ||
|
|
3fd7afbb57 | ||
|
|
4074929c6b | ||
|
|
d73e84ea6c | ||
|
|
753f1dc7b6 | ||
|
|
9464667323 | ||
|
|
4d82f2f22d | ||
|
|
e3d28e703f | ||
|
|
5f39a314b5 | ||
|
|
43caadc472 | ||
|
|
f2ce8b9f3c | ||
|
|
735e91e636 | ||
|
|
4df94d1f20 | ||
|
|
70440520e1 | ||
|
|
e49e2d5093 | ||
|
|
f0ac301417 | ||
|
|
168ff90e38 | ||
|
|
5e4f529b26 | ||
|
|
0d1bd3e298 | ||
|
|
70f826b737 | ||
|
|
8bd5af3fd2 | ||
|
|
dbbae87cd3 | ||
|
|
83fd42aff2 | ||
|
|
93c9383a92 | ||
|
|
7c490d8b72 | ||
|
|
b4b5e86a14 | ||
|
|
e166b97b8f | ||
|
|
829f382726 | ||
|
|
4ef103063d | ||
|
|
fa66e50193 | ||
|
|
255ad96c8b | ||
|
|
a12fa1177b | ||
|
|
6fa7cc8201 | ||
|
|
2fff5418a9 | ||
|
|
2e805cd5a3 | ||
|
|
61eaa89de6 | ||
|
|
aa0c021f8b | ||
|
|
4fd02db079 | ||
|
|
88bbc7e8c1 | ||
|
|
af0ba32dd9 | ||
|
|
938d295bf3 | ||
|
|
f82667066f | ||
|
|
03a7fe1282 | ||
|
|
0c0504ffd1 | ||
|
|
e4900ce87b | ||
|
|
04de87722b | ||
|
|
a95e28c085 | ||
|
|
9fbcfb0f0f | ||
|
|
f24a3442fb | ||
|
|
918a945e3b | ||
|
|
3b96b5779b | ||
|
|
a93b20428e | ||
|
|
0522024f6d | ||
|
|
f27f135a61 | ||
|
|
6a76136878 | ||
|
|
1766d28fc2 | ||
|
|
f51d944bb3 | ||
|
|
cabe240e7e | ||
|
|
e72fb39c4d | ||
|
|
0ca30e0e87 | ||
|
|
cc362393be | ||
|
|
40bfd827d2 | ||
|
|
a4046fbf6e | ||
|
|
28605f2687 | ||
|
|
2085d1bbba | ||
|
|
08db03800e | ||
|
|
04b7e0cde9 | ||
|
|
401260d3ca | ||
|
|
53e0c05290 | ||
|
|
cdbb89482e | ||
|
|
e290635ba5 | ||
|
|
e340e6f5e3 | ||
|
|
2d950e8f3a | ||
|
|
4c70d72ba2 | ||
|
|
80edc4c4e0 | ||
|
|
4d07a1aab6 | ||
|
|
e2cd357319 | ||
|
|
620b57bfa6 | ||
|
|
934c9d3df8 | ||
|
|
f034e8bb37 | ||
|
|
93f80c6837 | ||
|
|
a54177fee0 | ||
|
|
0e6ad42923 | ||
|
|
b0beb74011 | ||
|
|
4857fecc41 | ||
|
|
8405d960be | ||
|
|
b9101c9fb2 | ||
|
|
e457e6a2f2 | ||
|
|
f3416fa03e | ||
|
|
3e5ab2b1e1 | ||
|
|
5c0bc9a7c2 | ||
|
|
2adfa55acd | ||
|
|
8125e8afcd | ||
|
|
e328f18558 | ||
|
|
cbdfa9079c | ||
|
|
e08c4515a7 | ||
|
|
650aa16b89 | ||
|
|
11d908218b | ||
|
|
3627a7dc93 | ||
|
|
1e1c8cc4ff | ||
|
|
d616bc09c9 | ||
|
|
f1cef44d5d | ||
|
|
3795be4750 | ||
|
|
2bb66a7526 | ||
|
|
28a472782f | ||
|
|
a4da002352 | ||
|
|
94fdc2beee | ||
|
|
dd4a01d9f8 | ||
|
|
a2a6c67350 | ||
|
|
2152ca7ba6 | ||
|
|
40e4d236f4 | ||
|
|
0450cd080d | ||
|
|
1eaac79d63 | ||
|
|
19c0305ed9 | ||
|
|
f0d14a966a | ||
|
|
37e6ccdc1a | ||
|
|
06cea99b40 | ||
|
|
1851336862 | ||
|
|
461eb273d9 | ||
|
|
470edc4d70 | ||
|
|
26132a2a56 | ||
|
|
d92bd16042 | ||
|
|
1c7dfa6c91 | ||
|
|
3a3fed4314 | ||
|
|
82bdb76d75 | ||
|
|
066f3ea078 | ||
|
|
9d760a21d5 | ||
|
|
976c795ac6 | ||
|
|
ed320e4e24 | ||
|
|
3111738700 | ||
|
|
1fa0bada23 | ||
|
|
11eca7e58b | ||
|
|
4b50e2f14d | ||
|
|
63faba9603 | ||
|
|
3e213699e0 | ||
|
|
c88ff07691 | ||
|
|
b53aa5cf6e | ||
|
|
2641b9b3fe | ||
|
|
3a2a73992c | ||
|
|
b82b17a701 | ||
|
|
a6202edcd1 | ||
|
|
6eac0cb75d | ||
|
|
83672d6138 | ||
|
|
51dadf72d0 | ||
|
|
0cbf61acb3 | ||
|
|
399c7435ac | ||
|
|
d51fae7878 | ||
|
|
9750e25ad5 | ||
|
|
2f9b2f0e8f | ||
|
|
8deaf22544 | ||
|
|
b192f43187 | ||
|
|
8cb8d1303c | ||
|
|
5237348975 | ||
|
|
72e2f6757e | ||
|
|
cf059e7f86 | ||
|
|
44d69216b6 | ||
|
|
c38bf09af0 | ||
|
|
9373d47e86 | ||
|
|
29350628c3 | ||
|
|
83d1a68879 | ||
|
|
f188408099 | ||
|
|
449ab3a798 | ||
|
|
21504d1417 | ||
|
|
3060b496e3 | ||
|
|
bd35539fa1 | ||
|
|
df6447e3ad | ||
|
|
24fd898f0d | ||
|
|
1aa6238288 | ||
|
|
c16c4788da | ||
|
|
0c35daab85 | ||
|
|
4a19639e92 | ||
|
|
36cceea677 | ||
|
|
4dbc76790a | ||
|
|
b32a344a21 | ||
|
|
3896ab822f | ||
|
|
cfa4ba57d4 | ||
|
|
da051e0269 | ||
|
|
3eda77a91f | ||
|
|
5c2f4be5dd | ||
|
|
435b501db9 | ||
|
|
5a27ffef5f | ||
|
|
02256d9a45 | ||
|
|
7e069009d6 | ||
|
|
3c25cda4c0 | ||
|
|
70d7ad0b1a | ||
|
|
e793b2f661 | ||
|
|
917ea3e401 | ||
|
|
5a54dd666f | ||
|
|
733ec2c145 | ||
|
|
e386b03b90 | ||
|
|
25d5d51085 | ||
|
|
50c4301a34 | ||
|
|
0f60c0696b | ||
|
|
3ec2947c4f | ||
|
|
e89162838e | ||
|
|
72181090a5 | ||
|
|
72b2a5cc0d | ||
|
|
1eaeec8100 | ||
|
|
660db3b3ab | ||
|
|
89d2fcb81e | ||
|
|
ccda623840 | ||
|
|
a6e7dff61e | ||
|
|
86d1bbe8ff | ||
|
|
a10cb06f14 | ||
|
|
dd9a62818b | ||
|
|
c0e936675c | ||
|
|
b0b788b7dc | ||
|
|
18f0f3ecac | ||
|
|
e7d745ac94 | ||
|
|
24abf7f0ed | ||
|
|
36fb097d1d | ||
|
|
35ef5fd0d3 | ||
|
|
9a08f6534b | ||
|
|
885dd2053b | ||
|
|
6f6f280bdd | ||
|
|
a3e8fd374f | ||
|
|
f91c1f4180 | ||
|
|
d85746c1b9 | ||
|
|
5a17075eef | ||
|
|
6cab47fb55 | ||
|
|
93c5413790 | ||
|
|
f2db7baeba | ||
|
|
a507991808 | ||
|
|
7c86f90ac6 | ||
|
|
1e9b772692 | ||
|
|
096ab52216 | ||
|
|
88c3cd5cdd | ||
|
|
99a911a220 | ||
|
|
3218ab971b | ||
|
|
274e3c1f7f | ||
|
|
f8916a6e35 | ||
|
|
73f20d01e4 | ||
|
|
2fd3a875b6 | ||
|
|
68cba8d3b2 | ||
|
|
6b28fd405e | ||
|
|
3bccbabe53 | ||
|
|
c97c66ed8a | ||
|
|
4b212232c8 | ||
|
|
ac3a8edf2b | ||
|
|
b581025bbe | ||
|
|
7bc5331747 | ||
|
|
2415976475 | ||
|
|
8d0d0f0449 | ||
|
|
16b00ed160 | ||
|
|
df73a420f9 | ||
|
|
1e4d57f275 | ||
|
|
19a238c8d3 | ||
|
|
5ffd8a79eb | ||
|
|
04fbc82d7c | ||
|
|
3f105f7b8b | ||
|
|
b9193a5562 | ||
|
|
e1fa188244 | ||
|
|
80ad87671a | ||
|
|
b6d5a6ec2e | ||
|
|
759398d804 | ||
|
|
c1b30db3d1 | ||
|
|
0c8bfc39ef | ||
|
|
3815fddb27 | ||
|
|
b585a64a38 | ||
|
|
58e58c192f | ||
|
|
5939344378 | ||
|
|
ad85ee3531 | ||
|
|
349f19fef7 | ||
|
|
d5777a024e | ||
|
|
b7f4ee6171 | ||
|
|
a83c4e3970 | ||
|
|
5a767dae34 | ||
|
|
9f93d30b99 | ||
|
|
dff525edc6 | ||
|
|
26da431320 | ||
|
|
cde4622693 | ||
|
|
5ede7ecc69 | ||
|
|
b607d1e628 | ||
|
|
d7e36bdf93 | ||
|
|
2b8b185b5b | ||
|
|
927ebcbec9 | ||
|
|
ea1397de63 | ||
|
|
ce1f5c6204 | ||
|
|
652114c7b5 | ||
|
|
17cd2128fd | ||
|
|
bc4378cb3e | ||
|
|
513878dfef | ||
|
|
753d5529b2 | ||
|
|
9f217b88e4 | ||
|
|
d53faa8c01 | ||
|
|
a934760960 | ||
|
|
82914fc2aa | ||
|
|
db687197de | ||
|
|
efd713dc61 | ||
|
|
3f3c7cfe88 | ||
|
|
73ca285b7a | ||
|
|
168d25c020 | ||
|
|
e8ae5486c8 | ||
|
|
f049b8b915 | ||
|
|
4e755dc537 | ||
|
|
5351310a38 | ||
|
|
211ca43a82 | ||
|
|
e5235e7f22 | ||
|
|
e72298f0b4 | ||
|
|
3abf5c65c6 | ||
|
|
268acb0b88 | ||
|
|
196b3b873f | ||
|
|
4d9801a372 | ||
|
|
bd710ba665 | ||
|
|
afe369c876 | ||
|
|
206007bbce | ||
|
|
8ad05b92c0 | ||
|
|
735da2a855 | ||
|
|
980077f559 | ||
|
|
12053e75bb | ||
|
|
62372ed4c5 | ||
|
|
e5caf37697 | ||
|
|
befc5a9530 | ||
|
|
1e00407864 | ||
|
|
73038efccf | ||
|
|
6d37e19b40 | ||
|
|
2c33ef2b0d | ||
|
|
6c30e0836f | ||
|
|
5f77ca31bd | ||
|
|
f7c82d6b09 | ||
|
|
86dd9aa42a | ||
|
|
5daca270e4 | ||
|
|
e18813a4bf | ||
|
|
4aa7e211f3 | ||
|
|
419dc7edfb | ||
|
|
eaa84a6b39 | ||
|
|
1d0503d0e4 | ||
|
|
f7f98aa9a3 | ||
|
|
575d14261a | ||
|
|
9aab606deb | ||
|
|
2e11681b52 | ||
|
|
8cca6637f7 | ||
|
|
82e076378c | ||
|
|
94ddad3c49 | ||
|
|
d35dbca18b | ||
|
|
7468d6147a | ||
|
|
7c78d749de | ||
|
|
85dd99a3c4 | ||
|
|
0a9c0234e2 | ||
|
|
fad77ba5a0 | ||
|
|
12723f3216 | ||
|
|
a43140515f | ||
|
|
3e3cc8c541 | ||
|
|
a85141ace2 | ||
|
|
c33280bbb2 | ||
|
|
df3aa04787 | ||
|
|
4bd25a0d4a | ||
|
|
7fadf4c6e1 | ||
|
|
d1538508e8 | ||
|
|
b24d786933 | ||
|
|
8f69b87dd1 | ||
|
|
9b1da8c311 | ||
|
|
8287063aab | ||
|
|
e4a8258acf | ||
|
|
5e88043c7b | ||
|
|
bedf9112fb | ||
|
|
03681d23c5 | ||
|
|
21683db0b8 | ||
|
|
978d829150 | ||
|
|
cc05572a35 | ||
|
|
c5bb310613 | ||
|
|
77551b1fed | ||
|
|
70728c274e | ||
|
|
cee4714665 | ||
|
|
c3eca3b626 | ||
|
|
01e4cd2e78 | ||
|
|
b99d01ad7b | ||
|
|
bf0213907e | ||
|
|
eff5b6459d | ||
|
|
8e29b5eed6 | ||
|
|
c91748da15 | ||
|
|
f04f9dc262 | ||
|
|
e873cdab7e | ||
|
|
f9b6fd6ac5 | ||
|
|
aa191e110c | ||
|
|
dd09907925 | ||
|
|
da4810672d | ||
|
|
f772f59d7c | ||
|
|
1964fb90d5 | ||
|
|
5945f2860a | ||
|
|
f45da049b9 | ||
|
|
c0beab8a5d | ||
|
|
cabeb13adb | ||
|
|
e2e9721d5f | ||
|
|
4e9deab605 | ||
|
|
9bb048fb01 | ||
|
|
6849f80506 | ||
|
|
5597f4e2e0 | ||
|
|
35e9508bde | ||
|
|
45fbcec805 | ||
|
|
4c8da70ef3 | ||
|
|
ed5da5cd4a | ||
|
|
dc5fccdbcd | ||
|
|
91aea333c7 | ||
|
|
a0de01cff1 | ||
|
|
a41ed34193 | ||
|
|
49e8811c18 | ||
|
|
488563a82e | ||
|
|
d76d50f30e | ||
|
|
4685aef88d | ||
|
|
a106510924 | ||
|
|
9d54503ef7 | ||
|
|
b1449eebf3 | ||
|
|
b213453062 | ||
|
|
076c0321cf | ||
|
|
4d71b73f38 | ||
|
|
b20ffdf7db | ||
|
|
ef018e22d6 | ||
|
|
3fa290a257 | ||
|
|
cdde530b60 | ||
|
|
aa608510d0 | ||
|
|
009fd63ce9 | ||
|
|
bea352855a | ||
|
|
51e8a80ca3 | ||
|
|
8a543d4513 | ||
|
|
945e180a6f | ||
|
|
b93fa332d3 | ||
|
|
9e947f742d | ||
|
|
033e90f8b7 | ||
|
|
be576176c5 | ||
|
|
4da3e8a4d8 | ||
|
|
db2bf537ea | ||
|
|
9a4fdcaef2 | ||
|
|
ca40360f7d | ||
|
|
799e705ff8 | ||
|
|
a1b18c7f97 | ||
|
|
9958a6e1bf | ||
|
|
1fc6d8aca7 | ||
|
|
3e9ec2d943 | ||
|
|
1420def1c3 | ||
|
|
3b4184e765 | ||
|
|
4ce9102f93 | ||
|
|
eb27ec2234 | ||
|
|
b70e25d348 | ||
|
|
772c0bbe1a | ||
|
|
144021c053 | ||
|
|
59486cd55d | ||
|
|
afe3904ea3 | ||
|
|
8abd3ed3f1 | ||
|
|
53ed510c92 | ||
|
|
4ec46a2ebd | ||
|
|
db6f948499 | ||
|
|
05c73011f5 | ||
|
|
3b733d01f1 | ||
|
|
ebf21296d4 | ||
|
|
6f83ac4822 | ||
|
|
d358924324 | ||
|
|
f9a3606ca2 | ||
|
|
33299ad51e | ||
|
|
8752182e7e | ||
|
|
0551ac8ead | ||
|
|
6d5a11bd4d | ||
|
|
ce19d84247 | ||
|
|
f24aa45a3b | ||
|
|
64a28a7e75 | ||
|
|
249a755312 | ||
|
|
a3d51a013c | ||
|
|
839def9959 | ||
|
|
fd432a7100 | ||
|
|
60a07ce1e7 | ||
|
|
88c5700d87 | ||
|
|
d59993abf6 | ||
|
|
0754011909 | ||
|
|
376bb66cab | ||
|
|
588e15c633 | ||
|
|
93b8ad20d7 | ||
|
|
e51b3d760d | ||
|
|
91f3bc4488 | ||
|
|
3e80a99bbf | ||
|
|
37cdb55e79 | ||
|
|
58b66c0c95 | ||
|
|
e5f9db86a1 | ||
|
|
f138f99356 | ||
|
|
c42f4b9814 | ||
|
|
0a9fb886e3 | ||
|
|
3c4577201f | ||
|
|
816421188f | ||
|
|
5b15d2c4c6 | ||
|
|
4bc7165452 | ||
|
|
82d6531e8c | ||
|
|
d6209035c3 | ||
|
|
1d7799f981 | ||
|
|
51291a61e6 | ||
|
|
0841603be0 | ||
|
|
59ba6a0b1e | ||
|
|
53eda46043 | ||
|
|
cbc9fb7d08 | ||
|
|
1f479b20be | ||
|
|
f00b8e9522 | ||
|
|
c7dd271516 | ||
|
|
a947a61d65 | ||
|
|
0122f1cc5e | ||
|
|
acb905a3e6 | ||
|
|
7422eb5598 | ||
|
|
e721166f95 | ||
|
|
5a48130fa4 | ||
|
|
b60fe1ad10 | ||
|
|
1405b0147c | ||
|
|
222a7a57bc | ||
|
|
cddf9f0242 | ||
|
|
3e17ff5e7b | ||
|
|
04973094f2 | ||
|
|
018a6cb84a | ||
|
|
44825af0c0 | ||
|
|
cfb3607052 | ||
|
|
c5ec928aac | ||
|
|
8d0183a9fb | ||
|
|
ecd4079871 | ||
|
|
3ed975f2e6 | ||
|
|
c6deb537d5 | ||
|
|
e7b3d806a7 | ||
|
|
d1a0778b48 | ||
|
|
378634567f | ||
|
|
ed56ed2be0 | ||
|
|
648aa7e3b0 | ||
|
|
73ff41f2b2 | ||
|
|
3837466cb3 | ||
|
|
b97a5ef888 | ||
|
|
2ff1276ebb | ||
|
|
227cf5de85 | ||
|
|
ccf52be431 | ||
|
|
07713e988c | ||
|
|
f934318625 | ||
|
|
6fb90abd75 | ||
|
|
27cc33888a | ||
|
|
95af901808 | ||
|
|
c5a7f84250 | ||
|
|
a71d28500d | ||
|
|
436fd16f3a | ||
|
|
ca34bf42f6 | ||
|
|
fbf2315f57 | ||
|
|
72f50dcb6b | ||
|
|
fd4c2f79a7 | ||
|
|
72f9335213 | ||
|
|
53d97047a3 | ||
|
|
2ba3666e23 | ||
|
|
4a1d379ab4 | ||
|
|
73167e1e30 | ||
|
|
ffc13f5de3 | ||
|
|
9ba23d49d8 | ||
|
|
222a6c48a7 | ||
|
|
e33208e6ec | ||
|
|
af8781eaa7 | ||
|
|
167b1a8d2e | ||
|
|
0a7aff507c | ||
|
|
103532aad9 | ||
|
|
16939e9fd5 | ||
|
|
4ef6169041 | ||
|
|
9ebee42118 | ||
|
|
234d3997b1 | ||
|
|
3ba0bcea4e | ||
|
|
701855344e | ||
|
|
71b627fbc7 | ||
|
|
5a4fc2c690 | ||
|
|
0d67db52a2 | ||
|
|
d971554201 | ||
|
|
8fd7d7176e | ||
|
|
675575eed9 | ||
|
|
2122cde293 | ||
|
|
b68a554bba | ||
|
|
33043c7133 | ||
|
|
2e0f606a7a | ||
|
|
87878dd6a7 | ||
|
|
5296e073cc | ||
|
|
7bfb7d6f6e | ||
|
|
b5069cc7c2 | ||
|
|
3b6791f51a | ||
|
|
0b0be77e02 | ||
|
|
60db10559e | ||
|
|
76b066ba4a | ||
|
|
a28db32369 | ||
|
|
2523632391 | ||
|
|
53548c356a | ||
|
|
565904ff5d | ||
|
|
e0c5545f8c | ||
|
|
bc21285289 | ||
|
|
bbf8d757cd | ||
|
|
318d504fad | ||
|
|
fd5038148c | ||
|
|
693ca9291e | ||
|
|
cfd8afc226 | ||
|
|
3e52ca7600 | ||
|
|
482522e802 | ||
|
|
8b5b6a01c6 | ||
|
|
5614891d92 | ||
|
|
b9b4961f3c | ||
|
|
7b83b20339 | ||
|
|
e4403dd316 | ||
|
|
3f267fe6c9 | ||
|
|
3229471485 | ||
|
|
62bac1adf9 | ||
|
|
82becfd52a | ||
|
|
92f035545b | ||
|
|
74d8ea7dcb | ||
|
|
ac3f087279 | ||
|
|
1cc4eb98c1 | ||
|
|
e99bdf8f24 | ||
|
|
b4f521a141 | ||
|
|
1e23bc09f1 | ||
|
|
e3ec90405d | ||
|
|
41c87794a4 | ||
|
|
e62d2d4fda | ||
|
|
93adaa0f52 | ||
|
|
263a5d2067 | ||
|
|
f0a5005794 | ||
|
|
577457c8ab | ||
|
|
c0c450c444 | ||
|
|
1e1e0b0f51 | ||
|
|
a19204a1d5 | ||
|
|
1d139bfdfe | ||
|
|
75072decec | ||
|
|
0cf2ad6901 | ||
|
|
ccbd57a0c0 | ||
|
|
92e6c8c445 | ||
|
|
1e966f1d59 | ||
|
|
6872c2194e | ||
|
|
5b6a0216db | ||
|
|
e9a7194cd6 | ||
|
|
26898b9122 | ||
|
|
3e00e490cf | ||
|
|
c02ed17ebc | ||
|
|
fb559d66fe | ||
|
|
25dce64c3b | ||
|
|
6f19fde76e | ||
|
|
33ae91f49c | ||
|
|
99c179e29a | ||
|
|
1dbcb5a027 | ||
|
|
54d613e00e | ||
|
|
1f8aa90482 | ||
|
|
c9dcbef014 | ||
|
|
68086ec3f1 | ||
|
|
f62078d02b | ||
|
|
ab1d8594ea | ||
|
|
c368ec3c38 | ||
|
|
1a15782686 | ||
|
|
3bd0aeef77 | ||
|
|
b463baedd2 | ||
|
|
ae77c41dab | ||
|
|
807d909acd | ||
|
|
fa4f5f526e | ||
|
|
edff43cdb3 | ||
|
|
46fe45528c | ||
|
|
b4b53da6a4 | ||
|
|
41fd270080 | ||
|
|
410bb3cdca | ||
|
|
bc6fc24fbd | ||
|
|
c039f06c2b | ||
|
|
520effbbb7 | ||
|
|
a42d780724 | ||
|
|
da92255dd6 | ||
|
|
cce3d3bce8 | ||
|
|
f524e99290 | ||
|
|
ba19fc7cf3 | ||
|
|
22c3de582f | ||
|
|
48896e67cb | ||
|
|
16cd91eb02 | ||
|
|
7e03774b8e | ||
|
|
a04f6e3858 | ||
|
|
96eb1be556 | ||
|
|
f8e20a1405 | ||
|
|
c67c3a6861 | ||
|
|
d04897e011 | ||
|
|
558ae1a2ea | ||
|
|
64bffb82b1 | ||
|
|
81ac390eab | ||
|
|
0db556fac2 | ||
|
|
2793df06c4 | ||
|
|
e7b448e2bc | ||
|
|
d2bc72d54f | ||
|
|
83b22b4861 | ||
|
|
d42a949602 | ||
|
|
83e1512b59 | ||
|
|
ba6a1ec584 | ||
|
|
6685e583f2 | ||
|
|
d6032c912e | ||
|
|
25527ecc21 | ||
|
|
e0e7bd42cc | ||
|
|
fbc1af56ed | ||
|
|
8ff108db9e | ||
|
|
1dfcf960d3 | ||
|
|
9bdc51a3fb | ||
|
|
dbf3bcfacf | ||
|
|
3d5b269315 | ||
|
|
48f97da9cc | ||
|
|
9c954fbd81 | ||
|
|
c6bd41654f | ||
|
|
d65a74bb23 | ||
|
|
ff08bca042 | ||
|
|
a5d3d2e3b4 | ||
|
|
496a0667ee | ||
|
|
9be688b667 | ||
|
|
f3d9008c61 | ||
|
|
649a43c978 | ||
|
|
50568704ca | ||
|
|
b66b4dec83 | ||
|
|
8d0e807435 | ||
|
|
bf05ed7caf | ||
|
|
b5080eff00 | ||
|
|
c474769dd6 | ||
|
|
a6ae01da0b | ||
|
|
2bf4c44dbf | ||
|
|
5ca0fbba13 | ||
|
|
4cd84b2019 | ||
|
|
c502a45cf5 | ||
|
|
9e66914306 | ||
|
|
d33d27ee82 | ||
|
|
e2b13573ae | ||
|
|
ec74f5f1de | ||
|
|
5dee56debc | ||
|
|
5623fc992d | ||
|
|
1d28bfc570 | ||
|
|
084327e973 | ||
|
|
b2885efdc1 | ||
|
|
b65a75f138 | ||
|
|
0ee7f50bb4 | ||
|
|
02ce21bc18 | ||
|
|
3ba487bb00 | ||
|
|
384a89b0e3 | ||
|
|
e7fd9371b6 | ||
|
|
aa83429816 | ||
|
|
221ab02c24 | ||
|
|
0c4b751e8f | ||
|
|
43fd0924a1 | ||
|
|
7a036fc777 | ||
|
|
54efa6b38c | ||
|
|
6e37c9ee5a | ||
|
|
963f4586f3 | ||
|
|
4d0edebed3 | ||
|
|
cb39e8d0f8 | ||
|
|
a336f472b8 | ||
|
|
0a097e72be | ||
|
|
077f10af7b | ||
|
|
9317658fc7 | ||
|
|
21a13f2124 | ||
|
|
db6658c05f | ||
|
|
653af0bc06 | ||
|
|
93c5281af7 | ||
|
|
ce28fbc968 | ||
|
|
eb41c45711 | ||
|
|
17ab14e098 | ||
|
|
a42f7b4ece | ||
|
|
c7d69fa66b | ||
|
|
1da5c083ee | ||
|
|
4fb911da40 | ||
|
|
881417f860 | ||
|
|
9748b8bf94 | ||
|
|
337326da2b | ||
|
|
a088134d9b | ||
|
|
e49100f3f4 | ||
|
|
3c638e1574 | ||
|
|
9131edf021 | ||
|
|
52a1318475 | ||
|
|
5a7483d7c7 | ||
|
|
41f2748829 | ||
|
|
66bd5268ca | ||
|
|
ebef134af7 | ||
|
|
1173bf22ab | ||
|
|
e8f6828168 | ||
|
|
02c9339f9c | ||
|
|
c72bf42684 | ||
|
|
f42eeb7ee8 | ||
|
|
3d876121cc | ||
|
|
f9bcd7d90a | ||
|
|
b3af14fccb | ||
|
|
d224f33913 | ||
|
|
3a5f33ba91 | ||
|
|
e1ae8701b2 | ||
|
|
aff5a4d0d5 | ||
|
|
17467a9c29 | ||
|
|
ebed661863 | ||
|
|
c2e9f4764b | ||
|
|
7e5b87f00a | ||
|
|
70182e863c | ||
|
|
f0d30c4e34 | ||
|
|
013e7a6aa4 | ||
|
|
1b25b18d9e | ||
|
|
72ff384187 | ||
|
|
bac048f60f | ||
|
|
d8d0a64134 | ||
|
|
b2db87db4e | ||
|
|
1baaee582e | ||
|
|
9212b72351 | ||
|
|
24af820477 | ||
|
|
6c4c2d22c6 | ||
|
|
2e9b20be71 | ||
|
|
3216de5d89 | ||
|
|
4bf7cb8099 | ||
|
|
4871dbd7ef | ||
|
|
e125809fe0 | ||
|
|
27b80b573f | ||
|
|
38d6ae87b6 | ||
|
|
1a7cbc13e0 | ||
|
|
8e4691d4a4 | ||
|
|
b371337ed2 | ||
|
|
4d4b76ce39 | ||
|
|
289d3e9882 | ||
|
|
a57eb8f27f | ||
|
|
27023f1fd5 | ||
|
|
20a152993f | ||
|
|
ba7636db75 | ||
|
|
e3e51a2e1f | ||
|
|
93b601fe98 | ||
|
|
203ebb0e7a | ||
|
|
041c2e5693 | ||
|
|
258c0d511e | ||
|
|
15705553c7 | ||
|
|
27f023e399 | ||
|
|
0d2242171c | ||
|
|
0c62ecda65 | ||
|
|
7cd7fec93b | ||
|
|
cfab5e6217 | ||
|
|
0c313e8b8f | ||
|
|
61366061e6 | ||
|
|
b2c0685c09 | ||
|
|
e3ee284e91 | ||
|
|
58901855af | ||
|
|
c7f8a49c47 | ||
|
|
10685fe183 | ||
|
|
9e514fe95e | ||
|
|
f28a319e26 | ||
|
|
decfb58142 | ||
|
|
415bbc3b0a | ||
|
|
5b669ca287 | ||
|
|
1700217241 | ||
|
|
f00c0d5d73 | ||
|
|
64ce0d2911 | ||
|
|
82dce7a0d3 | ||
|
|
b94f67aa72 | ||
|
|
1ff77a1464 | ||
|
|
adb0e1e844 | ||
|
|
2043a06a48 | ||
|
|
738ebb66ac | ||
|
|
abf1f6c041 | ||
|
|
7db0e90506 | ||
|
|
400f9cf911 | ||
|
|
2d3b99c959 | ||
|
|
fd1ea05c78 | ||
|
|
d7c4b8f530 | ||
|
|
238f358d6a | ||
|
|
50afdca150 | ||
|
|
b5555d94f5 | ||
|
|
3d81633214 | ||
|
|
5db7997a17 | ||
|
|
71dd428919 | ||
|
|
a20d66a6b5 | ||
|
|
3caefa5409 | ||
|
|
a6e56be55a | ||
|
|
6d582f09be | ||
|
|
40cd46cd09 | ||
|
|
3cc59149cf | ||
|
|
e659266d62 | ||
|
|
14e09f5ea0 | ||
|
|
11f6462a31 | ||
|
|
48eebbe2fe | ||
|
|
f7093c035b | ||
|
|
b25e9cdee6 | ||
|
|
5cd7e4707a | ||
|
|
861374bb87 | ||
|
|
d3519b3059 | ||
|
|
da1f18c60f | ||
|
|
b7482f2a6a | ||
|
|
fd616cafca | ||
|
|
b262a5181f | ||
|
|
adb54a9054 | ||
|
|
5eb05f5550 | ||
|
|
2950c5eaa4 | ||
|
|
16fd67c070 | ||
|
|
9e3559f97c | ||
|
|
83eea30ea0 | ||
|
|
6ceccf1c7a | ||
|
|
31e1c4c712 | ||
|
|
fa97ec6c72 | ||
|
|
cd5467bf5c | ||
|
|
899f85f4e7 | ||
|
|
7c79fbefa6 | ||
|
|
18c6fe7ebd | ||
|
|
6f6643d758 | ||
|
|
356adebbce | ||
|
|
5c8e4fd6fd | ||
|
|
5be9bb47a7 | ||
|
|
60c5dc525b | ||
|
|
abfffcec07 | ||
|
|
09b12052f0 | ||
|
|
78bb0ab016 | ||
|
|
4cd4c2f607 | ||
|
|
f95b5d6f14 | ||
|
|
4a53be1e33 | ||
|
|
cbbe845d7b | ||
|
|
b2b52e92a4 | ||
|
|
15a97a4675 | ||
|
|
a01f25ec12 | ||
|
|
2f175765ec | ||
|
|
6a7ae72b1b | ||
|
|
e396bb1641 | ||
|
|
baedac4746 | ||
|
|
268ef626ca | ||
|
|
40c7ad4b46 | ||
|
|
54f9ce87f9 | ||
|
|
12b8a70e5c | ||
|
|
acf204d0e3 | ||
|
|
ee19f9ccaa | ||
|
|
34c0cf33b9 | ||
|
|
34ec624e46 | ||
|
|
056d3f9f36 | ||
|
|
040673af0b | ||
|
|
48fb0c5e21 | ||
|
|
4c1a55708f | ||
|
|
6e1951b356 | ||
|
|
3dd6b05d2e | ||
|
|
05f1ae01f3 | ||
|
|
3975041798 | ||
|
|
3a29d65777 | ||
|
|
d975790e79 | ||
|
|
4d28df7a89 | ||
|
|
bd6c690160 | ||
|
|
c0d7278827 | ||
|
|
f9eb0a20f7 | ||
|
|
8d27a5aa39 | ||
|
|
90f9416524 | ||
|
|
a593ce7c40 | ||
|
|
31fbf2cb57 | ||
|
|
c0d3027e65 | ||
|
|
bde270b73f | ||
|
|
edd18b53d0 | ||
|
|
2ad4b26c9e | ||
|
|
f39a5c55ba | ||
|
|
0af5feab79 | ||
|
|
68dd54a100 | ||
|
|
7a0f148d28 | ||
|
|
958b1592f8 | ||
|
|
7ac0828ae7 | ||
|
|
f7e7b38551 | ||
|
|
33e3112290 | ||
|
|
2a40d6bb7e | ||
|
|
f196a78728 | ||
|
|
523c7ac273 | ||
|
|
ce324586f8 | ||
|
|
35bd210062 | ||
|
|
0cfe3351bb | ||
|
|
7202f47716 | ||
|
|
bde4545afc | ||
|
|
b3c81ce5f2 | ||
|
|
02b0d1fb5e | ||
|
|
87d9ea06f3 | ||
|
|
a4e6a964c9 | ||
|
|
79c5d479fc | ||
|
|
8f0a9f91c1 | ||
|
|
93fae9cc8c | ||
|
|
134c869b07 | ||
|
|
beb0487513 | ||
|
|
aa9ffb8f6b | ||
|
|
18eb704b81 | ||
|
|
83fb62d4df | ||
|
|
cb650b70cb | ||
|
|
d5e42318dd | ||
|
|
24ed474c8c | ||
|
|
a9c25b4edd | ||
|
|
c89737ae7b | ||
|
|
e619a6ef7c | ||
|
|
583ab8dc92 | ||
|
|
db1619af31 | ||
|
|
22740a6c8d | ||
|
|
e9409577db | ||
|
|
9cef8c8e70 | ||
|
|
53bcec602d | ||
|
|
a62f12b427 | ||
|
|
e20816a7ce | ||
|
|
58535df676 | ||
|
|
057040af06 | ||
|
|
c603783a44 | ||
|
|
1928356ad5 | ||
|
|
e53ad2c62a | ||
|
|
bca397e3e4 | ||
|
|
164feaa3ec | ||
|
|
4d09fabad8 | ||
|
|
04913394c6 | ||
|
|
f8b563704f | ||
|
|
5d9bd0f6d3 | ||
|
|
1229c26098 | ||
|
|
77818d5453 | ||
|
|
2d358342c5 | ||
|
|
6c79be881d | ||
|
|
51a8937c64 | ||
|
|
c436455b32 | ||
|
|
18f89b979d | ||
|
|
8094259c78 | ||
|
|
b4f503b81e | ||
|
|
4db04519bd |
@@ -1,6 +1,6 @@
|
|||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*.{js,ts}]
|
[*.{js,ts,.tsx}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|||||||
22
.github/actions/build-electron/action.yml
vendored
22
.github/actions/build-electron/action.yml
vendored
@@ -162,3 +162,25 @@ runs:
|
|||||||
echo "Found ZIP: $zip_file"
|
echo "Found ZIP: $zip_file"
|
||||||
echo "Note: ZIP files are not code signed, but their contents should be"
|
echo "Note: ZIP files are not code signed, but their contents should be"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Sign the RPM
|
||||||
|
if: inputs.os == 'linux'
|
||||||
|
shell: ${{ inputs.shell }}
|
||||||
|
run: |
|
||||||
|
echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --import
|
||||||
|
|
||||||
|
# Import the key into RPM for verification
|
||||||
|
gpg --export -a > pubkey
|
||||||
|
rpm --import pubkey
|
||||||
|
rm pubkey
|
||||||
|
|
||||||
|
# Sign the RPM
|
||||||
|
rpm_file=$(find ./apps/desktop/upload -name "*.rpm" -print -quit)
|
||||||
|
rpmsign --define "_gpg_name Trilium Notes Signing Key <triliumnotes@outlook.com>" --addsign "$rpm_file"
|
||||||
|
rpm -Kv "$rpm_file"
|
||||||
|
|
||||||
|
# Validate code signing
|
||||||
|
if ! rpm -K "$rpm_file" | grep -q "digests signatures OK"; then
|
||||||
|
echo .rpm file not signed
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|||||||
2
.github/actions/report-size/action.yml
vendored
2
.github/actions/report-size/action.yml
vendored
@@ -44,7 +44,7 @@ runs:
|
|||||||
steps:
|
steps:
|
||||||
# Checkout branch to compare to [required]
|
# Checkout branch to compare to [required]
|
||||||
- name: Checkout base branch
|
- name: Checkout base branch
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.branch }}
|
ref: ${{ inputs.branch }}
|
||||||
path: br-base
|
path: br-base
|
||||||
|
|||||||
453
.github/scripts/sync-docs-to-wiki-with-wiki-syntax.ts
vendored
Normal file
453
.github/scripts/sync-docs-to-wiki-with-wiki-syntax.ts
vendored
Normal file
@@ -0,0 +1,453 @@
|
|||||||
|
#!/usr/bin/env tsx
|
||||||
|
|
||||||
|
import * as fs from 'fs/promises';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { exec } from 'child_process';
|
||||||
|
import { promisify } from 'util';
|
||||||
|
import { Dirent } from 'fs';
|
||||||
|
|
||||||
|
const execAsync = promisify(exec);
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
const FILE_EXTENSIONS = ['.md', '.png', '.jpg', '.jpeg', '.gif', '.svg'] as const;
|
||||||
|
const README_PATTERN = /^README(?:[-.](.+))?\.md$/;
|
||||||
|
|
||||||
|
interface SyncConfig {
|
||||||
|
mainRepoPath: string;
|
||||||
|
wikiPath: string;
|
||||||
|
docsPath: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert markdown to GitHub Wiki format
|
||||||
|
* - Images:  → [[image.png]]
|
||||||
|
* - Links: [text](page.md) → [[text|page]]
|
||||||
|
*/
|
||||||
|
async function convertToWikiFormat(wikiDir: string): Promise<void> {
|
||||||
|
console.log('Converting to GitHub Wiki format...');
|
||||||
|
const mdFiles = await findFiles(wikiDir, ['.md']);
|
||||||
|
let convertedCount = 0;
|
||||||
|
|
||||||
|
for (const file of mdFiles) {
|
||||||
|
let content = await fs.readFile(file, 'utf-8');
|
||||||
|
const originalContent = content;
|
||||||
|
|
||||||
|
// Convert image references to wiki format
|
||||||
|
//  → [[image.png]]
|
||||||
|
content = content.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, src) => {
|
||||||
|
// Skip external URLs
|
||||||
|
if (src.startsWith('http://') || src.startsWith('https://')) {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode URL encoding
|
||||||
|
let imagePath = src;
|
||||||
|
if (src.includes('%')) {
|
||||||
|
try {
|
||||||
|
imagePath = decodeURIComponent(src);
|
||||||
|
} catch {
|
||||||
|
imagePath = src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract just the filename for wiki syntax
|
||||||
|
const filename = path.basename(imagePath);
|
||||||
|
|
||||||
|
// Use wiki syntax for images
|
||||||
|
// If alt text exists, add it after pipe
|
||||||
|
if (alt && alt.trim()) {
|
||||||
|
return `[[${filename}|alt=${alt}]]`;
|
||||||
|
} else {
|
||||||
|
return `[[${filename}]]`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert internal markdown links to wiki format
|
||||||
|
// [text](../path/to/Page.md) → [[text|Page]]
|
||||||
|
content = content.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, text, href) => {
|
||||||
|
// Skip external URLs, anchors, and images
|
||||||
|
if (href.startsWith('http://') ||
|
||||||
|
href.startsWith('https://') ||
|
||||||
|
href.startsWith('#') ||
|
||||||
|
href.match(/\.(png|jpg|jpeg|gif|svg)$/i)) {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if it's a markdown file link
|
||||||
|
if (href.endsWith('.md') || href.includes('.md#')) {
|
||||||
|
// Decode URL encoding
|
||||||
|
let decodedHref = href;
|
||||||
|
if (href.includes('%')) {
|
||||||
|
try {
|
||||||
|
decodedHref = decodeURIComponent(href);
|
||||||
|
} catch {
|
||||||
|
decodedHref = href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract page name without extension and path
|
||||||
|
let pageName = decodedHref
|
||||||
|
.replace(/\.md(#.*)?$/, '') // Remove .md and anchor
|
||||||
|
.split('/') // Split by path
|
||||||
|
.pop() || ''; // Get last part (filename)
|
||||||
|
|
||||||
|
// Convert spaces to hyphens (GitHub wiki convention)
|
||||||
|
pageName = pageName.replace(/ /g, '-');
|
||||||
|
|
||||||
|
// Use wiki link syntax
|
||||||
|
if (text === pageName || text === pageName.replace(/-/g, ' ')) {
|
||||||
|
return `[[${pageName}]]`;
|
||||||
|
} else {
|
||||||
|
return `[[${text}|${pageName}]]`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For other internal links, just decode URL encoding
|
||||||
|
if (href.includes('%') && !href.startsWith('http')) {
|
||||||
|
try {
|
||||||
|
const decodedHref = decodeURIComponent(href);
|
||||||
|
return `[${text}](${decodedHref})`;
|
||||||
|
} catch {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save if modified
|
||||||
|
if (content !== originalContent) {
|
||||||
|
await fs.writeFile(file, content, 'utf-8');
|
||||||
|
const relativePath = path.relative(wikiDir, file);
|
||||||
|
console.log(` Converted: ${relativePath}`);
|
||||||
|
convertedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (convertedCount > 0) {
|
||||||
|
console.log(`Converted ${convertedCount} files to wiki format`);
|
||||||
|
} else {
|
||||||
|
console.log('No files needed conversion');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively find all files matching the given extensions
|
||||||
|
*/
|
||||||
|
async function findFiles(dir: string, extensions: readonly string[]): Promise<string[]> {
|
||||||
|
const files: string[] = [];
|
||||||
|
|
||||||
|
async function walk(currentDir: string): Promise<void> {
|
||||||
|
const entries: Dirent[] = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
const fullPath = path.join(currentDir, entry.name);
|
||||||
|
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
await walk(fullPath);
|
||||||
|
} else if (entry.isFile()) {
|
||||||
|
const ext = path.extname(entry.name).toLowerCase();
|
||||||
|
if (extensions.includes(ext)) {
|
||||||
|
files.push(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await walk(dir);
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all files in a directory recursively
|
||||||
|
*/
|
||||||
|
async function getAllFiles(dir: string): Promise<Set<string>> {
|
||||||
|
const files = new Set<string>();
|
||||||
|
|
||||||
|
async function walk(currentDir: string): Promise<void> {
|
||||||
|
try {
|
||||||
|
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
const fullPath = path.join(currentDir, entry.name);
|
||||||
|
const relativePath = path.relative(dir, fullPath);
|
||||||
|
|
||||||
|
// Skip .git directory
|
||||||
|
if (entry.name === '.git' || relativePath.startsWith('.git')) continue;
|
||||||
|
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
await walk(fullPath);
|
||||||
|
} else if (entry.isFile()) {
|
||||||
|
files.add(relativePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Directory might not exist yet
|
||||||
|
if ((error as any).code !== 'ENOENT') {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await walk(dir);
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flatten directory structure - move all files to root
|
||||||
|
* GitHub Wiki prefers flat structure
|
||||||
|
*/
|
||||||
|
async function flattenStructure(wikiDir: string): Promise<void> {
|
||||||
|
console.log('Flattening directory structure for wiki...');
|
||||||
|
const allFiles = await getAllFiles(wikiDir);
|
||||||
|
let movedCount = 0;
|
||||||
|
|
||||||
|
for (const file of allFiles) {
|
||||||
|
// Skip if already at root
|
||||||
|
if (!file.includes('/')) continue;
|
||||||
|
|
||||||
|
const oldPath = path.join(wikiDir, file);
|
||||||
|
const basename = path.basename(file);
|
||||||
|
|
||||||
|
// Create unique name if file already exists at root
|
||||||
|
let newName = basename;
|
||||||
|
let counter = 1;
|
||||||
|
while (await fileExists(path.join(wikiDir, newName))) {
|
||||||
|
const ext = path.extname(basename);
|
||||||
|
const nameWithoutExt = basename.slice(0, -ext.length);
|
||||||
|
newName = `${nameWithoutExt}-${counter}${ext}`;
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newPath = path.join(wikiDir, newName);
|
||||||
|
|
||||||
|
// Move file to root
|
||||||
|
await fs.rename(oldPath, newPath);
|
||||||
|
console.log(` Moved: ${file} → ${newName}`);
|
||||||
|
movedCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (movedCount > 0) {
|
||||||
|
console.log(`Moved ${movedCount} files to root`);
|
||||||
|
|
||||||
|
// Clean up empty directories
|
||||||
|
await cleanEmptyDirectories(wikiDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function fileExists(path: string): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
await fs.access(path);
|
||||||
|
return true;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove empty directories recursively
|
||||||
|
*/
|
||||||
|
async function cleanEmptyDirectories(dir: string): Promise<void> {
|
||||||
|
const allDirs = await getAllDirectories(dir);
|
||||||
|
|
||||||
|
for (const subDir of allDirs) {
|
||||||
|
try {
|
||||||
|
const entries = await fs.readdir(subDir);
|
||||||
|
if (entries.length === 0 || (entries.length === 1 && entries[0] === '.git')) {
|
||||||
|
await fs.rmdir(subDir);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Ignore errors
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all directories recursively
|
||||||
|
*/
|
||||||
|
async function getAllDirectories(dir: string): Promise<string[]> {
|
||||||
|
const dirs: string[] = [];
|
||||||
|
|
||||||
|
async function walk(currentDir: string): Promise<void> {
|
||||||
|
try {
|
||||||
|
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
if (entry.isDirectory() && entry.name !== '.git') {
|
||||||
|
const fullPath = path.join(currentDir, entry.name);
|
||||||
|
dirs.push(fullPath);
|
||||||
|
await walk(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Ignore errors
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await walk(dir);
|
||||||
|
return dirs.sort((a, b) => b.length - a.length); // Sort longest first for cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync files from source to wiki
|
||||||
|
*/
|
||||||
|
async function syncFiles(sourceDir: string, wikiDir: string): Promise<void> {
|
||||||
|
console.log('Syncing files to wiki...');
|
||||||
|
|
||||||
|
// Get all valid source files
|
||||||
|
const sourceFiles = await findFiles(sourceDir, FILE_EXTENSIONS);
|
||||||
|
const sourceRelativePaths = new Set<string>();
|
||||||
|
|
||||||
|
// Copy all source files
|
||||||
|
console.log(`Found ${sourceFiles.length} files to sync`);
|
||||||
|
|
||||||
|
for (const file of sourceFiles) {
|
||||||
|
const relativePath = path.relative(sourceDir, file);
|
||||||
|
sourceRelativePaths.add(relativePath);
|
||||||
|
|
||||||
|
const targetPath = path.join(wikiDir, relativePath);
|
||||||
|
const targetDir = path.dirname(targetPath);
|
||||||
|
|
||||||
|
// Create directory structure
|
||||||
|
await fs.mkdir(targetDir, { recursive: true });
|
||||||
|
|
||||||
|
// Copy file
|
||||||
|
await fs.copyFile(file, targetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove orphaned files
|
||||||
|
const wikiFiles = await getAllFiles(wikiDir);
|
||||||
|
for (const wikiFile of wikiFiles) {
|
||||||
|
if (!sourceRelativePaths.has(wikiFile) && !wikiFile.startsWith('Home')) {
|
||||||
|
const fullPath = path.join(wikiDir, wikiFile);
|
||||||
|
await fs.unlink(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy root README.md to wiki as Home.md if it exists
|
||||||
|
*/
|
||||||
|
async function copyRootReadme(mainRepoPath: string, wikiPath: string): Promise<void> {
|
||||||
|
const rootReadmePath = path.join(mainRepoPath, 'README.md');
|
||||||
|
const wikiHomePath = path.join(wikiPath, 'Home.md');
|
||||||
|
|
||||||
|
try {
|
||||||
|
await fs.access(rootReadmePath);
|
||||||
|
await fs.copyFile(rootReadmePath, wikiHomePath);
|
||||||
|
console.log(' Copied root README.md as Home.md');
|
||||||
|
} catch (error) {
|
||||||
|
console.log(' No root README.md found to use as Home page');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename README files to wiki-compatible names
|
||||||
|
*/
|
||||||
|
async function renameReadmeFiles(wikiDir: string): Promise<void> {
|
||||||
|
console.log('Converting README files for wiki compatibility...');
|
||||||
|
const files = await fs.readdir(wikiDir);
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
const match = file.match(README_PATTERN);
|
||||||
|
if (match) {
|
||||||
|
const oldPath = path.join(wikiDir, file);
|
||||||
|
let newName: string;
|
||||||
|
|
||||||
|
if (match[1]) {
|
||||||
|
// Language-specific README
|
||||||
|
newName = `Home-${match[1]}.md`;
|
||||||
|
} else {
|
||||||
|
// Main README
|
||||||
|
newName = 'Home.md';
|
||||||
|
}
|
||||||
|
|
||||||
|
const newPath = path.join(wikiDir, newName);
|
||||||
|
await fs.rename(oldPath, newPath);
|
||||||
|
console.log(` Renamed: ${file} → ${newName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there are any changes in the wiki
|
||||||
|
*/
|
||||||
|
async function hasChanges(wikiDir: string): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const { stdout } = await execAsync('git status --porcelain', { cwd: wikiDir });
|
||||||
|
return stdout.trim().length > 0;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error checking git status:', error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get configuration from environment variables
|
||||||
|
*/
|
||||||
|
function getConfig(): SyncConfig {
|
||||||
|
const mainRepoPath = process.env.MAIN_REPO_PATH || 'main-repo';
|
||||||
|
const wikiPath = process.env.WIKI_PATH || 'wiki';
|
||||||
|
const docsPath = path.join(mainRepoPath, 'docs');
|
||||||
|
|
||||||
|
return { mainRepoPath, wikiPath, docsPath };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main sync function
|
||||||
|
*/
|
||||||
|
async function syncDocsToWiki(): Promise<void> {
|
||||||
|
const config = getConfig();
|
||||||
|
const flattenWiki = process.env.FLATTEN_WIKI === 'true';
|
||||||
|
|
||||||
|
console.log('Starting documentation sync to wiki...');
|
||||||
|
console.log(`Source: ${config.docsPath}`);
|
||||||
|
console.log(`Target: ${config.wikiPath}`);
|
||||||
|
console.log(`Flatten structure: ${flattenWiki}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Verify paths exist
|
||||||
|
await fs.access(config.docsPath);
|
||||||
|
await fs.access(config.wikiPath);
|
||||||
|
|
||||||
|
// Sync files
|
||||||
|
await syncFiles(config.docsPath, config.wikiPath);
|
||||||
|
|
||||||
|
// Copy root README.md as Home.md
|
||||||
|
await copyRootReadme(config.mainRepoPath, config.wikiPath);
|
||||||
|
|
||||||
|
// Convert to wiki format
|
||||||
|
await convertToWikiFormat(config.wikiPath);
|
||||||
|
|
||||||
|
// Optionally flatten directory structure
|
||||||
|
if (flattenWiki) {
|
||||||
|
await flattenStructure(config.wikiPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rename README files to wiki-compatible names
|
||||||
|
await renameReadmeFiles(config.wikiPath);
|
||||||
|
|
||||||
|
// Check for changes
|
||||||
|
const changed = await hasChanges(config.wikiPath);
|
||||||
|
|
||||||
|
if (changed) {
|
||||||
|
console.log('\nChanges detected in wiki');
|
||||||
|
process.stdout.write('::set-output name=changes::true\n');
|
||||||
|
} else {
|
||||||
|
console.log('\nNo changes detected in wiki');
|
||||||
|
process.stdout.write('::set-output name=changes::false\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Sync completed successfully!');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error during sync:', error);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run if called directly
|
||||||
|
if (require.main === module) {
|
||||||
|
syncDocsToWiki();
|
||||||
|
}
|
||||||
|
|
||||||
|
export { syncDocsToWiki };
|
||||||
437
.github/scripts/sync-docs-to-wiki.ts
vendored
Executable file
437
.github/scripts/sync-docs-to-wiki.ts
vendored
Executable file
@@ -0,0 +1,437 @@
|
|||||||
|
#!/usr/bin/env tsx
|
||||||
|
|
||||||
|
import * as fs from 'fs/promises';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { exec } from 'child_process';
|
||||||
|
import { promisify } from 'util';
|
||||||
|
import { Dirent } from 'fs';
|
||||||
|
|
||||||
|
const execAsync = promisify(exec);
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
const FILE_EXTENSIONS = ['.md', '.png', '.jpg', '.jpeg', '.gif', '.svg'] as const;
|
||||||
|
const README_PATTERN = /^README(?:[-.](.+))?\.md$/;
|
||||||
|
|
||||||
|
interface SyncConfig {
|
||||||
|
mainRepoPath: string;
|
||||||
|
wikiPath: string;
|
||||||
|
docsPath: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively find all files matching the given extensions
|
||||||
|
*/
|
||||||
|
async function findFiles(dir: string, extensions: readonly string[]): Promise<string[]> {
|
||||||
|
const files: string[] = [];
|
||||||
|
|
||||||
|
async function walk(currentDir: string): Promise<void> {
|
||||||
|
const entries: Dirent[] = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
const fullPath = path.join(currentDir, entry.name);
|
||||||
|
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
await walk(fullPath);
|
||||||
|
} else if (entry.isFile()) {
|
||||||
|
const ext = path.extname(entry.name).toLowerCase();
|
||||||
|
if (extensions.includes(ext)) {
|
||||||
|
files.push(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await walk(dir);
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all files in a directory recursively
|
||||||
|
*/
|
||||||
|
async function getAllFiles(dir: string): Promise<Set<string>> {
|
||||||
|
const files = new Set<string>();
|
||||||
|
|
||||||
|
async function walk(currentDir: string): Promise<void> {
|
||||||
|
try {
|
||||||
|
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
const fullPath = path.join(currentDir, entry.name);
|
||||||
|
const relativePath = path.relative(dir, fullPath);
|
||||||
|
|
||||||
|
// Skip .git directory
|
||||||
|
if (entry.name === '.git' || relativePath.startsWith('.git')) continue;
|
||||||
|
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
await walk(fullPath);
|
||||||
|
} else if (entry.isFile()) {
|
||||||
|
files.add(relativePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Directory might not exist yet
|
||||||
|
if ((error as any).code !== 'ENOENT') {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await walk(dir);
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync files from source to wiki, preserving directory structure and removing orphaned files
|
||||||
|
*/
|
||||||
|
async function syncFiles(sourceDir: string, wikiDir: string): Promise<void> {
|
||||||
|
console.log('Analyzing files to sync...');
|
||||||
|
|
||||||
|
// Get all valid source files
|
||||||
|
const sourceFiles = await findFiles(sourceDir, FILE_EXTENSIONS);
|
||||||
|
const sourceRelativePaths = new Set<string>();
|
||||||
|
|
||||||
|
// Copy all source files and track their paths
|
||||||
|
console.log(`Found ${sourceFiles.length} files to sync`);
|
||||||
|
let copiedCount = 0;
|
||||||
|
let skippedCount = 0;
|
||||||
|
|
||||||
|
for (const file of sourceFiles) {
|
||||||
|
const relativePath = path.relative(sourceDir, file);
|
||||||
|
sourceRelativePaths.add(relativePath);
|
||||||
|
|
||||||
|
const targetPath = path.join(wikiDir, relativePath);
|
||||||
|
const targetDir = path.dirname(targetPath);
|
||||||
|
|
||||||
|
// Create directory structure
|
||||||
|
await fs.mkdir(targetDir, { recursive: true });
|
||||||
|
|
||||||
|
// Check if file needs updating (compare modification times)
|
||||||
|
let needsCopy = true;
|
||||||
|
try {
|
||||||
|
const sourceStat = await fs.stat(file);
|
||||||
|
const targetStat = await fs.stat(targetPath);
|
||||||
|
// Only copy if source is newer or sizes differ
|
||||||
|
needsCopy = sourceStat.mtime > targetStat.mtime || sourceStat.size !== targetStat.size;
|
||||||
|
} catch {
|
||||||
|
// Target doesn't exist, needs copy
|
||||||
|
needsCopy = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needsCopy) {
|
||||||
|
await fs.copyFile(file, targetPath);
|
||||||
|
console.log(` Updated: ${relativePath}`);
|
||||||
|
copiedCount++;
|
||||||
|
} else {
|
||||||
|
skippedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Updated ${copiedCount} files, ${skippedCount} unchanged`);
|
||||||
|
|
||||||
|
// Find and remove files that don't exist in source
|
||||||
|
console.log('Checking for orphaned files in wiki...');
|
||||||
|
const wikiFiles = await getAllFiles(wikiDir);
|
||||||
|
let removedCount = 0;
|
||||||
|
|
||||||
|
for (const wikiFile of wikiFiles) {
|
||||||
|
// Check if this file should exist (either as-is or will be renamed)
|
||||||
|
let shouldExist = sourceRelativePaths.has(wikiFile);
|
||||||
|
|
||||||
|
// Special handling for Home files that will be created from READMEs
|
||||||
|
if (wikiFile.startsWith('Home')) {
|
||||||
|
const readmeVariant1 = wikiFile.replace(/^Home(-.*)?\.md$/, 'README$1.md');
|
||||||
|
const readmeVariant2 = wikiFile.replace(/^Home-(.+)\.md$/, 'README.$1.md');
|
||||||
|
shouldExist = sourceRelativePaths.has(readmeVariant1) || sourceRelativePaths.has(readmeVariant2) || sourceRelativePaths.has('README.md');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shouldExist) {
|
||||||
|
const fullPath = path.join(wikiDir, wikiFile);
|
||||||
|
await fs.unlink(fullPath);
|
||||||
|
console.log(` Removed: ${wikiFile}`);
|
||||||
|
removedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removedCount > 0) {
|
||||||
|
console.log(`Removed ${removedCount} orphaned files`);
|
||||||
|
|
||||||
|
// Clean up empty directories
|
||||||
|
await cleanEmptyDirectories(wikiDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove empty directories recursively
|
||||||
|
*/
|
||||||
|
async function cleanEmptyDirectories(dir: string): Promise<void> {
|
||||||
|
async function removeEmptyDirs(currentDir: string): Promise<boolean> {
|
||||||
|
if (currentDir === dir) return false; // Don't remove root
|
||||||
|
|
||||||
|
try {
|
||||||
|
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
// Skip .git directory
|
||||||
|
const filteredEntries = entries.filter(e => e.name !== '.git');
|
||||||
|
|
||||||
|
if (filteredEntries.length === 0) {
|
||||||
|
await fs.rmdir(currentDir);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check subdirectories
|
||||||
|
for (const entry of filteredEntries) {
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
const subDir = path.join(currentDir, entry.name);
|
||||||
|
await removeEmptyDirs(subDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check again after cleaning subdirectories
|
||||||
|
const remainingEntries = await fs.readdir(currentDir);
|
||||||
|
const filteredRemaining = remainingEntries.filter(e => e !== '.git');
|
||||||
|
|
||||||
|
if (filteredRemaining.length === 0 && currentDir !== dir) {
|
||||||
|
await fs.rmdir(currentDir);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all directories and process them
|
||||||
|
const allDirs = await getAllDirectories(dir);
|
||||||
|
for (const subDir of allDirs) {
|
||||||
|
await removeEmptyDirs(subDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all directories recursively
|
||||||
|
*/
|
||||||
|
async function getAllDirectories(dir: string): Promise<string[]> {
|
||||||
|
const dirs: string[] = [];
|
||||||
|
|
||||||
|
async function walk(currentDir: string): Promise<void> {
|
||||||
|
try {
|
||||||
|
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
if (entry.isDirectory() && entry.name !== '.git') {
|
||||||
|
const fullPath = path.join(currentDir, entry.name);
|
||||||
|
dirs.push(fullPath);
|
||||||
|
await walk(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Ignore errors
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await walk(dir);
|
||||||
|
return dirs.sort((a, b) => b.length - a.length); // Sort longest first for cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fix references in markdown files for wiki compatibility
|
||||||
|
*
|
||||||
|
* Issues fixed:
|
||||||
|
* 1. URL-encoded image references (spaces as %20) need to match actual filenames
|
||||||
|
* 2. Internal markdown links need to be converted to wiki syntax
|
||||||
|
* 3. Images can optionally use wiki syntax [[image.png]] for better compatibility
|
||||||
|
*/
|
||||||
|
async function fixImageReferences(wikiDir: string): Promise<void> {
|
||||||
|
console.log('Fixing references for GitHub Wiki compatibility...');
|
||||||
|
const mdFiles = await findFiles(wikiDir, ['.md']);
|
||||||
|
let fixedCount = 0;
|
||||||
|
|
||||||
|
for (const file of mdFiles) {
|
||||||
|
let content = await fs.readFile(file, 'utf-8');
|
||||||
|
let modified = false;
|
||||||
|
const originalContent = content;
|
||||||
|
|
||||||
|
// Step 1: Fix URL-encoded image references
|
||||||
|
// Convert  to 
|
||||||
|
content = content.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, src) => {
|
||||||
|
// Skip external URLs
|
||||||
|
if (src.startsWith('http://') || src.startsWith('https://')) {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode URL encoding if present
|
||||||
|
if (src.includes('%')) {
|
||||||
|
try {
|
||||||
|
const decodedSrc = decodeURIComponent(src);
|
||||||
|
return ``;
|
||||||
|
} catch {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Step 2: Fix internal links - decode URL encoding but keep standard markdown format
|
||||||
|
// GitHub Wiki actually supports standard markdown links with relative paths
|
||||||
|
content = content.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, text, href) => {
|
||||||
|
// Skip external URLs, anchors, and images
|
||||||
|
if (href.startsWith('http://') ||
|
||||||
|
href.startsWith('https://') ||
|
||||||
|
href.startsWith('#') ||
|
||||||
|
href.match(/\.(png|jpg|jpeg|gif|svg)$/i)) {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode URL encoding for all internal links
|
||||||
|
if (href.includes('%')) {
|
||||||
|
try {
|
||||||
|
const decodedHref = decodeURIComponent(href);
|
||||||
|
return `[${text}](${decodedHref})`;
|
||||||
|
} catch {
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check if content was modified
|
||||||
|
if (content !== originalContent) {
|
||||||
|
modified = true;
|
||||||
|
await fs.writeFile(file, content, 'utf-8');
|
||||||
|
const relativePath = path.relative(wikiDir, file);
|
||||||
|
console.log(` Fixed references in: ${relativePath}`);
|
||||||
|
fixedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fixedCount > 0) {
|
||||||
|
console.log(`Fixed references in ${fixedCount} files`);
|
||||||
|
} else {
|
||||||
|
console.log('No references needed fixing');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename README files to wiki-compatible names
|
||||||
|
*/
|
||||||
|
async function renameReadmeFiles(wikiDir: string): Promise<void> {
|
||||||
|
console.log('Converting README files for wiki compatibility...');
|
||||||
|
const files = await fs.readdir(wikiDir);
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
const match = file.match(README_PATTERN);
|
||||||
|
if (match) {
|
||||||
|
const oldPath = path.join(wikiDir, file);
|
||||||
|
let newName: string;
|
||||||
|
|
||||||
|
if (match[1]) {
|
||||||
|
// Language-specific README (e.g., README-ZH_CN.md or README.es.md)
|
||||||
|
newName = `Home-${match[1]}.md`;
|
||||||
|
} else {
|
||||||
|
// Main README
|
||||||
|
newName = 'Home.md';
|
||||||
|
}
|
||||||
|
|
||||||
|
const newPath = path.join(wikiDir, newName);
|
||||||
|
await fs.rename(oldPath, newPath);
|
||||||
|
console.log(` Renamed: ${file} → ${newName}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there are any changes in the wiki
|
||||||
|
*/
|
||||||
|
async function hasChanges(wikiDir: string): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const { stdout } = await execAsync('git status --porcelain', { cwd: wikiDir });
|
||||||
|
return stdout.trim().length > 0;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error checking git status:', error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy root README.md to wiki as Home.md if it exists
|
||||||
|
*/
|
||||||
|
async function copyRootReadme(mainRepoPath: string, wikiPath: string): Promise<void> {
|
||||||
|
const rootReadmePath = path.join(mainRepoPath, 'README.md');
|
||||||
|
const wikiHomePath = path.join(wikiPath, 'Home.md');
|
||||||
|
|
||||||
|
try {
|
||||||
|
await fs.access(rootReadmePath);
|
||||||
|
await fs.copyFile(rootReadmePath, wikiHomePath);
|
||||||
|
console.log(' Copied root README.md as Home.md');
|
||||||
|
} catch (error) {
|
||||||
|
// Root README doesn't exist or can't be accessed
|
||||||
|
console.log(' No root README.md found to use as Home page');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get configuration from environment variables
|
||||||
|
*/
|
||||||
|
function getConfig(): SyncConfig {
|
||||||
|
const mainRepoPath = process.env.MAIN_REPO_PATH || 'main-repo';
|
||||||
|
const wikiPath = process.env.WIKI_PATH || 'wiki';
|
||||||
|
const docsPath = path.join(mainRepoPath, 'docs');
|
||||||
|
|
||||||
|
return { mainRepoPath, wikiPath, docsPath };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main sync function
|
||||||
|
*/
|
||||||
|
async function syncDocsToWiki(): Promise<void> {
|
||||||
|
const config = getConfig();
|
||||||
|
|
||||||
|
console.log('Starting documentation sync to wiki...');
|
||||||
|
console.log(`Source: ${config.docsPath}`);
|
||||||
|
console.log(`Target: ${config.wikiPath}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Verify paths exist
|
||||||
|
await fs.access(config.docsPath);
|
||||||
|
await fs.access(config.wikiPath);
|
||||||
|
|
||||||
|
// Sync files (copy new/updated, remove orphaned)
|
||||||
|
await syncFiles(config.docsPath, config.wikiPath);
|
||||||
|
|
||||||
|
// Copy root README.md as Home.md
|
||||||
|
await copyRootReadme(config.mainRepoPath, config.wikiPath);
|
||||||
|
|
||||||
|
// Fix image and link references for wiki compatibility
|
||||||
|
await fixImageReferences(config.wikiPath);
|
||||||
|
|
||||||
|
// Rename README files to wiki-compatible names
|
||||||
|
await renameReadmeFiles(config.wikiPath);
|
||||||
|
|
||||||
|
// Check for changes
|
||||||
|
const changed = await hasChanges(config.wikiPath);
|
||||||
|
|
||||||
|
if (changed) {
|
||||||
|
console.log('\nChanges detected in wiki');
|
||||||
|
// GitHub Actions output format
|
||||||
|
process.stdout.write('::set-output name=changes::true\n');
|
||||||
|
} else {
|
||||||
|
console.log('\nNo changes detected in wiki');
|
||||||
|
process.stdout.write('::set-output name=changes::false\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Sync completed successfully!');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error during sync:', error);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run if called directly
|
||||||
|
if (require.main === module) {
|
||||||
|
syncDocsToWiki();
|
||||||
|
}
|
||||||
|
|
||||||
|
export { syncDocsToWiki };
|
||||||
1
.github/workflows/checks.yml
vendored
1
.github/workflows/checks.yml
vendored
@@ -12,6 +12,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check if PRs have conflicts
|
- name: Check if PRs have conflicts
|
||||||
uses: eps1lon/actions-label-merge-conflict@v3
|
uses: eps1lon/actions-label-merge-conflict@v3
|
||||||
|
if: github.repository == ${{ vars.REPO_MAIN }}
|
||||||
with:
|
with:
|
||||||
dirtyLabel: "merge-conflicts"
|
dirtyLabel: "merge-conflicts"
|
||||||
repoToken: "${{ secrets.MERGE_CONFLICT_LABEL_PAT }}"
|
repoToken: "${{ secrets.MERGE_CONFLICT_LABEL_PAT }}"
|
||||||
|
|||||||
2
.github/workflows/codeql.yml
vendored
2
.github/workflows/codeql.yml
vendored
@@ -57,7 +57,7 @@ jobs:
|
|||||||
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
# Add any setup steps before running the `github/codeql-action/init` action.
|
# Add any setup steps before running the `github/codeql-action/init` action.
|
||||||
# This includes steps like installing compilers or runtimes (`actions/setup-node`
|
# This includes steps like installing compilers or runtimes (`actions/setup-node`
|
||||||
|
|||||||
8
.github/workflows/dev.yml
vendored
8
.github/workflows/dev.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # needed for https://github.com/marketplace/actions/nx-set-shas
|
fetch-depth: 0 # needed for https://github.com/marketplace/actions/nx-set-shas
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ jobs:
|
|||||||
- check-affected
|
- check-affected
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
@@ -68,7 +68,7 @@ jobs:
|
|||||||
- test_dev
|
- test_dev
|
||||||
- check-affected
|
- check-affected
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
@@ -103,7 +103,7 @@ jobs:
|
|||||||
- dockerfile: Dockerfile
|
- dockerfile: Dockerfile
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
4
.github/workflows/main-docker.yml
vendored
4
.github/workflows/main-docker.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
|||||||
- dockerfile: Dockerfile
|
- dockerfile: Dockerfile
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Set IMAGE_NAME to lowercase
|
- name: Set IMAGE_NAME to lowercase
|
||||||
run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV
|
run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV
|
||||||
@@ -141,7 +141,7 @@ jobs:
|
|||||||
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
|
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
|
|||||||
7
.github/workflows/nightly.yml
vendored
7
.github/workflows/nightly.yml
vendored
@@ -27,6 +27,7 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
nightly-electron:
|
nightly-electron:
|
||||||
|
if: github.repository == ${{ vars.REPO_MAIN }}
|
||||||
name: Deploy nightly
|
name: Deploy nightly
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -47,7 +48,7 @@ jobs:
|
|||||||
forge_platform: win32
|
forge_platform: win32
|
||||||
runs-on: ${{ matrix.os.image }}
|
runs-on: ${{ matrix.os.image }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -75,6 +76,7 @@ jobs:
|
|||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
||||||
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
|
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
|
||||||
|
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
|
||||||
|
|
||||||
- name: Publish release
|
- name: Publish release
|
||||||
uses: softprops/action-gh-release@v2.3.2
|
uses: softprops/action-gh-release@v2.3.2
|
||||||
@@ -96,6 +98,7 @@ jobs:
|
|||||||
path: apps/desktop/upload
|
path: apps/desktop/upload
|
||||||
|
|
||||||
nightly-server:
|
nightly-server:
|
||||||
|
if: github.repository == ${{ vars.REPO_MAIN }}
|
||||||
name: Deploy server nightly
|
name: Deploy server nightly
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -108,7 +111,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-24.04-arm
|
||||||
runs-on: ${{ matrix.runs-on }}
|
runs-on: ${{ matrix.runs-on }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Run the build
|
- name: Run the build
|
||||||
uses: ./.github/actions/build-server
|
uses: ./.github/actions/build-server
|
||||||
|
|||||||
2
.github/workflows/playwright.yml
vendored
2
.github/workflows/playwright.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
filter: tree:0
|
filter: tree:0
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|||||||
7
.github/workflows/release.yml
vendored
7
.github/workflows/release.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
|||||||
forge_platform: win32
|
forge_platform: win32
|
||||||
runs-on: ${{ matrix.os.image }}
|
runs-on: ${{ matrix.os.image }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
@@ -58,6 +58,7 @@ jobs:
|
|||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
||||||
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
|
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
|
||||||
|
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
|
||||||
|
|
||||||
- name: Upload the artifact
|
- name: Upload the artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -78,7 +79,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-24.04-arm
|
||||||
runs-on: ${{ matrix.runs-on }}
|
runs-on: ${{ matrix.runs-on }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Run the build
|
- name: Run the build
|
||||||
uses: ./.github/actions/build-server
|
uses: ./.github/actions/build-server
|
||||||
@@ -101,7 +102,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- run: mkdir upload
|
- run: mkdir upload
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
sparse-checkout: |
|
sparse-checkout: |
|
||||||
docs/Release Notes
|
docs/Release Notes
|
||||||
|
|||||||
67
.github/workflows/sync-docs-to-wiki.yml
vendored
Normal file
67
.github/workflows/sync-docs-to-wiki.yml
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
name: Sync Docs to Wiki
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'docs/**'
|
||||||
|
workflow_dispatch: # Allow manual triggering
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # Read access to repository contents
|
||||||
|
# Note: Writing to wiki requires a PAT or GITHUB_TOKEN with additional permissions
|
||||||
|
# The default GITHUB_TOKEN cannot write to wikis, so we need to:
|
||||||
|
# 1. Create a Personal Access Token (PAT) with 'repo' scope
|
||||||
|
# 2. Add it as a repository secret named WIKI_TOKEN
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync-wiki:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout main repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: main-repo
|
||||||
|
|
||||||
|
- name: Checkout wiki repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: TriliumNext/Trilium.wiki
|
||||||
|
path: wiki
|
||||||
|
token: ${{ secrets.WIKI_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|
||||||
|
- name: Install tsx for TypeScript execution
|
||||||
|
run: npm install -g tsx
|
||||||
|
|
||||||
|
- name: Setup Git
|
||||||
|
run: |
|
||||||
|
git config --global user.email "action@github.com"
|
||||||
|
git config --global user.name "GitHub Action"
|
||||||
|
|
||||||
|
- name: Sync documentation to wiki
|
||||||
|
id: sync
|
||||||
|
run: |
|
||||||
|
tsx main-repo/.github/scripts/sync-docs-to-wiki.ts
|
||||||
|
env:
|
||||||
|
MAIN_REPO_PATH: main-repo
|
||||||
|
WIKI_PATH: wiki
|
||||||
|
|
||||||
|
- name: Commit and push changes
|
||||||
|
if: contains(steps.sync.outputs.changes, 'true')
|
||||||
|
run: |
|
||||||
|
cd wiki
|
||||||
|
git add .
|
||||||
|
git commit -m "Sync documentation from main repository
|
||||||
|
|
||||||
|
Source commit: ${{ github.sha }}
|
||||||
|
Triggered by: ${{ github.event.head_commit.message }}"
|
||||||
|
git push
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.WIKI_TOKEN }}
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,6 +10,7 @@ node_modules
|
|||||||
|
|
||||||
# IDEs and editors
|
# IDEs and editors
|
||||||
/.idea
|
/.idea
|
||||||
|
.idea
|
||||||
.project
|
.project
|
||||||
.classpath
|
.classpath
|
||||||
.c9/
|
.c9/
|
||||||
|
|||||||
6
.idea/.gitignore
generated
vendored
6
.idea/.gitignore
generated
vendored
@@ -1,6 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/workspace.xml
|
|
||||||
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources.local.xml
|
|
||||||
/dataSources/
|
|
||||||
15
.idea/codeStyles/Project.xml
generated
15
.idea/codeStyles/Project.xml
generated
@@ -1,15 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<code_scheme name="Project" version="173">
|
|
||||||
<option name="OTHER_INDENT_OPTIONS">
|
|
||||||
<value>
|
|
||||||
<option name="INDENT_SIZE" value="2" />
|
|
||||||
<option name="TAB_SIZE" value="2" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<codeStyleSettings language="JSON">
|
|
||||||
<indentOptions>
|
|
||||||
<option name="INDENT_SIZE" value="4" />
|
|
||||||
</indentOptions>
|
|
||||||
</codeStyleSettings>
|
|
||||||
</code_scheme>
|
|
||||||
</component>
|
|
||||||
5
.idea/codeStyles/codeStyleConfig.xml
generated
5
.idea/codeStyles/codeStyleConfig.xml
generated
@@ -1,5 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<state>
|
|
||||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
|
||||||
</state>
|
|
||||||
</component>
|
|
||||||
12
.idea/dataSources.xml
generated
12
.idea/dataSources.xml
generated
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
|
||||||
<data-source source="LOCAL" name="document.db" uuid="2a4ac1e6-b828-4a2a-8e4a-3f59f10aff26">
|
|
||||||
<driver-ref>sqlite.xerial</driver-ref>
|
|
||||||
<synchronize>true</synchronize>
|
|
||||||
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
|
||||||
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/data/document.db</jdbc-url>
|
|
||||||
<working-dir>$ProjectFileDir$</working-dir>
|
|
||||||
</data-source>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
4
.idea/encodings.xml
generated
4
.idea/encodings.xml
generated
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
|
|
||||||
</project>
|
|
||||||
15
.idea/git_toolbox_prj.xml
generated
15
.idea/git_toolbox_prj.xml
generated
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="GitToolBoxProjectSettings">
|
|
||||||
<option name="commitMessageIssueKeyValidationOverride">
|
|
||||||
<BoolValueOverride>
|
|
||||||
<option name="enabled" value="true" />
|
|
||||||
</BoolValueOverride>
|
|
||||||
</option>
|
|
||||||
<option name="commitMessageValidationEnabledOverride">
|
|
||||||
<BoolValueOverride>
|
|
||||||
<option name="enabled" value="true" />
|
|
||||||
</BoolValueOverride>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
11
.idea/inspectionProfiles/Project_Default.xml
generated
11
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,11 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
||||||
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
|
||||||
<option name="processCode" value="true" />
|
|
||||||
<option name="processLiterals" value="true" />
|
|
||||||
<option name="processComments" value="true" />
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
6
.idea/jsLibraryMappings.xml
generated
6
.idea/jsLibraryMappings.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="JavaScriptLibraryMappings">
|
|
||||||
<includedPredefinedLibrary name="Node.js Core" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
9
.idea/jsLinters/jslint.xml
generated
9
.idea/jsLinters/jslint.xml
generated
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="JSLintConfiguration">
|
|
||||||
<option devel="true" />
|
|
||||||
<option es6="true" />
|
|
||||||
<option maxerr="50" />
|
|
||||||
<option node="true" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
8
.idea/misc.xml
generated
8
.idea/misc.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<project version="4">
|
|
||||||
<component name="JavaScriptSettings">
|
|
||||||
<option name="languageLevel" value="ES6" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_16" default="true" project-jdk-name="openjdk-16" project-jdk-type="JavaSDK">
|
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/trilium.iml" filepath="$PROJECT_DIR$/trilium.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
7
.idea/sqldialects.xml
generated
7
.idea/sqldialects.xml
generated
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="SqlDialectMappings">
|
|
||||||
<file url="file://$PROJECT_DIR$" dialect="SQLite" />
|
|
||||||
<file url="PROJECT" dialect="SQLite" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
2
.vscode/i18n-ally-custom-framework.yml
vendored
2
.vscode/i18n-ally-custom-framework.yml
vendored
@@ -3,6 +3,7 @@
|
|||||||
languageIds:
|
languageIds:
|
||||||
- javascript
|
- javascript
|
||||||
- typescript
|
- typescript
|
||||||
|
- typescriptreact
|
||||||
- html
|
- html
|
||||||
|
|
||||||
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
|
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
|
||||||
@@ -25,6 +26,7 @@ scopeRangeRegex: "useTranslation\\(\\s*\\[?\\s*['\"`](.*?)['\"`]"
|
|||||||
# The "$1" will be replaced by the keypath specified.
|
# The "$1" will be replaced by the keypath specified.
|
||||||
refactorTemplates:
|
refactorTemplates:
|
||||||
- t("$1")
|
- t("$1")
|
||||||
|
- {t("$1")}
|
||||||
- ${t("$1")}
|
- ${t("$1")}
|
||||||
- <%= t("$1") %>
|
- <%= t("$1") %>
|
||||||
|
|
||||||
|
|||||||
5
.vscode/snippets.code-snippets
vendored
5
.vscode/snippets.code-snippets
vendored
@@ -20,5 +20,10 @@
|
|||||||
"scope": "typescript",
|
"scope": "typescript",
|
||||||
"prefix": "jqf",
|
"prefix": "jqf",
|
||||||
"body": ["private $${1:name}!: JQuery<HTMLElement>;"]
|
"body": ["private $${1:name}!: JQuery<HTMLElement>;"]
|
||||||
|
},
|
||||||
|
"region": {
|
||||||
|
"scope": "css",
|
||||||
|
"prefix": "region",
|
||||||
|
"body": ["/* #region ${1:name} */\n$0\n/* #endregion */"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
38
README.md
38
README.md
@@ -1,11 +1,11 @@
|
|||||||
# Trilium Notes
|
# Trilium Notes
|
||||||
|
|
||||||
 
|
 
|
||||||

|

|
||||||

|

|
||||||
[](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [](https://hosted.weblate.org/engage/trilium/)
|
[](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [](https://hosted.weblate.org/engage/trilium/)
|
||||||
|
|
||||||
[English](./README.md) | [Chinese](./docs/README-ZH_CN.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
|
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
|
||||||
|
|
||||||
Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
|
Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
|
||||||
|
|
||||||
@@ -46,15 +46,15 @@ See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for q
|
|||||||
- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party themes, scripts, plugins and more.
|
- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party themes, scripts, plugins and more.
|
||||||
- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more.
|
- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more.
|
||||||
|
|
||||||
## ⚠️ Why TriliumNext?
|
## ❓Why TriliumNext?
|
||||||
|
|
||||||
[The original Trilium project is in maintenance mode](https://github.com/zadam/trilium/issues/4620).
|
The original Trilium developer ([Zadam](https://github.com/zadam)) has graciously given the Trilium repository to the community project which resides at https://github.com/TriliumNext
|
||||||
|
|
||||||
### Migrating from Trilium?
|
### ⬆️Migrating from Zadam/Trilium?
|
||||||
|
|
||||||
There are no special migration steps to migrate from a zadam/Trilium instance to a TriliumNext/Notes instance. Simply [install TriliumNext/Notes](#-installation) as usual and it will use your existing database.
|
There are no special migration steps to migrate from a zadam/Trilium instance to a TriliumNext/Trilium instance. Simply [install TriliumNext/Trilium](#-installation) as usual and it will use your existing database.
|
||||||
|
|
||||||
Versions up to and including [v0.90.4](https://github.com/TriliumNext/Notes/releases/tag/v0.90.4) are compatible with the latest zadam/trilium version of [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later versions of TriliumNext have their sync versions incremented.
|
Versions up to and including [v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are compatible with the latest zadam/trilium version of [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later versions of TriliumNext/Trilium have their sync versions incremented which prevents direct migration.
|
||||||
|
|
||||||
## 📖 Documentation
|
## 📖 Documentation
|
||||||
|
|
||||||
@@ -75,14 +75,14 @@ Feel free to join our official conversations. We would love to hear what feature
|
|||||||
|
|
||||||
- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous discussions.)
|
- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous discussions.)
|
||||||
- The `General` Matrix room is also bridged to [XMPP](xmpp:discuss@trilium.thisgreat.party?join)
|
- The `General` Matrix room is also bridged to [XMPP](xmpp:discuss@trilium.thisgreat.party?join)
|
||||||
- [Github Discussions](https://github.com/TriliumNext/Notes/discussions) (For asynchronous discussions.)
|
- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For asynchronous discussions.)
|
||||||
- [Github Issues](https://github.com/TriliumNext/Notes/issues) (For bug reports and feature requests.)
|
- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug reports and feature requests.)
|
||||||
|
|
||||||
## 🏗 Installation
|
## 🏗 Installation
|
||||||
|
|
||||||
### Windows / MacOS
|
### Windows / MacOS
|
||||||
|
|
||||||
Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the `trilium` executable.
|
Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package and run the `trilium` executable.
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ If your distribution is listed in the table below, use your distribution's packa
|
|||||||
|
|
||||||
[](https://repology.org/project/triliumnext/versions)
|
[](https://repology.org/project/triliumnext/versions)
|
||||||
|
|
||||||
You may also download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the `trilium` executable.
|
You may also download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package and run the `trilium` executable.
|
||||||
|
|
||||||
TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
|
TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
|
||||||
|
|
||||||
@@ -104,13 +104,15 @@ Currently only the latest versions of Chrome & Firefox are supported (and tested
|
|||||||
|
|
||||||
To use TriliumNext on a mobile device, you can use a mobile web browser to access the mobile interface of a server installation (see below).
|
To use TriliumNext on a mobile device, you can use a mobile web browser to access the mobile interface of a server installation (see below).
|
||||||
|
|
||||||
If you prefer a native Android app, you can use [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). Report bugs and missing features at [their repository](https://github.com/FliegendeWurst/TriliumDroid).
|
See issue https://github.com/TriliumNext/Trilium/issues/4962 for more information on mobile app support.
|
||||||
|
|
||||||
See issue https://github.com/TriliumNext/Notes/issues/72 for more information on mobile app support.
|
If you prefer a native Android app, you can use [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid).
|
||||||
|
Report bugs and missing features at [their repository](https://github.com/FliegendeWurst/TriliumDroid).
|
||||||
|
Note: It is best to disable automatic updates on your server installation (see below) when using TriliumDroid since the sync version must match between Trilium and TriliumDroid.
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
|
|
||||||
To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
|
To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
|
||||||
|
|
||||||
|
|
||||||
## 💻 Contribute
|
## 💻 Contribute
|
||||||
@@ -152,11 +154,11 @@ pnpm install
|
|||||||
pnpm nx --project=desktop electron-forge:make -- --arch=x64 --platform=win32
|
pnpm nx --project=desktop electron-forge:make -- --arch=x64 --platform=win32
|
||||||
```
|
```
|
||||||
|
|
||||||
For more details, see the [development docs](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Building%20and%20deployment/Running%20a%20development%20build.md).
|
For more details, see the [development docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide).
|
||||||
|
|
||||||
### Developer Documentation
|
### Developer Documentation
|
||||||
|
|
||||||
Please view the [documentation guide](./docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) for details. If you have more questions, feel free to reach out via the links described in the "Discuss with us" section above.
|
Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) for details. If you have more questions, feel free to reach out via the links described in the "Discuss with us" section above.
|
||||||
|
|
||||||
## 👏 Shoutouts
|
## 👏 Shoutouts
|
||||||
|
|
||||||
@@ -168,7 +170,7 @@ Please view the [documentation guide](./docs/Developer%20Guide/Developer%20Guide
|
|||||||
## 🤝 Support
|
## 🤝 Support
|
||||||
|
|
||||||
Support for the TriliumNext organization will be possible in the near future. For now, you can:
|
Support for the TriliumNext organization will be possible in the near future. For now, you can:
|
||||||
- Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/Notes/graphs/contributors))) for a full list)
|
- Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/trilium/graphs/contributors))) for a full list)
|
||||||
- Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2).
|
- Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2).
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,13 +35,13 @@
|
|||||||
"chore:generate-openapi": "tsx bin/generate-openapi.js"
|
"chore:generate-openapi": "tsx bin/generate-openapi.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "1.54.2",
|
"@playwright/test": "1.55.0",
|
||||||
"@stylistic/eslint-plugin": "5.2.2",
|
"@stylistic/eslint-plugin": "5.3.1",
|
||||||
"@types/express": "5.0.3",
|
"@types/express": "5.0.3",
|
||||||
"@types/node": "22.17.0",
|
"@types/node": "22.18.0",
|
||||||
"@types/yargs": "17.0.33",
|
"@types/yargs": "17.0.33",
|
||||||
"@vitest/coverage-v8": "3.2.4",
|
"@vitest/coverage-v8": "3.2.4",
|
||||||
"eslint": "9.32.0",
|
"eslint": "9.34.0",
|
||||||
"eslint-plugin-simple-import-sort": "12.1.1",
|
"eslint-plugin-simple-import-sort": "12.1.1",
|
||||||
"esm": "3.2.25",
|
"esm": "3.2.25",
|
||||||
"jsdoc": "4.0.4",
|
"jsdoc": "4.0.4",
|
||||||
@@ -49,8 +49,8 @@
|
|||||||
"rcedit": "4.0.1",
|
"rcedit": "4.0.1",
|
||||||
"rimraf": "6.0.1",
|
"rimraf": "6.0.1",
|
||||||
"tslib": "2.8.1",
|
"tslib": "2.8.1",
|
||||||
"typedoc": "0.28.9",
|
"typedoc": "0.28.12",
|
||||||
"typedoc-plugin-missing-exports": "4.0.0"
|
"typedoc-plugin-missing-exports": "4.1.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"appdmg": "0.6.6"
|
"appdmg": "0.6.6"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@triliumnext/client",
|
"name": "@triliumnext/client",
|
||||||
"version": "0.97.2",
|
"version": "0.98.1",
|
||||||
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
|
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "AGPL-3.0-only",
|
"license": "AGPL-3.0-only",
|
||||||
@@ -10,16 +10,16 @@
|
|||||||
"url": "https://github.com/TriliumNext/Notes"
|
"url": "https://github.com/TriliumNext/Notes"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint/js": "9.32.0",
|
"@eslint/js": "9.34.0",
|
||||||
"@excalidraw/excalidraw": "0.18.0",
|
"@excalidraw/excalidraw": "0.18.0",
|
||||||
"@fullcalendar/core": "6.1.18",
|
"@fullcalendar/core": "6.1.19",
|
||||||
"@fullcalendar/daygrid": "6.1.18",
|
"@fullcalendar/daygrid": "6.1.19",
|
||||||
"@fullcalendar/interaction": "6.1.18",
|
"@fullcalendar/interaction": "6.1.19",
|
||||||
"@fullcalendar/list": "6.1.18",
|
"@fullcalendar/list": "6.1.19",
|
||||||
"@fullcalendar/multimonth": "6.1.18",
|
"@fullcalendar/multimonth": "6.1.19",
|
||||||
"@fullcalendar/timegrid": "6.1.18",
|
"@fullcalendar/timegrid": "6.1.19",
|
||||||
"@maplibre/maplibre-gl-leaflet": "0.1.3",
|
"@maplibre/maplibre-gl-leaflet": "0.1.3",
|
||||||
"@mermaid-js/layout-elk": "0.1.8",
|
"@mermaid-js/layout-elk": "0.1.9",
|
||||||
"@mind-elixir/node-menu": "5.0.0",
|
"@mind-elixir/node-menu": "5.0.0",
|
||||||
"@popperjs/core": "2.11.8",
|
"@popperjs/core": "2.11.8",
|
||||||
"@triliumnext/ckeditor5": "workspace:*",
|
"@triliumnext/ckeditor5": "workspace:*",
|
||||||
@@ -28,15 +28,15 @@
|
|||||||
"@triliumnext/highlightjs": "workspace:*",
|
"@triliumnext/highlightjs": "workspace:*",
|
||||||
"@triliumnext/share-theme": "workspace:*",
|
"@triliumnext/share-theme": "workspace:*",
|
||||||
"autocomplete.js": "0.38.1",
|
"autocomplete.js": "0.38.1",
|
||||||
"bootstrap": "5.3.7",
|
"bootstrap": "5.3.8",
|
||||||
"boxicons": "2.1.4",
|
"boxicons": "2.1.4",
|
||||||
"dayjs": "1.11.13",
|
"dayjs": "1.11.18",
|
||||||
"dayjs-plugin-utc": "0.1.2",
|
"dayjs-plugin-utc": "0.1.2",
|
||||||
"debounce": "2.2.0",
|
"debounce": "2.2.0",
|
||||||
"draggabilly": "3.0.0",
|
"draggabilly": "3.0.0",
|
||||||
"force-graph": "1.50.1",
|
"force-graph": "1.50.1",
|
||||||
"globals": "16.3.0",
|
"globals": "16.3.0",
|
||||||
"i18next": "25.3.2",
|
"i18next": "25.4.2",
|
||||||
"i18next-http-backend": "3.0.2",
|
"i18next-http-backend": "3.0.2",
|
||||||
"jquery": "3.7.1",
|
"jquery": "3.7.1",
|
||||||
"jquery.fancytree": "2.38.5",
|
"jquery.fancytree": "2.38.5",
|
||||||
@@ -46,12 +46,13 @@
|
|||||||
"leaflet": "1.9.4",
|
"leaflet": "1.9.4",
|
||||||
"leaflet-gpx": "2.2.0",
|
"leaflet-gpx": "2.2.0",
|
||||||
"mark.js": "8.11.1",
|
"mark.js": "8.11.1",
|
||||||
"marked": "16.1.2",
|
"marked": "16.2.1",
|
||||||
"mermaid": "11.9.0",
|
"mermaid": "11.10.1",
|
||||||
"mind-elixir": "5.0.4",
|
"mind-elixir": "5.0.6",
|
||||||
"normalize.css": "8.0.1",
|
"normalize.css": "8.0.1",
|
||||||
"panzoom": "9.4.3",
|
"panzoom": "9.4.3",
|
||||||
"preact": "10.27.0",
|
"preact": "10.27.1",
|
||||||
|
"react-i18next": "15.7.3",
|
||||||
"split.js": "1.6.5",
|
"split.js": "1.6.5",
|
||||||
"svg-pan-zoom": "3.6.2",
|
"svg-pan-zoom": "3.6.2",
|
||||||
"tabulator-tables": "6.3.1",
|
"tabulator-tables": "6.3.1",
|
||||||
@@ -61,15 +62,15 @@
|
|||||||
"@ckeditor/ckeditor5-inspector": "5.0.0",
|
"@ckeditor/ckeditor5-inspector": "5.0.0",
|
||||||
"@preact/preset-vite": "2.10.2",
|
"@preact/preset-vite": "2.10.2",
|
||||||
"@types/bootstrap": "5.2.10",
|
"@types/bootstrap": "5.2.10",
|
||||||
"@types/jquery": "3.5.32",
|
"@types/jquery": "3.5.33",
|
||||||
"@types/leaflet": "1.9.20",
|
"@types/leaflet": "1.9.20",
|
||||||
"@types/leaflet-gpx": "1.3.7",
|
"@types/leaflet-gpx": "1.3.7",
|
||||||
"@types/mark.js": "8.11.12",
|
"@types/mark.js": "8.11.12",
|
||||||
"@types/tabulator-tables": "6.2.9",
|
"@types/tabulator-tables": "6.2.10",
|
||||||
"copy-webpack-plugin": "13.0.0",
|
"copy-webpack-plugin": "13.0.1",
|
||||||
"happy-dom": "18.0.1",
|
"happy-dom": "18.0.1",
|
||||||
"script-loader": "0.7.2",
|
"script-loader": "0.7.2",
|
||||||
"vite-plugin-static-copy": "3.1.1"
|
"vite-plugin-static-copy": "3.1.2"
|
||||||
},
|
},
|
||||||
"nx": {
|
"nx": {
|
||||||
"name": "client",
|
"name": "client",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import froca from "../services/froca.js";
|
import froca from "../services/froca.js";
|
||||||
import RootCommandExecutor from "./root_command_executor.js";
|
import RootCommandExecutor from "./root_command_executor.js";
|
||||||
import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js";
|
import Entrypoints from "./entrypoints.js";
|
||||||
import options from "../services/options.js";
|
import options from "../services/options.js";
|
||||||
import utils, { hasTouchBar } from "../services/utils.js";
|
import utils, { hasTouchBar } from "../services/utils.js";
|
||||||
import zoomComponent from "./zoom.js";
|
import zoomComponent from "./zoom.js";
|
||||||
@@ -30,16 +30,15 @@ import type CodeMirror from "@triliumnext/codemirror";
|
|||||||
import { StartupChecks } from "./startup_checks.js";
|
import { StartupChecks } from "./startup_checks.js";
|
||||||
import type { CreateNoteOpts } from "../services/note_create.js";
|
import type { CreateNoteOpts } from "../services/note_create.js";
|
||||||
import { ColumnComponent } from "tabulator-tables";
|
import { ColumnComponent } from "tabulator-tables";
|
||||||
|
import { ChooseNoteTypeCallback } from "../widgets/dialogs/note_type_chooser.jsx";
|
||||||
|
import type RootContainer from "../widgets/containers/root_container.js";
|
||||||
|
import { SqlExecuteResults } from "@triliumnext/commons";
|
||||||
|
|
||||||
interface Layout {
|
interface Layout {
|
||||||
getRootWidget: (appContext: AppContext) => RootWidget;
|
getRootWidget: (appContext: AppContext) => RootContainer;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface RootWidget extends Component {
|
export interface BeforeUploadListener extends Component {
|
||||||
render: () => JQuery<HTMLElement>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BeforeUploadListener extends Component {
|
|
||||||
beforeUnloadEvent(): boolean;
|
beforeUnloadEvent(): boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +83,6 @@ export type CommandMappings = {
|
|||||||
focusTree: CommandData;
|
focusTree: CommandData;
|
||||||
focusOnTitle: CommandData;
|
focusOnTitle: CommandData;
|
||||||
focusOnDetail: CommandData;
|
focusOnDetail: CommandData;
|
||||||
focusOnSearchDefinition: Required<CommandData>;
|
|
||||||
searchNotes: CommandData & {
|
searchNotes: CommandData & {
|
||||||
searchString?: string;
|
searchString?: string;
|
||||||
ancestorNoteId?: string | null;
|
ancestorNoteId?: string | null;
|
||||||
@@ -92,7 +90,14 @@ export type CommandMappings = {
|
|||||||
closeTocCommand: CommandData;
|
closeTocCommand: CommandData;
|
||||||
closeHlt: CommandData;
|
closeHlt: CommandData;
|
||||||
showLaunchBarSubtree: CommandData;
|
showLaunchBarSubtree: CommandData;
|
||||||
showRevisions: CommandData;
|
showHiddenSubtree: CommandData;
|
||||||
|
showSQLConsoleHistory: CommandData;
|
||||||
|
logout: CommandData;
|
||||||
|
switchToMobileVersion: CommandData;
|
||||||
|
switchToDesktopVersion: CommandData;
|
||||||
|
showRevisions: CommandData & {
|
||||||
|
noteId?: string | null;
|
||||||
|
};
|
||||||
showLlmChat: CommandData;
|
showLlmChat: CommandData;
|
||||||
createAiChat: CommandData;
|
createAiChat: CommandData;
|
||||||
showOptions: CommandData & {
|
showOptions: CommandData & {
|
||||||
@@ -135,6 +140,7 @@ export type CommandMappings = {
|
|||||||
showLeftPane: CommandData;
|
showLeftPane: CommandData;
|
||||||
showAttachments: CommandData;
|
showAttachments: CommandData;
|
||||||
showSearchHistory: CommandData;
|
showSearchHistory: CommandData;
|
||||||
|
showShareSubtree: CommandData;
|
||||||
hoistNote: CommandData & { noteId: string };
|
hoistNote: CommandData & { noteId: string };
|
||||||
leaveProtectedSession: CommandData;
|
leaveProtectedSession: CommandData;
|
||||||
enterProtectedSession: CommandData;
|
enterProtectedSession: CommandData;
|
||||||
@@ -320,6 +326,7 @@ export type CommandMappings = {
|
|||||||
printActiveNote: CommandData;
|
printActiveNote: CommandData;
|
||||||
exportAsPdf: CommandData;
|
exportAsPdf: CommandData;
|
||||||
openNoteExternally: CommandData;
|
openNoteExternally: CommandData;
|
||||||
|
openNoteCustom: CommandData;
|
||||||
renderActiveNote: CommandData;
|
renderActiveNote: CommandData;
|
||||||
unhoist: CommandData;
|
unhoist: CommandData;
|
||||||
reloadFrontendApp: CommandData;
|
reloadFrontendApp: CommandData;
|
||||||
@@ -368,6 +375,9 @@ export type CommandMappings = {
|
|||||||
};
|
};
|
||||||
refreshTouchBar: CommandData;
|
refreshTouchBar: CommandData;
|
||||||
reloadTextEditor: CommandData;
|
reloadTextEditor: CommandData;
|
||||||
|
chooseNoteType: CommandData & {
|
||||||
|
callback: ChooseNoteTypeCallback
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
type EventMappings = {
|
type EventMappings = {
|
||||||
@@ -520,7 +530,7 @@ export type FilteredCommandNames<T extends CommandData> = keyof Pick<CommandMapp
|
|||||||
export class AppContext extends Component {
|
export class AppContext extends Component {
|
||||||
isMainWindow: boolean;
|
isMainWindow: boolean;
|
||||||
components: Component[];
|
components: Component[];
|
||||||
beforeUnloadListeners: WeakRef<BeforeUploadListener>[];
|
beforeUnloadListeners: (WeakRef<BeforeUploadListener> | (() => boolean))[];
|
||||||
tabManager!: TabManager;
|
tabManager!: TabManager;
|
||||||
layout?: Layout;
|
layout?: Layout;
|
||||||
noteTreeWidget?: NoteTreeWidget;
|
noteTreeWidget?: NoteTreeWidget;
|
||||||
@@ -613,7 +623,7 @@ export class AppContext extends Component {
|
|||||||
component.triggerCommand(commandName, { $el: $(this) });
|
component.triggerCommand(commandName, { $el: $(this) });
|
||||||
});
|
});
|
||||||
|
|
||||||
this.child(rootWidget);
|
this.child(rootWidget as Component);
|
||||||
|
|
||||||
this.triggerEvent("initialRenderComplete", {});
|
this.triggerEvent("initialRenderComplete", {});
|
||||||
}
|
}
|
||||||
@@ -643,13 +653,17 @@ export class AppContext extends Component {
|
|||||||
return $(el).closest(".component").prop("component");
|
return $(el).closest(".component").prop("component");
|
||||||
}
|
}
|
||||||
|
|
||||||
addBeforeUnloadListener(obj: BeforeUploadListener) {
|
addBeforeUnloadListener(obj: BeforeUploadListener | (() => boolean)) {
|
||||||
if (typeof WeakRef !== "function") {
|
if (typeof WeakRef !== "function") {
|
||||||
// older browsers don't support WeakRef
|
// older browsers don't support WeakRef
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof obj === "object") {
|
||||||
this.beforeUnloadListeners.push(new WeakRef<BeforeUploadListener>(obj));
|
this.beforeUnloadListeners.push(new WeakRef<BeforeUploadListener>(obj));
|
||||||
|
} else {
|
||||||
|
this.beforeUnloadListeners.push(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -659,10 +673,11 @@ const appContext = new AppContext(window.glob.isMainWindow);
|
|||||||
$(window).on("beforeunload", () => {
|
$(window).on("beforeunload", () => {
|
||||||
let allSaved = true;
|
let allSaved = true;
|
||||||
|
|
||||||
appContext.beforeUnloadListeners = appContext.beforeUnloadListeners.filter((wr) => !!wr.deref());
|
appContext.beforeUnloadListeners = appContext.beforeUnloadListeners.filter((wr) => typeof wr === "function" || !!wr.deref());
|
||||||
|
|
||||||
for (const weakRef of appContext.beforeUnloadListeners) {
|
for (const listener of appContext.beforeUnloadListeners) {
|
||||||
const component = weakRef.deref();
|
if (typeof listener === "object") {
|
||||||
|
const component = listener.deref();
|
||||||
|
|
||||||
if (!component) {
|
if (!component) {
|
||||||
continue;
|
continue;
|
||||||
@@ -670,14 +685,17 @@ $(window).on("beforeunload", () => {
|
|||||||
|
|
||||||
if (!component.beforeUnloadEvent()) {
|
if (!component.beforeUnloadEvent()) {
|
||||||
console.log(`Component ${component.componentId} is not finished saving its state.`);
|
console.log(`Component ${component.componentId} is not finished saving its state.`);
|
||||||
|
|
||||||
toast.showMessage(t("app_context.please_wait_for_save"), 10000);
|
|
||||||
|
|
||||||
allSaved = false;
|
allSaved = false;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (!listener()) {
|
||||||
|
allSaved = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!allSaved) {
|
if (!allSaved) {
|
||||||
|
toast.showMessage(t("app_context.please_wait_for_save"), 10000);
|
||||||
return "some string";
|
return "some string";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import utils from "../services/utils.js";
|
import utils from "../services/utils.js";
|
||||||
import type { CommandMappings, CommandNames, EventData, EventNames } from "./app_context.js";
|
import type { CommandMappings, CommandNames, EventData, EventNames } from "./app_context.js";
|
||||||
|
|
||||||
|
type EventHandler = ((data: any) => void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract class for all components in the Trilium's frontend.
|
* Abstract class for all components in the Trilium's frontend.
|
||||||
*
|
*
|
||||||
@@ -19,6 +21,7 @@ export class TypedComponent<ChildT extends TypedComponent<ChildT>> {
|
|||||||
initialized: Promise<void> | null;
|
initialized: Promise<void> | null;
|
||||||
parent?: TypedComponent<any>;
|
parent?: TypedComponent<any>;
|
||||||
_position!: number;
|
_position!: number;
|
||||||
|
private listeners: Record<string, EventHandler[]> | null = {};
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.componentId = `${this.sanitizedClassName}-${utils.randomString(8)}`;
|
this.componentId = `${this.sanitizedClassName}-${utils.randomString(8)}`;
|
||||||
@@ -76,6 +79,14 @@ export class TypedComponent<ChildT extends TypedComponent<ChildT>> {
|
|||||||
handleEventInChildren<T extends EventNames>(name: T, data: EventData<T>): Promise<unknown[] | unknown> | null {
|
handleEventInChildren<T extends EventNames>(name: T, data: EventData<T>): Promise<unknown[] | unknown> | null {
|
||||||
const promises: Promise<unknown>[] = [];
|
const promises: Promise<unknown>[] = [];
|
||||||
|
|
||||||
|
// Handle React children.
|
||||||
|
if (this.listeners?.[name]) {
|
||||||
|
for (const listener of this.listeners[name]) {
|
||||||
|
listener(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle legacy children.
|
||||||
for (const child of this.children) {
|
for (const child of this.children) {
|
||||||
const ret = child.handleEvent(name, data) as Promise<void>;
|
const ret = child.handleEvent(name, data) as Promise<void>;
|
||||||
|
|
||||||
@@ -120,6 +131,35 @@ export class TypedComponent<ChildT extends TypedComponent<ChildT>> {
|
|||||||
|
|
||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registerHandler<T extends EventNames>(name: T, handler: EventHandler) {
|
||||||
|
if (!this.listeners) {
|
||||||
|
this.listeners = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.listeners[name]) {
|
||||||
|
this.listeners[name] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.listeners[name].includes(handler)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.listeners[name].push(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
removeHandler<T extends EventNames>(name: T, handler: EventHandler) {
|
||||||
|
if (!this.listeners?.[name]?.includes(handler)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.listeners[name] = this.listeners[name]
|
||||||
|
.filter(listener => listener !== handler);
|
||||||
|
|
||||||
|
if (!this.listeners[name].length) {
|
||||||
|
delete this.listeners[name];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Component extends TypedComponent<Component> {}
|
export default class Component extends TypedComponent<Component> {}
|
||||||
|
|||||||
@@ -10,22 +10,7 @@ import bundleService from "../services/bundle.js";
|
|||||||
import froca from "../services/froca.js";
|
import froca from "../services/froca.js";
|
||||||
import linkService from "../services/link.js";
|
import linkService from "../services/link.js";
|
||||||
import { t } from "../services/i18n.js";
|
import { t } from "../services/i18n.js";
|
||||||
import type FNote from "../entities/fnote.js";
|
import { CreateChildrenResponse, SqlExecuteResponse } from "@triliumnext/commons";
|
||||||
|
|
||||||
// TODO: Move somewhere else nicer.
|
|
||||||
export type SqlExecuteResults = string[][][];
|
|
||||||
|
|
||||||
// TODO: Deduplicate with server.
|
|
||||||
interface SqlExecuteResponse {
|
|
||||||
success: boolean;
|
|
||||||
error?: string;
|
|
||||||
results: SqlExecuteResults;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Deduplicate with server.
|
|
||||||
interface CreateChildrenResponse {
|
|
||||||
note: FNote;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class Entrypoints extends Component {
|
export default class Entrypoints extends Component {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -34,7 +19,7 @@ export default class Entrypoints extends Component {
|
|||||||
|
|
||||||
openDevToolsCommand() {
|
openDevToolsCommand() {
|
||||||
if (utils.isElectron()) {
|
if (utils.isElectron()) {
|
||||||
utils.dynamicRequire("@electron/remote").getCurrentWindow().toggleDevTools();
|
utils.dynamicRequire("@electron/remote").getCurrentWindow().webContents.toggleDevTools();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +109,7 @@ export default class Entrypoints extends Component {
|
|||||||
if (utils.isElectron()) {
|
if (utils.isElectron()) {
|
||||||
// standard JS version does not work completely correctly in electron
|
// standard JS version does not work completely correctly in electron
|
||||||
const webContents = utils.dynamicRequire("@electron/remote").getCurrentWebContents();
|
const webContents = utils.dynamicRequire("@electron/remote").getCurrentWebContents();
|
||||||
const activeIndex = parseInt(webContents.navigationHistory.getActiveIndex());
|
const activeIndex = webContents.navigationHistory.getActiveIndex();
|
||||||
|
|
||||||
webContents.goToIndex(activeIndex - 1);
|
webContents.goToIndex(activeIndex - 1);
|
||||||
} else {
|
} else {
|
||||||
@@ -136,7 +121,7 @@ export default class Entrypoints extends Component {
|
|||||||
if (utils.isElectron()) {
|
if (utils.isElectron()) {
|
||||||
// standard JS version does not work completely correctly in electron
|
// standard JS version does not work completely correctly in electron
|
||||||
const webContents = utils.dynamicRequire("@electron/remote").getCurrentWebContents();
|
const webContents = utils.dynamicRequire("@electron/remote").getCurrentWebContents();
|
||||||
const activeIndex = parseInt(webContents.navigationHistory.getActiveIndex());
|
const activeIndex = webContents.navigationHistory.getActiveIndex();
|
||||||
|
|
||||||
webContents.goToIndex(activeIndex + 1);
|
webContents.goToIndex(activeIndex + 1);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ export default class RootCommandExecutor extends Component {
|
|||||||
const noteContext = await appContext.tabManager.openTabWithNoteWithHoisting(searchNote.noteId, {
|
const noteContext = await appContext.tabManager.openTabWithNoteWithHoisting(searchNote.noteId, {
|
||||||
activate: true
|
activate: true
|
||||||
});
|
});
|
||||||
|
|
||||||
appContext.triggerCommand("focusOnSearchDefinition", { ntxId: noteContext.ntxId });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async searchInSubtreeCommand({ notePath }: CommandListenerData<"searchInSubtree">) {
|
async searchInSubtreeCommand({ notePath }: CommandListenerData<"searchInSubtree">) {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import electronContextMenu from "./menus/electron_context_menu.js";
|
|||||||
import glob from "./services/glob.js";
|
import glob from "./services/glob.js";
|
||||||
import { t } from "./services/i18n.js";
|
import { t } from "./services/i18n.js";
|
||||||
import options from "./services/options.js";
|
import options from "./services/options.js";
|
||||||
import server from "./services/server.js";
|
|
||||||
import type ElectronRemote from "@electron/remote";
|
import type ElectronRemote from "@electron/remote";
|
||||||
import type Electron from "electron";
|
import type Electron from "electron";
|
||||||
import "./stylesheets/bootstrap.scss";
|
import "./stylesheets/bootstrap.scss";
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ export interface NoteMetaData {
|
|||||||
/**
|
/**
|
||||||
* Note is the main node and concept in Trilium.
|
* Note is the main node and concept in Trilium.
|
||||||
*/
|
*/
|
||||||
class FNote {
|
export default class FNote {
|
||||||
private froca: Froca;
|
private froca: Froca;
|
||||||
|
|
||||||
noteId!: string;
|
noteId!: string;
|
||||||
@@ -1020,6 +1020,14 @@ class FNote {
|
|||||||
return this.noteId.startsWith("_options");
|
return this.noteId.startsWith("_options");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isTriliumSqlite() {
|
||||||
|
return this.mime === "text/x-sqlite;schema=trilium";
|
||||||
|
}
|
||||||
|
|
||||||
|
isTriliumScript() {
|
||||||
|
return this.mime.startsWith("application/javascript");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides note's date metadata.
|
* Provides note's date metadata.
|
||||||
*/
|
*/
|
||||||
@@ -1027,5 +1035,3 @@ class FNote {
|
|||||||
return await server.get<NoteMetaData>(`notes/${this.noteId}/metadata`);
|
return await server.get<NoteMetaData>(`notes/${this.noteId}/metadata`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default FNote;
|
|
||||||
|
|||||||
@@ -1,78 +1,47 @@
|
|||||||
import FlexContainer from "../widgets/containers/flex_container.js";
|
import FlexContainer from "../widgets/containers/flex_container.js";
|
||||||
import GlobalMenuWidget from "../widgets/buttons/global_menu.js";
|
|
||||||
import TabRowWidget from "../widgets/tab_row.js";
|
import TabRowWidget from "../widgets/tab_row.js";
|
||||||
import TitleBarButtonsWidget from "../widgets/title_bar_buttons.js";
|
|
||||||
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
|
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
|
||||||
import NoteTreeWidget from "../widgets/note_tree.js";
|
import NoteTreeWidget from "../widgets/note_tree.js";
|
||||||
import NoteTitleWidget from "../widgets/note_title.js";
|
import NoteTitleWidget from "../widgets/note_title.jsx";
|
||||||
import OwnedAttributeListWidget from "../widgets/ribbon_widgets/owned_attribute_list.js";
|
|
||||||
import NoteActionsWidget from "../widgets/buttons/note_actions.js";
|
|
||||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||||
import RibbonContainer from "../widgets/containers/ribbon_container.js";
|
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
||||||
import PromotedAttributesWidget from "../widgets/ribbon_widgets/promoted_attributes.js";
|
|
||||||
import InheritedAttributesWidget from "../widgets/ribbon_widgets/inherited_attribute_list.js";
|
|
||||||
import NoteListWidget from "../widgets/note_list.js";
|
import NoteListWidget from "../widgets/note_list.js";
|
||||||
import SearchDefinitionWidget from "../widgets/ribbon_widgets/search_definition.js";
|
import NoteIconWidget from "../widgets/note_icon.jsx";
|
||||||
import SqlResultWidget from "../widgets/sql_result.js";
|
|
||||||
import SqlTableSchemasWidget from "../widgets/sql_table_schemas.js";
|
|
||||||
import FilePropertiesWidget from "../widgets/ribbon_widgets/file_properties.js";
|
|
||||||
import ImagePropertiesWidget from "../widgets/ribbon_widgets/image_properties.js";
|
|
||||||
import NotePropertiesWidget from "../widgets/ribbon_widgets/note_properties.js";
|
|
||||||
import NoteIconWidget from "../widgets/note_icon.js";
|
|
||||||
import SearchResultWidget from "../widgets/search_result.js";
|
|
||||||
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
|
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
|
||||||
import RootContainer from "../widgets/containers/root_container.js";
|
import RootContainer from "../widgets/containers/root_container.js";
|
||||||
import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js";
|
import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js";
|
||||||
import SpacerWidget from "../widgets/spacer.js";
|
import SpacerWidget from "../widgets/spacer.js";
|
||||||
import QuickSearchWidget from "../widgets/quick_search.js";
|
import QuickSearchWidget from "../widgets/quick_search.js";
|
||||||
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
|
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
|
||||||
import LeftPaneToggleWidget from "../widgets/buttons/left_pane_toggle.js";
|
|
||||||
import CreatePaneButton from "../widgets/buttons/create_pane_button.js";
|
import CreatePaneButton from "../widgets/buttons/create_pane_button.js";
|
||||||
import ClosePaneButton from "../widgets/buttons/close_pane_button.js";
|
import ClosePaneButton from "../widgets/buttons/close_pane_button.js";
|
||||||
import BasicPropertiesWidget from "../widgets/ribbon_widgets/basic_properties.js";
|
|
||||||
import NoteInfoWidget from "../widgets/ribbon_widgets/note_info_widget.js";
|
|
||||||
import BookPropertiesWidget from "../widgets/ribbon_widgets/book_properties.js";
|
|
||||||
import NoteMapRibbonWidget from "../widgets/ribbon_widgets/note_map.js";
|
|
||||||
import NotePathsWidget from "../widgets/ribbon_widgets/note_paths.js";
|
|
||||||
import SimilarNotesWidget from "../widgets/ribbon_widgets/similar_notes.js";
|
|
||||||
import RightPaneContainer from "../widgets/containers/right_pane_container.js";
|
import RightPaneContainer from "../widgets/containers/right_pane_container.js";
|
||||||
import EditButton from "../widgets/floating_buttons/edit_button.js";
|
|
||||||
import EditedNotesWidget from "../widgets/ribbon_widgets/edited_notes.js";
|
|
||||||
import ShowTocWidgetButton from "../widgets/buttons/show_toc_widget_button.js";
|
|
||||||
import ShowHighlightsListWidgetButton from "../widgets/buttons/show_highlights_list_widget_button.js";
|
|
||||||
import NoteWrapperWidget from "../widgets/note_wrapper.js";
|
import NoteWrapperWidget from "../widgets/note_wrapper.js";
|
||||||
import BacklinksWidget from "../widgets/floating_buttons/zpetne_odkazy.js";
|
|
||||||
import SharedInfoWidget from "../widgets/shared_info.js";
|
|
||||||
import FindWidget from "../widgets/find.js";
|
import FindWidget from "../widgets/find.js";
|
||||||
import TocWidget from "../widgets/toc.js";
|
import TocWidget from "../widgets/toc.js";
|
||||||
import HighlightsListWidget from "../widgets/highlights_list.js";
|
import HighlightsListWidget from "../widgets/highlights_list.js";
|
||||||
import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js";
|
import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js";
|
||||||
import FloatingButtons from "../widgets/floating_buttons/floating_buttons.js";
|
|
||||||
import RelationMapButtons from "../widgets/floating_buttons/relation_map_buttons.js";
|
|
||||||
import SvgExportButton from "../widgets/floating_buttons/svg_export_button.js";
|
|
||||||
import LauncherContainer from "../widgets/containers/launcher_container.js";
|
import LauncherContainer from "../widgets/containers/launcher_container.js";
|
||||||
import RevisionsButton from "../widgets/buttons/revisions_button.js";
|
|
||||||
import CodeButtonsWidget from "../widgets/floating_buttons/code_buttons.js";
|
|
||||||
import ApiLogWidget from "../widgets/api_log.js";
|
|
||||||
import HideFloatingButtonsButton from "../widgets/floating_buttons/hide_floating_buttons_button.js";
|
|
||||||
import ScriptExecutorWidget from "../widgets/ribbon_widgets/script_executor.js";
|
|
||||||
import MovePaneButton from "../widgets/buttons/move_pane_button.js";
|
import MovePaneButton from "../widgets/buttons/move_pane_button.js";
|
||||||
import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js";
|
import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js";
|
||||||
import CopyImageReferenceButton from "../widgets/floating_buttons/copy_image_reference_button.js";
|
import ScrollPadding from "../widgets/scroll_padding.js";
|
||||||
import ScrollPaddingWidget from "../widgets/scroll_padding.js";
|
|
||||||
import ClassicEditorToolbar from "../widgets/ribbon_widgets/classic_editor_toolbar.js";
|
|
||||||
import options from "../services/options.js";
|
import options from "../services/options.js";
|
||||||
import utils from "../services/utils.js";
|
import utils from "../services/utils.js";
|
||||||
import GeoMapButtons from "../widgets/floating_buttons/geo_map_button.js";
|
|
||||||
import ContextualHelpButton from "../widgets/floating_buttons/help_button.js";
|
|
||||||
import CloseZenButton from "../widgets/close_zen_button.js";
|
|
||||||
import type { AppContext } from "../components/app_context.js";
|
import type { AppContext } from "../components/app_context.js";
|
||||||
import type { WidgetsByParent } from "../services/bundle.js";
|
import type { WidgetsByParent } from "../services/bundle.js";
|
||||||
import SwitchSplitOrientationButton from "../widgets/floating_buttons/switch_layout_button.js";
|
|
||||||
import ToggleReadOnlyButton from "../widgets/floating_buttons/toggle_read_only_button.js";
|
|
||||||
import PngExportButton from "../widgets/floating_buttons/png_export_button.js";
|
|
||||||
import RefreshButton from "../widgets/floating_buttons/refresh_button.js";
|
|
||||||
import { applyModals } from "./layout_commons.js";
|
import { applyModals } from "./layout_commons.js";
|
||||||
|
import Ribbon from "../widgets/ribbon/Ribbon.jsx";
|
||||||
|
import FloatingButtons from "../widgets/FloatingButtons.jsx";
|
||||||
|
import { DESKTOP_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
|
||||||
|
import SearchResult from "../widgets/search_result.jsx";
|
||||||
|
import GlobalMenu from "../widgets/buttons/global_menu.jsx";
|
||||||
|
import SqlResults from "../widgets/sql_result.js";
|
||||||
|
import SqlTableSchemas from "../widgets/sql_table_schemas.js";
|
||||||
|
import TitleBarButtons from "../widgets/title_bar_buttons.jsx";
|
||||||
|
import LeftPaneToggle from "../widgets/buttons/left_pane_toggle.js";
|
||||||
|
import ApiLog from "../widgets/api_log.jsx";
|
||||||
|
import CloseZenModeButton from "../widgets/close_zen_button.jsx";
|
||||||
|
import SharedInfo from "../widgets/shared_info.jsx";
|
||||||
|
|
||||||
export default class DesktopLayout {
|
export default class DesktopLayout {
|
||||||
|
|
||||||
@@ -107,9 +76,9 @@ export default class DesktopLayout {
|
|||||||
new FlexContainer("row")
|
new FlexContainer("row")
|
||||||
.class("tab-row-container")
|
.class("tab-row-container")
|
||||||
.child(new FlexContainer("row").id("tab-row-left-spacer"))
|
.child(new FlexContainer("row").id("tab-row-left-spacer"))
|
||||||
.optChild(launcherPaneIsHorizontal, new LeftPaneToggleWidget(true))
|
.optChild(launcherPaneIsHorizontal, <LeftPaneToggle isHorizontalLayout={true} />)
|
||||||
.child(new TabRowWidget().class("full-width"))
|
.child(new TabRowWidget().class("full-width"))
|
||||||
.optChild(customTitleBarButtons, new TitleBarButtonsWidget())
|
.optChild(customTitleBarButtons, <TitleBarButtons />)
|
||||||
.css("height", "40px")
|
.css("height", "40px")
|
||||||
.css("background-color", "var(--launcher-pane-background-color)")
|
.css("background-color", "var(--launcher-pane-background-color)")
|
||||||
.setParent(appContext)
|
.setParent(appContext)
|
||||||
@@ -130,7 +99,7 @@ export default class DesktopLayout {
|
|||||||
new FlexContainer("column")
|
new FlexContainer("column")
|
||||||
.id("rest-pane")
|
.id("rest-pane")
|
||||||
.css("flex-grow", "1")
|
.css("flex-grow", "1")
|
||||||
.optChild(!fullWidthTabBar, new FlexContainer("row").child(new TabRowWidget()).optChild(customTitleBarButtons, new TitleBarButtonsWidget()).css("height", "40px"))
|
.optChild(!fullWidthTabBar, new FlexContainer("row").child(new TabRowWidget()).optChild(customTitleBarButtons, <TitleBarButtons />).css("height", "40px"))
|
||||||
.child(
|
.child(
|
||||||
new FlexContainer("row")
|
new FlexContainer("row")
|
||||||
.filling()
|
.filling()
|
||||||
@@ -151,69 +120,30 @@ export default class DesktopLayout {
|
|||||||
.css("min-height", "50px")
|
.css("min-height", "50px")
|
||||||
.css("align-items", "center")
|
.css("align-items", "center")
|
||||||
.cssBlock(".title-row > * { margin: 5px; }")
|
.cssBlock(".title-row > * { margin: 5px; }")
|
||||||
.child(new NoteIconWidget())
|
.child(<NoteIconWidget />)
|
||||||
.child(new NoteTitleWidget())
|
.child(<NoteTitleWidget />)
|
||||||
.child(new SpacerWidget(0, 1))
|
.child(new SpacerWidget(0, 1))
|
||||||
.child(new MovePaneButton(true))
|
.child(new MovePaneButton(true))
|
||||||
.child(new MovePaneButton(false))
|
.child(new MovePaneButton(false))
|
||||||
.child(new ClosePaneButton())
|
.child(new ClosePaneButton())
|
||||||
.child(new CreatePaneButton())
|
.child(new CreatePaneButton())
|
||||||
)
|
)
|
||||||
.child(
|
.child(<Ribbon />)
|
||||||
new RibbonContainer()
|
.child(<SharedInfo />)
|
||||||
// the order of the widgets matter. Some of these want to "activate" themselves
|
|
||||||
// when visible. When this happens to multiple of them, the first one "wins".
|
|
||||||
// promoted attributes should always win.
|
|
||||||
.ribbon(new ClassicEditorToolbar())
|
|
||||||
.ribbon(new ScriptExecutorWidget())
|
|
||||||
.ribbon(new SearchDefinitionWidget())
|
|
||||||
.ribbon(new EditedNotesWidget())
|
|
||||||
.ribbon(new BookPropertiesWidget())
|
|
||||||
.ribbon(new NotePropertiesWidget())
|
|
||||||
.ribbon(new FilePropertiesWidget())
|
|
||||||
.ribbon(new ImagePropertiesWidget())
|
|
||||||
.ribbon(new BasicPropertiesWidget())
|
|
||||||
.ribbon(new OwnedAttributeListWidget())
|
|
||||||
.ribbon(new InheritedAttributesWidget())
|
|
||||||
.ribbon(new NotePathsWidget())
|
|
||||||
.ribbon(new NoteMapRibbonWidget())
|
|
||||||
.ribbon(new SimilarNotesWidget())
|
|
||||||
.ribbon(new NoteInfoWidget())
|
|
||||||
.button(new RevisionsButton())
|
|
||||||
.button(new NoteActionsWidget())
|
|
||||||
)
|
|
||||||
.child(new SharedInfoWidget())
|
|
||||||
.child(new WatchedFileUpdateStatusWidget())
|
.child(new WatchedFileUpdateStatusWidget())
|
||||||
.child(
|
.child(<FloatingButtons items={DESKTOP_FLOATING_BUTTONS} />)
|
||||||
new FloatingButtons()
|
|
||||||
.child(new RefreshButton())
|
|
||||||
.child(new SwitchSplitOrientationButton())
|
|
||||||
.child(new ToggleReadOnlyButton())
|
|
||||||
.child(new EditButton())
|
|
||||||
.child(new ShowTocWidgetButton())
|
|
||||||
.child(new ShowHighlightsListWidgetButton())
|
|
||||||
.child(new CodeButtonsWidget())
|
|
||||||
.child(new RelationMapButtons())
|
|
||||||
.child(new GeoMapButtons())
|
|
||||||
.child(new CopyImageReferenceButton())
|
|
||||||
.child(new SvgExportButton())
|
|
||||||
.child(new PngExportButton())
|
|
||||||
.child(new BacklinksWidget())
|
|
||||||
.child(new ContextualHelpButton())
|
|
||||||
.child(new HideFloatingButtonsButton())
|
|
||||||
)
|
|
||||||
.child(
|
.child(
|
||||||
new ScrollingContainer()
|
new ScrollingContainer()
|
||||||
.filling()
|
.filling()
|
||||||
.child(new PromotedAttributesWidget())
|
.child(new PromotedAttributesWidget())
|
||||||
.child(new SqlTableSchemasWidget())
|
.child(<SqlTableSchemas />)
|
||||||
.child(new NoteDetailWidget())
|
.child(new NoteDetailWidget())
|
||||||
.child(new NoteListWidget(false))
|
.child(new NoteListWidget(false))
|
||||||
.child(new SearchResultWidget())
|
.child(<SearchResult />)
|
||||||
.child(new SqlResultWidget())
|
.child(<SqlResults />)
|
||||||
.child(new ScrollPaddingWidget())
|
.child(<ScrollPadding />)
|
||||||
)
|
)
|
||||||
.child(new ApiLogWidget())
|
.child(<ApiLog />)
|
||||||
.child(new FindWidget())
|
.child(new FindWidget())
|
||||||
.child(
|
.child(
|
||||||
...this.customWidgets.get("node-detail-pane"), // typo, let's keep it for a while as BC
|
...this.customWidgets.get("node-detail-pane"), // typo, let's keep it for a while as BC
|
||||||
@@ -232,11 +162,11 @@ export default class DesktopLayout {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.child(new CloseZenButton())
|
.child(<CloseZenModeButton />)
|
||||||
|
|
||||||
// Desktop-specific dialogs.
|
// Desktop-specific dialogs.
|
||||||
.child(new PasswordNoteSetDialog())
|
.child(<PasswordNoteSetDialog />)
|
||||||
.child(new UploadAttachmentsDialog());
|
.child(<UploadAttachmentsDialog />);
|
||||||
|
|
||||||
applyModals(rootContainer);
|
applyModals(rootContainer);
|
||||||
return rootContainer;
|
return rootContainer;
|
||||||
@@ -246,14 +176,18 @@ export default class DesktopLayout {
|
|||||||
let launcherPane;
|
let launcherPane;
|
||||||
|
|
||||||
if (isHorizontal) {
|
if (isHorizontal) {
|
||||||
launcherPane = new FlexContainer("row").css("height", "53px").class("horizontal").child(new LauncherContainer(true)).child(new GlobalMenuWidget(true));
|
launcherPane = new FlexContainer("row")
|
||||||
|
.css("height", "53px")
|
||||||
|
.class("horizontal")
|
||||||
|
.child(new LauncherContainer(true))
|
||||||
|
.child(<GlobalMenu isHorizontalLayout={true} />);
|
||||||
} else {
|
} else {
|
||||||
launcherPane = new FlexContainer("column")
|
launcherPane = new FlexContainer("column")
|
||||||
.css("width", "53px")
|
.css("width", "53px")
|
||||||
.class("vertical")
|
.class("vertical")
|
||||||
.child(new GlobalMenuWidget(false))
|
.child(<GlobalMenu isHorizontalLayout={false} />)
|
||||||
.child(new LauncherContainer(false))
|
.child(new LauncherContainer(false))
|
||||||
.child(new LeftPaneToggleWidget(false));
|
.child(<LeftPaneToggle isHorizontalLayout={false} />);
|
||||||
}
|
}
|
||||||
|
|
||||||
launcherPane.id("launcher-pane");
|
launcherPane.id("launcher-pane");
|
||||||
@@ -24,46 +24,48 @@ import InfoDialog from "../widgets/dialogs/info.js";
|
|||||||
import IncorrectCpuArchDialog from "../widgets/dialogs/incorrect_cpu_arch.js";
|
import IncorrectCpuArchDialog from "../widgets/dialogs/incorrect_cpu_arch.js";
|
||||||
import PopupEditorDialog from "../widgets/dialogs/popup_editor.js";
|
import PopupEditorDialog from "../widgets/dialogs/popup_editor.js";
|
||||||
import FlexContainer from "../widgets/containers/flex_container.js";
|
import FlexContainer from "../widgets/containers/flex_container.js";
|
||||||
import NoteIconWidget from "../widgets/note_icon.js";
|
import NoteIconWidget from "../widgets/note_icon";
|
||||||
import NoteTitleWidget from "../widgets/note_title.js";
|
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
||||||
import ClassicEditorToolbar from "../widgets/ribbon_widgets/classic_editor_toolbar.js";
|
|
||||||
import PromotedAttributesWidget from "../widgets/ribbon_widgets/promoted_attributes.js";
|
|
||||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||||
import NoteListWidget from "../widgets/note_list.js";
|
import NoteListWidget from "../widgets/note_list.js";
|
||||||
|
import CallToActionDialog from "../widgets/dialogs/call_to_action.jsx";
|
||||||
|
import NoteTitleWidget from "../widgets/note_title.jsx";
|
||||||
|
import { PopupEditorFormattingToolbar } from "../widgets/ribbon/FormattingToolbar.js";
|
||||||
|
|
||||||
export function applyModals(rootContainer: RootContainer) {
|
export function applyModals(rootContainer: RootContainer) {
|
||||||
rootContainer
|
rootContainer
|
||||||
.child(new BulkActionsDialog())
|
.child(<BulkActionsDialog />)
|
||||||
.child(new AboutDialog())
|
.child(<AboutDialog />)
|
||||||
.child(new HelpDialog())
|
.child(<HelpDialog />)
|
||||||
.child(new RecentChangesDialog())
|
.child(<RecentChangesDialog />)
|
||||||
.child(new BranchPrefixDialog())
|
.child(<BranchPrefixDialog />)
|
||||||
.child(new SortChildNotesDialog())
|
.child(<SortChildNotesDialog />)
|
||||||
.child(new IncludeNoteDialog())
|
.child(<IncludeNoteDialog />)
|
||||||
.child(new NoteTypeChooserDialog())
|
.child(<NoteTypeChooserDialog />)
|
||||||
.child(new JumpToNoteDialog())
|
.child(<JumpToNoteDialog />)
|
||||||
.child(new AddLinkDialog())
|
.child(<AddLinkDialog />)
|
||||||
.child(new CloneToDialog())
|
.child(<CloneToDialog />)
|
||||||
.child(new MoveToDialog())
|
.child(<MoveToDialog />)
|
||||||
.child(new ImportDialog())
|
.child(<ImportDialog />)
|
||||||
.child(new ExportDialog())
|
.child(<ExportDialog />)
|
||||||
.child(new MarkdownImportDialog())
|
.child(<MarkdownImportDialog />)
|
||||||
.child(new ProtectedSessionPasswordDialog())
|
.child(<ProtectedSessionPasswordDialog />)
|
||||||
.child(new RevisionsDialog())
|
.child(<RevisionsDialog />)
|
||||||
.child(new DeleteNotesDialog())
|
.child(<DeleteNotesDialog />)
|
||||||
.child(new InfoDialog())
|
.child(<InfoDialog />)
|
||||||
.child(new ConfirmDialog())
|
.child(<ConfirmDialog />)
|
||||||
.child(new PromptDialog())
|
.child(<PromptDialog />)
|
||||||
.child(new IncorrectCpuArchDialog())
|
.child(<IncorrectCpuArchDialog />)
|
||||||
.child(new PopupEditorDialog()
|
.child(new PopupEditorDialog()
|
||||||
.child(new FlexContainer("row")
|
.child(new FlexContainer("row")
|
||||||
.class("title-row")
|
.class("title-row")
|
||||||
.css("align-items", "center")
|
.css("align-items", "center")
|
||||||
.cssBlock(".title-row > * { margin: 5px; }")
|
.cssBlock(".title-row > * { margin: 5px; }")
|
||||||
.child(new NoteIconWidget())
|
.child(<NoteIconWidget />)
|
||||||
.child(new NoteTitleWidget()))
|
.child(<NoteTitleWidget />))
|
||||||
.child(new ClassicEditorToolbar())
|
.child(<PopupEditorFormattingToolbar />)
|
||||||
.child(new PromotedAttributesWidget())
|
.child(new PromotedAttributesWidget())
|
||||||
.child(new NoteDetailWidget())
|
.child(new NoteDetailWidget())
|
||||||
.child(new NoteListWidget(true)))
|
.child(new NoteListWidget(true)))
|
||||||
|
.child(<CallToActionDialog />);
|
||||||
}
|
}
|
||||||
@@ -3,29 +3,26 @@ import NoteTitleWidget from "../widgets/note_title.js";
|
|||||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||||
import QuickSearchWidget from "../widgets/quick_search.js";
|
import QuickSearchWidget from "../widgets/quick_search.js";
|
||||||
import NoteTreeWidget from "../widgets/note_tree.js";
|
import NoteTreeWidget from "../widgets/note_tree.js";
|
||||||
import ToggleSidebarButtonWidget from "../widgets/mobile_widgets/toggle_sidebar_button.js";
|
|
||||||
import MobileDetailMenuWidget from "../widgets/mobile_widgets/mobile_detail_menu.js";
|
|
||||||
import ScreenContainer from "../widgets/mobile_widgets/screen_container.js";
|
import ScreenContainer from "../widgets/mobile_widgets/screen_container.js";
|
||||||
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
|
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
|
||||||
import FilePropertiesWidget from "../widgets/ribbon_widgets/file_properties.js";
|
|
||||||
import FloatingButtons from "../widgets/floating_buttons/floating_buttons.js";
|
|
||||||
import EditButton from "../widgets/floating_buttons/edit_button.js";
|
|
||||||
import RelationMapButtons from "../widgets/floating_buttons/relation_map_buttons.js";
|
|
||||||
import SvgExportButton from "../widgets/floating_buttons/svg_export_button.js";
|
|
||||||
import BacklinksWidget from "../widgets/floating_buttons/zpetne_odkazy.js";
|
|
||||||
import HideFloatingButtonsButton from "../widgets/floating_buttons/hide_floating_buttons_button.js";
|
|
||||||
import NoteListWidget from "../widgets/note_list.js";
|
import NoteListWidget from "../widgets/note_list.js";
|
||||||
import GlobalMenuWidget from "../widgets/buttons/global_menu.js";
|
import GlobalMenuWidget from "../widgets/buttons/global_menu.js";
|
||||||
import LauncherContainer from "../widgets/containers/launcher_container.js";
|
import LauncherContainer from "../widgets/containers/launcher_container.js";
|
||||||
import RootContainer from "../widgets/containers/root_container.js";
|
import RootContainer from "../widgets/containers/root_container.js";
|
||||||
import SharedInfoWidget from "../widgets/shared_info.js";
|
import SharedInfoWidget from "../widgets/shared_info.js";
|
||||||
import PromotedAttributesWidget from "../widgets/ribbon_widgets/promoted_attributes.js";
|
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
||||||
import SidebarContainer from "../widgets/mobile_widgets/sidebar_container.js";
|
import SidebarContainer from "../widgets/mobile_widgets/sidebar_container.js";
|
||||||
import type AppContext from "../components/app_context.js";
|
import type AppContext from "../components/app_context.js";
|
||||||
import TabRowWidget from "../widgets/tab_row.js";
|
import TabRowWidget from "../widgets/tab_row.js";
|
||||||
import RefreshButton from "../widgets/floating_buttons/refresh_button.js";
|
import MobileEditorToolbar from "../widgets/type_widgets/ckeditor/mobile_editor_toolbar.js";
|
||||||
import MobileEditorToolbar from "../widgets/ribbon_widgets/mobile_editor_toolbar.js";
|
|
||||||
import { applyModals } from "./layout_commons.js";
|
import { applyModals } from "./layout_commons.js";
|
||||||
|
import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx";
|
||||||
|
import { useNoteContext } from "../widgets/react/hooks.jsx";
|
||||||
|
import FloatingButtons from "../widgets/FloatingButtons.jsx";
|
||||||
|
import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
|
||||||
|
import ToggleSidebarButton from "../widgets/mobile_widgets/toggle_sidebar_button.jsx";
|
||||||
|
import CloseZenModeButton from "../widgets/close_zen_button.js";
|
||||||
|
import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js";
|
||||||
|
|
||||||
const MOBILE_CSS = `
|
const MOBILE_CSS = `
|
||||||
<style>
|
<style>
|
||||||
@@ -142,20 +139,12 @@ export default class MobileLayout {
|
|||||||
.contentSized()
|
.contentSized()
|
||||||
.css("font-size", "larger")
|
.css("font-size", "larger")
|
||||||
.css("align-items", "center")
|
.css("align-items", "center")
|
||||||
.child(new ToggleSidebarButtonWidget().contentSized())
|
.child(<ToggleSidebarButton />)
|
||||||
.child(new NoteTitleWidget().contentSized().css("position", "relative").css("padding-left", "0.5em"))
|
.child(<NoteTitleWidget />)
|
||||||
.child(new MobileDetailMenuWidget(true).contentSized())
|
.child(<MobileDetailMenu />)
|
||||||
)
|
|
||||||
.child(new SharedInfoWidget())
|
|
||||||
.child(
|
|
||||||
new FloatingButtons()
|
|
||||||
.child(new RefreshButton())
|
|
||||||
.child(new EditButton())
|
|
||||||
.child(new RelationMapButtons())
|
|
||||||
.child(new SvgExportButton())
|
|
||||||
.child(new BacklinksWidget())
|
|
||||||
.child(new HideFloatingButtonsButton())
|
|
||||||
)
|
)
|
||||||
|
.child(<SharedInfoWidget />)
|
||||||
|
.child(<FloatingButtons items={MOBILE_FLOATING_BUTTONS} />)
|
||||||
.child(new PromotedAttributesWidget())
|
.child(new PromotedAttributesWidget())
|
||||||
.child(
|
.child(
|
||||||
new ScrollingContainer()
|
new ScrollingContainer()
|
||||||
@@ -163,9 +152,9 @@ export default class MobileLayout {
|
|||||||
.contentSized()
|
.contentSized()
|
||||||
.child(new NoteDetailWidget())
|
.child(new NoteDetailWidget())
|
||||||
.child(new NoteListWidget(false))
|
.child(new NoteListWidget(false))
|
||||||
.child(new FilePropertiesWidget().css("font-size", "smaller"))
|
.child(<FilePropertiesWrapper />)
|
||||||
)
|
)
|
||||||
.child(new MobileEditorToolbar())
|
.child(<MobileEditorToolbar />)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.child(
|
.child(
|
||||||
@@ -173,9 +162,25 @@ export default class MobileLayout {
|
|||||||
.contentSized()
|
.contentSized()
|
||||||
.id("mobile-bottom-bar")
|
.id("mobile-bottom-bar")
|
||||||
.child(new TabRowWidget().css("height", "40px"))
|
.child(new TabRowWidget().css("height", "40px"))
|
||||||
.child(new FlexContainer("row").class("horizontal").css("height", "53px").child(new LauncherContainer(true)).child(new GlobalMenuWidget(true)).id("launcher-pane"))
|
.child(new FlexContainer("row")
|
||||||
);
|
.class("horizontal")
|
||||||
|
.css("height", "53px")
|
||||||
|
.child(new LauncherContainer(true))
|
||||||
|
.child(<GlobalMenuWidget isHorizontalLayout />)
|
||||||
|
.id("launcher-pane"))
|
||||||
|
)
|
||||||
|
.child(<CloseZenModeButton />);
|
||||||
applyModals(rootContainer);
|
applyModals(rootContainer);
|
||||||
return rootContainer;
|
return rootContainer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function FilePropertiesWrapper() {
|
||||||
|
const { note } = useNoteContext();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{note?.type === "file" && <FilePropertiesTab note={note} />}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ import server from "./server.js";
|
|||||||
import froca from "./froca.js";
|
import froca from "./froca.js";
|
||||||
import type FNote from "../entities/fnote.js";
|
import type FNote from "../entities/fnote.js";
|
||||||
import type { AttributeRow } from "./load_results.js";
|
import type { AttributeRow } from "./load_results.js";
|
||||||
|
import { AttributeType } from "@triliumnext/commons";
|
||||||
|
|
||||||
async function addLabel(noteId: string, name: string, value: string = "", isInheritable = false) {
|
async function addLabel(noteId: string, name: string, value: string = "", isInheritable = false) {
|
||||||
await server.put(`notes/${noteId}/attribute`, {
|
await server.put(`notes/${noteId}/attribute`, {
|
||||||
@@ -25,6 +26,14 @@ async function removeAttributeById(noteId: string, attributeId: string) {
|
|||||||
await server.remove(`notes/${noteId}/attributes/${attributeId}`);
|
await server.remove(`notes/${noteId}/attributes/${attributeId}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function removeOwnedAttributesByNameOrType(note: FNote, type: AttributeType, name: string) {
|
||||||
|
for (const attr of note.getOwnedAttributes()) {
|
||||||
|
if (attr.type === type && attr.name === name) {
|
||||||
|
await server.remove(`notes/${note.noteId}/attributes/${attr.attributeId}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a label identified by its name from the given note, if it exists. Note that the label must be owned, i.e.
|
* Removes a label identified by its name from the given note, if it exists. Note that the label must be owned, i.e.
|
||||||
* it will not remove inherited attributes.
|
* it will not remove inherited attributes.
|
||||||
@@ -52,7 +61,7 @@ function removeOwnedLabelByName(note: FNote, labelName: string) {
|
|||||||
* @param value the value of the attribute to set.
|
* @param value the value of the attribute to set.
|
||||||
*/
|
*/
|
||||||
export async function setAttribute(note: FNote, type: "label" | "relation", name: string, value: string | null | undefined) {
|
export async function setAttribute(note: FNote, type: "label" | "relation", name: string, value: string | null | undefined) {
|
||||||
if (value) {
|
if (value !== null && value !== undefined) {
|
||||||
// Create or update the attribute.
|
// Create or update the attribute.
|
||||||
await server.put(`notes/${note.noteId}/set-attribute`, { type, name, value });
|
await server.put(`notes/${note.noteId}/set-attribute`, { type, name, value });
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import type FNote from "../entities/fnote.js";
|
|||||||
import toast from "./toast.js";
|
import toast from "./toast.js";
|
||||||
import { BulkAction } from "@triliumnext/commons";
|
import { BulkAction } from "@triliumnext/commons";
|
||||||
|
|
||||||
const ACTION_GROUPS = [
|
export const ACTION_GROUPS = [
|
||||||
{
|
{
|
||||||
title: t("bulk_actions.labels"),
|
title: t("bulk_actions.labels"),
|
||||||
actions: [AddLabelBulkAction, UpdateLabelValueBulkAction, RenameLabelBulkAction, DeleteLabelBulkAction]
|
actions: [AddLabelBulkAction, UpdateLabelValueBulkAction, RenameLabelBulkAction, DeleteLabelBulkAction]
|
||||||
|
|||||||
@@ -35,8 +35,10 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
|
|||||||
loadResults.addOption(attributeEntity.name);
|
loadResults.addOption(attributeEntity.name);
|
||||||
} else if (ec.entityName === "attachments") {
|
} else if (ec.entityName === "attachments") {
|
||||||
processAttachment(loadResults, ec);
|
processAttachment(loadResults, ec);
|
||||||
} else if (ec.entityName === "blobs" || ec.entityName === "etapi_tokens") {
|
} else if (ec.entityName === "blobs") {
|
||||||
// NOOP - these entities are handled at the backend level and don't require frontend processing
|
// NOOP - these entities are handled at the backend level and don't require frontend processing
|
||||||
|
} else if (ec.entityName === "etapi_tokens") {
|
||||||
|
loadResults.hasEtapiTokenChanges = true;
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Unknown entityName '${ec.entityName}'`);
|
throw new Error(`Unknown entityName '${ec.entityName}'`);
|
||||||
}
|
}
|
||||||
@@ -77,9 +79,7 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
|
|||||||
noteAttributeCache.invalidate();
|
noteAttributeCache.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove after porting the file
|
const appContext = (await import("../components/app_context.js")).default;
|
||||||
// @ts-ignore
|
|
||||||
const appContext = (await import("../components/app_context.js")).default as any;
|
|
||||||
await appContext.triggerEvent("entitiesReloaded", { loadResults });
|
await appContext.triggerEvent("entitiesReloaded", { loadResults });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import i18next from "i18next";
|
|||||||
import i18nextHttpBackend from "i18next-http-backend";
|
import i18nextHttpBackend from "i18next-http-backend";
|
||||||
import server from "./server.js";
|
import server from "./server.js";
|
||||||
import type { Locale } from "@triliumnext/commons";
|
import type { Locale } from "@triliumnext/commons";
|
||||||
|
import { initReactI18next } from "react-i18next";
|
||||||
|
|
||||||
let locales: Locale[] | null;
|
let locales: Locale[] | null;
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ export async function initLocale() {
|
|||||||
|
|
||||||
locales = await server.get<Locale[]>("options/locales");
|
locales = await server.get<Locale[]>("options/locales");
|
||||||
|
|
||||||
|
i18next.use(initReactI18next);
|
||||||
await i18next.use(i18nextHttpBackend).init({
|
await i18next.use(i18nextHttpBackend).init({
|
||||||
lng: locale,
|
lng: locale,
|
||||||
fallbackLng: "en",
|
fallbackLng: "en",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { t } from "./i18n.js";
|
import { t } from "./i18n.js";
|
||||||
import toastService, { showError } from "./toast.js";
|
import toastService, { showError } from "./toast.js";
|
||||||
|
|
||||||
function copyImageReferenceToClipboard($imageWrapper: JQuery<HTMLElement>) {
|
export function copyImageReferenceToClipboard($imageWrapper: JQuery<HTMLElement>) {
|
||||||
try {
|
try {
|
||||||
$imageWrapper.attr("contenteditable", "true");
|
$imageWrapper.attr("contenteditable", "true");
|
||||||
selectImage($imageWrapper.get(0));
|
selectImage($imageWrapper.get(0));
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
import { byBookType, byNoteType } from "./help_button.js";
|
import { byBookType, byNoteType } from "./in_app_help.js";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import type { HiddenSubtreeItem } from "@triliumnext/commons";
|
import type { HiddenSubtreeItem } from "@triliumnext/commons";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
@@ -25,7 +25,7 @@ describe("Help button", () => {
|
|||||||
...Object.values(byBookType)
|
...Object.values(byBookType)
|
||||||
].filter((noteId) => noteId) as string[];
|
].filter((noteId) => noteId) as string[];
|
||||||
|
|
||||||
const metaPath = path.resolve(path.join(__dirname, "../../../../server/src/assets/doc_notes/en/User Guide/!!!meta.json"));
|
const metaPath = path.resolve(path.join(__dirname, "../../../server/src/assets/doc_notes/en/User Guide/!!!meta.json"));
|
||||||
const meta: HiddenSubtreeItem[] = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
const meta: HiddenSubtreeItem[] = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
||||||
const allNoteIds = new Set(getNoteIds(meta));
|
const allNoteIds = new Set(getNoteIds(meta));
|
||||||
|
|
||||||
43
apps/client/src/services/in_app_help.ts
Normal file
43
apps/client/src/services/in_app_help.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import { NoteType } from "@triliumnext/commons";
|
||||||
|
import { ViewTypeOptions } from "./note_list_renderer";
|
||||||
|
import FNote from "../entities/fnote";
|
||||||
|
|
||||||
|
export const byNoteType: Record<Exclude<NoteType, "book">, string | null> = {
|
||||||
|
canvas: null,
|
||||||
|
code: null,
|
||||||
|
contentWidget: null,
|
||||||
|
doc: null,
|
||||||
|
file: null,
|
||||||
|
image: null,
|
||||||
|
launcher: null,
|
||||||
|
mermaid: null,
|
||||||
|
mindMap: null,
|
||||||
|
noteMap: null,
|
||||||
|
relationMap: null,
|
||||||
|
render: null,
|
||||||
|
search: null,
|
||||||
|
text: null,
|
||||||
|
webView: null,
|
||||||
|
aiChat: null
|
||||||
|
};
|
||||||
|
|
||||||
|
export const byBookType: Record<ViewTypeOptions, string | null> = {
|
||||||
|
list: "mULW0Q3VojwY",
|
||||||
|
grid: "8QqnMzx393bx",
|
||||||
|
calendar: "xWbu3jpNWapp",
|
||||||
|
table: "2FvYrpmOXm29",
|
||||||
|
geoMap: "81SGnPGMk7Xc",
|
||||||
|
board: "CtBQqbwXDx1w"
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getHelpUrlForNote(note: FNote | null | undefined) {
|
||||||
|
if (note && note.type !== "book" && byNoteType[note.type]) {
|
||||||
|
return byNoteType[note.type];
|
||||||
|
} else if (note?.hasLabel("calendarRoot")) {
|
||||||
|
return "l0tKav7yLHGF";
|
||||||
|
} else if (note?.hasLabel("textSnippet")) {
|
||||||
|
return "pwc194wlRzcH";
|
||||||
|
} else if (note && note.type === "book") {
|
||||||
|
return byBookType[note.getAttributeValue("label", "viewType") as ViewTypeOptions ?? ""]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -62,6 +62,10 @@ async function getAction(actionName: string, silent = false) {
|
|||||||
return action;
|
return action;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getActionSync(actionName: string) {
|
||||||
|
return keyboardActionRepo[actionName];
|
||||||
|
}
|
||||||
|
|
||||||
function updateDisplayedShortcuts($container: JQuery<HTMLElement>) {
|
function updateDisplayedShortcuts($container: JQuery<HTMLElement>) {
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
//TODO: each() does not support async callbacks.
|
//TODO: each() does not support async callbacks.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { AttachmentRow } from "@triliumnext/commons";
|
import type { AttachmentRow, EtapiTokenRow } from "@triliumnext/commons";
|
||||||
import type { AttributeType } from "../entities/fattribute.js";
|
import type { AttributeType } from "../entities/fattribute.js";
|
||||||
import type { EntityChange } from "../server_types.js";
|
import type { EntityChange } from "../server_types.js";
|
||||||
|
|
||||||
@@ -53,6 +53,7 @@ type EntityRowMappings = {
|
|||||||
options: OptionRow;
|
options: OptionRow;
|
||||||
revisions: RevisionRow;
|
revisions: RevisionRow;
|
||||||
note_reordering: NoteReorderingRow;
|
note_reordering: NoteReorderingRow;
|
||||||
|
etapi_tokens: EtapiTokenRow;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type EntityRowNames = keyof EntityRowMappings;
|
export type EntityRowNames = keyof EntityRowMappings;
|
||||||
@@ -68,6 +69,7 @@ export default class LoadResults {
|
|||||||
private contentNoteIdToComponentId: ContentNoteIdToComponentIdRow[];
|
private contentNoteIdToComponentId: ContentNoteIdToComponentIdRow[];
|
||||||
private optionNames: string[];
|
private optionNames: string[];
|
||||||
private attachmentRows: AttachmentRow[];
|
private attachmentRows: AttachmentRow[];
|
||||||
|
public hasEtapiTokenChanges: boolean = false;
|
||||||
|
|
||||||
constructor(entityChanges: EntityChange[]) {
|
constructor(entityChanges: EntityChange[]) {
|
||||||
const entities: Record<string, Record<string, any>> = {};
|
const entities: Record<string, Record<string, any>> = {};
|
||||||
@@ -215,7 +217,8 @@ export default class LoadResults {
|
|||||||
this.revisionRows.length === 0 &&
|
this.revisionRows.length === 0 &&
|
||||||
this.contentNoteIdToComponentId.length === 0 &&
|
this.contentNoteIdToComponentId.length === 0 &&
|
||||||
this.optionNames.length === 0 &&
|
this.optionNames.length === 0 &&
|
||||||
this.attachmentRows.length === 0
|
this.attachmentRows.length === 0 &&
|
||||||
|
!this.hasEtapiTokenChanges
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,10 +36,12 @@ export interface Suggestion {
|
|||||||
commandId?: string;
|
commandId?: string;
|
||||||
commandDescription?: string;
|
commandDescription?: string;
|
||||||
commandShortcut?: string;
|
commandShortcut?: string;
|
||||||
|
attributeSnippet?: string;
|
||||||
|
highlightedAttributeSnippet?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Options {
|
export interface Options {
|
||||||
container?: HTMLElement;
|
container?: HTMLElement | null;
|
||||||
fastSearch?: boolean;
|
fastSearch?: boolean;
|
||||||
allowCreatingNotes?: boolean;
|
allowCreatingNotes?: boolean;
|
||||||
allowJumpToSearchNotes?: boolean;
|
allowJumpToSearchNotes?: boolean;
|
||||||
@@ -323,7 +325,33 @@ function initNoteAutocomplete($el: JQuery<HTMLElement>, options?: Options) {
|
|||||||
html += '</div>';
|
html += '</div>';
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
return `<span class="${suggestion.icon ?? "bx bx-note"}"></span> ${suggestion.highlightedNotePathTitle}`;
|
// Add special class for search-notes action
|
||||||
|
const actionClass = suggestion.action === "search-notes" ? "search-notes-action" : "";
|
||||||
|
|
||||||
|
// Choose appropriate icon based on action
|
||||||
|
let iconClass = suggestion.icon ?? "bx bx-note";
|
||||||
|
if (suggestion.action === "search-notes") {
|
||||||
|
iconClass = "bx bx-search";
|
||||||
|
} else if (suggestion.action === "create-note") {
|
||||||
|
iconClass = "bx bx-plus";
|
||||||
|
} else if (suggestion.action === "external-link") {
|
||||||
|
iconClass = "bx bx-link-external";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simplified HTML structure without nested divs
|
||||||
|
let html = `<div class="note-suggestion ${actionClass}">`;
|
||||||
|
html += `<span class="icon ${iconClass}"></span>`;
|
||||||
|
html += `<span class="text">`;
|
||||||
|
html += `<span class="search-result-title">${suggestion.highlightedNotePathTitle}</span>`;
|
||||||
|
|
||||||
|
// Add attribute snippet inline if available
|
||||||
|
if (suggestion.highlightedAttributeSnippet) {
|
||||||
|
html += `<span class="search-result-attributes">${suggestion.highlightedAttributeSnippet}</span>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `</span>`;
|
||||||
|
html += `</div>`;
|
||||||
|
return html;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// we can't cache identical searches because notes can be created / renamed, new recent notes can be added
|
// we can't cache identical searches because notes can be created / renamed, new recent notes can be added
|
||||||
@@ -452,6 +480,21 @@ function init() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function which triggers the display of recent notes in the autocomplete input and focuses it.
|
||||||
|
*
|
||||||
|
* @param inputElement - The input element to trigger recent notes on.
|
||||||
|
*/
|
||||||
|
export function triggerRecentNotes(inputElement: HTMLInputElement | null | undefined) {
|
||||||
|
if (!inputElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const $el = $(inputElement);
|
||||||
|
showRecentNotes($el);
|
||||||
|
$el.trigger("focus").trigger("select");
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
autocompleteSourceForCKEditor,
|
autocompleteSourceForCKEditor,
|
||||||
initNoteAutocomplete,
|
initNoteAutocomplete,
|
||||||
|
|||||||
@@ -109,8 +109,6 @@ async function createNote(parentNotePath: string | undefined, options: CreateNot
|
|||||||
|
|
||||||
async function chooseNoteType() {
|
async function chooseNoteType() {
|
||||||
return new Promise<ChooseNoteTypeResponse>((res) => {
|
return new Promise<ChooseNoteTypeResponse>((res) => {
|
||||||
// TODO: Remove ignore after callback for chooseNoteType is defined in app_context.ts
|
|
||||||
//@ts-ignore
|
|
||||||
appContext.triggerCommand("chooseNoteType", { callback: res });
|
appContext.triggerCommand("chooseNoteType", { callback: res });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ function download(url: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function downloadFileNote(noteId: string) {
|
export function downloadFileNote(noteId: string) {
|
||||||
const url = `${getFileUrl("notes", noteId)}?${Date.now()}`; // don't use cache
|
const url = `${getFileUrl("notes", noteId)}?${Date.now()}`; // don't use cache
|
||||||
|
|
||||||
download(url);
|
download(url);
|
||||||
@@ -163,7 +163,7 @@ async function openExternally(type: string, entityId: string, mime: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const openNoteExternally = async (noteId: string, mime: string) => await openExternally("notes", noteId, mime);
|
export const openNoteExternally = async (noteId: string, mime: string) => await openExternally("notes", noteId, mime);
|
||||||
const openAttachmentExternally = async (attachmentId: string, mime: string) => await openExternally("attachments", attachmentId, mime);
|
const openAttachmentExternally = async (attachmentId: string, mime: string) => await openExternally("attachments", attachmentId, mime);
|
||||||
|
|
||||||
function getHost() {
|
function getHost() {
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
import { OptionNames } from "@triliumnext/commons";
|
||||||
import server from "./server.js";
|
import server from "./server.js";
|
||||||
import { isShare } from "./utils.js";
|
import { isShare } from "./utils.js";
|
||||||
|
|
||||||
type OptionValue = number | string;
|
export type OptionValue = number | string;
|
||||||
|
|
||||||
class Options {
|
class Options {
|
||||||
initializedPromise: Promise<void>;
|
initializedPromise: Promise<void>;
|
||||||
@@ -76,6 +77,14 @@ class Options {
|
|||||||
await server.put(`options`, payload);
|
await server.put(`options`, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves multiple options at once, by supplying a record where the keys are the option names and the values represent the stringified value to set.
|
||||||
|
* @param newValues the record of keys and values.
|
||||||
|
*/
|
||||||
|
async saveMany<T extends OptionNames>(newValues: Record<T, OptionValue>) {
|
||||||
|
await server.put<void>("options", newValues);
|
||||||
|
}
|
||||||
|
|
||||||
async toggle(key: string) {
|
async toggle(key: string) {
|
||||||
await this.save(key, (!this.is(key)).toString());
|
await this.save(key, (!this.is(key)).toString());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ function ajax(url: string, method: string, data: unknown, headers: Headers, sile
|
|||||||
if (utils.isElectron()) {
|
if (utils.isElectron()) {
|
||||||
const ipc = utils.dynamicRequire("electron").ipcRenderer;
|
const ipc = utils.dynamicRequire("electron").ipcRenderer;
|
||||||
|
|
||||||
ipc.on("server-response", async (event: string, arg: Arg) => {
|
ipc.on("server-response", async (_, arg: Arg) => {
|
||||||
if (arg.statusCode >= 200 && arg.statusCode < 300) {
|
if (arg.statusCode >= 200 && arg.statusCode < 300) {
|
||||||
handleSuccessfulResponse(arg);
|
handleSuccessfulResponse(arg);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -14,6 +14,32 @@ interface ShortcutBinding {
|
|||||||
// Store all active shortcut bindings for management
|
// Store all active shortcut bindings for management
|
||||||
const activeBindings: Map<string, ShortcutBinding[]> = new Map();
|
const activeBindings: Map<string, ShortcutBinding[]> = new Map();
|
||||||
|
|
||||||
|
// Handle special key mappings and aliases
|
||||||
|
const keyMap: { [key: string]: string[] } = {
|
||||||
|
'return': ['Enter'],
|
||||||
|
'enter': ['Enter'], // alias for return
|
||||||
|
'del': ['Delete'],
|
||||||
|
'delete': ['Delete'], // alias for del
|
||||||
|
'esc': ['Escape'],
|
||||||
|
'escape': ['Escape'], // alias for esc
|
||||||
|
'space': [' ', 'Space'],
|
||||||
|
'tab': ['Tab'],
|
||||||
|
'backspace': ['Backspace'],
|
||||||
|
'home': ['Home'],
|
||||||
|
'end': ['End'],
|
||||||
|
'pageup': ['PageUp'],
|
||||||
|
'pagedown': ['PageDown'],
|
||||||
|
'up': ['ArrowUp'],
|
||||||
|
'down': ['ArrowDown'],
|
||||||
|
'left': ['ArrowLeft'],
|
||||||
|
'right': ['ArrowRight']
|
||||||
|
};
|
||||||
|
|
||||||
|
// Function keys
|
||||||
|
for (let i = 1; i <= 19; i++) {
|
||||||
|
keyMap[`f${i}`] = [`F${i}`];
|
||||||
|
}
|
||||||
|
|
||||||
function removeGlobalShortcut(namespace: string) {
|
function removeGlobalShortcut(namespace: string) {
|
||||||
bindGlobalShortcut("", null, namespace);
|
bindGlobalShortcut("", null, namespace);
|
||||||
}
|
}
|
||||||
@@ -124,32 +150,6 @@ export function keyMatches(e: KeyboardEvent, key: string): boolean {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle special key mappings and aliases
|
|
||||||
const keyMap: { [key: string]: string[] } = {
|
|
||||||
'return': ['Enter'],
|
|
||||||
'enter': ['Enter'], // alias for return
|
|
||||||
'del': ['Delete'],
|
|
||||||
'delete': ['Delete'], // alias for del
|
|
||||||
'esc': ['Escape'],
|
|
||||||
'escape': ['Escape'], // alias for esc
|
|
||||||
'space': [' ', 'Space'],
|
|
||||||
'tab': ['Tab'],
|
|
||||||
'backspace': ['Backspace'],
|
|
||||||
'home': ['Home'],
|
|
||||||
'end': ['End'],
|
|
||||||
'pageup': ['PageUp'],
|
|
||||||
'pagedown': ['PageDown'],
|
|
||||||
'up': ['ArrowUp'],
|
|
||||||
'down': ['ArrowDown'],
|
|
||||||
'left': ['ArrowLeft'],
|
|
||||||
'right': ['ArrowRight']
|
|
||||||
};
|
|
||||||
|
|
||||||
// Function keys
|
|
||||||
for (let i = 1; i <= 19; i++) {
|
|
||||||
keyMap[`f${i}`] = [`F${i}`];
|
|
||||||
}
|
|
||||||
|
|
||||||
const mappedKeys = keyMap[key.toLowerCase()];
|
const mappedKeys = keyMap[key.toLowerCase()];
|
||||||
if (mappedKeys) {
|
if (mappedKeys) {
|
||||||
return mappedKeys.includes(e.key) || mappedKeys.includes(e.code);
|
return mappedKeys.includes(e.key) || mappedKeys.includes(e.code);
|
||||||
@@ -163,7 +163,7 @@ export function keyMatches(e: KeyboardEvent, key: string): boolean {
|
|||||||
|
|
||||||
// For letter keys, use the physical key code for consistency
|
// For letter keys, use the physical key code for consistency
|
||||||
if (key.length === 1 && key >= 'a' && key <= 'z') {
|
if (key.length === 1 && key >= 'a' && key <= 'z') {
|
||||||
return e.code === `Key${key.toUpperCase()}`;
|
return e.key.toLowerCase() === key.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
// For regular keys, check both key and code as fallback
|
// For regular keys, check both key and code as fallback
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import type { ViewScope } from "./link.js";
|
import type { ViewScope } from "./link.js";
|
||||||
|
import FNote from "../entities/fnote";
|
||||||
|
|
||||||
const SVG_MIME = "image/svg+xml";
|
const SVG_MIME = "image/svg+xml";
|
||||||
|
|
||||||
export const isShare = !window.glob;
|
export const isShare = !window.glob;
|
||||||
|
|
||||||
function reloadFrontendApp(reason?: string) {
|
export function reloadFrontendApp(reason?: string) {
|
||||||
if (reason) {
|
if (reason) {
|
||||||
logInfo(`Frontend app reload: ${reason}`);
|
logInfo(`Frontend app reload: ${reason}`);
|
||||||
}
|
}
|
||||||
@@ -13,7 +14,7 @@ function reloadFrontendApp(reason?: string) {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
function restartDesktopApp() {
|
export function restartDesktopApp() {
|
||||||
if (!isElectron()) {
|
if (!isElectron()) {
|
||||||
reloadFrontendApp();
|
reloadFrontendApp();
|
||||||
return;
|
return;
|
||||||
@@ -125,7 +126,7 @@ function formatDateISO(date: Date) {
|
|||||||
return `${date.getFullYear()}-${padNum(date.getMonth() + 1)}-${padNum(date.getDate())}`;
|
return `${date.getFullYear()}-${padNum(date.getMonth() + 1)}-${padNum(date.getDate())}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatDateTime(date: Date, userSuppliedFormat?: string): string {
|
export function formatDateTime(date: Date, userSuppliedFormat?: string): string {
|
||||||
if (userSuppliedFormat?.trim()) {
|
if (userSuppliedFormat?.trim()) {
|
||||||
return dayjs(date).format(userSuppliedFormat);
|
return dayjs(date).format(userSuppliedFormat);
|
||||||
} else {
|
} else {
|
||||||
@@ -144,11 +145,11 @@ function now() {
|
|||||||
/**
|
/**
|
||||||
* Returns `true` if the client is currently running under Electron, or `false` if running in a web browser.
|
* Returns `true` if the client is currently running under Electron, or `false` if running in a web browser.
|
||||||
*/
|
*/
|
||||||
function isElectron() {
|
export function isElectron() {
|
||||||
return !!(window && window.process && window.process.type);
|
return !!(window && window.process && window.process.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isMac() {
|
export function isMac() {
|
||||||
return navigator.platform.indexOf("Mac") > -1;
|
return navigator.platform.indexOf("Mac") > -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +186,11 @@ export function escapeQuotes(value: string) {
|
|||||||
return value.replaceAll('"', """);
|
return value.replaceAll('"', """);
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatSize(size: number) {
|
export function formatSize(size: number | null | undefined) {
|
||||||
|
if (size === null || size === undefined) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
size = Math.max(Math.round(size / 1024), 1);
|
size = Math.max(Math.round(size / 1024), 1);
|
||||||
|
|
||||||
if (size < 1024) {
|
if (size < 1024) {
|
||||||
@@ -218,7 +223,7 @@ function randomString(len: number) {
|
|||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isMobile() {
|
export function isMobile() {
|
||||||
return (
|
return (
|
||||||
window.glob?.device === "mobile" ||
|
window.glob?.device === "mobile" ||
|
||||||
// window.glob.device is not available in setup
|
// window.glob.device is not available in setup
|
||||||
@@ -292,7 +297,7 @@ function isHtmlEmpty(html: string) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function clearBrowserCache() {
|
export async function clearBrowserCache() {
|
||||||
if (isElectron()) {
|
if (isElectron()) {
|
||||||
const win = dynamicRequire("@electron/remote").getCurrentWindow();
|
const win = dynamicRequire("@electron/remote").getCurrentWindow();
|
||||||
await win.webContents.session.clearCache();
|
await win.webContents.session.clearCache();
|
||||||
@@ -306,7 +311,13 @@ function copySelectionToClipboard() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function dynamicRequire(moduleName: string) {
|
type dynamicRequireMappings = {
|
||||||
|
"@electron/remote": typeof import("@electron/remote"),
|
||||||
|
"electron": typeof import("electron"),
|
||||||
|
"child_process": typeof import("child_process")
|
||||||
|
};
|
||||||
|
|
||||||
|
export function dynamicRequire<T extends keyof dynamicRequireMappings>(moduleName: T): Awaited<dynamicRequireMappings[T]>{
|
||||||
if (typeof __non_webpack_require__ !== "undefined") {
|
if (typeof __non_webpack_require__ !== "undefined") {
|
||||||
return __non_webpack_require__(moduleName);
|
return __non_webpack_require__(moduleName);
|
||||||
} else {
|
} else {
|
||||||
@@ -374,6 +385,17 @@ async function openInAppHelp($button: JQuery<HTMLElement>) {
|
|||||||
|
|
||||||
const inAppHelpPage = $button.attr("data-in-app-help");
|
const inAppHelpPage = $button.attr("data-in-app-help");
|
||||||
if (inAppHelpPage) {
|
if (inAppHelpPage) {
|
||||||
|
openInAppHelpFromUrl(inAppHelpPage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the in-app help at the given page in a split note. If there already is a split note open with a help page, it will be replaced by this one.
|
||||||
|
*
|
||||||
|
* @param inAppHelpPage the ID of the help note (excluding the `_help_` prefix).
|
||||||
|
* @returns a promise that resolves once the help has been opened.
|
||||||
|
*/
|
||||||
|
export async function openInAppHelpFromUrl(inAppHelpPage: string) {
|
||||||
// Dynamic import to avoid import issues in tests.
|
// Dynamic import to avoid import issues in tests.
|
||||||
const appContext = (await import("../components/app_context.js")).default;
|
const appContext = (await import("../components/app_context.js")).default;
|
||||||
const activeContext = appContext.tabManager.getActiveContext();
|
const activeContext = appContext.tabManager.getActiveContext();
|
||||||
@@ -399,8 +421,6 @@ async function openInAppHelp($button: JQuery<HTMLElement>) {
|
|||||||
// There is already a help window open, make sure it opens on the right note.
|
// There is already a help window open, make sure it opens on the right note.
|
||||||
helpSubcontext.setNote(targetNote, { viewScope });
|
helpSubcontext.setNote(targetNote, { viewScope });
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function initHelpButtons($el: JQuery<HTMLElement> | JQuery<Window>) {
|
function initHelpButtons($el: JQuery<HTMLElement> | JQuery<Window>) {
|
||||||
@@ -561,8 +581,7 @@ function copyHtmlToClipboard(content: string) {
|
|||||||
document.removeEventListener("copy", listener);
|
document.removeEventListener("copy", listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Set to FNote once the file is ported.
|
export function createImageSrcUrl(note: FNote) {
|
||||||
function createImageSrcUrl(note: { noteId: string; title: string }) {
|
|
||||||
return `api/images/${note.noteId}/${encodeURIComponent(note.title)}?timestamp=${Date.now()}`;
|
return `api/images/${note.noteId}/${encodeURIComponent(note.title)}?timestamp=${Date.now()}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -731,10 +750,86 @@ function isUpdateAvailable(latestVersion: string | null | undefined, currentVers
|
|||||||
return compareVersions(latestVersion, currentVersion) > 0;
|
return compareVersions(latestVersion, currentVersion) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isLaunchBarConfig(noteId: string) {
|
export function isLaunchBarConfig(noteId: string) {
|
||||||
return ["_lbRoot", "_lbAvailableLaunchers", "_lbVisibleLaunchers", "_lbMobileRoot", "_lbMobileAvailableLaunchers", "_lbMobileVisibleLaunchers"].includes(noteId);
|
return ["_lbRoot", "_lbAvailableLaunchers", "_lbVisibleLaunchers", "_lbMobileRoot", "_lbMobileAvailableLaunchers", "_lbMobileVisibleLaunchers"].includes(noteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a class to the <body> of the page, where the class name is formed via a prefix and a value.
|
||||||
|
* Useful for configurable options such as `heading-style-markdown`, where `heading-style` is the prefix and `markdown` is the dynamic value.
|
||||||
|
* There is no separator between the prefix and the value, if needed it has to be supplied manually to the prefix.
|
||||||
|
*
|
||||||
|
* @param prefix the prefix.
|
||||||
|
* @param value the value to be appended to the prefix.
|
||||||
|
*/
|
||||||
|
export function toggleBodyClass(prefix: string, value: string) {
|
||||||
|
const $body = $("body");
|
||||||
|
for (const clazz of Array.from($body[0].classList)) {
|
||||||
|
// create copy to safely iterate over while removing classes
|
||||||
|
if (clazz.startsWith(prefix)) {
|
||||||
|
$body.removeClass(clazz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$body.addClass(prefix + value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic comparison for equality between the two arrays. The values are strictly checked via `===`.
|
||||||
|
*
|
||||||
|
* @param a the first array to compare.
|
||||||
|
* @param b the second array to compare.
|
||||||
|
* @returns `true` if both arrays are equals, `false` otherwise.
|
||||||
|
*/
|
||||||
|
export function arrayEqual<T>(a: T[], b: T[]) {
|
||||||
|
if (a === b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (a.length !== b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i=0; i < a.length; i++) {
|
||||||
|
if (a[i] !== b[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
type Indexed<T extends object> = T & { index: number };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an object array, alters every object in the array to have an index field assigned to it.
|
||||||
|
*
|
||||||
|
* @param items the objects to be numbered.
|
||||||
|
* @returns the same object for convenience, with the type changed to indicate the new index field.
|
||||||
|
*/
|
||||||
|
export function numberObjectsInPlace<T extends object>(items: T[]): Indexed<T>[] {
|
||||||
|
let index = 0;
|
||||||
|
for (const item of items) {
|
||||||
|
(item as Indexed<T>).index = index++;
|
||||||
|
}
|
||||||
|
return items as Indexed<T>[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function mapToKeyValueArray<K extends string | number | symbol, V>(map: Record<K, V>) {
|
||||||
|
const values: { key: K, value: V }[] = [];
|
||||||
|
for (const [ key, value ] of Object.entries(map)) {
|
||||||
|
values.push({ key: key as K, value: value as V });
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getErrorMessage(e: unknown) {
|
||||||
|
if (e && typeof e === "object" && "message" in e && typeof e.message === "string") {
|
||||||
|
return e.message;
|
||||||
|
} else {
|
||||||
|
return "Unknown error";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
reloadFrontendApp,
|
reloadFrontendApp,
|
||||||
restartDesktopApp,
|
restartDesktopApp,
|
||||||
|
|||||||
@@ -320,8 +320,3 @@ h6 {
|
|||||||
page-break-after: avoid;
|
page-break-after: avoid;
|
||||||
break-after: avoid;
|
break-after: avoid;
|
||||||
}
|
}
|
||||||
|
|
||||||
figure.table {
|
|
||||||
/* Workaround for https://github.com/ckeditor/ckeditor5/issues/18903. Remove once official fix is released */
|
|
||||||
display: table !important;
|
|
||||||
}
|
|
||||||
@@ -28,6 +28,28 @@
|
|||||||
--ck-mention-list-max-height: 500px;
|
--ck-mention-list-max-height: 500px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body#trilium-app.motion-disabled *,
|
||||||
|
body#trilium-app.motion-disabled *::before,
|
||||||
|
body#trilium-app.motion-disabled *::after {
|
||||||
|
/* Disable transitions and animations */
|
||||||
|
transition: none !important;
|
||||||
|
animation: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body#trilium-app.shadows-disabled *,
|
||||||
|
body#trilium-app.shadows-disabled *::before,
|
||||||
|
body#trilium-app.shadows-disabled *::after {
|
||||||
|
/* Disable shadows */
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body#trilium-app.backdrop-effects-disabled *,
|
||||||
|
body#trilium-app.backdrop-effects-disabled *::before,
|
||||||
|
body#trilium-app.backdrop-effects-disabled *::after {
|
||||||
|
/* Disable backdrop effects */
|
||||||
|
backdrop-filter: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
.table {
|
.table {
|
||||||
--bs-table-bg: transparent !important;
|
--bs-table-bg: transparent !important;
|
||||||
}
|
}
|
||||||
@@ -139,12 +161,26 @@ textarea,
|
|||||||
color: var(--muted-text-color);
|
color: var(--muted-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form-group.disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a gap between consecutive radios / check boxes */
|
/* Add a gap between consecutive radios / check boxes */
|
||||||
label.tn-radio + label.tn-radio,
|
label.tn-radio + label.tn-radio,
|
||||||
label.tn-checkbox + label.tn-checkbox {
|
label.tn-checkbox + label.tn-checkbox {
|
||||||
margin-left: 12px;
|
margin-left: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
label.tn-radio input[type="radio"],
|
||||||
|
label.tn-checkbox input[type="checkbox"] {
|
||||||
|
margin-right: .5em;
|
||||||
|
}
|
||||||
|
|
||||||
#left-pane input,
|
#left-pane input,
|
||||||
#left-pane select,
|
#left-pane select,
|
||||||
#left-pane textarea {
|
#left-pane textarea {
|
||||||
@@ -346,7 +382,7 @@ body.desktop .tabulator-popup-container {
|
|||||||
|
|
||||||
@supports (animation-fill-mode: forwards) {
|
@supports (animation-fill-mode: forwards) {
|
||||||
/* Delay the opening of submenus */
|
/* Delay the opening of submenus */
|
||||||
body.desktop .dropdown-submenu .dropdown-menu {
|
body.desktop:not(.motion-disabled) .dropdown-submenu .dropdown-menu {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
animation-fill-mode: forwards;
|
animation-fill-mode: forwards;
|
||||||
animation-delay: var(--submenu-opening-delay);
|
animation-delay: var(--submenu-opening-delay);
|
||||||
@@ -406,14 +442,20 @@ body #context-menu-container .dropdown-item > span {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-menu kbd {
|
.dropdown-item span.keyboard-shortcut {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu kbd {
|
||||||
color: var(--muted-text-color);
|
color: var(--muted-text-color);
|
||||||
border: none;
|
border: none;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
|
padding: 0;
|
||||||
|
flex-grow: 1;
|
||||||
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-item,
|
.dropdown-item,
|
||||||
@@ -642,6 +684,10 @@ table.promoted-attributes-in-tooltip th {
|
|||||||
z-index: calc(var(--ck-z-panel) - 1) !important;
|
z-index: calc(var(--ck-z-panel) - 1) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tooltip.tooltip-top {
|
||||||
|
z-index: 32767 !important;
|
||||||
|
}
|
||||||
|
|
||||||
.tooltip-trigger {
|
.tooltip-trigger {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -827,10 +873,34 @@ table.promoted-attributes-in-tooltip th {
|
|||||||
|
|
||||||
.aa-dropdown-menu .aa-suggestion {
|
.aa-dropdown-menu .aa-suggestion {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding: 5px;
|
padding: 6px 16px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.aa-dropdown-menu .aa-suggestion .icon {
|
||||||
|
display: inline-block;
|
||||||
|
line-height: inherit;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aa-dropdown-menu .aa-suggestion .text {
|
||||||
|
display: inline-block;
|
||||||
|
width: calc(100% - 20px);
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aa-dropdown-menu .aa-suggestion .search-result-title {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aa-dropdown-menu .aa-suggestion .search-result-attributes {
|
||||||
|
display: block;
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: var(--muted-text-color);
|
||||||
|
opacity: 0.6;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
.aa-dropdown-menu .aa-suggestion p {
|
.aa-dropdown-menu .aa-suggestion p {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -918,6 +988,11 @@ div[data-notify="container"] {
|
|||||||
font-family: var(--monospace-font-family);
|
font-family: var(--monospace-font-family);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
svg.ck-icon .note-icon {
|
||||||
|
color: var(--main-text-color);
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.ck-content {
|
.ck-content {
|
||||||
--ck-content-font-family: var(--detail-font-family);
|
--ck-content-font-family: var(--detail-font-family);
|
||||||
--ck-content-font-size: 1.1em;
|
--ck-content-font-size: 1.1em;
|
||||||
@@ -1388,7 +1463,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
border: none;
|
border: none;
|
||||||
color: var(--launcher-pane-text-color);
|
color: var(--launcher-pane-text-color);
|
||||||
background-color: var(--launcher-pane-background-color);
|
background: transparent;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1734,16 +1809,12 @@ button.close:hover {
|
|||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.options-number-input {
|
.options-section input[type="number"] {
|
||||||
/* overriding settings from .form-control */
|
/* overriding settings from .form-control */
|
||||||
width: 10em !important;
|
width: 10em !important;
|
||||||
flex-grow: 0 !important;
|
flex-grow: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.options-mime-types {
|
|
||||||
column-width: 250px;
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
}
|
}
|
||||||
@@ -1764,20 +1835,42 @@ textarea {
|
|||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.jump-to-note-dialog .modal-dialog {
|
||||||
|
max-width: 900px;
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
.jump-to-note-dialog .modal-header {
|
.jump-to-note-dialog .modal-header {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jump-to-note-dialog .modal-body {
|
.jump-to-note-dialog .modal-body {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
min-height: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jump-to-note-results .aa-dropdown-menu {
|
.jump-to-note-results .aa-dropdown-menu {
|
||||||
max-height: 40vh;
|
max-height: calc(80vh - 200px);
|
||||||
|
width: 100%;
|
||||||
|
max-width: none;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jump-to-note-results {
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jump-to-note-results .aa-suggestions {
|
.jump-to-note-results .aa-suggestions {
|
||||||
padding: 1rem;
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jump-to-note-results .aa-dropdown-menu .aa-suggestion:hover,
|
||||||
|
.jump-to-note-results .aa-dropdown-menu .aa-cursor {
|
||||||
|
background-color: var(--hover-item-background-color, #f8f9fa);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Command palette styling */
|
/* Command palette styling */
|
||||||
@@ -1795,8 +1888,24 @@ textarea {
|
|||||||
|
|
||||||
.jump-to-note-dialog .aa-cursor .command-suggestion,
|
.jump-to-note-dialog .aa-cursor .command-suggestion,
|
||||||
.jump-to-note-dialog .aa-suggestion:hover .command-suggestion {
|
.jump-to-note-dialog .aa-suggestion:hover .command-suggestion {
|
||||||
border-left-color: var(--link-color);
|
background-color: transparent;
|
||||||
background-color: var(--hover-background-color);
|
}
|
||||||
|
|
||||||
|
.jump-to-note-dialog .show-in-full-search,
|
||||||
|
.jump-to-note-results .show-in-full-search {
|
||||||
|
border-top: 1px solid var(--main-border-color);
|
||||||
|
padding-top: 12px;
|
||||||
|
margin-top: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jump-to-note-results .aa-suggestion .search-notes-action {
|
||||||
|
border-top: 1px solid var(--main-border-color);
|
||||||
|
margin-top: 8px;
|
||||||
|
padding-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jump-to-note-results .aa-suggestion:has(.search-notes-action)::after {
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jump-to-note-dialog .command-icon {
|
.jump-to-note-dialog .command-icon {
|
||||||
@@ -1886,6 +1995,7 @@ body.zen #launcher-container,
|
|||||||
body.zen #launcher-pane,
|
body.zen #launcher-pane,
|
||||||
body.zen #left-pane,
|
body.zen #left-pane,
|
||||||
body.zen #right-pane,
|
body.zen #right-pane,
|
||||||
|
body.zen #mobile-sidebar-wrapper,
|
||||||
body.zen .tab-row-container,
|
body.zen .tab-row-container,
|
||||||
body.zen .tab-row-widget,
|
body.zen .tab-row-widget,
|
||||||
body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)),
|
body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)),
|
||||||
@@ -1893,7 +2003,8 @@ body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row,
|
|||||||
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)),
|
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)),
|
||||||
body.zen .note-icon-widget,
|
body.zen .note-icon-widget,
|
||||||
body.zen .title-row .button-widget,
|
body.zen .title-row .button-widget,
|
||||||
body.zen .floating-buttons-children > *:not(.bx-edit-alt) {
|
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
|
||||||
|
body.zen .action-button {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1935,6 +2046,10 @@ body.zen .note-title-widget input {
|
|||||||
background: transparent !important;
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.zen #detail-container {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
/* Content renderer */
|
/* Content renderer */
|
||||||
|
|
||||||
footer.file-footer,
|
footer.file-footer,
|
||||||
@@ -2251,3 +2366,12 @@ footer.webview-footer button {
|
|||||||
content: "\ec24";
|
content: "\ec24";
|
||||||
transform: rotate(180deg);
|
transform: rotate(180deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* CK Edito */
|
||||||
|
|
||||||
|
/* Insert text snippet: limit the width of the listed items to avoid overly long names */
|
||||||
|
:root body.desktop div.ck-template-form li.ck-list__item .ck-template-form__text-part > span {
|
||||||
|
max-width: 25vw;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
--main-text-color: #ccc;
|
--main-text-color: #ccc;
|
||||||
--main-border-color: #454545;
|
--main-border-color: #454545;
|
||||||
--subtle-border-color: #313131;
|
--subtle-border-color: #313131;
|
||||||
--dropdown-border-color: #292929;
|
--dropdown-border-color: #404040;
|
||||||
--dropdown-shadow-opacity: 0.6;
|
--dropdown-shadow-opacity: 0.6;
|
||||||
--dropdown-item-icon-destructive-color: #de6e5b;
|
--dropdown-item-icon-destructive-color: #de6e5b;
|
||||||
--disabled-tooltip-icon-color: #7fd2ef;
|
--disabled-tooltip-icon-color: #7fd2ef;
|
||||||
@@ -89,6 +89,7 @@
|
|||||||
|
|
||||||
--menu-text-color: #e3e3e3;
|
--menu-text-color: #e3e3e3;
|
||||||
--menu-background-color: #222222d9;
|
--menu-background-color: #222222d9;
|
||||||
|
--menu-background-color-no-backdrop: #1b1b1b;
|
||||||
--menu-item-icon-color: #8c8c8c;
|
--menu-item-icon-color: #8c8c8c;
|
||||||
--menu-item-disabled-opacity: 0.5;
|
--menu-item-disabled-opacity: 0.5;
|
||||||
--menu-item-keyboard-shortcut-color: #ffffff8f;
|
--menu-item-keyboard-shortcut-color: #ffffff8f;
|
||||||
@@ -120,6 +121,8 @@
|
|||||||
--quick-search-focus-border: #80808095;
|
--quick-search-focus-border: #80808095;
|
||||||
--quick-search-focus-background: #ffffff1f;
|
--quick-search-focus-background: #ffffff1f;
|
||||||
--quick-search-focus-color: white;
|
--quick-search-focus-color: white;
|
||||||
|
--quick-search-result-content-background: #0000004d;
|
||||||
|
--quick-search-result-highlight-color: #a4d995;
|
||||||
|
|
||||||
--left-pane-collapsed-border-color: #0009;
|
--left-pane-collapsed-border-color: #0009;
|
||||||
--left-pane-background-color: #1f1f1f;
|
--left-pane-background-color: #1f1f1f;
|
||||||
|
|||||||
@@ -83,6 +83,7 @@
|
|||||||
|
|
||||||
--menu-text-color: #272727;
|
--menu-text-color: #272727;
|
||||||
--menu-background-color: #ffffffd9;
|
--menu-background-color: #ffffffd9;
|
||||||
|
--menu-background-color-no-backdrop: #fdfdfd;
|
||||||
--menu-item-icon-color: #727272;
|
--menu-item-icon-color: #727272;
|
||||||
--menu-item-disabled-opacity: 0.6;
|
--menu-item-disabled-opacity: 0.6;
|
||||||
--menu-item-keyboard-shortcut-color: #666666a8;
|
--menu-item-keyboard-shortcut-color: #666666a8;
|
||||||
@@ -114,6 +115,8 @@
|
|||||||
--quick-search-focus-border: #00000029;
|
--quick-search-focus-border: #00000029;
|
||||||
--quick-search-focus-background: #ffffff80;
|
--quick-search-focus-background: #ffffff80;
|
||||||
--quick-search-focus-color: #000;
|
--quick-search-focus-color: #000;
|
||||||
|
--quick-search-result-content-background: #0000000f;
|
||||||
|
--quick-search-result-highlight-color: #c65050;
|
||||||
|
|
||||||
--left-pane-collapsed-border-color: #0000000d;
|
--left-pane-collapsed-border-color: #0000000d;
|
||||||
--left-pane-background-color: #f2f2f2;
|
--left-pane-background-color: #f2f2f2;
|
||||||
|
|||||||
@@ -83,6 +83,12 @@
|
|||||||
--tab-note-icons: true;
|
--tab-note-icons: true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.backdrop-effects-disabled {
|
||||||
|
/* Backdrop effects are disabled, replace the menu background color with the
|
||||||
|
* no-backdrop fallback color */
|
||||||
|
--menu-background-color: var(--menu-background-color-no-backdrop);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MENUS
|
* MENUS
|
||||||
*
|
*
|
||||||
@@ -191,13 +197,17 @@ html body .dropdown-item[disabled] {
|
|||||||
|
|
||||||
/* Menu item keyboard shortcut */
|
/* Menu item keyboard shortcut */
|
||||||
.dropdown-item kbd {
|
.dropdown-item kbd {
|
||||||
margin-left: 16px;
|
|
||||||
font-family: unset !important;
|
font-family: unset !important;
|
||||||
font-size: unset !important;
|
font-size: unset !important;
|
||||||
color: var(--menu-item-keyboard-shortcut-color) !important;
|
color: var(--menu-item-keyboard-shortcut-color) !important;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropdown-item span.keyboard-shortcut {
|
||||||
|
color: var(--menu-item-keyboard-shortcut-color) !important;
|
||||||
|
margin-left: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-divider {
|
.dropdown-divider {
|
||||||
position: relative;
|
position: relative;
|
||||||
border-color: transparent !important;
|
border-color: transparent !important;
|
||||||
@@ -319,6 +329,8 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after {
|
|||||||
|
|
||||||
#toast-container .toast .toast-body {
|
#toast-container .toast .toast-body {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -530,10 +542,9 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* List item */
|
/* List item */
|
||||||
.jump-to-note-dialog .aa-suggestions div,
|
.jump-to-note-dialog .aa-suggestion,
|
||||||
.note-detail-empty .aa-suggestions div {
|
.note-detail-empty .aa-suggestion {
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
padding: 6px 12px;
|
|
||||||
color: var(--menu-text-color);
|
color: var(--menu-text-color);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,16 +233,16 @@ div.tn-tool-dialog {
|
|||||||
|
|
||||||
/* Item title link */
|
/* Item title link */
|
||||||
|
|
||||||
.recent-changes-content ul li .note-title a {
|
.recent-changes-content ul li a {
|
||||||
color: currentColor;
|
color: currentColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
.recent-changes-content ul li .note-title a:hover {
|
.recent-changes-content ul li a:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Item title for deleted notes */
|
/* Item title for deleted notes */
|
||||||
.recent-changes-content ul li.deleted-note .note-title > .note-title {
|
.recent-changes-content ul li.deleted-note .note-title {
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@
|
|||||||
button.btn.btn-primary,
|
button.btn.btn-primary,
|
||||||
button.btn.btn-secondary,
|
button.btn.btn-secondary,
|
||||||
button.btn.btn-sm:not(.select-button),
|
button.btn.btn-sm:not(.select-button),
|
||||||
button.btn.btn-success {
|
button.btn.btn-success,
|
||||||
|
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -21,7 +22,8 @@ button.btn.btn-success {
|
|||||||
button.btn.btn-primary:hover,
|
button.btn.btn-primary:hover,
|
||||||
button.btn.btn-secondary:hover,
|
button.btn.btn-secondary:hover,
|
||||||
button.btn.btn-sm:not(.select-button):hover,
|
button.btn.btn-sm:not(.select-button):hover,
|
||||||
button.btn.btn-success:hover {
|
button.btn.btn-success:hover,
|
||||||
|
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):hover {
|
||||||
background: var(--cmd-button-hover-background-color);
|
background: var(--cmd-button-hover-background-color);
|
||||||
color: var(--cmd-button-hover-text-color);
|
color: var(--cmd-button-hover-text-color);
|
||||||
}
|
}
|
||||||
@@ -29,7 +31,8 @@ button.btn.btn-success:hover {
|
|||||||
button.btn.btn-primary:active,
|
button.btn.btn-primary:active,
|
||||||
button.btn.btn-secondary:active,
|
button.btn.btn-secondary:active,
|
||||||
button.btn.btn-sm:not(.select-button):active,
|
button.btn.btn-sm:not(.select-button):active,
|
||||||
button.btn.btn-success:active {
|
button.btn.btn-success:active,
|
||||||
|
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):active {
|
||||||
opacity: 0.85;
|
opacity: 0.85;
|
||||||
box-shadow: unset;
|
box-shadow: unset;
|
||||||
background: var(--cmd-button-background-color) !important;
|
background: var(--cmd-button-background-color) !important;
|
||||||
@@ -40,14 +43,16 @@ button.btn.btn-success:active {
|
|||||||
button.btn.btn-primary:disabled,
|
button.btn.btn-primary:disabled,
|
||||||
button.btn.btn-secondary:disabled,
|
button.btn.btn-secondary:disabled,
|
||||||
button.btn.btn-sm:not(.select-button):disabled,
|
button.btn.btn-sm:not(.select-button):disabled,
|
||||||
button.btn.btn-success:disabled {
|
button.btn.btn-success:disabled,
|
||||||
|
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text.ck-disabled {
|
||||||
opacity: var(--cmd-button-disabled-opacity);
|
opacity: var(--cmd-button-disabled-opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
button.btn.btn-primary:focus-visible,
|
button.btn.btn-primary:focus-visible,
|
||||||
button.btn.btn-secondary:focus-visible,
|
button.btn.btn-secondary:focus-visible,
|
||||||
button.btn.btn-sm:not(.select-button):focus-visible,
|
button.btn.btn-sm:not(.select-button):focus-visible,
|
||||||
button.btn.btn-success:focus-visible {
|
button.btn.btn-success:focus-visible,
|
||||||
|
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):focus-visible {
|
||||||
outline: 2px solid var(--input-focus-outline-color);
|
outline: 2px solid var(--input-focus-outline-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,8 +154,11 @@ input[type="password"],
|
|||||||
input[type="date"],
|
input[type="date"],
|
||||||
input[type="time"],
|
input[type="time"],
|
||||||
input[type="datetime-local"],
|
input[type="datetime-local"],
|
||||||
|
:root input.ck.ck-input-text,
|
||||||
|
:root input.ck.ck-input-number,
|
||||||
textarea.form-control,
|
textarea.form-control,
|
||||||
textarea,
|
textarea,
|
||||||
|
:root textarea.ck.ck-textarea,
|
||||||
.tn-input-field {
|
.tn-input-field {
|
||||||
outline: 3px solid transparent;
|
outline: 3px solid transparent;
|
||||||
outline-offset: 6px;
|
outline-offset: 6px;
|
||||||
@@ -167,8 +175,11 @@ input[type="password"]:hover,
|
|||||||
input[type="date"]:hover,
|
input[type="date"]:hover,
|
||||||
input[type="time"]:hover,
|
input[type="time"]:hover,
|
||||||
input[type="datetime-local"]:hover,
|
input[type="datetime-local"]:hover,
|
||||||
|
:root input.ck.ck-input-text:not([readonly="true"]):hover,
|
||||||
|
:root input.ck.ck-input-number:not([readonly="true"]):hover,
|
||||||
textarea.form-control:hover,
|
textarea.form-control:hover,
|
||||||
textarea:hover,
|
textarea:hover,
|
||||||
|
:root textarea.ck.ck-textarea:hover,
|
||||||
.tn-input-field:hover {
|
.tn-input-field:hover {
|
||||||
background: var(--input-hover-background);
|
background: var(--input-hover-background);
|
||||||
color: var(--input-hover-color);
|
color: var(--input-hover-color);
|
||||||
@@ -181,8 +192,11 @@ input[type="password"]:focus,
|
|||||||
input[type="date"]:focus,
|
input[type="date"]:focus,
|
||||||
input[type="time"]:focus,
|
input[type="time"]:focus,
|
||||||
input[type="datetime-local"]:focus,
|
input[type="datetime-local"]:focus,
|
||||||
|
:root input.ck.ck-input-text:focus,
|
||||||
|
:root input.ck.ck-input-number:focus,
|
||||||
textarea.form-control:focus,
|
textarea.form-control:focus,
|
||||||
textarea:focus,
|
textarea:focus,
|
||||||
|
:root textarea.ck.ck-textarea:focus,
|
||||||
.tn-input-field:focus,
|
.tn-input-field:focus,
|
||||||
.tn-input-field:focus-within {
|
.tn-input-field:focus-within {
|
||||||
box-shadow: unset;
|
box-shadow: unset;
|
||||||
@@ -455,6 +469,7 @@ optgroup {
|
|||||||
left: 0;
|
left: 0;
|
||||||
width: var(--box-size);
|
width: var(--box-size);
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
margin: unset;
|
||||||
opacity: 0 !important;
|
opacity: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
:root {
|
:root {
|
||||||
--ck-font-face: var(--main-font-family);
|
--ck-font-face: var(--main-font-family);
|
||||||
|
--ck-input-label-height: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -307,6 +308,11 @@
|
|||||||
fill: black !important;
|
fill: black !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Hex color input box prefix */
|
||||||
|
:root .ck.ck-color-selector .ck-color-picker__hash-view {
|
||||||
|
margin-top: var(--ck-input-label-height);
|
||||||
|
}
|
||||||
|
|
||||||
/* Numbered list */
|
/* Numbered list */
|
||||||
|
|
||||||
:root .ck.ck-list-properties_with-numbered-properties .ck.ck-list-styles-list {
|
:root .ck.ck-list-properties_with-numbered-properties .ck.ck-list-styles-list {
|
||||||
@@ -363,19 +369,86 @@
|
|||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Action buttons */
|
/* Text snippet dropdown */
|
||||||
|
|
||||||
:root .ck-link-actions button.ck-button,
|
div.ck-template-form {
|
||||||
:root .ck-link-form button.ck-button {
|
padding: 8px;
|
||||||
--ck-border-radius: 6px;
|
|
||||||
|
|
||||||
background: transparent;
|
|
||||||
box-shadow: unset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
:root .ck-link-actions button.ck-button:hover,
|
div.ck-template-form .ck-labeled-field-view {
|
||||||
:root .ck-link-form button.ck-button:hover {
|
margin-bottom: 8px;
|
||||||
background: var(--hover-item-background-color);
|
}
|
||||||
|
|
||||||
|
/* Template item */
|
||||||
|
|
||||||
|
:root div.ck-template-form li.ck-list__item button.ck-template-button {
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Template icon */
|
||||||
|
:root .ck-template-form .ck-button__icon {
|
||||||
|
--ck-spacing-medium: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root div.ck-template-form .note-icon {
|
||||||
|
color: var(--menu-item-icon-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Template name */
|
||||||
|
div.ck-template-form .ck-template-form__text-part {
|
||||||
|
color: var(--hover-item-text-color);
|
||||||
|
font-size: .9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.ck-template-form .ck-template-form__text-part mark {
|
||||||
|
background: unset;
|
||||||
|
color: var(--quick-search-result-highlight-color);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Template description */
|
||||||
|
:root div.ck-template-form .ck-template-form__description {
|
||||||
|
opacity: .5;
|
||||||
|
font-size: .9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Messages */
|
||||||
|
div.ck-template-form .ck-search__info > span {
|
||||||
|
line-height: initial;
|
||||||
|
color: var(--muted-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.ck-template-form .ck-search__info span:nth-child(2) {
|
||||||
|
display: block;
|
||||||
|
opacity: .5;
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: .9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Link dropdown */
|
||||||
|
|
||||||
|
:root .ck.ck-form.ck-link-form ul.ck-link-form__providers-list {
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Math popup */
|
||||||
|
|
||||||
|
.ck-math-form .ck-labeled-field-view {
|
||||||
|
--ck-input-label-height: 0;
|
||||||
|
|
||||||
|
margin-inline-end: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Emoji dropdown */
|
||||||
|
|
||||||
|
.ck-emoji-picker-form .ck-emoji__search .ck-button_with-text:not(.ck-list-item-button) {
|
||||||
|
margin-top: var(--ck-input-label-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find and replace dialog */
|
||||||
|
|
||||||
|
.ck-find-and-replace-form .ck-find-and-replace-form__inputs button {
|
||||||
|
margin-top: var(--ck-input-label-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mention list (the autocompletion list for emojis, labels and relations) */
|
/* Mention list (the autocompletion list for emojis, labels and relations) */
|
||||||
@@ -392,6 +465,58 @@
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FORMS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Buttons
|
||||||
|
*/
|
||||||
|
|
||||||
|
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck-button_with-text {
|
||||||
|
--ck-color-text: var(--cmd-button-text-color);
|
||||||
|
|
||||||
|
min-width: 60px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Text boxes
|
||||||
|
*/
|
||||||
|
|
||||||
|
.ck.ck-labeled-field-view {
|
||||||
|
padding-top: var(--ck-input-label-height) !important; /* Create space for the label */
|
||||||
|
}
|
||||||
|
|
||||||
|
.ck.ck-labeled-field-view > .ck.ck-labeled-field-view__input-wrapper > label.ck.ck-label {
|
||||||
|
/* Move the label above the text box regardless of the text box state */
|
||||||
|
transform: translate(0, calc(-.2em - var(--ck-input-label-height))) !important;
|
||||||
|
|
||||||
|
padding-left: 0 !important;
|
||||||
|
background: transparent;
|
||||||
|
font-size: .85em;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root input.ck.ck-input-text[readonly="true"] {
|
||||||
|
cursor: not-allowed;
|
||||||
|
background: var(--input-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Forms */
|
||||||
|
|
||||||
|
:root .ck.ck-form__row.ck-form__row_with-submit > :not(:first-child) {
|
||||||
|
margin-inline-start: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ck.ck-form__row_with-submit button {
|
||||||
|
margin-top: var(--ck-input-label-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ck.ck-form__header {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EDITOR'S CONTENT
|
* EDITOR'S CONTENT
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -96,7 +96,6 @@
|
|||||||
background: var(--background) !important;
|
background: var(--background) !important;
|
||||||
color: var(--color) !important;
|
color: var(--color) !important;
|
||||||
line-height: unset;
|
line-height: unset;
|
||||||
cursor: help;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.sql-table-schemas-widget .sql-table-schemas button:hover,
|
.sql-table-schemas-widget .sql-table-schemas button:hover,
|
||||||
@@ -106,18 +105,6 @@
|
|||||||
--color: var(--main-text-color);
|
--color: var(--main-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tooltip */
|
|
||||||
|
|
||||||
.tooltip .table-schema {
|
|
||||||
font-family: var(--monospace-font-family);
|
|
||||||
font-size: .85em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Data type */
|
|
||||||
.tooltip .table-schema td:nth-child(2) {
|
|
||||||
color: var(--muted-text-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE MAP
|
* NOTE MAP
|
||||||
*/
|
*/
|
||||||
@@ -182,8 +169,6 @@ div.note-detail-empty {
|
|||||||
|
|
||||||
.options-section:not(.tn-no-card) {
|
.options-section:not(.tn-no-card) {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
min-width: var(--options-card-min-width);
|
|
||||||
max-width: var(--options-card-max-width);
|
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
border: 1px solid var(--card-border-color) !important;
|
border: 1px solid var(--card-border-color) !important;
|
||||||
box-shadow: var(--card-box-shadow);
|
box-shadow: var(--card-box-shadow);
|
||||||
@@ -192,6 +177,11 @@ div.note-detail-empty {
|
|||||||
margin-bottom: calc(var(--options-title-offset) + 26px) !important;
|
margin-bottom: calc(var(--options-title-offset) + 26px) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.desktop .option-section:not(.tn-no-card) {
|
||||||
|
min-width: var(--options-card-min-width);
|
||||||
|
max-width: var(--options-card-max-width);
|
||||||
|
}
|
||||||
|
|
||||||
.note-detail-content-widget-content.options {
|
.note-detail-content-widget-content.options {
|
||||||
--default-padding: 15px;
|
--default-padding: 15px;
|
||||||
padding-top: calc(var(--default-padding) + var(--options-title-offset) + var(--options-title-font-size));
|
padding-top: calc(var(--default-padding) + var(--options-title-offset) + var(--options-title-font-size));
|
||||||
@@ -233,11 +223,6 @@ div.note-detail-empty {
|
|||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.options-section .options-mime-types {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.options-section .form-group {
|
.options-section .form-group {
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,7 @@ body.background-effects.platform-win32.layout-vertical {
|
|||||||
}
|
}
|
||||||
|
|
||||||
body.background-effects.platform-win32,
|
body.background-effects.platform-win32,
|
||||||
body.background-effects.platform-win32 #root-widget,
|
body.background-effects.platform-win32 #root-widget {
|
||||||
body.background-effects.platform-win32 #launcher-pane .launcher-button {
|
|
||||||
background: transparent !important;
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,7 +329,6 @@ body.layout-horizontal > .horizontal {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
.calendar-dropdown-widget {
|
.calendar-dropdown-widget {
|
||||||
width: unset !important;
|
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
color: var(--calendar-color);
|
color: var(--calendar-color);
|
||||||
user-select: none;
|
user-select: none;
|
||||||
@@ -576,25 +574,18 @@ div.quick-search .search-button.show {
|
|||||||
* Quick search results
|
* Quick search results
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
div.quick-search .dropdown-menu {
|
||||||
|
--quick-search-item-delimiter-color: transparent;
|
||||||
|
--menu-item-icon-vert-offset: -.065em;
|
||||||
|
}
|
||||||
|
|
||||||
/* Item */
|
/* Item */
|
||||||
.quick-search .dropdown-menu *.dropdown-item {
|
.quick-search .dropdown-menu *.dropdown-item {
|
||||||
padding: 8px 12px !important;
|
padding: 8px 12px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note icon */
|
.quick-search .quick-search-item-icon {
|
||||||
.quick-search .dropdown-menu .dropdown-item > .bx {
|
vertical-align: text-bottom;
|
||||||
position: relative;
|
|
||||||
top: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note title */
|
|
||||||
.quick-search .dropdown-menu .dropdown-item > a {
|
|
||||||
color: var(--menu-text-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.quick-search .dropdown-menu .dropdown-item > a:hover {
|
|
||||||
--hover-item-background-color: transparent;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note path */
|
/* Note path */
|
||||||
@@ -605,6 +596,24 @@ div.quick-search .search-button.show {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Note content snippet */
|
||||||
|
:root .quick-search .search-result-content {
|
||||||
|
background-color: var(--quick-search-result-content-background);
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Highlighted search terms */
|
||||||
|
:root .quick-search .search-result-title b,
|
||||||
|
:root .quick-search .search-result-content b,
|
||||||
|
:root .quick-search .search-result-attributes b {
|
||||||
|
color: var(--quick-search-result-highlight-color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.quick-search div.dropdown-divider {
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TREE PANE
|
* TREE PANE
|
||||||
*/
|
*/
|
||||||
@@ -1375,7 +1384,7 @@ div.floating-buttons-children .floating-button:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* The first visible floating button */
|
/* The first visible floating button */
|
||||||
div.floating-buttons-children > *:nth-child(1 of .visible) {
|
div.floating-buttons-children > *:first-child {
|
||||||
--border-radius: var(--border-radius-size) 0 0 var(--border-radius-size);
|
--border-radius: var(--border-radius-size) 0 0 var(--border-radius-size);
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--border-radius);
|
||||||
}
|
}
|
||||||
@@ -1477,13 +1486,6 @@ div.floating-buttons-children .close-floating-buttons:has(.close-floating-button
|
|||||||
padding-inline-start: 8px;
|
padding-inline-start: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy image reference */
|
|
||||||
|
|
||||||
.floating-buttons .copy-image-reference-button .hidden-image-copy {
|
|
||||||
/* Take out of the the hidden image from flexbox to prevent the layout being affected */
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Code, relation map buttons */
|
/* Code, relation map buttons */
|
||||||
|
|
||||||
.floating-buttons .code-buttons-widget,
|
.floating-buttons .code-buttons-widget,
|
||||||
|
|||||||
@@ -1,31 +1,23 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "Sobre Trilium Notes",
|
"title": "Sobre Trilium Notes",
|
||||||
"close": "Tanca",
|
|
||||||
"homepage": "Pàgina principal:"
|
"homepage": "Pàgina principal:"
|
||||||
},
|
},
|
||||||
"add_link": {
|
"add_link": {
|
||||||
"note": "Nota",
|
"note": "Nota"
|
||||||
"close": "Tanca"
|
|
||||||
},
|
},
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"close": "Tanca",
|
|
||||||
"prefix": "Prefix: ",
|
"prefix": "Prefix: ",
|
||||||
"save": "Desa"
|
"save": "Desa"
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"close": "Tanca",
|
|
||||||
"labels": "Etiquetes",
|
"labels": "Etiquetes",
|
||||||
"relations": "Relacions",
|
"relations": "Relacions",
|
||||||
"notes": "Notes",
|
"notes": "Notes",
|
||||||
"other": "Altres"
|
"other": "Altres"
|
||||||
},
|
},
|
||||||
"clone_to": {
|
|
||||||
"close": "Tanca"
|
|
||||||
},
|
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"confirmation": "Confirmació",
|
"confirmation": "Confirmació",
|
||||||
"close": "Tanca",
|
|
||||||
"cancel": "Cancel·la",
|
"cancel": "Cancel·la",
|
||||||
"ok": "OK"
|
"ok": "OK"
|
||||||
},
|
},
|
||||||
@@ -39,53 +31,34 @@
|
|||||||
"export": "Exporta"
|
"export": "Exporta"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"close": "Tanca",
|
|
||||||
"troubleshooting": "Solució de problemes",
|
"troubleshooting": "Solució de problemes",
|
||||||
"other": "Altres"
|
"other": "Altres"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"close": "Tanca",
|
|
||||||
"options": "Opcions",
|
"options": "Opcions",
|
||||||
"import": "Importa"
|
"import": "Importa"
|
||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"close": "Tanca",
|
|
||||||
"label_note": "Nota"
|
"label_note": "Nota"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"closeButton": "Tanca",
|
"closeButton": "Tanca",
|
||||||
"okButton": "OK"
|
"okButton": "OK"
|
||||||
},
|
},
|
||||||
"jump_to_note": {
|
|
||||||
"close": "Tanca"
|
|
||||||
},
|
|
||||||
"markdown_import": {
|
|
||||||
"close": "Tanca"
|
|
||||||
},
|
|
||||||
"move_to": {
|
|
||||||
"close": "Tanca"
|
|
||||||
},
|
|
||||||
"note_type_chooser": {
|
"note_type_chooser": {
|
||||||
"close": "Tanca",
|
|
||||||
"templates": "Plantilles:"
|
"templates": "Plantilles:"
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
|
||||||
"close": "Tanca"
|
|
||||||
},
|
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"title": "Sol·licitud",
|
"title": "Sol·licitud",
|
||||||
"close": "Tanca",
|
|
||||||
"defaultTitle": "Sol·licitud"
|
"defaultTitle": "Sol·licitud"
|
||||||
},
|
},
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
"close_label": "Tanca"
|
"close_label": "Tanca"
|
||||||
},
|
},
|
||||||
"recent_changes": {
|
"recent_changes": {
|
||||||
"close": "Tanca",
|
|
||||||
"undelete_link": "recuperar"
|
"undelete_link": "recuperar"
|
||||||
},
|
},
|
||||||
"revisions": {
|
"revisions": {
|
||||||
"close": "Tanca",
|
|
||||||
"restore_button": "Restaura",
|
"restore_button": "Restaura",
|
||||||
"delete_button": "Suprimeix",
|
"delete_button": "Suprimeix",
|
||||||
"download_button": "Descarrega",
|
"download_button": "Descarrega",
|
||||||
@@ -93,14 +66,12 @@
|
|||||||
"preview": "Vista prèvia:"
|
"preview": "Vista prèvia:"
|
||||||
},
|
},
|
||||||
"sort_child_notes": {
|
"sort_child_notes": {
|
||||||
"close": "Tanca",
|
|
||||||
"title": "títol",
|
"title": "títol",
|
||||||
"ascending": "ascendent",
|
"ascending": "ascendent",
|
||||||
"descending": "descendent",
|
"descending": "descendent",
|
||||||
"folders": "Carpetes"
|
"folders": "Carpetes"
|
||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"close": "Tanca",
|
|
||||||
"options": "Opcions",
|
"options": "Opcions",
|
||||||
"upload": "Puja"
|
"upload": "Puja"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "关于 Trilium Notes",
|
"title": "关于 Trilium Notes",
|
||||||
"close": "关闭",
|
|
||||||
"homepage": "项目主页:",
|
"homepage": "项目主页:",
|
||||||
"app_version": "应用版本:",
|
"app_version": "应用版本:",
|
||||||
"db_version": "数据库版本:",
|
"db_version": "数据库版本:",
|
||||||
@@ -28,25 +27,22 @@
|
|||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "添加链接",
|
"add_link": "添加链接",
|
||||||
"help_on_links": "链接帮助",
|
"help_on_links": "链接帮助",
|
||||||
"close": "关闭",
|
|
||||||
"note": "笔记",
|
"note": "笔记",
|
||||||
"search_note": "按名称搜索笔记",
|
"search_note": "按名称搜索笔记",
|
||||||
"link_title_mirrors": "链接标题跟随笔记标题变化",
|
"link_title_mirrors": "链接标题跟随笔记标题变化",
|
||||||
"link_title_arbitrary": "链接标题可随意修改",
|
"link_title_arbitrary": "链接标题可随意修改",
|
||||||
"link_title": "链接标题",
|
"link_title": "链接标题",
|
||||||
"button_add_link": "添加链接 <kbd>回车</kbd>"
|
"button_add_link": "添加链接"
|
||||||
},
|
},
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"edit_branch_prefix": "编辑分支前缀",
|
"edit_branch_prefix": "编辑分支前缀",
|
||||||
"help_on_tree_prefix": "有关树前缀的帮助",
|
"help_on_tree_prefix": "有关树前缀的帮助",
|
||||||
"close": "关闭",
|
|
||||||
"prefix": "前缀: ",
|
"prefix": "前缀: ",
|
||||||
"save": "保存",
|
"save": "保存",
|
||||||
"branch_prefix_saved": "分支前缀已保存。"
|
"branch_prefix_saved": "分支前缀已保存。"
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"bulk_actions": "批量操作",
|
"bulk_actions": "批量操作",
|
||||||
"close": "关闭",
|
|
||||||
"affected_notes": "受影响的笔记",
|
"affected_notes": "受影响的笔记",
|
||||||
"include_descendants": "包括所选笔记的子笔记",
|
"include_descendants": "包括所选笔记的子笔记",
|
||||||
"available_actions": "可用操作",
|
"available_actions": "可用操作",
|
||||||
@@ -61,20 +57,18 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "克隆笔记到...",
|
"clone_notes_to": "克隆笔记到...",
|
||||||
"close": "关闭",
|
|
||||||
"help_on_links": "链接帮助",
|
"help_on_links": "链接帮助",
|
||||||
"notes_to_clone": "要克隆的笔记",
|
"notes_to_clone": "要克隆的笔记",
|
||||||
"target_parent_note": "目标父笔记",
|
"target_parent_note": "目标父笔记",
|
||||||
"search_for_note_by_its_name": "按名称搜索笔记",
|
"search_for_note_by_its_name": "按名称搜索笔记",
|
||||||
"cloned_note_prefix_title": "克隆的笔记将在笔记树中显示给定的前缀",
|
"cloned_note_prefix_title": "克隆的笔记将在笔记树中显示给定的前缀",
|
||||||
"prefix_optional": "前缀(可选)",
|
"prefix_optional": "前缀(可选)",
|
||||||
"clone_to_selected_note": "克隆到选定的笔记 <kbd>回车</kbd>",
|
"clone_to_selected_note": "克隆到选定的笔记",
|
||||||
"no_path_to_clone_to": "没有克隆路径。",
|
"no_path_to_clone_to": "没有克隆路径。",
|
||||||
"note_cloned": "笔记 \"{{clonedTitle}}\" 已克隆到 \"{{targetTitle}}\""
|
"note_cloned": "笔记 \"{{clonedTitle}}\" 已克隆到 \"{{targetTitle}}\""
|
||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"confirmation": "确认",
|
"confirmation": "确认",
|
||||||
"close": "关闭",
|
|
||||||
"cancel": "取消",
|
"cancel": "取消",
|
||||||
"ok": "确定",
|
"ok": "确定",
|
||||||
"are_you_sure_remove_note": "确定要从关系图中移除笔记 \"{{title}}\" ? ",
|
"are_you_sure_remove_note": "确定要从关系图中移除笔记 \"{{title}}\" ? ",
|
||||||
@@ -87,9 +81,9 @@
|
|||||||
"delete_all_clones_description": "同时删除所有克隆(可以在最近修改中撤消)",
|
"delete_all_clones_description": "同时删除所有克隆(可以在最近修改中撤消)",
|
||||||
"erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。",
|
"erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。",
|
||||||
"erase_notes_warning": "永久擦除笔记(无法撤销),包括所有克隆。这将强制应用程序重载。",
|
"erase_notes_warning": "永久擦除笔记(无法撤销),包括所有克隆。这将强制应用程序重载。",
|
||||||
"notes_to_be_deleted": "将删除以下笔记 ({{- noteCount}})",
|
"notes_to_be_deleted": "将删除以下笔记 ({{notesCount}})",
|
||||||
"no_note_to_delete": "没有笔记将被删除(仅克隆)。",
|
"no_note_to_delete": "没有笔记将被删除(仅克隆)。",
|
||||||
"broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{- relationCount}})",
|
"broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{ relationCount}})",
|
||||||
"cancel": "取消",
|
"cancel": "取消",
|
||||||
"ok": "确定",
|
"ok": "确定",
|
||||||
"deleted_relation_text": "笔记 {{- note}} (将被删除的笔记) 被以下关系 {{- relation}} 引用, 来自 {{- source}}。"
|
"deleted_relation_text": "笔记 {{- note}} (将被删除的笔记) 被以下关系 {{- relation}} 引用, 来自 {{- source}}。"
|
||||||
@@ -113,20 +107,17 @@
|
|||||||
"format_pdf": "PDF - 用于打印或共享目的。"
|
"format_pdf": "PDF - 用于打印或共享目的。"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"fullDocumentation": "帮助(完整<a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">在线文档</a>)",
|
|
||||||
"close": "关闭",
|
|
||||||
"noteNavigation": "笔记导航",
|
"noteNavigation": "笔记导航",
|
||||||
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - 在笔记列表中向上/向下移动",
|
"goUpDown": "在笔记列表中向上/向下移动",
|
||||||
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - 折叠/展开节点",
|
"collapseExpand": "折叠/展开节点",
|
||||||
"notSet": "未设置",
|
"notSet": "未设置",
|
||||||
"goBackForwards": "在历史记录中前后移动",
|
"goBackForwards": "在历史记录中前后移动",
|
||||||
"showJumpToNoteDialog": "显示<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"跳转到\" 对话框</a>",
|
"showJumpToNoteDialog": "显示<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"跳转到\" 对话框</a>",
|
||||||
"scrollToActiveNote": "滚动到活跃笔记",
|
"scrollToActiveNote": "滚动到活跃笔记",
|
||||||
"jumpToParentNote": "<kbd>Backspace</kbd> - 跳转到父笔记",
|
"jumpToParentNote": "跳转到父笔记",
|
||||||
"collapseWholeTree": "折叠整个笔记树",
|
"collapseWholeTree": "折叠整个笔记树",
|
||||||
"collapseSubTree": "折叠子树",
|
"collapseSubTree": "折叠子树",
|
||||||
"tabShortcuts": "标签页快捷键",
|
"tabShortcuts": "标签页快捷键",
|
||||||
"newTabNoteLink": "<kbd>CTRL+click</kbd> - 在笔记链接上使用CTRL+点击(或中键点击)在新标签页中打开笔记",
|
|
||||||
"onlyInDesktop": "仅在桌面版(电子构建)中",
|
"onlyInDesktop": "仅在桌面版(电子构建)中",
|
||||||
"openEmptyTab": "打开空白标签页",
|
"openEmptyTab": "打开空白标签页",
|
||||||
"closeActiveTab": "关闭活跃标签页",
|
"closeActiveTab": "关闭活跃标签页",
|
||||||
@@ -141,14 +132,14 @@
|
|||||||
"moveNoteUpHierarchy": "在层级结构中向上移动笔记",
|
"moveNoteUpHierarchy": "在层级结构中向上移动笔记",
|
||||||
"multiSelectNote": "多选上/下笔记",
|
"multiSelectNote": "多选上/下笔记",
|
||||||
"selectAllNotes": "选择当前级别的所有笔记",
|
"selectAllNotes": "选择当前级别的所有笔记",
|
||||||
"selectNote": "<kbd>Shift+click</kbd> - 选择笔记",
|
"selectNote": "选择笔记",
|
||||||
"copyNotes": "将活跃笔记(或当前选择)复制到剪贴板(用于<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">克隆</a>)",
|
"copyNotes": "将活跃笔记(或当前选择)复制到剪贴板(用于<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">克隆</a>)",
|
||||||
"cutNotes": "将当前笔记(或当前选择)剪切到剪贴板(用于移动笔记)",
|
"cutNotes": "将当前笔记(或当前选择)剪切到剪贴板(用于移动笔记)",
|
||||||
"pasteNotes": "将笔记粘贴为活跃笔记的子笔记(根据是复制还是剪切到剪贴板来决定是移动还是克隆)",
|
"pasteNotes": "将笔记粘贴为活跃笔记的子笔记(根据是复制还是剪切到剪贴板来决定是移动还是克隆)",
|
||||||
"deleteNotes": "删除笔记/子树",
|
"deleteNotes": "删除笔记/子树",
|
||||||
"editingNotes": "编辑笔记",
|
"editingNotes": "编辑笔记",
|
||||||
"editNoteTitle": "在树形笔记树中,焦点会从笔记树切换到笔记标题。按下 Enter 键会将焦点从笔记标题切换到文本编辑器。按下 <kbd>Ctrl+.</kbd> 会将焦点从编辑器切换回笔记树。",
|
"editNoteTitle": "在树形笔记树中,焦点会从笔记树切换到笔记标题。按下 Enter 键会将焦点从笔记标题切换到文本编辑器。按下 <kbd>Ctrl+.</kbd> 会将焦点从编辑器切换回笔记树。",
|
||||||
"createEditLink": "<kbd>Ctrl+K</kbd> - 创建/编辑外部链接",
|
"createEditLink": "创建/编辑外部链接",
|
||||||
"createInternalLink": "创建内部链接",
|
"createInternalLink": "创建内部链接",
|
||||||
"followLink": "跟随光标下的链接",
|
"followLink": "跟随光标下的链接",
|
||||||
"insertDateTime": "在插入点插入当前日期和时间",
|
"insertDateTime": "在插入点插入当前日期和时间",
|
||||||
@@ -165,11 +156,12 @@
|
|||||||
"other": "其他",
|
"other": "其他",
|
||||||
"quickSearch": "定位到快速搜索框",
|
"quickSearch": "定位到快速搜索框",
|
||||||
"inPageSearch": "页面内搜索",
|
"inPageSearch": "页面内搜索",
|
||||||
"newTabWithActivationNoteLink": "<kbd>Ctrl+Shift+click</kbd> - (或 <kbd>Shift+middle mouse click</kbd>) 在笔记链接打开并激活笔记在一个新的选项卡"
|
"newTabWithActivationNoteLink": "在新标签页打开笔记链接并激活该标签页",
|
||||||
|
"title": "资料表",
|
||||||
|
"newTabNoteLink": "在新标签页开启链接"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"importIntoNote": "导入到笔记",
|
"importIntoNote": "导入到笔记",
|
||||||
"close": "关闭",
|
|
||||||
"chooseImportFile": "选择导入文件",
|
"chooseImportFile": "选择导入文件",
|
||||||
"importDescription": "所选文件的内容将作为子笔记导入到",
|
"importDescription": "所选文件的内容将作为子笔记导入到",
|
||||||
"options": "选项",
|
"options": "选项",
|
||||||
@@ -196,14 +188,13 @@
|
|||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "包含笔记",
|
"dialog_title": "包含笔记",
|
||||||
"close": "关闭",
|
|
||||||
"label_note": "笔记",
|
"label_note": "笔记",
|
||||||
"placeholder_search": "按名称搜索笔记",
|
"placeholder_search": "按名称搜索笔记",
|
||||||
"box_size_prompt": "包含笔记的框大小:",
|
"box_size_prompt": "包含笔记的框大小:",
|
||||||
"box_size_small": "小型 (显示大约10行)",
|
"box_size_small": "小型 (显示大约10行)",
|
||||||
"box_size_medium": "中型 (显示大约30行)",
|
"box_size_medium": "中型 (显示大约30行)",
|
||||||
"box_size_full": "完整显示(完整文本框)",
|
"box_size_full": "完整显示(完整文本框)",
|
||||||
"button_include": "包含笔记 <kbd>回车</kbd>"
|
"button_include": "包含笔记"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"modalTitle": "信息消息",
|
"modalTitle": "信息消息",
|
||||||
@@ -211,45 +202,41 @@
|
|||||||
"okButton": "确定"
|
"okButton": "确定"
|
||||||
},
|
},
|
||||||
"jump_to_note": {
|
"jump_to_note": {
|
||||||
"close": "关闭",
|
"search_button": "全文搜索",
|
||||||
"search_button": "全文搜索 <kbd>Ctrl+回车</kbd>",
|
|
||||||
"search_placeholder": "按名称或类型搜索笔记 > 查看命令..."
|
"search_placeholder": "按名称或类型搜索笔记 > 查看命令..."
|
||||||
},
|
},
|
||||||
"markdown_import": {
|
"markdown_import": {
|
||||||
"dialog_title": "Markdown 导入",
|
"dialog_title": "Markdown 导入",
|
||||||
"close": "关闭",
|
|
||||||
"modal_body_text": "由于浏览器沙箱的限制,无法直接从 JavaScript 读取剪贴板内容。请将要导入的 Markdown 文本粘贴到下面的文本框中,然后点击导入按钮",
|
"modal_body_text": "由于浏览器沙箱的限制,无法直接从 JavaScript 读取剪贴板内容。请将要导入的 Markdown 文本粘贴到下面的文本框中,然后点击导入按钮",
|
||||||
"import_button": "导入 Ctrl+回车",
|
"import_button": "导入",
|
||||||
"import_success": "Markdown 内容已成功导入文档。"
|
"import_success": "Markdown 内容已成功导入文档。"
|
||||||
},
|
},
|
||||||
"move_to": {
|
"move_to": {
|
||||||
"dialog_title": "移动笔记到...",
|
"dialog_title": "移动笔记到...",
|
||||||
"close": "关闭",
|
|
||||||
"notes_to_move": "需要移动的笔记",
|
"notes_to_move": "需要移动的笔记",
|
||||||
"target_parent_note": "目标父笔记",
|
"target_parent_note": "目标父笔记",
|
||||||
"search_placeholder": "通过名称搜索笔记",
|
"search_placeholder": "通过名称搜索笔记",
|
||||||
"move_button": "移动到选定的笔记 <kbd>回车</kbd>",
|
"move_button": "移动到选定的笔记",
|
||||||
"error_no_path": "没有可以移动到的路径。",
|
"error_no_path": "没有可以移动到的路径。",
|
||||||
"move_success_message": "所选笔记已移动到 "
|
"move_success_message": "所选笔记已移动到 "
|
||||||
},
|
},
|
||||||
"note_type_chooser": {
|
"note_type_chooser": {
|
||||||
"modal_title": "选择笔记类型",
|
"modal_title": "选择笔记类型",
|
||||||
"close": "关闭",
|
|
||||||
"modal_body": "选择新笔记的类型或模板:",
|
"modal_body": "选择新笔记的类型或模板:",
|
||||||
"templates": "模板:",
|
"templates": "模板",
|
||||||
"change_path_prompt": "更改创建新笔记的位置:",
|
"change_path_prompt": "更改创建新笔记的位置:",
|
||||||
"search_placeholder": "按名称搜索路径(默认为空)"
|
"search_placeholder": "按名称搜索路径(默认为空)",
|
||||||
|
"builtin_templates": "内置模板"
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"title": "密码未设置",
|
"title": "密码未设置",
|
||||||
"close": "关闭",
|
|
||||||
"body1": "受保护的笔记使用用户密码加密,但密码尚未设置。",
|
"body1": "受保护的笔记使用用户密码加密,但密码尚未设置。",
|
||||||
"body2": "点击<a class=\"open-password-options-button\" href=\"javascript:\">这里</a>打开选项对话框并设置您的密码。"
|
"body2": "若要保护笔记,请按一下下方按钮开启「选项」对话框并设置密码。",
|
||||||
|
"go_to_password_options": "移动至密码选项"
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"title": "提示",
|
"title": "提示",
|
||||||
"close": "关闭",
|
"ok": "确定",
|
||||||
"ok": "确定 <kbd>回车</kbd>",
|
|
||||||
"defaultTitle": "提示"
|
"defaultTitle": "提示"
|
||||||
},
|
},
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
@@ -257,12 +244,11 @@
|
|||||||
"help_title": "关于保护笔记的帮助",
|
"help_title": "关于保护笔记的帮助",
|
||||||
"close_label": "关闭",
|
"close_label": "关闭",
|
||||||
"form_label": "输入密码进入保护会话以继续:",
|
"form_label": "输入密码进入保护会话以继续:",
|
||||||
"start_button": "开始保护会话 <kbd>回车</kbd>"
|
"start_button": "开始保护会话"
|
||||||
},
|
},
|
||||||
"recent_changes": {
|
"recent_changes": {
|
||||||
"title": "最近修改",
|
"title": "最近修改",
|
||||||
"erase_notes_button": "立即清理已删除的笔记",
|
"erase_notes_button": "立即清理已删除的笔记",
|
||||||
"close": "关闭",
|
|
||||||
"deleted_notes_message": "已删除的笔记已清理。",
|
"deleted_notes_message": "已删除的笔记已清理。",
|
||||||
"no_changes_message": "暂无修改...",
|
"no_changes_message": "暂无修改...",
|
||||||
"undelete_link": "恢复删除",
|
"undelete_link": "恢复删除",
|
||||||
@@ -273,7 +259,6 @@
|
|||||||
"delete_all_revisions": "删除此笔记的所有修订版本",
|
"delete_all_revisions": "删除此笔记的所有修订版本",
|
||||||
"delete_all_button": "删除所有修订版本",
|
"delete_all_button": "删除所有修订版本",
|
||||||
"help_title": "关于笔记修订版本的帮助",
|
"help_title": "关于笔记修订版本的帮助",
|
||||||
"close": "关闭",
|
|
||||||
"revision_last_edited": "此修订版本上次编辑于 {{date}}",
|
"revision_last_edited": "此修订版本上次编辑于 {{date}}",
|
||||||
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
|
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
|
||||||
"no_revisions": "此笔记暂无修订版本...",
|
"no_revisions": "此笔记暂无修订版本...",
|
||||||
@@ -295,7 +280,6 @@
|
|||||||
},
|
},
|
||||||
"sort_child_notes": {
|
"sort_child_notes": {
|
||||||
"sort_children_by": "按...排序子笔记",
|
"sort_children_by": "按...排序子笔记",
|
||||||
"close": "关闭",
|
|
||||||
"sorting_criteria": "排序条件",
|
"sorting_criteria": "排序条件",
|
||||||
"title": "标题",
|
"title": "标题",
|
||||||
"date_created": "创建日期",
|
"date_created": "创建日期",
|
||||||
@@ -309,13 +293,12 @@
|
|||||||
"sort_with_respect_to_different_character_sorting": "根据不同语言或地区的字符排序和排序规则排序。",
|
"sort_with_respect_to_different_character_sorting": "根据不同语言或地区的字符排序和排序规则排序。",
|
||||||
"natural_sort_language": "自然排序语言",
|
"natural_sort_language": "自然排序语言",
|
||||||
"the_language_code_for_natural_sort": "自然排序的语言代码,例如中文的 \"zh-CN\"。",
|
"the_language_code_for_natural_sort": "自然排序的语言代码,例如中文的 \"zh-CN\"。",
|
||||||
"sort": "排序 <kbd>Enter</kbd>"
|
"sort": "排序"
|
||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"upload_attachments_to_note": "上传附件到笔记",
|
"upload_attachments_to_note": "上传附件到笔记",
|
||||||
"close": "关闭",
|
|
||||||
"choose_files": "选择文件",
|
"choose_files": "选择文件",
|
||||||
"files_will_be_uploaded": "文件将作为附件上传到",
|
"files_will_be_uploaded": "文件将作为附件上传到 {{noteTitle}}",
|
||||||
"options": "选项",
|
"options": "选项",
|
||||||
"shrink_images": "缩小图片",
|
"shrink_images": "缩小图片",
|
||||||
"upload": "上传",
|
"upload": "上传",
|
||||||
@@ -441,7 +424,7 @@
|
|||||||
"share_favicon": "在分享页面中设置的 favicon 笔记。一般需要将它设置为分享和可继承。Favicon 笔记也必须位于分享子树中。可以考虑一并使用 'share_hidden_from_tree'。",
|
"share_favicon": "在分享页面中设置的 favicon 笔记。一般需要将它设置为分享和可继承。Favicon 笔记也必须位于分享子树中。可以考虑一并使用 'share_hidden_from_tree'。",
|
||||||
"is_owned_by_note": "由此笔记所有",
|
"is_owned_by_note": "由此笔记所有",
|
||||||
"other_notes_with_name": "其它含有 {{attributeType}} 名为 \"{{attributeName}}\" 的的笔记",
|
"other_notes_with_name": "其它含有 {{attributeType}} 名为 \"{{attributeName}}\" 的的笔记",
|
||||||
"and_more": "... 以及另外 {{count}} 个",
|
"and_more": "... 以及另外 {{count}} 个。",
|
||||||
"print_landscape": "导出为 PDF 时,将页面方向更改为横向而不是纵向。",
|
"print_landscape": "导出为 PDF 时,将页面方向更改为横向而不是纵向。",
|
||||||
"print_page_size": "导出为 PDF 时,更改页面大小。支持的值:<code>A0</code>、<code>A1</code>、<code>A2</code>、<code>A3</code>、<code>A4</code>、<code>A5</code>、<code>A6</code>、<code>Legal</code>、<code>Letter</code>、<code>Tabloid</code>、<code>Ledger</code>。",
|
"print_page_size": "导出为 PDF 时,更改页面大小。支持的值:<code>A0</code>、<code>A1</code>、<code>A2</code>、<code>A3</code>、<code>A4</code>、<code>A5</code>、<code>A6</code>、<code>Legal</code>、<code>Letter</code>、<code>Tabloid</code>、<code>Ledger</code>。",
|
||||||
"color_type": "颜色"
|
"color_type": "颜色"
|
||||||
@@ -449,7 +432,7 @@
|
|||||||
"attribute_editor": {
|
"attribute_editor": {
|
||||||
"help_text_body1": "要添加标签,只需输入例如 <code>#rock</code> 或者如果您还想添加值,则例如 <code>#year = 2020</code>",
|
"help_text_body1": "要添加标签,只需输入例如 <code>#rock</code> 或者如果您还想添加值,则例如 <code>#year = 2020</code>",
|
||||||
"help_text_body2": "对于关系,请输入 <code>~author = @</code>,这将显示一个自动完成列表,您可以查找所需的笔记。",
|
"help_text_body2": "对于关系,请输入 <code>~author = @</code>,这将显示一个自动完成列表,您可以查找所需的笔记。",
|
||||||
"help_text_body3": "您也可以使用右侧的 <code>+</code> 按钮添加标签和关系。</p>",
|
"help_text_body3": "您也可以使用右侧的 <code>+</code> 按钮添加标签和关系。",
|
||||||
"save_attributes": "保存属性 <enter>",
|
"save_attributes": "保存属性 <enter>",
|
||||||
"add_a_new_attribute": "添加新属性",
|
"add_a_new_attribute": "添加新属性",
|
||||||
"add_new_label": "添加新标签 <kbd data-command=\"addNewLabel\"></kbd>",
|
"add_new_label": "添加新标签 <kbd data-command=\"addNewLabel\"></kbd>",
|
||||||
@@ -749,7 +732,8 @@
|
|||||||
"note_type": "笔记类型",
|
"note_type": "笔记类型",
|
||||||
"editable": "可编辑",
|
"editable": "可编辑",
|
||||||
"basic_properties": "基本属性",
|
"basic_properties": "基本属性",
|
||||||
"language": "语言"
|
"language": "语言",
|
||||||
|
"configure_code_notes": "配置代码注释..."
|
||||||
},
|
},
|
||||||
"book_properties": {
|
"book_properties": {
|
||||||
"view_type": "视图类型",
|
"view_type": "视图类型",
|
||||||
@@ -865,7 +849,7 @@
|
|||||||
"debug": "调试",
|
"debug": "调试",
|
||||||
"debug_description": "调试将打印额外的调试信息到控制台,以帮助调试复杂查询",
|
"debug_description": "调试将打印额外的调试信息到控制台,以帮助调试复杂查询",
|
||||||
"action": "操作",
|
"action": "操作",
|
||||||
"search_button": "搜索 <kbd>回车</kbd>",
|
"search_button": "搜索",
|
||||||
"search_execute": "搜索并执行操作",
|
"search_execute": "搜索并执行操作",
|
||||||
"save_to_note": "保存到笔记",
|
"save_to_note": "保存到笔记",
|
||||||
"search_parameters": "搜索参数",
|
"search_parameters": "搜索参数",
|
||||||
@@ -965,7 +949,7 @@
|
|||||||
"no_attachments": "此笔记没有附件。"
|
"no_attachments": "此笔记没有附件。"
|
||||||
},
|
},
|
||||||
"book": {
|
"book": {
|
||||||
"no_children_help": "此类型为书籍的笔记没有任何子笔记,因此没有内容显示。请参阅 <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> 了解详情"
|
"no_children_help": "此类型为书籍的笔记没有任何子笔记,因此没有内容显示。请参阅 <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> 了解详情。"
|
||||||
},
|
},
|
||||||
"editable_code": {
|
"editable_code": {
|
||||||
"placeholder": "在这里输入您的代码笔记内容..."
|
"placeholder": "在这里输入您的代码笔记内容..."
|
||||||
@@ -984,7 +968,7 @@
|
|||||||
},
|
},
|
||||||
"protected_session": {
|
"protected_session": {
|
||||||
"enter_password_instruction": "显示受保护的笔记需要输入您的密码:",
|
"enter_password_instruction": "显示受保护的笔记需要输入您的密码:",
|
||||||
"start_session_button": "开始受保护的会话",
|
"start_session_button": "开始受保护的会话 <kbd>Enter</kbd>",
|
||||||
"started": "受保护的会话已启动。",
|
"started": "受保护的会话已启动。",
|
||||||
"wrong_password": "密码错误。",
|
"wrong_password": "密码错误。",
|
||||||
"protecting-finished-successfully": "保护操作已成功完成。",
|
"protecting-finished-successfully": "保护操作已成功完成。",
|
||||||
@@ -1045,7 +1029,7 @@
|
|||||||
"error_creating_anonymized_database": "无法创建匿名化数据库,请检查后端日志以获取详细信息",
|
"error_creating_anonymized_database": "无法创建匿名化数据库,请检查后端日志以获取详细信息",
|
||||||
"successfully_created_fully_anonymized_database": "成功创建完全匿名化的数据库,路径为 {{anonymizedFilePath}}",
|
"successfully_created_fully_anonymized_database": "成功创建完全匿名化的数据库,路径为 {{anonymizedFilePath}}",
|
||||||
"successfully_created_lightly_anonymized_database": "成功创建轻度匿名化的数据库,路径为 {{anonymizedFilePath}}",
|
"successfully_created_lightly_anonymized_database": "成功创建轻度匿名化的数据库,路径为 {{anonymizedFilePath}}",
|
||||||
"no_anonymized_database_yet": "尚无匿名化数据库"
|
"no_anonymized_database_yet": "尚无匿名化数据库。"
|
||||||
},
|
},
|
||||||
"database_integrity_check": {
|
"database_integrity_check": {
|
||||||
"title": "数据库完整性检查",
|
"title": "数据库完整性检查",
|
||||||
@@ -1118,17 +1102,17 @@
|
|||||||
"title": "主题",
|
"title": "主题",
|
||||||
"theme_label": "主题",
|
"theme_label": "主题",
|
||||||
"override_theme_fonts_label": "覆盖主题字体",
|
"override_theme_fonts_label": "覆盖主题字体",
|
||||||
"auto_theme": "自动",
|
"triliumnext": "Trilium(跟随系统颜色方案)",
|
||||||
"light_theme": "浅色",
|
"triliumnext-light": "Trilium(浅色)",
|
||||||
"dark_theme": "深色",
|
"triliumnext-dark": "Trilium(深色)",
|
||||||
"triliumnext": "TriliumNext Beta(跟随系统颜色方案)",
|
|
||||||
"triliumnext-light": "TriliumNext Beta(浅色)",
|
|
||||||
"triliumnext-dark": "TriliumNext Beta(深色)",
|
|
||||||
"layout": "布局",
|
"layout": "布局",
|
||||||
"layout-vertical-title": "垂直",
|
"layout-vertical-title": "垂直",
|
||||||
"layout-horizontal-title": "水平",
|
"layout-horizontal-title": "水平",
|
||||||
"layout-vertical-description": "启动栏位于左侧(默认)",
|
"layout-vertical-description": "启动栏位于左侧(默认)",
|
||||||
"layout-horizontal-description": "启动栏位于标签页栏下方,标签页栏现在是全宽的。"
|
"layout-horizontal-description": "启动栏位于标签页栏下方,标签页栏现在是全宽的。",
|
||||||
|
"auto_theme": "传统(跟随系统配色方案)",
|
||||||
|
"light_theme": "传统(浅色)",
|
||||||
|
"dark_theme": "传统(深色)"
|
||||||
},
|
},
|
||||||
"zoom_factor": {
|
"zoom_factor": {
|
||||||
"title": "缩放系数(仅桌面客户端有效)",
|
"title": "缩放系数(仅桌面客户端有效)",
|
||||||
@@ -1182,7 +1166,7 @@
|
|||||||
},
|
},
|
||||||
"revisions_snapshot_interval": {
|
"revisions_snapshot_interval": {
|
||||||
"note_revisions_snapshot_interval_title": "笔记修订快照间隔",
|
"note_revisions_snapshot_interval_title": "笔记修订快照间隔",
|
||||||
"note_revisions_snapshot_description": "笔记修订快照间隔是创建新笔记修订的时间。有关更多信息,请参见 <a href=\"https://triliumnext.github.io/Docs/Wiki/note-revisions.html\" class=\"external\">wiki</a>。",
|
"note_revisions_snapshot_description": "笔记修订快照间隔是创建新笔记修订的时间。有关更多信息,请参见 <doc>wiki</doc>。",
|
||||||
"snapshot_time_interval_label": "笔记修订快照时间间隔:"
|
"snapshot_time_interval_label": "笔记修订快照时间间隔:"
|
||||||
},
|
},
|
||||||
"revisions_snapshot_limit": {
|
"revisions_snapshot_limit": {
|
||||||
@@ -1350,7 +1334,7 @@
|
|||||||
"oauth_title": "OAuth/OpenID 认证",
|
"oauth_title": "OAuth/OpenID 认证",
|
||||||
"oauth_description": "OpenID 是一种标准化方式,允许您使用其他服务(如 Google)的账号登录网站来验证您的身份。默认的身份提供者是 Google,但您可以更改为任何其他 OpenID 提供者。点击<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">这里</a>了解更多信息。请参阅这些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指南</a> 通过 Google 设置 OpenID 服务。",
|
"oauth_description": "OpenID 是一种标准化方式,允许您使用其他服务(如 Google)的账号登录网站来验证您的身份。默认的身份提供者是 Google,但您可以更改为任何其他 OpenID 提供者。点击<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">这里</a>了解更多信息。请参阅这些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指南</a> 通过 Google 设置 OpenID 服务。",
|
||||||
"oauth_description_warning": "要启用 OAuth/OpenID,您需要设置 config.ini 文件中的 OAuth/OpenID 基础 URL、客户端 ID 和客户端密钥,并重新启动应用程序。如果要从环境变量设置,请设置 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 环境变量。",
|
"oauth_description_warning": "要启用 OAuth/OpenID,您需要设置 config.ini 文件中的 OAuth/OpenID 基础 URL、客户端 ID 和客户端密钥,并重新启动应用程序。如果要从环境变量设置,请设置 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 环境变量。",
|
||||||
"oauth_missing_vars": "缺少以下设置项: {{missingVars}}",
|
"oauth_missing_vars": "缺少以下设置项:{{variables}}",
|
||||||
"oauth_user_account": "用户账号: ",
|
"oauth_user_account": "用户账号: ",
|
||||||
"oauth_user_email": "用户邮箱: ",
|
"oauth_user_email": "用户邮箱: ",
|
||||||
"oauth_user_not_logged_in": "未登录!"
|
"oauth_user_not_logged_in": "未登录!"
|
||||||
@@ -1456,9 +1440,9 @@
|
|||||||
"open-in-popup": "快速编辑"
|
"open-in-popup": "快速编辑"
|
||||||
},
|
},
|
||||||
"shared_info": {
|
"shared_info": {
|
||||||
"shared_publicly": "此笔记已公开分享于",
|
"help_link": "访问 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a> 获取帮助。",
|
||||||
"shared_locally": "此笔记已在本地分享于",
|
"shared_publicly": "该笔记已在 {{- link}} 上公开分享。",
|
||||||
"help_link": "访问 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a> 获取帮助。"
|
"shared_locally": "此笔记在本地通过 {{- link}} 进行共享。"
|
||||||
},
|
},
|
||||||
"note_types": {
|
"note_types": {
|
||||||
"text": "文本",
|
"text": "文本",
|
||||||
@@ -1536,7 +1520,8 @@
|
|||||||
"hoist-this-note-workspace": "聚焦此笔记(工作区)",
|
"hoist-this-note-workspace": "聚焦此笔记(工作区)",
|
||||||
"refresh-saved-search-results": "刷新保存的搜索结果",
|
"refresh-saved-search-results": "刷新保存的搜索结果",
|
||||||
"create-child-note": "创建子笔记",
|
"create-child-note": "创建子笔记",
|
||||||
"unhoist": "取消聚焦"
|
"unhoist": "取消聚焦",
|
||||||
|
"toggle-sidebar": "切换侧边栏"
|
||||||
},
|
},
|
||||||
"title_bar_buttons": {
|
"title_bar_buttons": {
|
||||||
"window-on-top": "保持此窗口置顶"
|
"window-on-top": "保持此窗口置顶"
|
||||||
@@ -1888,14 +1873,19 @@
|
|||||||
"selected_provider": "已选提供商",
|
"selected_provider": "已选提供商",
|
||||||
"selected_provider_description": "选择用于聊天和补全功能的AI提供商",
|
"selected_provider_description": "选择用于聊天和补全功能的AI提供商",
|
||||||
"select_model": "选择模型...",
|
"select_model": "选择模型...",
|
||||||
"select_provider": "选择提供商..."
|
"select_provider": "选择提供商...",
|
||||||
|
"ai_enabled": "已启用 AI 功能",
|
||||||
|
"ai_disabled": "已禁用 AI 功能",
|
||||||
|
"no_models_found_online": "找不到模型。请检查您的 API 密钥及设置。",
|
||||||
|
"no_models_found_ollama": "找不到 Ollama 模型。请确认 Ollama 是否正在运行。",
|
||||||
|
"error_fetching": "获取模型失败:{{error}}"
|
||||||
},
|
},
|
||||||
"code-editor-options": {
|
"code-editor-options": {
|
||||||
"title": "编辑器"
|
"title": "编辑器"
|
||||||
},
|
},
|
||||||
"custom_date_time_format": {
|
"custom_date_time_format": {
|
||||||
"title": "自定义日期/时间格式",
|
"title": "自定义日期/时间格式",
|
||||||
"description": "通过<kbd></kbd>或工具栏的方式可自定义日期和时间格式,有关日期/时间格式字符串中各个字符的含义,请参阅<a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">Day.js docs</a>。",
|
"description": "通过<shortcut />或工具栏的方式可自定义日期和时间格式,有关日期/时间格式字符串中各个字符的含义,请参阅<doc>Day.js docs</doc>。",
|
||||||
"format_string": "日期/时间格式字符串:",
|
"format_string": "日期/时间格式字符串:",
|
||||||
"formatted_time": "格式化后日期/时间:"
|
"formatted_time": "格式化后日期/时间:"
|
||||||
},
|
},
|
||||||
@@ -2005,6 +1995,32 @@
|
|||||||
"open_externally": "在外部打开"
|
"open_externally": "在外部打开"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "关闭"
|
"close": "关闭",
|
||||||
|
"help_title": "显示关于此画面的更多信息"
|
||||||
|
},
|
||||||
|
"call_to_action": {
|
||||||
|
"background_effects_title": "背景效果现已推出稳定版本",
|
||||||
|
"background_effects_message": "在 Windows 装置上,背景效果现在已完全稳定。背景效果通过模糊背后的背景,为使用者界面增添一抹色彩。此技术也用于其他应用程序,例如 Windows 资源管理器。",
|
||||||
|
"background_effects_button": "启用背景效果",
|
||||||
|
"next_theme_title": "试用新 Trilium 主题",
|
||||||
|
"next_theme_message": "当前使用旧版主题,要试用新主题吗?",
|
||||||
|
"next_theme_button": "试用新主题",
|
||||||
|
"dismiss": "关闭"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"related_settings": "相关设置"
|
||||||
|
},
|
||||||
|
"settings_appearance": {
|
||||||
|
"related_code_blocks": "文本笔记中代码块的色彩方案",
|
||||||
|
"related_code_notes": "代码笔记的色彩方案"
|
||||||
|
},
|
||||||
|
"units": {
|
||||||
|
"percentage": "%"
|
||||||
|
},
|
||||||
|
"ui-performance": {
|
||||||
|
"title": "性能",
|
||||||
|
"enable-motion": "启用过渡和动画",
|
||||||
|
"enable-shadows": "启用阴影",
|
||||||
|
"enable-backdrop-effects": "启用菜单、弹窗和面板的背景效果"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "Πληροφορίες για το Trilium Notes",
|
"title": "Πληροφορίες για το Trilium Notes",
|
||||||
"close": "Κλείσιμο",
|
|
||||||
"homepage": "Αρχική Σελίδα:",
|
"homepage": "Αρχική Σελίδα:",
|
||||||
"app_version": "Έκδοση εφαρμογής:",
|
"app_version": "Έκδοση εφαρμογής:",
|
||||||
"db_version": "Έκδοση βάσης δεδομένων:",
|
"db_version": "Έκδοση βάσης δεδομένων:",
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "About Trilium Notes",
|
"title": "About Trilium Notes",
|
||||||
"close": "Close",
|
|
||||||
"homepage": "Homepage:",
|
"homepage": "Homepage:",
|
||||||
"app_version": "App version:",
|
"app_version": "App version:",
|
||||||
"db_version": "DB version:",
|
"db_version": "DB version:",
|
||||||
@@ -28,25 +27,22 @@
|
|||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "Add link",
|
"add_link": "Add link",
|
||||||
"help_on_links": "Help on links",
|
"help_on_links": "Help on links",
|
||||||
"close": "Close",
|
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"search_note": "search for note by its name",
|
"search_note": "search for note by its name",
|
||||||
"link_title_mirrors": "link title mirrors the note's current title",
|
"link_title_mirrors": "link title mirrors the note's current title",
|
||||||
"link_title_arbitrary": "link title can be changed arbitrarily",
|
"link_title_arbitrary": "link title can be changed arbitrarily",
|
||||||
"link_title": "Link title",
|
"link_title": "Link title",
|
||||||
"button_add_link": "Add link <kbd>enter</kbd>"
|
"button_add_link": "Add link"
|
||||||
},
|
},
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"edit_branch_prefix": "Edit branch prefix",
|
"edit_branch_prefix": "Edit branch prefix",
|
||||||
"help_on_tree_prefix": "Help on Tree prefix",
|
"help_on_tree_prefix": "Help on Tree prefix",
|
||||||
"close": "Close",
|
|
||||||
"prefix": "Prefix: ",
|
"prefix": "Prefix: ",
|
||||||
"save": "Save",
|
"save": "Save",
|
||||||
"branch_prefix_saved": "Branch prefix has been saved."
|
"branch_prefix_saved": "Branch prefix has been saved."
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"bulk_actions": "Bulk actions",
|
"bulk_actions": "Bulk actions",
|
||||||
"close": "Close",
|
|
||||||
"affected_notes": "Affected notes",
|
"affected_notes": "Affected notes",
|
||||||
"include_descendants": "Include descendants of the selected notes",
|
"include_descendants": "Include descendants of the selected notes",
|
||||||
"available_actions": "Available actions",
|
"available_actions": "Available actions",
|
||||||
@@ -61,20 +57,18 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "Clone notes to...",
|
"clone_notes_to": "Clone notes to...",
|
||||||
"close": "Close",
|
|
||||||
"help_on_links": "Help on links",
|
"help_on_links": "Help on links",
|
||||||
"notes_to_clone": "Notes to clone",
|
"notes_to_clone": "Notes to clone",
|
||||||
"target_parent_note": "Target parent note",
|
"target_parent_note": "Target parent note",
|
||||||
"search_for_note_by_its_name": "search for note by its name",
|
"search_for_note_by_its_name": "search for note by its name",
|
||||||
"cloned_note_prefix_title": "Cloned note will be shown in note tree with given prefix",
|
"cloned_note_prefix_title": "Cloned note will be shown in note tree with given prefix",
|
||||||
"prefix_optional": "Prefix (optional)",
|
"prefix_optional": "Prefix (optional)",
|
||||||
"clone_to_selected_note": "Clone to selected note <kbd>enter</kbd>",
|
"clone_to_selected_note": "Clone to selected note",
|
||||||
"no_path_to_clone_to": "No path to clone to.",
|
"no_path_to_clone_to": "No path to clone to.",
|
||||||
"note_cloned": "Note \"{{clonedTitle}}\" has been cloned into \"{{targetTitle}}\""
|
"note_cloned": "Note \"{{clonedTitle}}\" has been cloned into \"{{targetTitle}}\""
|
||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"confirmation": "Confirmation",
|
"confirmation": "Confirmation",
|
||||||
"close": "Close",
|
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"are_you_sure_remove_note": "Are you sure you want to remove the note \"{{title}}\" from relation map? ",
|
"are_you_sure_remove_note": "Are you sure you want to remove the note \"{{title}}\" from relation map? ",
|
||||||
@@ -87,9 +81,9 @@
|
|||||||
"delete_all_clones_description": "Delete also all clones (can be undone in recent changes)",
|
"delete_all_clones_description": "Delete also all clones (can be undone in recent changes)",
|
||||||
"erase_notes_description": "Normal (soft) deletion only marks the notes as deleted and they can be undeleted (in recent changes dialog) within a period of time. Checking this option will erase the notes immediately and it won't be possible to undelete the notes.",
|
"erase_notes_description": "Normal (soft) deletion only marks the notes as deleted and they can be undeleted (in recent changes dialog) within a period of time. Checking this option will erase the notes immediately and it won't be possible to undelete the notes.",
|
||||||
"erase_notes_warning": "Erase notes permanently (can't be undone), including all clones. This will force application reload.",
|
"erase_notes_warning": "Erase notes permanently (can't be undone), including all clones. This will force application reload.",
|
||||||
"notes_to_be_deleted": "Following notes will be deleted ({{- noteCount}})",
|
"notes_to_be_deleted": "Following notes will be deleted ({{notesCount}})",
|
||||||
"no_note_to_delete": "No note will be deleted (only clones).",
|
"no_note_to_delete": "No note will be deleted (only clones).",
|
||||||
"broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{- relationCount}})",
|
"broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{ relationCount}})",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"deleted_relation_text": "Note {{- note}} (to be deleted) is referenced by relation {{- relation}} originating from {{- source}}."
|
"deleted_relation_text": "Note {{- note}} (to be deleted) is referenced by relation {{- relation}} originating from {{- source}}."
|
||||||
@@ -113,21 +107,20 @@
|
|||||||
"format_pdf": "PDF - for printing or sharing purposes."
|
"format_pdf": "PDF - for printing or sharing purposes."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"fullDocumentation": "Help (full documentation is available <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)",
|
"title": "Cheatsheet",
|
||||||
"close": "Close",
|
|
||||||
"noteNavigation": "Note navigation",
|
"noteNavigation": "Note navigation",
|
||||||
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - go up/down in the list of notes",
|
"goUpDown": "go up/down in the list of notes",
|
||||||
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - collapse/expand node",
|
"collapseExpand": "collapse/expand node",
|
||||||
"notSet": "not set",
|
"notSet": "not set",
|
||||||
"goBackForwards": "go back / forwards in the history",
|
"goBackForwards": "go back / forwards in the history",
|
||||||
"showJumpToNoteDialog": "show <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Jump to\" dialog</a>",
|
"showJumpToNoteDialog": "show <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Jump to\" dialog</a>",
|
||||||
"scrollToActiveNote": "scroll to active note",
|
"scrollToActiveNote": "scroll to active note",
|
||||||
"jumpToParentNote": "<kbd>Backspace</kbd> - jump to parent note",
|
"jumpToParentNote": "jump to parent note",
|
||||||
"collapseWholeTree": "collapse whole note tree",
|
"collapseWholeTree": "collapse whole note tree",
|
||||||
"collapseSubTree": "collapse sub-tree",
|
"collapseSubTree": "collapse sub-tree",
|
||||||
"tabShortcuts": "Tab shortcuts",
|
"tabShortcuts": "Tab shortcuts",
|
||||||
"newTabNoteLink": "<kbd>Ctrl+click</kbd> - (or <kbd>middle mouse click</kbd>) on note link opens note in a new tab",
|
"newTabNoteLink": "on note link opens note in a new tab",
|
||||||
"newTabWithActivationNoteLink": "<kbd>Ctrl+Shift+click</kbd> - (or <kbd>Shift+middle mouse click</kbd>) on note link opens and activates the note in a new tab",
|
"newTabWithActivationNoteLink": "on note link opens and activates the note in a new tab",
|
||||||
"onlyInDesktop": "Only in desktop (Electron build)",
|
"onlyInDesktop": "Only in desktop (Electron build)",
|
||||||
"openEmptyTab": "open empty tab",
|
"openEmptyTab": "open empty tab",
|
||||||
"closeActiveTab": "close active tab",
|
"closeActiveTab": "close active tab",
|
||||||
@@ -142,14 +135,14 @@
|
|||||||
"moveNoteUpHierarchy": "move note up in the hierarchy",
|
"moveNoteUpHierarchy": "move note up in the hierarchy",
|
||||||
"multiSelectNote": "multi-select note above/below",
|
"multiSelectNote": "multi-select note above/below",
|
||||||
"selectAllNotes": "select all notes in the current level",
|
"selectAllNotes": "select all notes in the current level",
|
||||||
"selectNote": "<kbd>Shift+click</kbd> - select note",
|
"selectNote": "select note",
|
||||||
"copyNotes": "copy active note (or current selection) into clipboard (used for <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">cloning</a>)",
|
"copyNotes": "copy active note (or current selection) into clipboard (used for <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">cloning</a>)",
|
||||||
"cutNotes": "cut current note (or current selection) into clipboard (used for moving notes)",
|
"cutNotes": "cut current note (or current selection) into clipboard (used for moving notes)",
|
||||||
"pasteNotes": "paste note(s) as sub-note into active note (which is either move or clone depending on whether it was copied or cut into clipboard)",
|
"pasteNotes": "paste note(s) as sub-note into active note (which is either move or clone depending on whether it was copied or cut into clipboard)",
|
||||||
"deleteNotes": "delete note / sub-tree",
|
"deleteNotes": "delete note / sub-tree",
|
||||||
"editingNotes": "Editing notes",
|
"editingNotes": "Editing notes",
|
||||||
"editNoteTitle": "in tree pane will switch from tree pane into note title. Enter from note title will switch focus to text editor. <kbd>Ctrl+.</kbd> will switch back from editor to tree pane.",
|
"editNoteTitle": "in tree pane will switch from tree pane into note title. Enter from note title will switch focus to text editor. <kbd>Ctrl+.</kbd> will switch back from editor to tree pane.",
|
||||||
"createEditLink": "<kbd>Ctrl+K</kbd> - create / edit external link",
|
"createEditLink": "create / edit external link",
|
||||||
"createInternalLink": "create internal link",
|
"createInternalLink": "create internal link",
|
||||||
"followLink": "follow link under cursor",
|
"followLink": "follow link under cursor",
|
||||||
"insertDateTime": "insert current date and time at caret position",
|
"insertDateTime": "insert current date and time at caret position",
|
||||||
@@ -169,7 +162,6 @@
|
|||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"importIntoNote": "Import into note",
|
"importIntoNote": "Import into note",
|
||||||
"close": "Close",
|
|
||||||
"chooseImportFile": "Choose import file",
|
"chooseImportFile": "Choose import file",
|
||||||
"importDescription": "Content of the selected file(s) will be imported as child note(s) into",
|
"importDescription": "Content of the selected file(s) will be imported as child note(s) into",
|
||||||
"options": "Options",
|
"options": "Options",
|
||||||
@@ -196,14 +188,13 @@
|
|||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "Include note",
|
"dialog_title": "Include note",
|
||||||
"close": "Close",
|
|
||||||
"label_note": "Note",
|
"label_note": "Note",
|
||||||
"placeholder_search": "search for note by its name",
|
"placeholder_search": "search for note by its name",
|
||||||
"box_size_prompt": "Box size of the included note:",
|
"box_size_prompt": "Box size of the included note:",
|
||||||
"box_size_small": "small (~ 10 lines)",
|
"box_size_small": "small (~ 10 lines)",
|
||||||
"box_size_medium": "medium (~ 30 lines)",
|
"box_size_medium": "medium (~ 30 lines)",
|
||||||
"box_size_full": "full (box shows complete text)",
|
"box_size_full": "full (box shows complete text)",
|
||||||
"button_include": "Include note <kbd>enter</kbd>"
|
"button_include": "Include note"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"modalTitle": "Info message",
|
"modalTitle": "Info message",
|
||||||
@@ -212,23 +203,20 @@
|
|||||||
},
|
},
|
||||||
"jump_to_note": {
|
"jump_to_note": {
|
||||||
"search_placeholder": "Search for note by its name or type > for commands...",
|
"search_placeholder": "Search for note by its name or type > for commands...",
|
||||||
"close": "Close",
|
"search_button": "Search in full text"
|
||||||
"search_button": "Search in full text <kbd>Ctrl+Enter</kbd>"
|
|
||||||
},
|
},
|
||||||
"markdown_import": {
|
"markdown_import": {
|
||||||
"dialog_title": "Markdown import",
|
"dialog_title": "Markdown import",
|
||||||
"close": "Close",
|
|
||||||
"modal_body_text": "Because of browser sandbox it's not possible to directly read clipboard from JavaScript. Please paste the Markdown to import to textarea below and click on Import button",
|
"modal_body_text": "Because of browser sandbox it's not possible to directly read clipboard from JavaScript. Please paste the Markdown to import to textarea below and click on Import button",
|
||||||
"import_button": "Import Ctrl+Enter",
|
"import_button": "Import",
|
||||||
"import_success": "Markdown content has been imported into the document."
|
"import_success": "Markdown content has been imported into the document."
|
||||||
},
|
},
|
||||||
"move_to": {
|
"move_to": {
|
||||||
"dialog_title": "Move notes to ...",
|
"dialog_title": "Move notes to ...",
|
||||||
"close": "Close",
|
|
||||||
"notes_to_move": "Notes to move",
|
"notes_to_move": "Notes to move",
|
||||||
"target_parent_note": "Target parent note",
|
"target_parent_note": "Target parent note",
|
||||||
"search_placeholder": "search for note by its name",
|
"search_placeholder": "search for note by its name",
|
||||||
"move_button": "Move to selected note <kbd>enter</kbd>",
|
"move_button": "Move to selected note",
|
||||||
"error_no_path": "No path to move to.",
|
"error_no_path": "No path to move to.",
|
||||||
"move_success_message": "Selected notes have been moved into "
|
"move_success_message": "Selected notes have been moved into "
|
||||||
},
|
},
|
||||||
@@ -236,20 +224,19 @@
|
|||||||
"change_path_prompt": "Change where to create the new note:",
|
"change_path_prompt": "Change where to create the new note:",
|
||||||
"search_placeholder": "search path by name (default if empty)",
|
"search_placeholder": "search path by name (default if empty)",
|
||||||
"modal_title": "Choose note type",
|
"modal_title": "Choose note type",
|
||||||
"close": "Close",
|
|
||||||
"modal_body": "Choose note type / template of the new note:",
|
"modal_body": "Choose note type / template of the new note:",
|
||||||
"templates": "Templates:"
|
"templates": "Templates",
|
||||||
|
"builtin_templates": "Built-in Templates"
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"title": "Password is not set",
|
"title": "Password is not set",
|
||||||
"close": "Close",
|
|
||||||
"body1": "Protected notes are encrypted using a user password, but password has not been set yet.",
|
"body1": "Protected notes are encrypted using a user password, but password has not been set yet.",
|
||||||
"body2": "To be able to protect notes, click <a class=\"open-password-options-button\" href=\"javascript:\">here</a> to open the Options dialog and set your password."
|
"body2": "To be able to protect notes, click the button below to open the Options dialog and set your password.",
|
||||||
|
"go_to_password_options": "Go to Password options"
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"title": "Prompt",
|
"title": "Prompt",
|
||||||
"close": "Close",
|
"ok": "OK",
|
||||||
"ok": "OK <kbd>enter</kbd>",
|
|
||||||
"defaultTitle": "Prompt"
|
"defaultTitle": "Prompt"
|
||||||
},
|
},
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
@@ -257,12 +244,11 @@
|
|||||||
"help_title": "Help on Protected notes",
|
"help_title": "Help on Protected notes",
|
||||||
"close_label": "Close",
|
"close_label": "Close",
|
||||||
"form_label": "To proceed with requested action you need to start protected session by entering password:",
|
"form_label": "To proceed with requested action you need to start protected session by entering password:",
|
||||||
"start_button": "Start protected session <kbd>enter</kbd>"
|
"start_button": "Start protected session"
|
||||||
},
|
},
|
||||||
"recent_changes": {
|
"recent_changes": {
|
||||||
"title": "Recent changes",
|
"title": "Recent changes",
|
||||||
"erase_notes_button": "Erase deleted notes now",
|
"erase_notes_button": "Erase deleted notes now",
|
||||||
"close": "Close",
|
|
||||||
"deleted_notes_message": "Deleted notes have been erased.",
|
"deleted_notes_message": "Deleted notes have been erased.",
|
||||||
"no_changes_message": "No changes yet...",
|
"no_changes_message": "No changes yet...",
|
||||||
"undelete_link": "undelete",
|
"undelete_link": "undelete",
|
||||||
@@ -273,7 +259,6 @@
|
|||||||
"delete_all_revisions": "Delete all revisions of this note",
|
"delete_all_revisions": "Delete all revisions of this note",
|
||||||
"delete_all_button": "Delete all revisions",
|
"delete_all_button": "Delete all revisions",
|
||||||
"help_title": "Help on Note Revisions",
|
"help_title": "Help on Note Revisions",
|
||||||
"close": "Close",
|
|
||||||
"revision_last_edited": "This revision was last edited on {{date}}",
|
"revision_last_edited": "This revision was last edited on {{date}}",
|
||||||
"confirm_delete_all": "Do you want to delete all revisions of this note?",
|
"confirm_delete_all": "Do you want to delete all revisions of this note?",
|
||||||
"no_revisions": "No revisions for this note yet...",
|
"no_revisions": "No revisions for this note yet...",
|
||||||
@@ -295,7 +280,6 @@
|
|||||||
},
|
},
|
||||||
"sort_child_notes": {
|
"sort_child_notes": {
|
||||||
"sort_children_by": "Sort children by...",
|
"sort_children_by": "Sort children by...",
|
||||||
"close": "Close",
|
|
||||||
"sorting_criteria": "Sorting criteria",
|
"sorting_criteria": "Sorting criteria",
|
||||||
"title": "title",
|
"title": "title",
|
||||||
"date_created": "date created",
|
"date_created": "date created",
|
||||||
@@ -309,13 +293,12 @@
|
|||||||
"sort_with_respect_to_different_character_sorting": "sort with respect to different character sorting and collation rules in different languages or regions.",
|
"sort_with_respect_to_different_character_sorting": "sort with respect to different character sorting and collation rules in different languages or regions.",
|
||||||
"natural_sort_language": "Natural sort language",
|
"natural_sort_language": "Natural sort language",
|
||||||
"the_language_code_for_natural_sort": "The language code for natural sort, e.g. \"zh-CN\" for Chinese.",
|
"the_language_code_for_natural_sort": "The language code for natural sort, e.g. \"zh-CN\" for Chinese.",
|
||||||
"sort": "Sort <kbd>enter</kbd>"
|
"sort": "Sort"
|
||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"upload_attachments_to_note": "Upload attachments to note",
|
"upload_attachments_to_note": "Upload attachments to note",
|
||||||
"close": "Close",
|
|
||||||
"choose_files": "Choose files",
|
"choose_files": "Choose files",
|
||||||
"files_will_be_uploaded": "Files will be uploaded as attachments into",
|
"files_will_be_uploaded": "Files will be uploaded as attachments into {{noteTitle}}",
|
||||||
"options": "Options",
|
"options": "Options",
|
||||||
"shrink_images": "Shrink images",
|
"shrink_images": "Shrink images",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
@@ -749,7 +732,8 @@
|
|||||||
"note_type": "Note type",
|
"note_type": "Note type",
|
||||||
"editable": "Editable",
|
"editable": "Editable",
|
||||||
"basic_properties": "Basic Properties",
|
"basic_properties": "Basic Properties",
|
||||||
"language": "Language"
|
"language": "Language",
|
||||||
|
"configure_code_notes": "Configure code notes..."
|
||||||
},
|
},
|
||||||
"book_properties": {
|
"book_properties": {
|
||||||
"view_type": "View type",
|
"view_type": "View type",
|
||||||
@@ -865,7 +849,7 @@
|
|||||||
"debug": "debug",
|
"debug": "debug",
|
||||||
"debug_description": "Debug will print extra debugging information into the console to aid in debugging complex queries",
|
"debug_description": "Debug will print extra debugging information into the console to aid in debugging complex queries",
|
||||||
"action": "action",
|
"action": "action",
|
||||||
"search_button": "Search <kbd>enter</kbd>",
|
"search_button": "Search",
|
||||||
"search_execute": "Search & Execute actions",
|
"search_execute": "Search & Execute actions",
|
||||||
"save_to_note": "Save to note",
|
"save_to_note": "Save to note",
|
||||||
"search_parameters": "Search Parameters",
|
"search_parameters": "Search Parameters",
|
||||||
@@ -1118,18 +1102,24 @@
|
|||||||
"title": "Application Theme",
|
"title": "Application Theme",
|
||||||
"theme_label": "Theme",
|
"theme_label": "Theme",
|
||||||
"override_theme_fonts_label": "Override theme fonts",
|
"override_theme_fonts_label": "Override theme fonts",
|
||||||
"auto_theme": "Auto",
|
"auto_theme": "Legacy (Follow system color scheme)",
|
||||||
"light_theme": "Light",
|
"light_theme": "Legacy (Light)",
|
||||||
"dark_theme": "Dark",
|
"dark_theme": "Legacy (Dark)",
|
||||||
"triliumnext": "TriliumNext Beta (Follow system color scheme)",
|
"triliumnext": "Trilium (Follow system color scheme)",
|
||||||
"triliumnext-light": "TriliumNext Beta (Light)",
|
"triliumnext-light": "Trilium (Light)",
|
||||||
"triliumnext-dark": "TriliumNext Beta (Dark)",
|
"triliumnext-dark": "Trilium (Dark)",
|
||||||
"layout": "Layout",
|
"layout": "Layout",
|
||||||
"layout-vertical-title": "Vertical",
|
"layout-vertical-title": "Vertical",
|
||||||
"layout-horizontal-title": "Horizontal",
|
"layout-horizontal-title": "Horizontal",
|
||||||
"layout-vertical-description": "launcher bar is on the left (default)",
|
"layout-vertical-description": "launcher bar is on the left (default)",
|
||||||
"layout-horizontal-description": "launcher bar is underneath the tab bar, the tab bar is now full width."
|
"layout-horizontal-description": "launcher bar is underneath the tab bar, the tab bar is now full width."
|
||||||
},
|
},
|
||||||
|
"ui-performance": {
|
||||||
|
"title": "Performance",
|
||||||
|
"enable-motion": "Enable transitions and animations",
|
||||||
|
"enable-shadows": "Enable shadows",
|
||||||
|
"enable-backdrop-effects": "Enable background effects for menus, popups and panels"
|
||||||
|
},
|
||||||
"ai_llm": {
|
"ai_llm": {
|
||||||
"not_started": "Not started",
|
"not_started": "Not started",
|
||||||
"title": "AI Settings",
|
"title": "AI Settings",
|
||||||
@@ -1270,7 +1260,12 @@
|
|||||||
"selected_provider": "Selected Provider",
|
"selected_provider": "Selected Provider",
|
||||||
"selected_provider_description": "Choose the AI provider for chat and completion features",
|
"selected_provider_description": "Choose the AI provider for chat and completion features",
|
||||||
"select_model": "Select model...",
|
"select_model": "Select model...",
|
||||||
"select_provider": "Select provider..."
|
"select_provider": "Select provider...",
|
||||||
|
"ai_enabled": "AI features enabled",
|
||||||
|
"ai_disabled": "AI features disabled",
|
||||||
|
"no_models_found_online": "No models found. Please check your API key and settings.",
|
||||||
|
"no_models_found_ollama": "No Ollama models found. Please check if Ollama is running.",
|
||||||
|
"error_fetching": "Error fetching models: {{error}}"
|
||||||
},
|
},
|
||||||
"zoom_factor": {
|
"zoom_factor": {
|
||||||
"title": "Zoom Factor (desktop build only)",
|
"title": "Zoom Factor (desktop build only)",
|
||||||
@@ -1327,7 +1322,7 @@
|
|||||||
},
|
},
|
||||||
"revisions_snapshot_interval": {
|
"revisions_snapshot_interval": {
|
||||||
"note_revisions_snapshot_interval_title": "Note Revision Snapshot Interval",
|
"note_revisions_snapshot_interval_title": "Note Revision Snapshot Interval",
|
||||||
"note_revisions_snapshot_description": "The Note revision snapshot interval is the time after which a new note revision will be created for the note. See <a href=\"https://triliumnext.github.io/Docs/Wiki/note-revisions.html\" class=\"external\">wiki</a> for more info.",
|
"note_revisions_snapshot_description": "The Note revision snapshot interval is the time after which a new note revision will be created for the note. See <doc>wiki</doc> for more info.",
|
||||||
"snapshot_time_interval_label": "Note revision snapshot time interval:"
|
"snapshot_time_interval_label": "Note revision snapshot time interval:"
|
||||||
},
|
},
|
||||||
"revisions_snapshot_limit": {
|
"revisions_snapshot_limit": {
|
||||||
@@ -1389,7 +1384,7 @@
|
|||||||
},
|
},
|
||||||
"custom_date_time_format": {
|
"custom_date_time_format": {
|
||||||
"title": "Custom Date/Time Format",
|
"title": "Custom Date/Time Format",
|
||||||
"description": "Customize the format of the date and time inserted via <kbd></kbd> or the toolbar. See <a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">Day.js docs</a> for available format tokens.",
|
"description": "Customize the format of the date and time inserted via <shortcut /> or the toolbar. See <doc>Day.js docs</doc> for available format tokens.",
|
||||||
"format_string": "Format string:",
|
"format_string": "Format string:",
|
||||||
"formatted_time": "Formatted date/time:"
|
"formatted_time": "Formatted date/time:"
|
||||||
},
|
},
|
||||||
@@ -1607,8 +1602,8 @@
|
|||||||
"open-in-popup": "Quick edit"
|
"open-in-popup": "Quick edit"
|
||||||
},
|
},
|
||||||
"shared_info": {
|
"shared_info": {
|
||||||
"shared_publicly": "This note is shared publicly on",
|
"shared_publicly": "This note is shared publicly on {{- link}}.",
|
||||||
"shared_locally": "This note is shared locally on",
|
"shared_locally": "This note is shared locally on {{- link}}.",
|
||||||
"help_link": "For help visit <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
"help_link": "For help visit <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||||
},
|
},
|
||||||
"note_types": {
|
"note_types": {
|
||||||
@@ -1687,7 +1682,8 @@
|
|||||||
"hoist-this-note-workspace": "Hoist this note (workspace)",
|
"hoist-this-note-workspace": "Hoist this note (workspace)",
|
||||||
"refresh-saved-search-results": "Refresh saved search results",
|
"refresh-saved-search-results": "Refresh saved search results",
|
||||||
"create-child-note": "Create child note",
|
"create-child-note": "Create child note",
|
||||||
"unhoist": "Unhoist"
|
"unhoist": "Unhoist",
|
||||||
|
"toggle-sidebar": "Toggle sidebar"
|
||||||
},
|
},
|
||||||
"title_bar_buttons": {
|
"title_bar_buttons": {
|
||||||
"window-on-top": "Keep Window on Top"
|
"window-on-top": "Keep Window on Top"
|
||||||
@@ -2007,6 +2003,26 @@
|
|||||||
"open_externally": "Open externally"
|
"open_externally": "Open externally"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "Close"
|
"close": "Close",
|
||||||
|
"help_title": "Display more information about this screen"
|
||||||
|
},
|
||||||
|
"call_to_action": {
|
||||||
|
"next_theme_title": "Try the new Trilium theme",
|
||||||
|
"next_theme_message": "You are currently using the legacy theme, would you like to try the new theme?",
|
||||||
|
"next_theme_button": "Try the new theme",
|
||||||
|
"background_effects_title": "Background effects are now stable",
|
||||||
|
"background_effects_message": "On Windows devices, background effects are now fully stable. The background effects adds a touch of color to the user interface by blurring the background behind it. This technique is also used in other applications such as Windows Explorer.",
|
||||||
|
"background_effects_button": "Enable background effects",
|
||||||
|
"dismiss": "Dismiss"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"related_settings": "Related settings"
|
||||||
|
},
|
||||||
|
"settings_appearance": {
|
||||||
|
"related_code_blocks": "Color scheme for code blocks in text notes",
|
||||||
|
"related_code_notes": "Color scheme for code notes"
|
||||||
|
},
|
||||||
|
"units": {
|
||||||
|
"percentage": "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "Acerca de Trilium Notes",
|
"title": "Acerca de Trilium Notes",
|
||||||
"close": "Cerrar",
|
|
||||||
"homepage": "Página principal:",
|
"homepage": "Página principal:",
|
||||||
"app_version": "Versión de la aplicación:",
|
"app_version": "Versión de la aplicación:",
|
||||||
"db_version": "Versión de base de datos:",
|
"db_version": "Versión de base de datos:",
|
||||||
@@ -28,25 +27,22 @@
|
|||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "Agregar enlace",
|
"add_link": "Agregar enlace",
|
||||||
"help_on_links": "Ayuda sobre enlaces",
|
"help_on_links": "Ayuda sobre enlaces",
|
||||||
"close": "Cerrar",
|
|
||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"search_note": "buscar nota por su nombre",
|
"search_note": "buscar nota por su nombre",
|
||||||
"link_title_mirrors": "el título del enlace replica el título actual de la nota",
|
"link_title_mirrors": "el título del enlace replica el título actual de la nota",
|
||||||
"link_title_arbitrary": "el título del enlace se puede cambiar arbitrariamente",
|
"link_title_arbitrary": "el título del enlace se puede cambiar arbitrariamente",
|
||||||
"link_title": "Título del enlace",
|
"link_title": "Título del enlace",
|
||||||
"button_add_link": "Agregar enlace <kbd>Enter</kbd>"
|
"button_add_link": "Agregar enlace"
|
||||||
},
|
},
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"edit_branch_prefix": "Editar prefijo de rama",
|
"edit_branch_prefix": "Editar prefijo de rama",
|
||||||
"help_on_tree_prefix": "Ayuda sobre el prefijo del árbol",
|
"help_on_tree_prefix": "Ayuda sobre el prefijo del árbol",
|
||||||
"close": "Cerrar",
|
|
||||||
"prefix": "Prefijo: ",
|
"prefix": "Prefijo: ",
|
||||||
"save": "Guardar",
|
"save": "Guardar",
|
||||||
"branch_prefix_saved": "Se ha guardado el prefijo de rama."
|
"branch_prefix_saved": "Se ha guardado el prefijo de rama."
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"bulk_actions": "Acciones en bloque",
|
"bulk_actions": "Acciones en bloque",
|
||||||
"close": "Cerrar",
|
|
||||||
"affected_notes": "Notas afectadas",
|
"affected_notes": "Notas afectadas",
|
||||||
"include_descendants": "Incluir descendientes de las notas seleccionadas",
|
"include_descendants": "Incluir descendientes de las notas seleccionadas",
|
||||||
"available_actions": "Acciones disponibles",
|
"available_actions": "Acciones disponibles",
|
||||||
@@ -61,20 +57,18 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "Clonar notas a...",
|
"clone_notes_to": "Clonar notas a...",
|
||||||
"close": "Cerrar",
|
|
||||||
"help_on_links": "Ayuda sobre enlaces",
|
"help_on_links": "Ayuda sobre enlaces",
|
||||||
"notes_to_clone": "Notas a clonar",
|
"notes_to_clone": "Notas a clonar",
|
||||||
"target_parent_note": "Nota padre de destino",
|
"target_parent_note": "Nota padre de destino",
|
||||||
"search_for_note_by_its_name": "buscar nota por su nombre",
|
"search_for_note_by_its_name": "buscar nota por su nombre",
|
||||||
"cloned_note_prefix_title": "La nota clonada se mostrará en el árbol de notas con el prefijo dado",
|
"cloned_note_prefix_title": "La nota clonada se mostrará en el árbol de notas con el prefijo dado",
|
||||||
"prefix_optional": "Prefijo (opcional)",
|
"prefix_optional": "Prefijo (opcional)",
|
||||||
"clone_to_selected_note": "Clonar a nota seleccionada <kbd>enter</kbd>",
|
"clone_to_selected_note": "Clonar a nota seleccionada",
|
||||||
"no_path_to_clone_to": "No hay ruta para clonar.",
|
"no_path_to_clone_to": "No hay ruta para clonar.",
|
||||||
"note_cloned": "La nota \"{{clonedTitle}}\" a sido clonada en \"{{targetTitle}}\""
|
"note_cloned": "La nota \"{{clonedTitle}}\" a sido clonada en \"{{targetTitle}}\""
|
||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"confirmation": "Confirmación",
|
"confirmation": "Confirmación",
|
||||||
"close": "Cerrar",
|
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"ok": "Aceptar",
|
"ok": "Aceptar",
|
||||||
"are_you_sure_remove_note": "¿Está seguro que desea eliminar la nota \"{{title}}\" del mapa de relaciones? ",
|
"are_you_sure_remove_note": "¿Está seguro que desea eliminar la nota \"{{title}}\" del mapa de relaciones? ",
|
||||||
@@ -87,9 +81,9 @@
|
|||||||
"delete_all_clones_description": "Eliminar también todos los clones (se puede deshacer en cambios recientes)",
|
"delete_all_clones_description": "Eliminar también todos los clones (se puede deshacer en cambios recientes)",
|
||||||
"erase_notes_description": "La eliminación normal (suave) solo marca las notas como eliminadas y se pueden recuperar (en el cuadro de diálogo de cambios recientes) dentro de un periodo de tiempo. Al marcar esta opción se borrarán las notas inmediatamente y no será posible recuperarlas.",
|
"erase_notes_description": "La eliminación normal (suave) solo marca las notas como eliminadas y se pueden recuperar (en el cuadro de diálogo de cambios recientes) dentro de un periodo de tiempo. Al marcar esta opción se borrarán las notas inmediatamente y no será posible recuperarlas.",
|
||||||
"erase_notes_warning": "Eliminar notas permanentemente (no se puede deshacer), incluidos todos los clones. Esto forzará la recarga de la aplicación.",
|
"erase_notes_warning": "Eliminar notas permanentemente (no se puede deshacer), incluidos todos los clones. Esto forzará la recarga de la aplicación.",
|
||||||
"notes_to_be_deleted": "Las siguientes notas serán eliminadas ({{- noteCount}})",
|
"notes_to_be_deleted": "Las siguientes notas serán eliminadas ({{notesCount}})",
|
||||||
"no_note_to_delete": "No se eliminará ninguna nota (solo clones).",
|
"no_note_to_delete": "No se eliminará ninguna nota (solo clones).",
|
||||||
"broken_relations_to_be_deleted": "Las siguientes relaciones se romperán y serán eliminadas ({{- relationCount}})",
|
"broken_relations_to_be_deleted": "Las siguientes relaciones se romperán y serán eliminadas ({{ relationCount}})",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"ok": "Aceptar",
|
"ok": "Aceptar",
|
||||||
"deleted_relation_text": "Nota {{- note}} (para ser eliminada) está referenciado por la relación {{- relation}} que se origina en {{- source}}."
|
"deleted_relation_text": "Nota {{- note}} (para ser eliminada) está referenciado por la relación {{- relation}} que se origina en {{- source}}."
|
||||||
@@ -113,21 +107,19 @@
|
|||||||
"format_pdf": "PDF - para propósitos de impresión o compartición."
|
"format_pdf": "PDF - para propósitos de impresión o compartición."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"fullDocumentation": "Ayuda (la documentación completa está disponible <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)",
|
|
||||||
"close": "Cerrar",
|
|
||||||
"noteNavigation": "Navegación de notas",
|
"noteNavigation": "Navegación de notas",
|
||||||
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - subir/bajar en la lista de notas",
|
"goUpDown": "subir/bajar en la lista de notas",
|
||||||
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - colapsar/expandir nodo",
|
"collapseExpand": "colapsar/expandir nodo",
|
||||||
"notSet": "no establecido",
|
"notSet": "no establecido",
|
||||||
"goBackForwards": "retroceder / avanzar en la historia",
|
"goBackForwards": "retroceder / avanzar en la historia",
|
||||||
"showJumpToNoteDialog": "mostrar <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Saltar a\" diálogo</a>",
|
"showJumpToNoteDialog": "mostrar <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Saltar a\" diálogo</a>",
|
||||||
"scrollToActiveNote": "desplazarse hasta la nota activa",
|
"scrollToActiveNote": "desplazarse hasta la nota activa",
|
||||||
"jumpToParentNote": "<kbd>Backspace</kbd> - saltar a la nota padre",
|
"jumpToParentNote": "saltar a la nota padre",
|
||||||
"collapseWholeTree": "colapsar todo el árbol de notas",
|
"collapseWholeTree": "colapsar todo el árbol de notas",
|
||||||
"collapseSubTree": "colapsar subárbol",
|
"collapseSubTree": "colapsar subárbol",
|
||||||
"tabShortcuts": "Atajos de pestañas",
|
"tabShortcuts": "Atajos de pestañas",
|
||||||
"newTabNoteLink": "<kbd>CTRL+clic</kbd> - (o <kbd>clic central del mouse</kbd>) en el enlace de la nota abre la nota en una nueva pestaña",
|
"newTabNoteLink": "en el enlace de la nota abre la nota en una nueva pestaña",
|
||||||
"newTabWithActivationNoteLink": "<kbd>Ctrl+Shift+clic</kbd> - (o <kbd>Shift+clic de rueda de ratón</kbd>) en el enlace de la nota abre y activa la nota en una nueva pestaña",
|
"newTabWithActivationNoteLink": "en el enlace de la nota abre y activa la nota en una nueva pestaña",
|
||||||
"onlyInDesktop": "Solo en escritorio (compilación con Electron)",
|
"onlyInDesktop": "Solo en escritorio (compilación con Electron)",
|
||||||
"openEmptyTab": "abrir pestaña vacía",
|
"openEmptyTab": "abrir pestaña vacía",
|
||||||
"closeActiveTab": "cerrar pestaña activa",
|
"closeActiveTab": "cerrar pestaña activa",
|
||||||
@@ -142,14 +134,14 @@
|
|||||||
"moveNoteUpHierarchy": "mover nota hacia arriba en la jerarquía",
|
"moveNoteUpHierarchy": "mover nota hacia arriba en la jerarquía",
|
||||||
"multiSelectNote": "selección múltiple de nota hacia arriba/abajo",
|
"multiSelectNote": "selección múltiple de nota hacia arriba/abajo",
|
||||||
"selectAllNotes": "seleccionar todas las notas en el nivel actual",
|
"selectAllNotes": "seleccionar todas las notas en el nivel actual",
|
||||||
"selectNote": "<kbd>Shift+click</kbd> - seleccionar nota",
|
"selectNote": "seleccionar nota",
|
||||||
"copyNotes": "copiar nota activa (o selección actual) al portapapeles (usado para <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonar</a>)",
|
"copyNotes": "copiar nota activa (o selección actual) al portapapeles (usado para <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonar</a>)",
|
||||||
"cutNotes": "cortar la nota actual (o la selección actual) en el portapapeles (usado para mover notas)",
|
"cutNotes": "cortar la nota actual (o la selección actual) en el portapapeles (usado para mover notas)",
|
||||||
"pasteNotes": "pegar notas como subnotas en la nota activa (que se puede mover o clonar dependiendo de si se copió o cortó en el portapapeles)",
|
"pasteNotes": "pegar notas como subnotas en la nota activa (que se puede mover o clonar dependiendo de si se copió o cortó en el portapapeles)",
|
||||||
"deleteNotes": "eliminar nota/subárbol",
|
"deleteNotes": "eliminar nota/subárbol",
|
||||||
"editingNotes": "Editando notas",
|
"editingNotes": "Editando notas",
|
||||||
"editNoteTitle": "en el panel de árbol cambiará del panel de árbol al título de la nota. Ingresar desde el título de la nota cambiará el foco al editor de texto. <kbd>Ctrl+.</kbd> cambiará de nuevo del editor al panel de árbol.",
|
"editNoteTitle": "en el panel de árbol cambiará del panel de árbol al título de la nota. Ingresar desde el título de la nota cambiará el foco al editor de texto. <kbd>Ctrl+.</kbd> cambiará de nuevo del editor al panel de árbol.",
|
||||||
"createEditLink": "<kbd>Ctrl+K</kbd> - crear/editar enlace externo",
|
"createEditLink": "crear/editar enlace externo",
|
||||||
"createInternalLink": "crear enlace interno",
|
"createInternalLink": "crear enlace interno",
|
||||||
"followLink": "siga el enlace debajo del cursor",
|
"followLink": "siga el enlace debajo del cursor",
|
||||||
"insertDateTime": "insertar la fecha y hora actuales en la posición del cursor",
|
"insertDateTime": "insertar la fecha y hora actuales en la posición del cursor",
|
||||||
@@ -165,11 +157,11 @@
|
|||||||
"showSQLConsole": "mostrar consola SQL",
|
"showSQLConsole": "mostrar consola SQL",
|
||||||
"other": "Otro",
|
"other": "Otro",
|
||||||
"quickSearch": "centrarse en la entrada de búsqueda rápida",
|
"quickSearch": "centrarse en la entrada de búsqueda rápida",
|
||||||
"inPageSearch": "búsqueda en la página"
|
"inPageSearch": "búsqueda en la página",
|
||||||
|
"title": "Hoja de ayuda"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"importIntoNote": "Importar a nota",
|
"importIntoNote": "Importar a nota",
|
||||||
"close": "Cerrar",
|
|
||||||
"chooseImportFile": "Elija el archivo de importación",
|
"chooseImportFile": "Elija el archivo de importación",
|
||||||
"importDescription": "El contenido de los archivos seleccionados se importará como notas secundarias en",
|
"importDescription": "El contenido de los archivos seleccionados se importará como notas secundarias en",
|
||||||
"options": "Opciones",
|
"options": "Opciones",
|
||||||
@@ -196,14 +188,13 @@
|
|||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "Incluir nota",
|
"dialog_title": "Incluir nota",
|
||||||
"close": "Cerrar",
|
|
||||||
"label_note": "Nota",
|
"label_note": "Nota",
|
||||||
"placeholder_search": "buscar nota por su nombre",
|
"placeholder_search": "buscar nota por su nombre",
|
||||||
"box_size_prompt": "Tamaño de caja de la nota incluida:",
|
"box_size_prompt": "Tamaño de caja de la nota incluida:",
|
||||||
"box_size_small": "pequeño (~ 10 líneas)",
|
"box_size_small": "pequeño (~ 10 líneas)",
|
||||||
"box_size_medium": "medio (~ 30 líneas)",
|
"box_size_medium": "medio (~ 30 líneas)",
|
||||||
"box_size_full": "completo (el cuadro muestra el texto completo)",
|
"box_size_full": "completo (el cuadro muestra el texto completo)",
|
||||||
"button_include": "Incluir nota <kbd>Enter</kbd>"
|
"button_include": "Incluir nota"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"modalTitle": "Mensaje informativo",
|
"modalTitle": "Mensaje informativo",
|
||||||
@@ -211,24 +202,21 @@
|
|||||||
"okButton": "Aceptar"
|
"okButton": "Aceptar"
|
||||||
},
|
},
|
||||||
"jump_to_note": {
|
"jump_to_note": {
|
||||||
"close": "Cerrar",
|
"search_button": "Buscar en texto completo",
|
||||||
"search_button": "Buscar en texto completo <kbd>Ctrl+Enter</kbd>",
|
|
||||||
"search_placeholder": "Busque nota por su nombre o escriba > para comandos..."
|
"search_placeholder": "Busque nota por su nombre o escriba > para comandos..."
|
||||||
},
|
},
|
||||||
"markdown_import": {
|
"markdown_import": {
|
||||||
"dialog_title": "Importación de Markdown",
|
"dialog_title": "Importación de Markdown",
|
||||||
"close": "Cerrar",
|
|
||||||
"modal_body_text": "Debido al entorno limitado del navegador, no es posible leer directamente el portapapeles desde JavaScript. Por favor, pegue el código Markdown para importar en el área de texto a continuación y haga clic en el botón Importar",
|
"modal_body_text": "Debido al entorno limitado del navegador, no es posible leer directamente el portapapeles desde JavaScript. Por favor, pegue el código Markdown para importar en el área de texto a continuación y haga clic en el botón Importar",
|
||||||
"import_button": "Importar Ctrl+Enter",
|
"import_button": "Importar",
|
||||||
"import_success": "El contenido de Markdown se ha importado al documento."
|
"import_success": "El contenido de Markdown se ha importado al documento."
|
||||||
},
|
},
|
||||||
"move_to": {
|
"move_to": {
|
||||||
"dialog_title": "Mover notas a...",
|
"dialog_title": "Mover notas a...",
|
||||||
"close": "Cerrar",
|
|
||||||
"notes_to_move": "Notas a mover",
|
"notes_to_move": "Notas a mover",
|
||||||
"target_parent_note": "Nota padre de destino",
|
"target_parent_note": "Nota padre de destino",
|
||||||
"search_placeholder": "buscar nota por su nombre",
|
"search_placeholder": "buscar nota por su nombre",
|
||||||
"move_button": "Mover a la nota seleccionada <kbd>enter</kbd>",
|
"move_button": "Mover a la nota seleccionada",
|
||||||
"error_no_path": "No hay ruta a donde mover.",
|
"error_no_path": "No hay ruta a donde mover.",
|
||||||
"move_success_message": "Las notas seleccionadas se han movido a "
|
"move_success_message": "Las notas seleccionadas se han movido a "
|
||||||
},
|
},
|
||||||
@@ -236,20 +224,19 @@
|
|||||||
"change_path_prompt": "Cambiar donde se creará la nueva nota:",
|
"change_path_prompt": "Cambiar donde se creará la nueva nota:",
|
||||||
"search_placeholder": "ruta de búsqueda por nombre (por defecto si está vacío)",
|
"search_placeholder": "ruta de búsqueda por nombre (por defecto si está vacío)",
|
||||||
"modal_title": "Elija el tipo de nota",
|
"modal_title": "Elija el tipo de nota",
|
||||||
"close": "Cerrar",
|
|
||||||
"modal_body": "Elija el tipo de nota/plantilla de la nueva nota:",
|
"modal_body": "Elija el tipo de nota/plantilla de la nueva nota:",
|
||||||
"templates": "Plantillas:"
|
"templates": "Plantillas",
|
||||||
|
"builtin_templates": "Plantillas incluidas"
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"title": "La contraseña no está establecida",
|
"title": "La contraseña no está establecida",
|
||||||
"close": "Cerrar",
|
|
||||||
"body1": "Las notas protegidas se cifran mediante una contraseña de usuario, pero la contraseña aún no se ha establecido.",
|
"body1": "Las notas protegidas se cifran mediante una contraseña de usuario, pero la contraseña aún no se ha establecido.",
|
||||||
"body2": "Para poder proteger notas, dé clic <a class=\"open-password-options-button\" href=\"javascript:\">aquí</a> para abrir el diálogo de Opciones y establecer tu contraseña."
|
"go_to_password_options": "Ir a opciones de contraseña",
|
||||||
|
"body2": "Para poder proteger las notas, haz click en el botón inferior para abrir la pantalla de Opciones y establecer tu contraseña."
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"title": "Aviso",
|
"title": "Aviso",
|
||||||
"close": "Cerrar",
|
"ok": "Aceptar",
|
||||||
"ok": "Aceptar <kbd>enter</kbd>",
|
|
||||||
"defaultTitle": "Aviso"
|
"defaultTitle": "Aviso"
|
||||||
},
|
},
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
@@ -257,12 +244,11 @@
|
|||||||
"help_title": "Ayuda sobre notas protegidas",
|
"help_title": "Ayuda sobre notas protegidas",
|
||||||
"close_label": "Cerrar",
|
"close_label": "Cerrar",
|
||||||
"form_label": "Para continuar con la acción solicitada, debe iniciar en la sesión protegida ingresando la contraseña:",
|
"form_label": "Para continuar con la acción solicitada, debe iniciar en la sesión protegida ingresando la contraseña:",
|
||||||
"start_button": "Iniciar sesión protegida <kbd>entrar</kbd>"
|
"start_button": "Iniciar sesión protegida"
|
||||||
},
|
},
|
||||||
"recent_changes": {
|
"recent_changes": {
|
||||||
"title": "Cambios recientes",
|
"title": "Cambios recientes",
|
||||||
"erase_notes_button": "Borrar notas eliminadas ahora",
|
"erase_notes_button": "Borrar notas eliminadas ahora",
|
||||||
"close": "Cerrar",
|
|
||||||
"deleted_notes_message": "Las notas eliminadas han sido borradas.",
|
"deleted_notes_message": "Las notas eliminadas han sido borradas.",
|
||||||
"no_changes_message": "Aún no hay cambios...",
|
"no_changes_message": "Aún no hay cambios...",
|
||||||
"undelete_link": "recuperar",
|
"undelete_link": "recuperar",
|
||||||
@@ -273,7 +259,6 @@
|
|||||||
"delete_all_revisions": "Eliminar todas las revisiones de esta nota",
|
"delete_all_revisions": "Eliminar todas las revisiones de esta nota",
|
||||||
"delete_all_button": "Eliminar todas las revisiones",
|
"delete_all_button": "Eliminar todas las revisiones",
|
||||||
"help_title": "Ayuda sobre revisiones de notas",
|
"help_title": "Ayuda sobre revisiones de notas",
|
||||||
"close": "Cerrar",
|
|
||||||
"revision_last_edited": "Esta revisión se editó por última vez en {{date}}",
|
"revision_last_edited": "Esta revisión se editó por última vez en {{date}}",
|
||||||
"confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?",
|
"confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?",
|
||||||
"no_revisions": "Aún no hay revisiones para esta nota...",
|
"no_revisions": "Aún no hay revisiones para esta nota...",
|
||||||
@@ -295,7 +280,6 @@
|
|||||||
},
|
},
|
||||||
"sort_child_notes": {
|
"sort_child_notes": {
|
||||||
"sort_children_by": "Ordenar hijos por...",
|
"sort_children_by": "Ordenar hijos por...",
|
||||||
"close": "Cerrar",
|
|
||||||
"sorting_criteria": "Criterios de ordenamiento",
|
"sorting_criteria": "Criterios de ordenamiento",
|
||||||
"title": "título",
|
"title": "título",
|
||||||
"date_created": "fecha de creación",
|
"date_created": "fecha de creación",
|
||||||
@@ -309,13 +293,12 @@
|
|||||||
"sort_with_respect_to_different_character_sorting": "ordenar con respecto a diferentes reglas de ordenamiento y clasificación de caracteres en diferentes idiomas o regiones.",
|
"sort_with_respect_to_different_character_sorting": "ordenar con respecto a diferentes reglas de ordenamiento y clasificación de caracteres en diferentes idiomas o regiones.",
|
||||||
"natural_sort_language": "Idioma de clasificación natural",
|
"natural_sort_language": "Idioma de clasificación natural",
|
||||||
"the_language_code_for_natural_sort": "El código del idioma para el ordenamiento natural, ej. \"zh-CN\" para Chino.",
|
"the_language_code_for_natural_sort": "El código del idioma para el ordenamiento natural, ej. \"zh-CN\" para Chino.",
|
||||||
"sort": "Ordenar <kbd>Enter</kbd>"
|
"sort": "Ordenar"
|
||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"upload_attachments_to_note": "Cargar archivos adjuntos a nota",
|
"upload_attachments_to_note": "Cargar archivos adjuntos a nota",
|
||||||
"close": "Cerrar",
|
|
||||||
"choose_files": "Elija los archivos",
|
"choose_files": "Elija los archivos",
|
||||||
"files_will_be_uploaded": "Los archivos se cargarán como archivos adjuntos en",
|
"files_will_be_uploaded": "Los archivos se cargarán como archivos adjuntos en {{noteTitle}}",
|
||||||
"options": "Opciones",
|
"options": "Opciones",
|
||||||
"shrink_images": "Reducir imágenes",
|
"shrink_images": "Reducir imágenes",
|
||||||
"upload": "Subir",
|
"upload": "Subir",
|
||||||
@@ -749,7 +732,8 @@
|
|||||||
"note_type": "Tipo de nota",
|
"note_type": "Tipo de nota",
|
||||||
"editable": "Editable",
|
"editable": "Editable",
|
||||||
"basic_properties": "Propiedades básicas",
|
"basic_properties": "Propiedades básicas",
|
||||||
"language": "Idioma"
|
"language": "Idioma",
|
||||||
|
"configure_code_notes": "Configurar notas de código..."
|
||||||
},
|
},
|
||||||
"book_properties": {
|
"book_properties": {
|
||||||
"view_type": "Tipo de vista",
|
"view_type": "Tipo de vista",
|
||||||
@@ -865,7 +849,7 @@
|
|||||||
"debug": "depurar",
|
"debug": "depurar",
|
||||||
"debug_description": "La depuración imprimirá información de depuración adicional en la consola para ayudar a depurar consultas complejas",
|
"debug_description": "La depuración imprimirá información de depuración adicional en la consola para ayudar a depurar consultas complejas",
|
||||||
"action": "acción",
|
"action": "acción",
|
||||||
"search_button": "Buscar <kbd>Enter</kbd>",
|
"search_button": "Buscar",
|
||||||
"search_execute": "Buscar y ejecutar acciones",
|
"search_execute": "Buscar y ejecutar acciones",
|
||||||
"save_to_note": "Guardar en nota",
|
"save_to_note": "Guardar en nota",
|
||||||
"search_parameters": "Parámetros de búsqueda",
|
"search_parameters": "Parámetros de búsqueda",
|
||||||
@@ -1118,17 +1102,17 @@
|
|||||||
"title": "Tema",
|
"title": "Tema",
|
||||||
"theme_label": "Tema",
|
"theme_label": "Tema",
|
||||||
"override_theme_fonts_label": "Sobreescribir fuentes de tema",
|
"override_theme_fonts_label": "Sobreescribir fuentes de tema",
|
||||||
"auto_theme": "Automático",
|
"triliumnext": "Trilium (Sigue el esquema de color del sistema)",
|
||||||
"light_theme": "Claro",
|
"triliumnext-light": "Trilium (Claro)",
|
||||||
"dark_theme": "Oscuro",
|
"triliumnext-dark": "Trilium (Oscuro)",
|
||||||
"triliumnext": "TriliumNext Beta (Sigue el esquema de color del sistema)",
|
|
||||||
"triliumnext-light": "TriliumNext Beta (Claro)",
|
|
||||||
"triliumnext-dark": "TriliumNext Beta (Oscuro)",
|
|
||||||
"layout": "Disposición",
|
"layout": "Disposición",
|
||||||
"layout-vertical-title": "Vertical",
|
"layout-vertical-title": "Vertical",
|
||||||
"layout-horizontal-title": "Horizontal",
|
"layout-horizontal-title": "Horizontal",
|
||||||
"layout-vertical-description": "la barra del lanzador está en la izquierda (por defecto)",
|
"layout-vertical-description": "la barra del lanzador está en la izquierda (por defecto)",
|
||||||
"layout-horizontal-description": "la barra de lanzamiento está debajo de la barra de pestañas, la barra de pestañas ahora tiene ancho completo."
|
"layout-horizontal-description": "la barra de lanzamiento está debajo de la barra de pestañas, la barra de pestañas ahora tiene ancho completo.",
|
||||||
|
"auto_theme": "Heredado (Sigue el esquema de colores del sistema)",
|
||||||
|
"light_theme": "Heredado (Claro)",
|
||||||
|
"dark_theme": "Heredado (Oscuro)"
|
||||||
},
|
},
|
||||||
"ai_llm": {
|
"ai_llm": {
|
||||||
"not_started": "No iniciado",
|
"not_started": "No iniciado",
|
||||||
@@ -1270,7 +1254,12 @@
|
|||||||
"selected_provider": "Proveedor seleccionado",
|
"selected_provider": "Proveedor seleccionado",
|
||||||
"selected_provider_description": "Elija el proveedor de IA para el chat y características de completado",
|
"selected_provider_description": "Elija el proveedor de IA para el chat y características de completado",
|
||||||
"select_model": "Seleccionar modelo...",
|
"select_model": "Seleccionar modelo...",
|
||||||
"select_provider": "Seleccionar proveedor..."
|
"select_provider": "Seleccionar proveedor...",
|
||||||
|
"ai_enabled": "Características de IA activadas",
|
||||||
|
"ai_disabled": "Características de IA desactivadas",
|
||||||
|
"no_models_found_online": "No se encontraron modelos. Por favor, comprueba tu clave de API y la configuración.",
|
||||||
|
"no_models_found_ollama": "No se encontraron modelos de Ollama. Por favor, comprueba si Ollama se está ejecutando.",
|
||||||
|
"error_fetching": "Error al obtener los modelos: {{error}}"
|
||||||
},
|
},
|
||||||
"zoom_factor": {
|
"zoom_factor": {
|
||||||
"title": "Factor de zoom (solo versión de escritorio)",
|
"title": "Factor de zoom (solo versión de escritorio)",
|
||||||
@@ -1327,7 +1316,7 @@
|
|||||||
},
|
},
|
||||||
"revisions_snapshot_interval": {
|
"revisions_snapshot_interval": {
|
||||||
"note_revisions_snapshot_interval_title": "Intervalo de instantáneas de revisiones de notas",
|
"note_revisions_snapshot_interval_title": "Intervalo de instantáneas de revisiones de notas",
|
||||||
"note_revisions_snapshot_description": "El intervalo de tiempo de la instantánea de revisión de nota es el tiempo después de lo cual se creará una nueva revisión para la nota. Ver <a href=\"https://triliumnext.github.io/docs/wiki/note-revisions.html\" class=\"external\"> wiki </a> para obtener más información.",
|
"note_revisions_snapshot_description": "El intervalo de tiempo de la instantánea de revisión de nota es el tiempo después de lo cual se creará una nueva revisión para la nota. Ver <doc>wiki</doc> para obtener más información.",
|
||||||
"snapshot_time_interval_label": "Intervalo de tiempo de la instantánea de revisión de notas:"
|
"snapshot_time_interval_label": "Intervalo de tiempo de la instantánea de revisión de notas:"
|
||||||
},
|
},
|
||||||
"revisions_snapshot_limit": {
|
"revisions_snapshot_limit": {
|
||||||
@@ -1389,7 +1378,7 @@
|
|||||||
},
|
},
|
||||||
"custom_date_time_format": {
|
"custom_date_time_format": {
|
||||||
"title": "Formato de fecha/hora personalizada",
|
"title": "Formato de fecha/hora personalizada",
|
||||||
"description": "Personalizar el formado de fecha y la hora insertada vía <kbd></kbd> o la barra de herramientas. Véa la <a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">documentación de Day.js</a> para más tokens de formato disponibles.",
|
"description": "Personalizar el formado de fecha y la hora insertada vía <shortcut /> o la barra de herramientas. Véa la <doc>documentación de Day.js</doc> para más tokens de formato disponibles.",
|
||||||
"format_string": "Cadena de formato:",
|
"format_string": "Cadena de formato:",
|
||||||
"formatted_time": "Fecha/hora personalizada:"
|
"formatted_time": "Fecha/hora personalizada:"
|
||||||
},
|
},
|
||||||
@@ -1607,8 +1596,8 @@
|
|||||||
"open-in-popup": "Edición rápida"
|
"open-in-popup": "Edición rápida"
|
||||||
},
|
},
|
||||||
"shared_info": {
|
"shared_info": {
|
||||||
"shared_publicly": "Esta nota está compartida públicamente en",
|
"shared_publicly": "Esta nota está compartida públicamente en {{- link}}",
|
||||||
"shared_locally": "Esta nota está compartida localmente en",
|
"shared_locally": "Esta nota está compartida localmente en {{- link}}",
|
||||||
"help_link": "Para obtener ayuda visite <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
"help_link": "Para obtener ayuda visite <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||||
},
|
},
|
||||||
"note_types": {
|
"note_types": {
|
||||||
@@ -2007,6 +1996,32 @@
|
|||||||
"configure_launch_bar_description": "Abrir la configuración de la barra de inicio, para agregar o quitar elementos."
|
"configure_launch_bar_description": "Abrir la configuración de la barra de inicio, para agregar o quitar elementos."
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close": "Cerrar"
|
"close": "Cerrar",
|
||||||
|
"help_title": "Mostrar más información sobre esta pantalla"
|
||||||
|
},
|
||||||
|
"call_to_action": {
|
||||||
|
"next_theme_title": "Prueba el nuevo tema de Trilium",
|
||||||
|
"next_theme_message": "Estas usando actualmente el tema heredado, ¿Te gustaría probar el nuevo tema?",
|
||||||
|
"next_theme_button": "Prueba el nuevo tema",
|
||||||
|
"background_effects_title": "Los efectos de fondo son ahora estables",
|
||||||
|
"background_effects_message": "En los dispositivos Windows, los efectos de fondo ya son totalmente estables. Los efectos de fondo añaden un toque de color a la interfaz de usuario difuminando el fondo que hay detrás. Esta técnica también se utiliza en otras aplicaciones como el Explorador de Windows.",
|
||||||
|
"background_effects_button": "Activar efectos de fondo",
|
||||||
|
"dismiss": "Desestimar"
|
||||||
|
},
|
||||||
|
"ui-performance": {
|
||||||
|
"title": "Rendimiento",
|
||||||
|
"enable-motion": "Habilitar transiciones y animaciones",
|
||||||
|
"enable-shadows": "Activar sombras",
|
||||||
|
"enable-backdrop-effects": "Habilitar efectos de fondo para menús, ventanas emergentes y paneles"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"related_settings": "Configuración relacionada"
|
||||||
|
},
|
||||||
|
"settings_appearance": {
|
||||||
|
"related_code_blocks": "Esquema de colores para bloques de código en notas de texto",
|
||||||
|
"related_code_notes": "Esquema de colores para notas de código"
|
||||||
|
},
|
||||||
|
"units": {
|
||||||
|
"percentage": "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
22
apps/client/src/translations/fa/translation.json
Normal file
22
apps/client/src/translations/fa/translation.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "درباره Trilium Notes",
|
||||||
|
"homepage": "صفحه اصلی:",
|
||||||
|
"app_version": "نسخه برنامه:",
|
||||||
|
"db_version": "نسخه پایگاه داده:",
|
||||||
|
"sync_version": "نسخه منطبق:",
|
||||||
|
"build_date": "تاریخ ساخت:",
|
||||||
|
"build_revision": "نسخه بازنگری شده:",
|
||||||
|
"data_directory": "دایرکتوری داده:"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"critical-error": {
|
||||||
|
"title": "خطای بحرانی",
|
||||||
|
"message": "خطای بحرانی رخ داده که مانع از اجرای برنامه می شود\n\n {{message}}\n\nبه احتمال زیاد ناشی از خطای غیرمنتظره در اجرای ناموفق یک اسکریپت است. برنامه را در مد ایمن اجرا کنید و خطا را بررسی نمایید."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"add_link": {
|
||||||
|
"add_link": "افزودن لینک",
|
||||||
|
"note": "یادداشت"
|
||||||
|
}
|
||||||
|
}
|
||||||
147
apps/client/src/translations/fi/translation.json
Normal file
147
apps/client/src/translations/fi/translation.json
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "Lisätietoja Trilium Notes:ista",
|
||||||
|
"homepage": "Kotisivu:",
|
||||||
|
"app_version": "Sovelluksen versio:",
|
||||||
|
"db_version": "Tietokannan versio:",
|
||||||
|
"build_date": "Koontipäivämäärä:",
|
||||||
|
"data_directory": "Datakansio:",
|
||||||
|
"sync_version": "Synkronoinnin versio:",
|
||||||
|
"build_revision": "Sovelluksen versio:"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"critical-error": {
|
||||||
|
"title": "Kriittinen virhe"
|
||||||
|
},
|
||||||
|
"widget-error": {
|
||||||
|
"title": "Widgetin luonti epäonnistui"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"add_link": {
|
||||||
|
"add_link": "Lisää linkki",
|
||||||
|
"link_title": "Linkin otsikko",
|
||||||
|
"button_add_link": "Lisää linkki",
|
||||||
|
"note": "Muistio",
|
||||||
|
"search_note": "etsi muistiota sen nimellä"
|
||||||
|
},
|
||||||
|
"branch_prefix": {
|
||||||
|
"prefix": "Etuliite: ",
|
||||||
|
"save": "Tallenna"
|
||||||
|
},
|
||||||
|
"bulk_actions": {
|
||||||
|
"bulk_actions": "Massatoiminnot",
|
||||||
|
"available_actions": "Saatavilla olevat toiminnot",
|
||||||
|
"chosen_actions": "Valitut toiminnot",
|
||||||
|
"execute_bulk_actions": "Toteuta massatoiminnot",
|
||||||
|
"bulk_actions_executed": "Massatoiminnot on toteutettu onnistuneesti.",
|
||||||
|
"none_yet": "Ei vielä... lisää toiminto klikkaamalla jotiain yllä saatavilla olevaa yltä.",
|
||||||
|
"labels": "Merkit",
|
||||||
|
"relations": "Suhteet",
|
||||||
|
"notes": "Muistiot",
|
||||||
|
"other": "Muut",
|
||||||
|
"affected_notes": "Vaikuttaa muistioihin"
|
||||||
|
},
|
||||||
|
"clone_to": {
|
||||||
|
"clone_notes_to": "Kopioi muistiot...",
|
||||||
|
"help_on_links": "Apua linkkeihin",
|
||||||
|
"notes_to_clone": "Kopioitavat muistiot",
|
||||||
|
"target_parent_note": "Kohteen päämuistio",
|
||||||
|
"search_for_note_by_its_name": "ensi muistiota sen nimellä",
|
||||||
|
"cloned_note_prefix_title": "Kopioitu muistia näytetään puussa annetulla etuliitteellä",
|
||||||
|
"prefix_optional": "Etuliite (valinnainen)",
|
||||||
|
"clone_to_selected_note": "Kopioi valittuun muistioon",
|
||||||
|
"note_cloned": "Muistio \"{{clonedTitle}}\" on kopioitu \"{{targetTitle}}\""
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"confirmation": "Vahvistus",
|
||||||
|
"cancel": "Peruuta",
|
||||||
|
"ok": "OK",
|
||||||
|
"also_delete_note": "Poista myös muistio"
|
||||||
|
},
|
||||||
|
"delete_notes": {
|
||||||
|
"delete_notes_preview": "Poista muistion esikatselu",
|
||||||
|
"close": "Sulje",
|
||||||
|
"notes_to_be_deleted": "Seuraavat muistiot tullaan poistamaan ({{notesCount}})",
|
||||||
|
"no_note_to_delete": "Muistioita ei poisteta (vain kopiot).",
|
||||||
|
"cancel": "Peruuta",
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"export": {
|
||||||
|
"export_note_title": "Vie muistio",
|
||||||
|
"close": "Sulje",
|
||||||
|
"format_html": "HTML - suositeltu, sillä se säilyttää kaikki formatoinnit",
|
||||||
|
"format_markdown": "Markdown - tämä säilyttää suurimman osan formatoinneista.",
|
||||||
|
"opml_version_1": "OPML v1.0 - pelkkä teksti",
|
||||||
|
"opml_version_2": "OPML v2.0 - sallii myös HTML:n",
|
||||||
|
"export": "Vie",
|
||||||
|
"choose_export_type": "Valitse ensin viennin tyyppi",
|
||||||
|
"export_status": "Viennin tila",
|
||||||
|
"export_in_progress": "Vienti käynnissä: {{progressCount}}",
|
||||||
|
"export_finished_successfully": "Vienti valmistui onnistuneesti.",
|
||||||
|
"format_pdf": "PDF - tulostukseen ja jakamiseen."
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"title": "Lunttilappu",
|
||||||
|
"noteNavigation": "Muistion navigointi",
|
||||||
|
"goUpDown": "mene ylös/alas muistioiden listassa",
|
||||||
|
"collapseExpand": "pienennä/suurenna solmu",
|
||||||
|
"notSet": "ei asetettu",
|
||||||
|
"goBackForwards": "mene taaksepäin/eteenpäin historiassa",
|
||||||
|
"jumpToParentNote": "Hyppää ylempään muistioon",
|
||||||
|
"collapseWholeTree": "pienennä koko muistio puu",
|
||||||
|
"onlyInDesktop": "Vain työpöytänäkymässä (Electron build)",
|
||||||
|
"openEmptyTab": "Avaa tyhjä välilehti",
|
||||||
|
"closeActiveTab": "sulje aktiivinen välilehti",
|
||||||
|
"activateNextTab": "aktivoi seuraava välilehti",
|
||||||
|
"activatePreviousTab": "aktivoi edellinen välilehti",
|
||||||
|
"creatingNotes": "Luo muistiota",
|
||||||
|
"movingCloningNotes": "Siirrä / kopioi muistioita",
|
||||||
|
"moveNoteUpHierarchy": "siirrä muistio ylöspäin listassa",
|
||||||
|
"selectNote": "valitse muistio",
|
||||||
|
"editingNotes": "Muokkaa solmua",
|
||||||
|
"createEditLink": "luo / muokkaa ulkoista linkkiä",
|
||||||
|
"createInternalLink": "luo sisäinen linkki",
|
||||||
|
"insertDateTime": "lisää nykyinen päivämäärä ja aika hiiren kohdalle",
|
||||||
|
"troubleshooting": "Vianmääritys",
|
||||||
|
"reloadFrontend": "lataa Trilium:in käyttöliittymä",
|
||||||
|
"showDevTools": "näytä kehittäjätyökalut",
|
||||||
|
"showSQLConsole": "näytä SQL konsoli",
|
||||||
|
"other": "Muut"
|
||||||
|
},
|
||||||
|
"import": {
|
||||||
|
"importIntoNote": "Tuo muistioon",
|
||||||
|
"chooseImportFile": "Valitse tuonnin tiedosto",
|
||||||
|
"options": "Valinnat",
|
||||||
|
"safeImport": "Turvallinen tuonti",
|
||||||
|
"shrinkImages": "Kutista kuvat",
|
||||||
|
"replaceUnderscoresWithSpaces": "Korvaa alaviivat väleillä tuotujen muistioiden tiedostonimissä",
|
||||||
|
"import": "Tuo",
|
||||||
|
"failed": "Tuonti epäonnistui: {{message}}.",
|
||||||
|
"html_import_tags": {
|
||||||
|
"title": "HTML Tuonnin Tunnisteet",
|
||||||
|
"placeholder": "Lisää HTML tunnisteet, yksi per rivi"
|
||||||
|
},
|
||||||
|
"import-status": "Tuonnin tila",
|
||||||
|
"in-progress": "Tuonti vaiheessa: {{progress}}",
|
||||||
|
"successful": "Tuonti valmistui onnistuneesti."
|
||||||
|
},
|
||||||
|
"include_note": {
|
||||||
|
"dialog_title": "Sisällytä muistio",
|
||||||
|
"label_note": "Muistio",
|
||||||
|
"placeholder_search": "etsi muistiota sen nimellä",
|
||||||
|
"box_size_small": "pieni (~ 10 riviä)",
|
||||||
|
"box_size_medium": "keskisuuri (~ 30 riviä)",
|
||||||
|
"button_include": "Sisällytä muistio"
|
||||||
|
},
|
||||||
|
"info": {
|
||||||
|
"modalTitle": "Info viesti",
|
||||||
|
"closeButton": "Sulje",
|
||||||
|
"okButton": "OK"
|
||||||
|
},
|
||||||
|
"jump_to_note": {
|
||||||
|
"search_button": "Etsi koko tekstistä"
|
||||||
|
},
|
||||||
|
"call_to_action": {
|
||||||
|
"dismiss": "Hylkää"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "À propos de Trilium Notes",
|
"title": "À propos de Trilium Notes",
|
||||||
"close": "Fermer",
|
|
||||||
"homepage": "Page d'accueil :",
|
"homepage": "Page d'accueil :",
|
||||||
"app_version": "Version de l'application :",
|
"app_version": "Version de l'application :",
|
||||||
"db_version": "Version de la base de données :",
|
"db_version": "Version de la base de données :",
|
||||||
@@ -28,25 +27,22 @@
|
|||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "Ajouter un lien",
|
"add_link": "Ajouter un lien",
|
||||||
"help_on_links": "Aide sur les liens",
|
"help_on_links": "Aide sur les liens",
|
||||||
"close": "Fermer",
|
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"search_note": "rechercher une note par son nom",
|
"search_note": "rechercher une note par son nom",
|
||||||
"link_title_mirrors": "le titre du lien reflète le titre actuel de la note",
|
"link_title_mirrors": "le titre du lien reflète le titre actuel de la note",
|
||||||
"link_title_arbitrary": "le titre du lien peut être modifié arbitrairement",
|
"link_title_arbitrary": "le titre du lien peut être modifié arbitrairement",
|
||||||
"link_title": "Titre du lien",
|
"link_title": "Titre du lien",
|
||||||
"button_add_link": "Ajouter un lien <kbd>Entrée</kbd>"
|
"button_add_link": "Ajouter un lien"
|
||||||
},
|
},
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"edit_branch_prefix": "Modifier le préfixe de branche",
|
"edit_branch_prefix": "Modifier le préfixe de branche",
|
||||||
"help_on_tree_prefix": "Aide sur le préfixe de l'arbre",
|
"help_on_tree_prefix": "Aide sur le préfixe de l'arbre",
|
||||||
"close": "Fermer",
|
|
||||||
"prefix": "Préfixe : ",
|
"prefix": "Préfixe : ",
|
||||||
"save": "Sauvegarder",
|
"save": "Sauvegarder",
|
||||||
"branch_prefix_saved": "Le préfixe de la branche a été enregistré."
|
"branch_prefix_saved": "Le préfixe de la branche a été enregistré."
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"bulk_actions": "Actions groupées",
|
"bulk_actions": "Actions groupées",
|
||||||
"close": "Fermer",
|
|
||||||
"affected_notes": "Notes concernées",
|
"affected_notes": "Notes concernées",
|
||||||
"include_descendants": "Inclure les descendants des notes sélectionnées",
|
"include_descendants": "Inclure les descendants des notes sélectionnées",
|
||||||
"available_actions": "Actions disponibles",
|
"available_actions": "Actions disponibles",
|
||||||
@@ -61,20 +57,18 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "Cloner les notes dans...",
|
"clone_notes_to": "Cloner les notes dans...",
|
||||||
"close": "Fermer",
|
|
||||||
"help_on_links": "Aide sur les liens",
|
"help_on_links": "Aide sur les liens",
|
||||||
"notes_to_clone": "Notes à cloner",
|
"notes_to_clone": "Notes à cloner",
|
||||||
"target_parent_note": "Note parent cible",
|
"target_parent_note": "Note parent cible",
|
||||||
"search_for_note_by_its_name": "rechercher une note par son nom",
|
"search_for_note_by_its_name": "rechercher une note par son nom",
|
||||||
"cloned_note_prefix_title": "La note clonée sera affichée dans l'arbre des notes avec le préfixe donné",
|
"cloned_note_prefix_title": "La note clonée sera affichée dans l'arbre des notes avec le préfixe donné",
|
||||||
"prefix_optional": "Préfixe (facultatif)",
|
"prefix_optional": "Préfixe (facultatif)",
|
||||||
"clone_to_selected_note": "Cloner vers la note sélectionnée <kbd>entrer</kbd>",
|
"clone_to_selected_note": "Cloner vers la note sélectionnée",
|
||||||
"no_path_to_clone_to": "Aucun chemin vers lequel cloner.",
|
"no_path_to_clone_to": "Aucun chemin vers lequel cloner.",
|
||||||
"note_cloned": "La note \"{{clonedTitle}}\" a été clonée dans \"{{targetTitle}}\""
|
"note_cloned": "La note \"{{clonedTitle}}\" a été clonée dans \"{{targetTitle}}\""
|
||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"confirmation": "Confirmation",
|
"confirmation": "Confirmation",
|
||||||
"close": "Fermer",
|
|
||||||
"cancel": "Annuler",
|
"cancel": "Annuler",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"are_you_sure_remove_note": "Voulez-vous vraiment supprimer la note « {{title}} » de la carte des relations ? ",
|
"are_you_sure_remove_note": "Voulez-vous vraiment supprimer la note « {{title}} » de la carte des relations ? ",
|
||||||
@@ -87,9 +81,9 @@
|
|||||||
"delete_all_clones_description": "Supprimer aussi les clones (peut être annulé dans des modifications récentes)",
|
"delete_all_clones_description": "Supprimer aussi les clones (peut être annulé dans des modifications récentes)",
|
||||||
"erase_notes_description": "La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.",
|
"erase_notes_description": "La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.",
|
||||||
"erase_notes_warning": "Efface les notes de manière permanente (ne peut pas être annulée), y compris les clones. L'application va être rechargée.",
|
"erase_notes_warning": "Efface les notes de manière permanente (ne peut pas être annulée), y compris les clones. L'application va être rechargée.",
|
||||||
"notes_to_be_deleted": "Les notes suivantes seront supprimées ({{- noteCount}})",
|
"notes_to_be_deleted": "Les notes suivantes seront supprimées ({{notesCount}})",
|
||||||
"no_note_to_delete": "Aucune note ne sera supprimée (uniquement les clones).",
|
"no_note_to_delete": "Aucune note ne sera supprimée (uniquement les clones).",
|
||||||
"broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{- relationCount}})",
|
"broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{ relationCount}})",
|
||||||
"cancel": "Annuler",
|
"cancel": "Annuler",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"deleted_relation_text": "Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}."
|
"deleted_relation_text": "Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}."
|
||||||
@@ -113,20 +107,18 @@
|
|||||||
"format_pdf": "PDF - pour l'impression ou le partage de documents."
|
"format_pdf": "PDF - pour l'impression ou le partage de documents."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"fullDocumentation": "Aide (la documentation complète est disponible <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">en ligne</a>)",
|
|
||||||
"close": "Fermer",
|
|
||||||
"noteNavigation": "Navigation dans les notes",
|
"noteNavigation": "Navigation dans les notes",
|
||||||
"goUpDown": "<kbd>HAUT</kbd>, <kbd>BAS</kbd> - aller vers le haut/bas dans la liste des notes",
|
"goUpDown": "aller vers le haut/bas dans la liste des notes",
|
||||||
"collapseExpand": "<kbd>GAUCHE</kbd>, <kbd>DROITE</kbd> - réduire/développer le nœud",
|
"collapseExpand": "réduire/développer le nœud",
|
||||||
"notSet": "non défini",
|
"notSet": "non défini",
|
||||||
"goBackForwards": "reculer/avancer dans l'historique",
|
"goBackForwards": "reculer/avancer dans l'historique",
|
||||||
"showJumpToNoteDialog": "afficher la <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">boîte de dialogue \"Aller à la note\"</a>",
|
"showJumpToNoteDialog": "afficher la <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">boîte de dialogue \"Aller à la note\"</a>",
|
||||||
"scrollToActiveNote": "faire défiler jusqu'à la note active",
|
"scrollToActiveNote": "faire défiler jusqu'à la note active",
|
||||||
"jumpToParentNote": "<kbd>Retour arrière</kbd> - aller à la note parent",
|
"jumpToParentNote": "aller à la note parent",
|
||||||
"collapseWholeTree": "réduire tout l'arbre des notes",
|
"collapseWholeTree": "réduire tout l'arbre des notes",
|
||||||
"collapseSubTree": "réduire le sous-arbre",
|
"collapseSubTree": "réduire le sous-arbre",
|
||||||
"tabShortcuts": "Raccourcis des onglets",
|
"tabShortcuts": "Raccourcis des onglets",
|
||||||
"newTabNoteLink": "<kbd>CTRL+clic</kbd> - (ou clic central de la souris) sur le lien de la note ouvre la note dans un nouvel onglet",
|
"newTabNoteLink": "sur le lien de la note ouvre la note dans un nouvel onglet",
|
||||||
"onlyInDesktop": "Uniquement sur ordinateur (version Electron)",
|
"onlyInDesktop": "Uniquement sur ordinateur (version Electron)",
|
||||||
"openEmptyTab": "ouvrir un onglet vide",
|
"openEmptyTab": "ouvrir un onglet vide",
|
||||||
"closeActiveTab": "fermer l'onglet actif",
|
"closeActiveTab": "fermer l'onglet actif",
|
||||||
@@ -141,14 +133,14 @@
|
|||||||
"moveNoteUpHierarchy": "déplacer la note vers le haut dans la hiérarchie",
|
"moveNoteUpHierarchy": "déplacer la note vers le haut dans la hiérarchie",
|
||||||
"multiSelectNote": "sélectionner plusieurs notes au-dessus/au-dessous",
|
"multiSelectNote": "sélectionner plusieurs notes au-dessus/au-dessous",
|
||||||
"selectAllNotes": "sélectionner toutes les notes du niveau actuel",
|
"selectAllNotes": "sélectionner toutes les notes du niveau actuel",
|
||||||
"selectNote": "<kbd>Shift+clic</kbd> - sélectionner une note",
|
"selectNote": "sélectionner une note",
|
||||||
"copyNotes": "copier la note active (ou la sélection actuelle) dans le presse-papiers (utilisé pour le <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonage</a>)",
|
"copyNotes": "copier la note active (ou la sélection actuelle) dans le presse-papiers (utilisé pour le <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonage</a>)",
|
||||||
"cutNotes": "couper la note actuelle (ou la sélection actuelle) dans le presse-papiers (utilisé pour déplacer les notes)",
|
"cutNotes": "couper la note actuelle (ou la sélection actuelle) dans le presse-papiers (utilisé pour déplacer les notes)",
|
||||||
"pasteNotes": "coller la ou les notes en tant que sous-note dans la note active (qui est soit déplacée, soit clonée selon qu'elle a été copiée ou coupée dans le presse-papiers)",
|
"pasteNotes": "coller la ou les notes en tant que sous-note dans la note active (qui est soit déplacée, soit clonée selon qu'elle a été copiée ou coupée dans le presse-papiers)",
|
||||||
"deleteNotes": "supprimer une note / un sous-arbre",
|
"deleteNotes": "supprimer une note / un sous-arbre",
|
||||||
"editingNotes": "Édition des notes",
|
"editingNotes": "Édition des notes",
|
||||||
"editNoteTitle": "dans le volet de l'arborescence, basculera du volet au titre de la note. Presser Entrer à partir du titre de la note basculera vers l’éditeur de texte. <kbd>Ctrl+.</kbd> bascule de l'éditeur au volet arborescent.",
|
"editNoteTitle": "dans le volet de l'arborescence, basculera du volet au titre de la note. Presser Entrer à partir du titre de la note basculera vers l’éditeur de texte. <kbd>Ctrl+.</kbd> bascule de l'éditeur au volet arborescent.",
|
||||||
"createEditLink": "<kbd>Ctrl+K</kbd> - créer/éditer un lien externe",
|
"createEditLink": "créer/éditer un lien externe",
|
||||||
"createInternalLink": "créer un lien interne",
|
"createInternalLink": "créer un lien interne",
|
||||||
"followLink": "suivre le lien sous le curseur",
|
"followLink": "suivre le lien sous le curseur",
|
||||||
"insertDateTime": "insérer la date et l'heure courante à la position du curseur",
|
"insertDateTime": "insérer la date et l'heure courante à la position du curseur",
|
||||||
@@ -164,11 +156,12 @@
|
|||||||
"showSQLConsole": "afficher la console SQL",
|
"showSQLConsole": "afficher la console SQL",
|
||||||
"other": "Autre",
|
"other": "Autre",
|
||||||
"quickSearch": "aller à la recherche rapide",
|
"quickSearch": "aller à la recherche rapide",
|
||||||
"inPageSearch": "recherche sur la page"
|
"inPageSearch": "recherche sur la page",
|
||||||
|
"title": "Aide-mémoire",
|
||||||
|
"newTabWithActivationNoteLink": "Lorsqu’on clique sur un lien de note, celle-ci s’ouvre et devient active dans un nouvel onglet"
|
||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"importIntoNote": "Importer dans la note",
|
"importIntoNote": "Importer dans la note",
|
||||||
"close": "Fermer",
|
|
||||||
"chooseImportFile": "Choisissez le fichier à importer",
|
"chooseImportFile": "Choisissez le fichier à importer",
|
||||||
"importDescription": "Le contenu du ou des fichiers sélectionnés sera importé en tant que note(s) enfant dans",
|
"importDescription": "Le contenu du ou des fichiers sélectionnés sera importé en tant que note(s) enfant dans",
|
||||||
"options": "Options",
|
"options": "Options",
|
||||||
@@ -195,14 +188,13 @@
|
|||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "Inclure une note",
|
"dialog_title": "Inclure une note",
|
||||||
"close": "Fermer",
|
|
||||||
"label_note": "Note",
|
"label_note": "Note",
|
||||||
"placeholder_search": "rechercher une note par son nom",
|
"placeholder_search": "rechercher une note par son nom",
|
||||||
"box_size_prompt": "Taille de la boîte de la note incluse :",
|
"box_size_prompt": "Taille de la boîte de la note incluse :",
|
||||||
"box_size_small": "petit (~ 10 lignes)",
|
"box_size_small": "petit (~ 10 lignes)",
|
||||||
"box_size_medium": "moyen (~ 30 lignes)",
|
"box_size_medium": "moyen (~ 30 lignes)",
|
||||||
"box_size_full": "complet (la boîte affiche le texte complet)",
|
"box_size_full": "complet (la boîte affiche le texte complet)",
|
||||||
"button_include": "Inclure une note <kbd>Entrée</kbd>"
|
"button_include": "Inclure une note"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"modalTitle": "Message d'information",
|
"modalTitle": "Message d'information",
|
||||||
@@ -210,42 +202,41 @@
|
|||||||
"okButton": "OK"
|
"okButton": "OK"
|
||||||
},
|
},
|
||||||
"jump_to_note": {
|
"jump_to_note": {
|
||||||
"close": "Fermer",
|
"search_button": "Rechercher dans le texte intégral",
|
||||||
"search_button": "Rechercher dans le texte intégral <kbd>Ctrl+Entrée</kbd>"
|
"search_placeholder": "Rechercher une note par son nom ou saisir ‘>’ pour les commandes…"
|
||||||
},
|
},
|
||||||
"markdown_import": {
|
"markdown_import": {
|
||||||
"dialog_title": "Importation Markdown",
|
"dialog_title": "Importation Markdown",
|
||||||
"close": "Fermer",
|
|
||||||
"modal_body_text": "En raison du bac à sable du navigateur, il n'est pas possible de lire directement le presse-papiers à partir de JavaScript. Veuillez coller le Markdown à importer dans la zone de texte ci-dessous et cliquez sur le bouton Importer",
|
"modal_body_text": "En raison du bac à sable du navigateur, il n'est pas possible de lire directement le presse-papiers à partir de JavaScript. Veuillez coller le Markdown à importer dans la zone de texte ci-dessous et cliquez sur le bouton Importer",
|
||||||
"import_button": "Importer Ctrl+Entrée",
|
"import_button": "Importer",
|
||||||
"import_success": "Le contenu Markdown a été importé dans le document."
|
"import_success": "Le contenu Markdown a été importé dans le document."
|
||||||
},
|
},
|
||||||
"move_to": {
|
"move_to": {
|
||||||
"dialog_title": "Déplacer les notes vers...",
|
"dialog_title": "Déplacer les notes vers...",
|
||||||
"close": "Fermer",
|
|
||||||
"notes_to_move": "Notes à déplacer",
|
"notes_to_move": "Notes à déplacer",
|
||||||
"target_parent_note": "Note parent cible",
|
"target_parent_note": "Note parent cible",
|
||||||
"search_placeholder": "rechercher une note par son nom",
|
"search_placeholder": "rechercher une note par son nom",
|
||||||
"move_button": "Déplacer vers la note sélectionnée <kbd>entrer</kbd>",
|
"move_button": "Déplacer vers la note sélectionnée",
|
||||||
"error_no_path": "Aucun chemin vers lequel déplacer.",
|
"error_no_path": "Aucun chemin vers lequel déplacer.",
|
||||||
"move_success_message": "Les notes sélectionnées ont été déplacées dans "
|
"move_success_message": "Les notes sélectionnées ont été déplacées dans "
|
||||||
},
|
},
|
||||||
"note_type_chooser": {
|
"note_type_chooser": {
|
||||||
"modal_title": "Choisissez le type de note",
|
"modal_title": "Choisissez le type de note",
|
||||||
"close": "Fermer",
|
|
||||||
"modal_body": "Choisissez le type de note/le modèle de la nouvelle note :",
|
"modal_body": "Choisissez le type de note/le modèle de la nouvelle note :",
|
||||||
"templates": "Modèles :"
|
"templates": "Modèles",
|
||||||
|
"change_path_prompt": "Modifier l’emplacement de création de la nouvelle note :",
|
||||||
|
"search_placeholder": "Rechercher le chemin par nom (par défaut si vide)",
|
||||||
|
"builtin_templates": "Modèles intégrés"
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"title": "Le mot de passe n'est pas défini",
|
"title": "Le mot de passe n'est pas défini",
|
||||||
"close": "Fermer",
|
|
||||||
"body1": "Les notes protégées sont cryptées à l'aide d'un mot de passe utilisateur, mais le mot de passe n'a pas encore été défini.",
|
"body1": "Les notes protégées sont cryptées à l'aide d'un mot de passe utilisateur, mais le mot de passe n'a pas encore été défini.",
|
||||||
"body2": "Pour pouvoir protéger les notes, cliquez <a class=\"open-password-options-button\" href=\"javascript:\">ici</a> pour ouvrir les Options et définir votre mot de passe."
|
"body2": "Pour pouvoir protéger les notes, cliquez sur le bouton ci-dessous pour ouvrir la boîte de dialogue Options et définir votre mot de passe.",
|
||||||
|
"go_to_password_options": "Accéder aux options de mot de passe"
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"title": "Prompt",
|
"title": "Prompt",
|
||||||
"close": "Fermer",
|
"ok": "OK",
|
||||||
"ok": "OK <kbd>entrer</kbd>",
|
|
||||||
"defaultTitle": "Prompt"
|
"defaultTitle": "Prompt"
|
||||||
},
|
},
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
@@ -253,12 +244,11 @@
|
|||||||
"help_title": "Aide sur les notes protégées",
|
"help_title": "Aide sur les notes protégées",
|
||||||
"close_label": "Fermer",
|
"close_label": "Fermer",
|
||||||
"form_label": "Pour procéder à l'action demandée, vous devez démarrer une session protégée en saisissant le mot de passe :",
|
"form_label": "Pour procéder à l'action demandée, vous devez démarrer une session protégée en saisissant le mot de passe :",
|
||||||
"start_button": "Démarrer une session protégée <kbd>entrer</kbd>"
|
"start_button": "Démarrer une session protégée"
|
||||||
},
|
},
|
||||||
"recent_changes": {
|
"recent_changes": {
|
||||||
"title": "Modifications récentes",
|
"title": "Modifications récentes",
|
||||||
"erase_notes_button": "Effacer les notes supprimées maintenant",
|
"erase_notes_button": "Effacer les notes supprimées maintenant",
|
||||||
"close": "Fermer",
|
|
||||||
"deleted_notes_message": "Les notes supprimées ont été effacées.",
|
"deleted_notes_message": "Les notes supprimées ont été effacées.",
|
||||||
"no_changes_message": "Aucun changement pour l'instant...",
|
"no_changes_message": "Aucun changement pour l'instant...",
|
||||||
"undelete_link": "annuler la suppression",
|
"undelete_link": "annuler la suppression",
|
||||||
@@ -269,7 +259,6 @@
|
|||||||
"delete_all_revisions": "Supprimer toutes les versions de cette note",
|
"delete_all_revisions": "Supprimer toutes les versions de cette note",
|
||||||
"delete_all_button": "Supprimer toutes les versions",
|
"delete_all_button": "Supprimer toutes les versions",
|
||||||
"help_title": "Aide sur les versions de notes",
|
"help_title": "Aide sur les versions de notes",
|
||||||
"close": "Fermer",
|
|
||||||
"revision_last_edited": "Cette version a été modifiée pour la dernière fois le {{date}}",
|
"revision_last_edited": "Cette version a été modifiée pour la dernière fois le {{date}}",
|
||||||
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
|
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
|
||||||
"no_revisions": "Aucune version pour cette note pour l'instant...",
|
"no_revisions": "Aucune version pour cette note pour l'instant...",
|
||||||
@@ -285,11 +274,12 @@
|
|||||||
"mime": "MIME : ",
|
"mime": "MIME : ",
|
||||||
"file_size": "Taille du fichier :",
|
"file_size": "Taille du fichier :",
|
||||||
"preview": "Aperçu :",
|
"preview": "Aperçu :",
|
||||||
"preview_not_available": "L'aperçu n'est pas disponible pour ce type de note."
|
"preview_not_available": "L'aperçu n'est pas disponible pour ce type de note.",
|
||||||
|
"restore_button": "Restaurer",
|
||||||
|
"delete_button": "Supprimer"
|
||||||
},
|
},
|
||||||
"sort_child_notes": {
|
"sort_child_notes": {
|
||||||
"sort_children_by": "Trier les enfants par...",
|
"sort_children_by": "Trier les enfants par...",
|
||||||
"close": "Fermer",
|
|
||||||
"sorting_criteria": "Critères de tri",
|
"sorting_criteria": "Critères de tri",
|
||||||
"title": "titre",
|
"title": "titre",
|
||||||
"date_created": "date de création",
|
"date_created": "date de création",
|
||||||
@@ -303,13 +293,12 @@
|
|||||||
"sort_with_respect_to_different_character_sorting": "trier en fonction de différentes règles de tri et de classement des caractères dans différentes langues ou régions.",
|
"sort_with_respect_to_different_character_sorting": "trier en fonction de différentes règles de tri et de classement des caractères dans différentes langues ou régions.",
|
||||||
"natural_sort_language": "Langage de tri naturel",
|
"natural_sort_language": "Langage de tri naturel",
|
||||||
"the_language_code_for_natural_sort": "Le code de langue pour le tri naturel, par ex. \"zh-CN\" pour le chinois.",
|
"the_language_code_for_natural_sort": "Le code de langue pour le tri naturel, par ex. \"zh-CN\" pour le chinois.",
|
||||||
"sort": "Trier <kbd>Entrée</kbd>"
|
"sort": "Trier"
|
||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"upload_attachments_to_note": "Téléverser des pièces jointes à la note",
|
"upload_attachments_to_note": "Téléverser des pièces jointes à la note",
|
||||||
"close": "Fermer",
|
|
||||||
"choose_files": "Choisir des fichiers",
|
"choose_files": "Choisir des fichiers",
|
||||||
"files_will_be_uploaded": "Les fichiers seront téléversés sous forme de pièces jointes dans",
|
"files_will_be_uploaded": "Les fichiers seront téléversés sous forme de pièces jointes dans {{noteTitle}}",
|
||||||
"options": "Options",
|
"options": "Options",
|
||||||
"shrink_images": "Réduire les images",
|
"shrink_images": "Réduire les images",
|
||||||
"upload": "Téléverser",
|
"upload": "Téléverser",
|
||||||
@@ -398,7 +387,7 @@
|
|||||||
"share_root": "partage cette note à l'adresse racine /share.",
|
"share_root": "partage cette note à l'adresse racine /share.",
|
||||||
"share_description": "définir le texte à ajouter à la balise méta HTML pour la description",
|
"share_description": "définir le texte à ajouter à la balise méta HTML pour la description",
|
||||||
"share_raw": "la note sera servie dans son format brut, sans wrapper HTML",
|
"share_raw": "la note sera servie dans son format brut, sans wrapper HTML",
|
||||||
"share_disallow_robot_indexing": "interdira l'indexation par robot de cette note via l'en-tête <code>X-Robots-Tag: noindex</code>",
|
"share_disallow_robot_indexing": "Interdira l'indexation par robot de cette note via l'en-tête <code>X-Robots-Tag: noindex</code>",
|
||||||
"share_credentials": "exiger des informations d’identification pour accéder à cette note partagée. La valeur devrait être au format « nom d'utilisateur : mot de passe ». N'oubliez pas de rendre cela héritable pour l'appliquer aux notes/images enfants.",
|
"share_credentials": "exiger des informations d’identification pour accéder à cette note partagée. La valeur devrait être au format « nom d'utilisateur : mot de passe ». N'oubliez pas de rendre cela héritable pour l'appliquer aux notes/images enfants.",
|
||||||
"share_index": "la note avec ce label listera toutes les racines des notes partagées",
|
"share_index": "la note avec ce label listera toutes les racines des notes partagées",
|
||||||
"display_relations": "noms des relations délimités par des virgules qui doivent être affichés. Tous les autres seront masqués.",
|
"display_relations": "noms des relations délimités par des virgules qui doivent être affichés. Tous les autres seront masqués.",
|
||||||
@@ -437,7 +426,8 @@
|
|||||||
"other_notes_with_name": "Autres notes portant le nom {{attributeType}} \"{{attributeName}}\"",
|
"other_notes_with_name": "Autres notes portant le nom {{attributeType}} \"{{attributeName}}\"",
|
||||||
"and_more": "... et {{count}} plus.",
|
"and_more": "... et {{count}} plus.",
|
||||||
"print_landscape": "Lors de l'exportation en PDF, change l'orientation de la page en paysage au lieu de portrait.",
|
"print_landscape": "Lors de l'exportation en PDF, change l'orientation de la page en paysage au lieu de portrait.",
|
||||||
"print_page_size": "Lors de l'exportation en PDF, change la taille de la page. Valeurs supportées : <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>."
|
"print_page_size": "Lors de l'exportation en PDF, change la taille de la page. Valeurs supportées : <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
|
||||||
|
"color_type": "Couleur"
|
||||||
},
|
},
|
||||||
"attribute_editor": {
|
"attribute_editor": {
|
||||||
"help_text_body1": "Pour ajouter un label, tapez simplement par ex. <code>#rock</code>, ou si vous souhaitez également ajouter une valeur, tapez par ex. <code>#année = 2020</code>",
|
"help_text_body1": "Pour ajouter un label, tapez simplement par ex. <code>#rock</code>, ou si vous souhaitez également ajouter une valeur, tapez par ex. <code>#année = 2020</code>",
|
||||||
@@ -557,7 +547,7 @@
|
|||||||
},
|
},
|
||||||
"attachments_actions": {
|
"attachments_actions": {
|
||||||
"open_externally": "Ouverture externe",
|
"open_externally": "Ouverture externe",
|
||||||
"open_externally_title": "Le fichier sera ouvert dans une application externe et les modifications apportées seront surveillées. \nVous pourrez ensuite téléverser la version modifiée dans Trilium.",
|
"open_externally_title": "Le fichier sera ouvert dans une application externe et surveillé pour détecter les modifications. Vous pourrez ensuite téléverser la version modifiée dans Trilium.",
|
||||||
"open_custom": "Ouvrir avec",
|
"open_custom": "Ouvrir avec",
|
||||||
"open_custom_title": "Le fichier sera ouvert dans une application externe et surveillé pour les modifications. Vous pourrez ensuite téléverser la version modifiée sur Trilium.",
|
"open_custom_title": "Le fichier sera ouvert dans une application externe et surveillé pour les modifications. Vous pourrez ensuite téléverser la version modifiée sur Trilium.",
|
||||||
"download": "Télécharger",
|
"download": "Télécharger",
|
||||||
@@ -596,7 +586,8 @@
|
|||||||
"september": "Septembre",
|
"september": "Septembre",
|
||||||
"october": "Octobre",
|
"october": "Octobre",
|
||||||
"november": "Novembre",
|
"november": "Novembre",
|
||||||
"december": "Décembre"
|
"december": "Décembre",
|
||||||
|
"cannot_find_week_note": "Impossible de trouver la note de la semaine"
|
||||||
},
|
},
|
||||||
"close_pane_button": {
|
"close_pane_button": {
|
||||||
"close_this_pane": "Fermer ce volet"
|
"close_this_pane": "Fermer ce volet"
|
||||||
@@ -740,7 +731,8 @@
|
|||||||
"basic_properties": {
|
"basic_properties": {
|
||||||
"note_type": "Type de note",
|
"note_type": "Type de note",
|
||||||
"editable": "Modifiable",
|
"editable": "Modifiable",
|
||||||
"basic_properties": "Propriétés de base"
|
"basic_properties": "Propriétés de base",
|
||||||
|
"language": "Langage"
|
||||||
},
|
},
|
||||||
"book_properties": {
|
"book_properties": {
|
||||||
"view_type": "Type d'affichage",
|
"view_type": "Type d'affichage",
|
||||||
@@ -751,7 +743,11 @@
|
|||||||
"collapse": "Réduire",
|
"collapse": "Réduire",
|
||||||
"expand": "Développer",
|
"expand": "Développer",
|
||||||
"invalid_view_type": "Type de vue non valide '{{type}}'",
|
"invalid_view_type": "Type de vue non valide '{{type}}'",
|
||||||
"calendar": "Calendrier"
|
"calendar": "Calendrier",
|
||||||
|
"book_properties": "Propriétés de la collection",
|
||||||
|
"table": "Tableau",
|
||||||
|
"geo-map": "Carte géographique",
|
||||||
|
"board": "Tableau de bord"
|
||||||
},
|
},
|
||||||
"edited_notes": {
|
"edited_notes": {
|
||||||
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
|
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
|
||||||
@@ -828,7 +824,8 @@
|
|||||||
"unknown_label_type": "Type de label inconnu '{{type}}'",
|
"unknown_label_type": "Type de label inconnu '{{type}}'",
|
||||||
"unknown_attribute_type": "Type d'attribut inconnu '{{type}}'",
|
"unknown_attribute_type": "Type d'attribut inconnu '{{type}}'",
|
||||||
"add_new_attribute": "Ajouter un nouvel attribut",
|
"add_new_attribute": "Ajouter un nouvel attribut",
|
||||||
"remove_this_attribute": "Supprimer cet attribut"
|
"remove_this_attribute": "Supprimer cet attribut",
|
||||||
|
"remove_color": "Supprimer l’étiquette de couleur"
|
||||||
},
|
},
|
||||||
"script_executor": {
|
"script_executor": {
|
||||||
"query": "Requête",
|
"query": "Requête",
|
||||||
@@ -851,7 +848,7 @@
|
|||||||
"debug": "debug",
|
"debug": "debug",
|
||||||
"debug_description": "Debug imprimera des informations supplémentaires dans la console pour faciliter le débogage des requêtes complexes",
|
"debug_description": "Debug imprimera des informations supplémentaires dans la console pour faciliter le débogage des requêtes complexes",
|
||||||
"action": "action",
|
"action": "action",
|
||||||
"search_button": "Recherche <kbd>Entrée</kbd>",
|
"search_button": "Recherche",
|
||||||
"search_execute": "Rechercher et exécuter des actions",
|
"search_execute": "Rechercher et exécuter des actions",
|
||||||
"save_to_note": "Enregistrer dans la note",
|
"save_to_note": "Enregistrer dans la note",
|
||||||
"search_parameters": "Paramètres de recherche",
|
"search_parameters": "Paramètres de recherche",
|
||||||
@@ -918,7 +915,7 @@
|
|||||||
"description1": "Le script de recherche permet de définir les résultats de la recherche en exécutant un script. Cela offre une flexibilité maximale lorsque la recherche standard ne suffit pas.",
|
"description1": "Le script de recherche permet de définir les résultats de la recherche en exécutant un script. Cela offre une flexibilité maximale lorsque la recherche standard ne suffit pas.",
|
||||||
"description2": "Le script de recherche doit être de type \"code\" et sous-type \"backend JavaScript\". Le script doit retourner un tableau de noteIds ou de notes.",
|
"description2": "Le script de recherche doit être de type \"code\" et sous-type \"backend JavaScript\". Le script doit retourner un tableau de noteIds ou de notes.",
|
||||||
"example_title": "Voir cet exemple :",
|
"example_title": "Voir cet exemple :",
|
||||||
"example_code": "// 1. préfiltrage à l'aide de la recherche standard\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. application de critères de recherche personnalisés\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;",
|
"example_code": "// 1. préfiltrage à l'aide de la recherche standard\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. application de critères de recherche personnalisés\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;",
|
||||||
"note": "Notez que le script de recherche et la l'expression à rechercher standard ne peuvent pas être combinés."
|
"note": "Notez que le script de recherche et la l'expression à rechercher standard ne peuvent pas être combinés."
|
||||||
},
|
},
|
||||||
"search_string": {
|
"search_string": {
|
||||||
@@ -1087,7 +1084,8 @@
|
|||||||
"max_width_label": "Largeur maximale du contenu en pixels",
|
"max_width_label": "Largeur maximale du contenu en pixels",
|
||||||
"apply_changes_description": "Pour appliquer les modifications de largeur du contenu, cliquez sur",
|
"apply_changes_description": "Pour appliquer les modifications de largeur du contenu, cliquez sur",
|
||||||
"reload_button": "recharger l'interface",
|
"reload_button": "recharger l'interface",
|
||||||
"reload_description": "changements par rapport aux options d'apparence"
|
"reload_description": "changements par rapport aux options d'apparence",
|
||||||
|
"max_width_unit": "Pixels"
|
||||||
},
|
},
|
||||||
"native_title_bar": {
|
"native_title_bar": {
|
||||||
"title": "Barre de titre native (nécessite le redémarrage de l'application)",
|
"title": "Barre de titre native (nécessite le redémarrage de l'application)",
|
||||||
@@ -1103,17 +1101,17 @@
|
|||||||
"title": "Thème de l'application",
|
"title": "Thème de l'application",
|
||||||
"theme_label": "Thème",
|
"theme_label": "Thème",
|
||||||
"override_theme_fonts_label": "Remplacer les polices du thème",
|
"override_theme_fonts_label": "Remplacer les polices du thème",
|
||||||
"auto_theme": "Auto",
|
"triliumnext": "Trilium (Suit le thème du système)",
|
||||||
"light_theme": "Lumière",
|
"triliumnext-light": "Trilium (Clair)",
|
||||||
"dark_theme": "Sombre",
|
"triliumnext-dark": "Trilium (sombre)",
|
||||||
"triliumnext": "TriliumNext Beta (Suit le thème du système)",
|
|
||||||
"triliumnext-light": "TriliumNext Beta (Clair)",
|
|
||||||
"triliumnext-dark": "TriliumNext Beta (sombre)",
|
|
||||||
"layout": "Disposition",
|
"layout": "Disposition",
|
||||||
"layout-vertical-title": "Vertical",
|
"layout-vertical-title": "Vertical",
|
||||||
"layout-horizontal-title": "Horizontal",
|
"layout-horizontal-title": "Horizontal",
|
||||||
"layout-vertical-description": "la barre de raccourcis est à gauche (défaut)",
|
"layout-vertical-description": "la barre de raccourcis est à gauche (défaut)",
|
||||||
"layout-horizontal-description": "la barre de raccourcis est sous la barre des onglets, cette-dernière est s'affiche en pleine largeur."
|
"layout-horizontal-description": "la barre de raccourcis est sous la barre des onglets, cette-dernière est s'affiche en pleine largeur.",
|
||||||
|
"auto_theme": "Hérité (suivre le schéma de couleurs du système)",
|
||||||
|
"light_theme": "Hérité (clair)",
|
||||||
|
"dark_theme": "Hérité (foncé)"
|
||||||
},
|
},
|
||||||
"zoom_factor": {
|
"zoom_factor": {
|
||||||
"title": "Facteur de zoom (version bureau uniquement)",
|
"title": "Facteur de zoom (version bureau uniquement)",
|
||||||
@@ -1158,14 +1156,14 @@
|
|||||||
"note_erasure_timeout": {
|
"note_erasure_timeout": {
|
||||||
"note_erasure_timeout_title": "Délai d'effacement des notes",
|
"note_erasure_timeout_title": "Délai d'effacement des notes",
|
||||||
"note_erasure_description": "Les notes supprimées (et les attributs, versions...) sont seulement marquées comme supprimées et il est possible de les récupérer à partir de la boîte de dialogue Notes récentes. Après un certain temps, les notes supprimées sont « effacées », ce qui signifie que leur contenu n'est plus récupérable. Ce paramètre vous permet de configurer la durée entre la suppression et l'effacement de la note.",
|
"note_erasure_description": "Les notes supprimées (et les attributs, versions...) sont seulement marquées comme supprimées et il est possible de les récupérer à partir de la boîte de dialogue Notes récentes. Après un certain temps, les notes supprimées sont « effacées », ce qui signifie que leur contenu n'est plus récupérable. Ce paramètre vous permet de configurer la durée entre la suppression et l'effacement de la note.",
|
||||||
"erase_notes_after": "Effacer les notes après",
|
"erase_notes_after": "Effacer les notes après :",
|
||||||
"manual_erasing_description": "Vous pouvez également déclencher l'effacement manuellement (sans tenir compte de la durée définie ci-dessus) :",
|
"manual_erasing_description": "Vous pouvez également déclencher l'effacement manuellement (sans tenir compte de la durée définie ci-dessus) :",
|
||||||
"erase_deleted_notes_now": "Effacer les notes supprimées maintenant",
|
"erase_deleted_notes_now": "Effacer les notes supprimées maintenant",
|
||||||
"deleted_notes_erased": "Les notes supprimées ont été effacées."
|
"deleted_notes_erased": "Les notes supprimées ont été effacées."
|
||||||
},
|
},
|
||||||
"revisions_snapshot_interval": {
|
"revisions_snapshot_interval": {
|
||||||
"note_revisions_snapshot_interval_title": "Délai d'enregistrement automatique d'une version de note",
|
"note_revisions_snapshot_interval_title": "Délai d'enregistrement automatique d'une version de note",
|
||||||
"note_revisions_snapshot_description": "Le délai d'enregistrement automatique des versions de note définit le temps avant la création automatique d'une nouvelle version de note. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/note-revisions.html\" class=\"external\">wiki</a> pour plus d'informations.",
|
"note_revisions_snapshot_description": "Le délai d'enregistrement automatique des versions de note définit le temps avant la création automatique d'une nouvelle version de note. Consultez le <doc>wiki</doc> pour plus d'informations.",
|
||||||
"snapshot_time_interval_label": "Délai d'enregistrement automatique de version de note :"
|
"snapshot_time_interval_label": "Délai d'enregistrement automatique de version de note :"
|
||||||
},
|
},
|
||||||
"revisions_snapshot_limit": {
|
"revisions_snapshot_limit": {
|
||||||
@@ -1391,8 +1389,8 @@
|
|||||||
"convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?"
|
"convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?"
|
||||||
},
|
},
|
||||||
"shared_info": {
|
"shared_info": {
|
||||||
"shared_publicly": "Cette note est partagée publiquement sur",
|
"shared_publicly": "Cette note est partagée publiquement sur {{- link}}",
|
||||||
"shared_locally": "Cette note est partagée localement sur",
|
"shared_locally": "Cette note est partagée localement sur {{- link}}",
|
||||||
"help_link": "Pour obtenir de l'aide, visitez le <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
"help_link": "Pour obtenir de l'aide, visitez le <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||||
},
|
},
|
||||||
"note_types": {
|
"note_types": {
|
||||||
@@ -1669,5 +1667,29 @@
|
|||||||
},
|
},
|
||||||
"multi_factor_authentication": {
|
"multi_factor_authentication": {
|
||||||
"oauth_user_email": "Courriel de l'utilisateur : "
|
"oauth_user_email": "Courriel de l'utilisateur : "
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"close": "Fermer"
|
||||||
|
},
|
||||||
|
"ai_llm": {
|
||||||
|
"not_started": "Non démarré",
|
||||||
|
"title": "Paramètres IA",
|
||||||
|
"processed_notes": "Notes traitées",
|
||||||
|
"n_notes_queued_0": "{{ count }} note en attente d’indexation",
|
||||||
|
"n_notes_queued_1": "{{ count }} notes en attente d’indexation",
|
||||||
|
"n_notes_queued_2": "",
|
||||||
|
"notes_indexed_0": "{{ count }} note indexée",
|
||||||
|
"notes_indexed_1": "{{ count }} notes indexées",
|
||||||
|
"notes_indexed_2": "",
|
||||||
|
"anthropic_url_description": "URL de base pour l'API Anthropic (par défaut : https ://api.anthropic.com)",
|
||||||
|
"anthropic_model_description": "Modèles Anthropic Claude pour la complétion",
|
||||||
|
"voyage_settings": "Réglages d'IA Voyage",
|
||||||
|
"ollama_settings": "Réglages Ollama",
|
||||||
|
"ollama_url_description": "URL pour l'API Ollama (par défaut: http://localhost:11434)",
|
||||||
|
"ollama_model_description": "Model Ollama utilisé pour la complétion",
|
||||||
|
"anthropic_configuration": "Configuration Anthropic",
|
||||||
|
"voyage_configuration": "Configuration IA Voyage",
|
||||||
|
"voyage_url_description": "Défaut: https://api.voyageai.com/v1",
|
||||||
|
"ollama_configuration": "Configuration Ollama"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
apps/client/src/translations/hu/translation.json
Normal file
1
apps/client/src/translations/hu/translation.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"close": "Chiudi",
|
|
||||||
"app_version": "Versione dell'app:",
|
"app_version": "Versione dell'app:",
|
||||||
"db_version": "Versione DB:",
|
"db_version": "Versione DB:",
|
||||||
"sync_version": "Versione Sync:",
|
"sync_version": "Versione Sync:",
|
||||||
@@ -27,7 +26,6 @@
|
|||||||
},
|
},
|
||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "Aggiungi un collegamento",
|
"add_link": "Aggiungi un collegamento",
|
||||||
"close": "Chiudi",
|
|
||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"search_note": "cerca una nota per nome",
|
"search_note": "cerca una nota per nome",
|
||||||
"link_title_mirrors": "il titolo del collegamento rispecchia il titolo della nota corrente",
|
"link_title_mirrors": "il titolo del collegamento rispecchia il titolo della nota corrente",
|
||||||
@@ -39,14 +37,12 @@
|
|||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"edit_branch_prefix": "Modifica il prefisso del ramo",
|
"edit_branch_prefix": "Modifica il prefisso del ramo",
|
||||||
"help_on_tree_prefix": "Aiuto sui prefissi dell'Albero",
|
"help_on_tree_prefix": "Aiuto sui prefissi dell'Albero",
|
||||||
"close": "Chiudi",
|
|
||||||
"prefix": "Prefisso: ",
|
"prefix": "Prefisso: ",
|
||||||
"save": "Salva",
|
"save": "Salva",
|
||||||
"branch_prefix_saved": "Il prefisso del ramo è stato salvato."
|
"branch_prefix_saved": "Il prefisso del ramo è stato salvato."
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"bulk_actions": "Azioni massive",
|
"bulk_actions": "Azioni massive",
|
||||||
"close": "Chiudi",
|
|
||||||
"affected_notes": "Note influenzate",
|
"affected_notes": "Note influenzate",
|
||||||
"include_descendants": "Includi i discendenti della nota selezionata",
|
"include_descendants": "Includi i discendenti della nota selezionata",
|
||||||
"available_actions": "Azioni disponibili",
|
"available_actions": "Azioni disponibili",
|
||||||
@@ -61,7 +57,6 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "Clona note in...",
|
"clone_notes_to": "Clona note in...",
|
||||||
"close": "Chiudi",
|
|
||||||
"help_on_links": "Aiuto sui collegamenti",
|
"help_on_links": "Aiuto sui collegamenti",
|
||||||
"notes_to_clone": "Note da clonare",
|
"notes_to_clone": "Note da clonare",
|
||||||
"target_parent_note": "Nodo padre obiettivo",
|
"target_parent_note": "Nodo padre obiettivo",
|
||||||
@@ -73,7 +68,6 @@
|
|||||||
"note_cloned": "La nota \"{{clonedTitle}}\" è stata clonata in \"{{targetTitle}}\""
|
"note_cloned": "La nota \"{{clonedTitle}}\" è stata clonata in \"{{targetTitle}}\""
|
||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"close": "Chiudi",
|
|
||||||
"cancel": "Annulla",
|
"cancel": "Annulla",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"confirmation": "Conferma",
|
"confirmation": "Conferma",
|
||||||
@@ -106,47 +100,20 @@
|
|||||||
"choose_export_type": "Scegli prima il tipo di esportazione, per favore",
|
"choose_export_type": "Scegli prima il tipo di esportazione, per favore",
|
||||||
"export_in_progress": "Esportazione in corso: {{progressCount}}",
|
"export_in_progress": "Esportazione in corso: {{progressCount}}",
|
||||||
"export_finished_successfully": "Esportazione terminata con successo.",
|
"export_finished_successfully": "Esportazione terminata con successo.",
|
||||||
"format_pdf": "PDF- allo scopo di stampa o esportazione."
|
"format_pdf": "PDF- allo scopo di stampa o esportazione.",
|
||||||
},
|
"export_type_subtree": "Questa nota e tutti i suoi discendenti",
|
||||||
"help": {
|
"format_html": "HTML - raccomandato in quanto mantiene tutti i formati",
|
||||||
"close": "Chiudi",
|
"format_html_zip": "HTML in archivio ZIP - questo è raccomandato in quanto conserva tutta la formattazione.",
|
||||||
"fullDocumentation": "Aiuto (la documentazione completa è disponibile <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)"
|
"format_markdown": "MArkdown - questo conserva la maggior parte della formattazione.",
|
||||||
},
|
"export_type_single": "Solo questa nota, senza le sottostanti"
|
||||||
"import": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"include_note": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"jump_to_note": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"markdown_import": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"move_to": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"note_type_chooser": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"close": "Chiudi",
|
|
||||||
"body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non è stata ancora impostata.",
|
"body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non è stata ancora impostata.",
|
||||||
"body2": "Per proteggere le note, fare clic su <a class=\"open-password-options-button\" href=\"javascript:\">qui</a> per aprire la finestra di dialogo Opzioni e impostare la password."
|
"body2": "Per proteggere le note, fare clic su <a class=\"open-password-options-button\" href=\"javascript:\">qui</a> per aprire la finestra di dialogo Opzioni e impostare la password."
|
||||||
},
|
},
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
"close_label": "Chiudi"
|
"close_label": "Chiudi"
|
||||||
},
|
},
|
||||||
"prompt": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"recent_changes": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"revisions": {
|
|
||||||
"close": "Chiudi"
|
|
||||||
},
|
|
||||||
"abstract_bulk_action": {
|
"abstract_bulk_action": {
|
||||||
"remove_this_search_action": "Rimuovi questa azione di ricerca"
|
"remove_this_search_action": "Rimuovi questa azione di ricerca"
|
||||||
},
|
},
|
||||||
@@ -375,5 +342,12 @@
|
|||||||
"quick-search": {
|
"quick-search": {
|
||||||
"placeholder": "Ricerca rapida",
|
"placeholder": "Ricerca rapida",
|
||||||
"searching": "Ricerca in corso..."
|
"searching": "Ricerca in corso..."
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"goUpDown": "su/giù nella lista delle note",
|
||||||
|
"collapseExpand": "collassa/espande il nodo",
|
||||||
|
"notSet": "non impostato",
|
||||||
|
"goBackForwards": "indietro/avanti nella cronologia",
|
||||||
|
"showJumpToNoteDialog": "mostra <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">la finestra di dialogo \"Salta alla nota\"<a>"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
29
apps/client/src/translations/ko/translation.json
Normal file
29
apps/client/src/translations/ko/translation.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "Trilium Notes에 대해서",
|
||||||
|
"homepage": "홈페이지:",
|
||||||
|
"app_version": "앱 버전:",
|
||||||
|
"db_version": "DB 버전:",
|
||||||
|
"sync_version": "동기화 버전:",
|
||||||
|
"build_date": "빌드 날짜:",
|
||||||
|
"build_revision": "빌드 리비전:",
|
||||||
|
"data_directory": "데이터 경로:"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"critical-error": {
|
||||||
|
"title": "심각한 오류",
|
||||||
|
"message": "클라이언트 애플리케이션 시작 도중 심각한 오류가 발생했습니다:\n\n{{message}}\n\n이는 스크립트가 예기치 않게 실패하면서 발생한 것일 수 있습니다. 애플리케이션을 안전 모드로 시작한 뒤 문제를 해결해 보세요."
|
||||||
|
},
|
||||||
|
"widget-error": {
|
||||||
|
"title": "위젯 초기화 실패"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"add_link": {
|
||||||
|
"add_link": "링크 추가",
|
||||||
|
"note": "노트",
|
||||||
|
"search_note": "이름으로 노트 검색하기"
|
||||||
|
},
|
||||||
|
"branch_prefix": {
|
||||||
|
"save": "저장"
|
||||||
|
}
|
||||||
|
}
|
||||||
9
apps/client/src/translations/nl/translation.json
Normal file
9
apps/client/src/translations/nl/translation.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "Over Trilium Notes",
|
||||||
|
"homepage": "Homepagina:",
|
||||||
|
"app_version": "App versie:",
|
||||||
|
"db_version": "DB Versie:",
|
||||||
|
"sync_version": "Sync Versie:"
|
||||||
|
}
|
||||||
|
}
|
||||||
139
apps/client/src/translations/pl/translation.json
Normal file
139
apps/client/src/translations/pl/translation.json
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "O notatkach Trilium",
|
||||||
|
"homepage": "Strona główna:",
|
||||||
|
"app_version": "Wersja aplikacji:",
|
||||||
|
"db_version": "Wersja bazy danych:",
|
||||||
|
"sync_version": "Wersja synchronizacji:",
|
||||||
|
"build_date": "Zbudowano:",
|
||||||
|
"build_revision": "Rewizja zbudowania:",
|
||||||
|
"data_directory": "Katalog z danymi:"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"critical-error": {
|
||||||
|
"title": "Błąd krytyczny",
|
||||||
|
"message": "Wystąpił krytyczny błąd uniemożliwiający uruchomienie aplikacji:\n\n{{message}}\n\nJest to spowodowane najprawdopodobniej niespodziewanym błędem skryptu. Spróbuj uruchomić aplikację ponownie w trybie bezpiecznym i zaadresuj problem."
|
||||||
|
},
|
||||||
|
"widget-error": {
|
||||||
|
"title": "Nie udało się zainicjować widżetu",
|
||||||
|
"message-custom": "Niestandardowy widżet z notatki o identyfikatorze \"{{id}}\", i tytule \"{{title}}\" nie mógł zostać zainicjowany z powodu:\n\n{{message}}",
|
||||||
|
"message-unknown": "Nieznany widżet nie mógł być zainicjowany z powodu:\n\n{{message}}"
|
||||||
|
},
|
||||||
|
"bundle-error": {
|
||||||
|
"title": "Nie udało się załadować niestandardowego skryptu",
|
||||||
|
"message": "Skrypt z notatki o identyfikatorze \"{{id}}\", tytule \"{{title}}: nie został uruchomiony z powodu:\n\n{{message}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"add_link": {
|
||||||
|
"add_link": "Dodaj link",
|
||||||
|
"note": "Notatka",
|
||||||
|
"search_note": "Wyszukaj notatkę po nazwie",
|
||||||
|
"link_title_arbitrary": "Tytuł linku można dowolnie zmieniać",
|
||||||
|
"link_title": "Tytuł linku",
|
||||||
|
"button_add_link": "Dodaj link"
|
||||||
|
},
|
||||||
|
"branch_prefix": {
|
||||||
|
"save": "Zapisz",
|
||||||
|
"edit_branch_prefix": "Edytuj prefiks gałęzi",
|
||||||
|
"prefix": "Prefiks: ",
|
||||||
|
"branch_prefix_saved": "Zapisano prefiks gałęzi."
|
||||||
|
},
|
||||||
|
"bulk_actions": {
|
||||||
|
"labels": "Etykiety",
|
||||||
|
"notes": "Notatki",
|
||||||
|
"other": "Inne",
|
||||||
|
"relations": "Powiązania",
|
||||||
|
"bulk_actions": "Działania zbiorcze",
|
||||||
|
"include_descendants": "Uwzględnia rozwinięcia wybranych notatek",
|
||||||
|
"available_actions": "Dostępne działania",
|
||||||
|
"chosen_actions": "Wybrane działania",
|
||||||
|
"execute_bulk_actions": "Wykonaj zbiór działań",
|
||||||
|
"bulk_actions_executed": "Zbiór działań został wykonany prawidłowo.",
|
||||||
|
"none_yet": "Brak zaznaczonych działań... dodaj działanie poprzez kliknięcie jednej z dostępnych opcji powyżej."
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"ok": "OK",
|
||||||
|
"cancel": "Anuluj",
|
||||||
|
"confirmation": "Potwierdzenie",
|
||||||
|
"are_you_sure_remove_note": "Czy napewno chcesz usunąć notatkę \"{{title}}\" z mapy powiązań? ",
|
||||||
|
"if_you_dont_check": "Jeśli nie zaznaczysz tej opcji, notatka zostanie usunięta jedynie z mapy powiązań.",
|
||||||
|
"also_delete_note": "Usuń dodatkowo notatkę"
|
||||||
|
},
|
||||||
|
"delete_notes": {
|
||||||
|
"cancel": "Anuluj",
|
||||||
|
"close": "Zamknij",
|
||||||
|
"delete_notes_preview": "Usuń podgląd notatek",
|
||||||
|
"delete_all_clones_description": "Usuń również wszystkie sklonowania (działanie może zostać cofnięte w ostatnich zmianach)",
|
||||||
|
"erase_notes_description": "Normalne (miękkie) usuwanie zaznacza jedynie notatki jako usunięte i można je przywrócić (w oknie dialogowym ostatnich zmian) przez wyznaczony okres czasu. Zaznaczenie tej opcji spowoduje natychmiastowe usunięcie notatek, bez możliwości ich przywrócenia.",
|
||||||
|
"erase_notes_warning": "Usuń notatki permanentnie (bez opcji ich przywrócenia), włączając wszystkie kopie. Działanie to wymaga ponownego uruchomienia aplikacji.",
|
||||||
|
"notes_to_be_deleted": "Następujące notatki zostaną usunięte ({{notesCount}})",
|
||||||
|
"no_note_to_delete": "Żadne notatki nie zostaną usunięte (jedynie kopie).",
|
||||||
|
"broken_relations_to_be_deleted": "Następujące powiązania zostaną uszkodzone i usunięte ({{ relationCount}})",
|
||||||
|
"ok": "OK",
|
||||||
|
"deleted_relation_text": "Notatka {{- note}} (do usunięcia) jest powiązana przez relację {{- relation}} pochodzącą z {{- source}}."
|
||||||
|
},
|
||||||
|
"export": {
|
||||||
|
"close": "Zamknij",
|
||||||
|
"export_note_title": "Eksportuj notatkę",
|
||||||
|
"export_type_subtree": "Ta notatka oraz wszystkie podrzędne",
|
||||||
|
"format_html": "HTML - rekomendowany jako zachowujący całość formatowania",
|
||||||
|
"format_html_zip": "HTML w archiwum ZIP - rekomendowany jako zachowujący całość formatowania.",
|
||||||
|
"format_markdown": "Markdown - zachowuje większość formatowania.",
|
||||||
|
"format_opml": "OPML - format wymiany danych dla outlinerów zawierający tylko tekst. Formatowanie, obrazy i pliki nie są uwzględnione.",
|
||||||
|
"opml_version_1": "OPML v1.0 - tylko zwykły tekst",
|
||||||
|
"opml_version_2": "OPML v2.0 - umożliwia również HTML",
|
||||||
|
"export_type_single": "Tylko ta notatka, bez elementów podrzędnych",
|
||||||
|
"export": "Eksportuj",
|
||||||
|
"choose_export_type": "Wybierz najpierw rodzaj pliku do eksportu",
|
||||||
|
"export_status": "Status eksportu",
|
||||||
|
"export_in_progress": "Postęp eksportowania: {{progressCount}}",
|
||||||
|
"export_finished_successfully": "Eksportowanie zakończone.",
|
||||||
|
"format_pdf": "PDF - w celu drukowania lub udostępniania."
|
||||||
|
},
|
||||||
|
"clone_to": {
|
||||||
|
"clone_notes_to": "Sklonuj notatki do...",
|
||||||
|
"notes_to_clone": "Notatki do sklonowania",
|
||||||
|
"search_for_note_by_its_name": "Wyszukaj notatkę po jej nazwie",
|
||||||
|
"cloned_note_prefix_title": "Sklonowana notatka zostanie wyświetlona w drzewie notatki z podanym prefiksem",
|
||||||
|
"prefix_optional": "Prefiks (opcjonalne)",
|
||||||
|
"clone_to_selected_note": "Sklonuj do wybranej notatki",
|
||||||
|
"no_path_to_clone_to": "Brak ścieżki do sklonowania.",
|
||||||
|
"note_cloned": "Notatka \"{{clonedTitle}}\" została sklonowana do \"{{targetTitle}}\""
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"title": "Ściągawka",
|
||||||
|
"noteNavigation": "Nawigacja po notatkach",
|
||||||
|
"goUpDown": "przewijanie w górę/w dół w liście notatek",
|
||||||
|
"collapseExpand": "zwiń/rozwiń zbiór",
|
||||||
|
"notSet": "niezdefiniowany",
|
||||||
|
"goBackForwards": "przewijaj do tyłu/do przodu w historii",
|
||||||
|
"showJumpToNoteDialog": "pokaż <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"przejdź do dialogu</a>",
|
||||||
|
"scrollToActiveNote": "przewiń do aktywnej notatki",
|
||||||
|
"jumpToParentNote": "przejdź do głównej notatki",
|
||||||
|
"collapseWholeTree": "zwiń całe drzewko notatki",
|
||||||
|
"collapseSubTree": "zwiń gałąź notatki",
|
||||||
|
"tabShortcuts": "Skóry kart",
|
||||||
|
"newTabNoteLink": "link notatki otwiera notatkę w nowej karcie",
|
||||||
|
"newTabWithActivationNoteLink": "link notatki otwiera i aktywuje notatkę w nowej karcie",
|
||||||
|
"onlyInDesktop": "Tylko na komputerze stacjonarnym (wersja Electron)",
|
||||||
|
"openEmptyTab": "Otwórz pustą kartę",
|
||||||
|
"closeActiveTab": "zamknij aktywną kartę",
|
||||||
|
"activateNextTab": "aktywuj następną kartę",
|
||||||
|
"activatePreviousTab": "aktywuj poprzednią kartę",
|
||||||
|
"creatingNotes": "Tworzenie notatek",
|
||||||
|
"createNoteAfter": "Utwórz nową notatkę obok obecnie aktywnej",
|
||||||
|
"createNoteInto": "Utwórz nową podnotatkę w obecnie otwartej",
|
||||||
|
"editBranchPrefix": "edytuj <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">prefiks</a> aktywnej kopii notatki",
|
||||||
|
"movingCloningNotes": "Przenoszenie / kopiowanie notatek",
|
||||||
|
"moveNoteUpDown": "Przenieś notatkę w górę/w dół na liście notatek",
|
||||||
|
"moveNoteUpHierarchy": "Przenieś notatkę w górę w hierarchii",
|
||||||
|
"multiSelectNote": "Zaznacz wiele notatek powyżej/poniżej",
|
||||||
|
"selectAllNotes": "Wybierz wszystkie notatki na obecnym poziomie",
|
||||||
|
"selectNote": "Wybierz notatkę",
|
||||||
|
"copyNotes": "skopiuj obecną notatkę (lub obecną sekcję) do schowka (zastosowanie dla<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">klonowania</a>)",
|
||||||
|
"cutNotes": "przytnij obecną notatkę (lub obecną sekcję) do schowka (zastosowanie dla przenoszenia notatek)",
|
||||||
|
"pasteNotes": "wklej notatkę jako podnotatka w obecnej notatce (rozumiane jako przenieś lub skopiuj, w zależności czy notatka była skopiowana czy wycięta)",
|
||||||
|
"deleteNotes": "usuń notatkę / gałąź",
|
||||||
|
"editingNotes": "Edytowanie notatek"
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -7,8 +7,7 @@
|
|||||||
"sync_version": "Versiune sincronizare:",
|
"sync_version": "Versiune sincronizare:",
|
||||||
"build_date": "Data compilării:",
|
"build_date": "Data compilării:",
|
||||||
"build_revision": "Revizia compilării:",
|
"build_revision": "Revizia compilării:",
|
||||||
"data_directory": "Directorul de date:",
|
"data_directory": "Directorul de date:"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"abstract_bulk_action": {
|
"abstract_bulk_action": {
|
||||||
"remove_this_search_action": "Înlătură acesată acțiune la căutare"
|
"remove_this_search_action": "Înlătură acesată acțiune la căutare"
|
||||||
@@ -30,19 +29,18 @@
|
|||||||
},
|
},
|
||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "Adaugă legătură",
|
"add_link": "Adaugă legătură",
|
||||||
"close": "Închide",
|
|
||||||
"help_on_links": "Informații despre legături",
|
"help_on_links": "Informații despre legături",
|
||||||
"link_title": "Titlu legătură",
|
"link_title": "Titlu legătură",
|
||||||
"link_title_arbitrary": "titlul legăturii poate fi schimbat în mod arbitrar",
|
"link_title_arbitrary": "titlul legăturii poate fi schimbat în mod arbitrar",
|
||||||
"link_title_mirrors": "titlul legăturii corespunde titlul curent al notiței",
|
"link_title_mirrors": "titlul legăturii corespunde titlul curent al notiței",
|
||||||
"note": "Notiță",
|
"note": "Notiță",
|
||||||
"search_note": "căutați notița după nume",
|
"search_note": "căutați notița după nume",
|
||||||
"button_add_link": "Adaugă legătură <kbd>Enter</kbd>"
|
"button_add_link": "Adaugă legătură"
|
||||||
},
|
},
|
||||||
"add_relation": {
|
"add_relation": {
|
||||||
"add_relation": "Adaugă relație",
|
"add_relation": "Adaugă relație",
|
||||||
"allowed_characters": "Sunt permise doar caractere alfanumerice, underline și două puncte.",
|
"allowed_characters": "Sunt permise doar caractere alfanumerice, underline și două puncte.",
|
||||||
"create_relation_on_all_matched_notes": "Crează relația pentru toate notițele găsite",
|
"create_relation_on_all_matched_notes": "Creează relația pentru toate notițele găsite.",
|
||||||
"relation_name": "denumirea relației",
|
"relation_name": "denumirea relației",
|
||||||
"target_note": "notița destinație",
|
"target_note": "notița destinație",
|
||||||
"to": "către"
|
"to": "către"
|
||||||
@@ -78,9 +76,9 @@
|
|||||||
"attachment_erasure_timeout": {
|
"attachment_erasure_timeout": {
|
||||||
"attachment_auto_deletion_description": "Atașamentele se șterg automat (permanent) dacă nu sunt referențiate de către notița lor părinte după un timp prestabilit de timp.",
|
"attachment_auto_deletion_description": "Atașamentele se șterg automat (permanent) dacă nu sunt referențiate de către notița lor părinte după un timp prestabilit de timp.",
|
||||||
"attachment_erasure_timeout": "Perioadă de ștergere a atașamentelor",
|
"attachment_erasure_timeout": "Perioadă de ștergere a atașamentelor",
|
||||||
"erase_attachments_after": "Erase unused attachments after:",
|
"erase_attachments_after": "Șterge atașamentele neutilizate după:",
|
||||||
"erase_unused_attachments_now": "Elimină atașamentele șterse acum",
|
"erase_unused_attachments_now": "Elimină atașamentele șterse acum",
|
||||||
"manual_erasing_description": "Șterge acum toate atașamentele nefolosite din notițe",
|
"manual_erasing_description": "Puteți șterge atașamentele nefolosite manual (fără a lua în considerare timpul de mai sus):",
|
||||||
"unused_attachments_erased": "Atașamentele nefolosite au fost șterse."
|
"unused_attachments_erased": "Atașamentele nefolosite au fost șterse."
|
||||||
},
|
},
|
||||||
"attachment_list": {
|
"attachment_list": {
|
||||||
@@ -143,7 +141,7 @@
|
|||||||
"hide_promoted_attributes": "Ascunde lista atributelor promovate pentru această notiță",
|
"hide_promoted_attributes": "Ascunde lista atributelor promovate pentru această notiță",
|
||||||
"hide_relations": "lista denumirilor relațiilor ce trebuie ascunse, delimitate prin virgulă. Toate celelalte vor fi afișate.",
|
"hide_relations": "lista denumirilor relațiilor ce trebuie ascunse, delimitate prin virgulă. Toate celelalte vor fi afișate.",
|
||||||
"icon_class": "valoarea acestei etichete este adăugată ca o clasă CSS la iconița notiței din ierarhia notițelor, fapt ce poate ajuta la identificarea vizuală mai rapidă a notițelor. Un exemplu ar fi „bx bx-home” pentru iconițe preluate din boxicons. Poate fi folosită în notițe de tip șablon.",
|
"icon_class": "valoarea acestei etichete este adăugată ca o clasă CSS la iconița notiței din ierarhia notițelor, fapt ce poate ajuta la identificarea vizuală mai rapidă a notițelor. Un exemplu ar fi „bx bx-home” pentru iconițe preluate din boxicons. Poate fi folosită în notițe de tip șablon.",
|
||||||
"inbox": "locația implicită în care vor apărea noile notițe atunci când se crează o noitiță utilizând butonul „Crează notiță” din bara laterală, notițele vor fi create în interiorul notiței cu această etichetă.",
|
"inbox": "locația implicită în care vor apărea noile notițe atunci când se crează o noitiță utilizând butonul „Crează notiță” din bara laterală, notițele vor fi create în interiorul notiței marcată cu eticheta <code>#inbox</code>.",
|
||||||
"inherit": "atributele acestei notițe vor fi moștenite chiar dacă nu există o relație părinte-copil între notițe. A se vedea relația de tip șablon pentru un concept similar. De asemenea, a se vedea moștenirea atributelor în documentație.",
|
"inherit": "atributele acestei notițe vor fi moștenite chiar dacă nu există o relație părinte-copil între notițe. A se vedea relația de tip șablon pentru un concept similar. De asemenea, a se vedea moștenirea atributelor în documentație.",
|
||||||
"inheritable": "Moștenibilă",
|
"inheritable": "Moștenibilă",
|
||||||
"inheritable_title": "Atributele moștenibile vor fi moștenite de către toți descendenții acestei notițe.",
|
"inheritable_title": "Atributele moștenibile vor fi moștenite de către toți descendenții acestei notițe.",
|
||||||
@@ -200,7 +198,7 @@
|
|||||||
"share_disallow_robot_indexing": "împiedică indexarea conținutului de către roboți utilizând antetul <code>X-Robots-Tag: noindex</code>",
|
"share_disallow_robot_indexing": "împiedică indexarea conținutului de către roboți utilizând antetul <code>X-Robots-Tag: noindex</code>",
|
||||||
"share_external_link": "notița va funcționa drept o legătură către un site web extern în ierarhia de partajare",
|
"share_external_link": "notița va funcționa drept o legătură către un site web extern în ierarhia de partajare",
|
||||||
"share_favicon": "Notiță ce conține pictograma favicon pentru a fi setată în paginile partajate. De obicei se poate seta în rădăcina ierarhiei de partajare și se poate face moștenibilă. Notița ce conține favicon-ul trebuie să fie și ea în ierarhia de partajare. Considerați și utilizarea „share_hidden_from_tree”.",
|
"share_favicon": "Notiță ce conține pictograma favicon pentru a fi setată în paginile partajate. De obicei se poate seta în rădăcina ierarhiei de partajare și se poate face moștenibilă. Notița ce conține favicon-ul trebuie să fie și ea în ierarhia de partajare. Considerați și utilizarea „share_hidden_from_tree”.",
|
||||||
"share_hidden_from_tree": "notița este ascunsă din arborele de navigație din stânga, dar încă este accesibilă prin intermediul unui URL.",
|
"share_hidden_from_tree": "notița este ascunsă din arborele de navigație din stânga, dar încă este accesibilă prin intermediul unui URL",
|
||||||
"share_index": "notițele cu această etichetă vor afișa lista tuturor rădăcilor notițelor partajate",
|
"share_index": "notițele cu această etichetă vor afișa lista tuturor rădăcilor notițelor partajate",
|
||||||
"share_js": "Notiță JavaScript ce va fi injectată în pagina de partajare. Notița respectivă trebuie să fie și ea în ierarhia de partajare. Considerați utilizarea 'share_hidden_from_tree'.",
|
"share_js": "Notiță JavaScript ce va fi injectată în pagina de partajare. Notița respectivă trebuie să fie și ea în ierarhia de partajare. Considerați utilizarea 'share_hidden_from_tree'.",
|
||||||
"share_omit_default_css": "CSS-ul implicit pentru pagina de partajare va fi omis. Se poate folosi atunci când se fac schimbări majore de stil la pagină.",
|
"share_omit_default_css": "CSS-ul implicit pentru pagina de partajare va fi omis. Se poate folosi atunci când se fac schimbări majore de stil la pagină.",
|
||||||
@@ -216,7 +214,7 @@
|
|||||||
"target_note_title": "Relația este o conexiune numită dintre o notiță sursă și o notiță țintă.",
|
"target_note_title": "Relația este o conexiune numită dintre o notiță sursă și o notiță țintă.",
|
||||||
"template": "Șablon",
|
"template": "Șablon",
|
||||||
"text": "Text",
|
"text": "Text",
|
||||||
"title_template": "titlul implicit al notițelor create în interiorul acestei notițe. Valoarea este evaluată ca un șir de caractere JavaScript\n și poate fi astfel îmbogățită cu un conținut dinamic prin intermediul variabilelow <code>now</code> și <code>parentNote</code>. Exemple:\n \n <ul>\n <li><code>Lucrările lui ${parentNote.getLabelValue('autor')}</code></li>\n <li><code>Jurnal pentru ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n A se vedea <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki-ul pentru detalii</a>, documentația API pentru <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> și <a href=\"https://day.js.org/docs/en/display/format\">now</a> pentru mai multe informații",
|
"title_template": "titlul implicit al notițelor create în interiorul acestei notițe. Valoarea este evaluată ca un șir de caractere JavaScript\n și poate fi astfel îmbogățită cu un conținut dinamic prin intermediul variabilelor <code>now</code> și <code>parentNote</code>. Exemple:\n \n <ul>\n <li><code>Lucrările lui ${parentNote.getLabelValue('autor')}</code></li>\n <li><code>Jurnal pentru ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n A se vedea <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">wiki-ul pentru detalii</a>, documentația API pentru <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> și <a href=\"https://day.js.org/docs/en/display/format\">now</a> pentru mai multe informații.",
|
||||||
"toc": "<code>#toc</code> sau <code>#toc=show</code> forțează afișarea tabelei de conținut, <code>#toc=hide</code> forțează ascunderea ei. Dacă eticheta nu există, se utilizează setările globale",
|
"toc": "<code>#toc</code> sau <code>#toc=show</code> forțează afișarea tabelei de conținut, <code>#toc=hide</code> forțează ascunderea ei. Dacă eticheta nu există, se utilizează setările globale",
|
||||||
"top": "păstrează notița la începutul listei (se aplică doar pentru notițe sortate automat)",
|
"top": "păstrează notița la începutul listei (se aplică doar pentru notițe sortate automat)",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
@@ -296,7 +294,6 @@
|
|||||||
},
|
},
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"branch_prefix_saved": "Prefixul ramurii a fost salvat.",
|
"branch_prefix_saved": "Prefixul ramurii a fost salvat.",
|
||||||
"close": "Închide",
|
|
||||||
"edit_branch_prefix": "Editează prefixul ramurii",
|
"edit_branch_prefix": "Editează prefixul ramurii",
|
||||||
"help_on_tree_prefix": "Informații despre prefixe de ierarhie",
|
"help_on_tree_prefix": "Informații despre prefixe de ierarhie",
|
||||||
"prefix": "Prefix: ",
|
"prefix": "Prefix: ",
|
||||||
@@ -308,7 +305,6 @@
|
|||||||
"bulk_actions": "Acțiuni în masă",
|
"bulk_actions": "Acțiuni în masă",
|
||||||
"bulk_actions_executed": "Acțiunile în masă au fost executate cu succes.",
|
"bulk_actions_executed": "Acțiunile în masă au fost executate cu succes.",
|
||||||
"chosen_actions": "Acțiuni selectate",
|
"chosen_actions": "Acțiuni selectate",
|
||||||
"close": "Închide",
|
|
||||||
"execute_bulk_actions": "Execută acțiunile în masă",
|
"execute_bulk_actions": "Execută acțiunile în masă",
|
||||||
"include_descendants": "Include descendenții notiței selectate",
|
"include_descendants": "Include descendenții notiței selectate",
|
||||||
"none_yet": "Nicio acțiune... adăugați una printr-un click pe cele disponibile mai jos.",
|
"none_yet": "Nicio acțiune... adăugați una printr-un click pe cele disponibile mai jos.",
|
||||||
@@ -342,7 +338,7 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "Clonează notițele către...",
|
"clone_notes_to": "Clonează notițele către...",
|
||||||
"clone_to_selected_note": "Clonează notița selectată <kbd>enter</kbd>",
|
"clone_to_selected_note": "Clonează notița selectată",
|
||||||
"cloned_note_prefix_title": "Notița clonată va fi afișată în ierarhia notiței utilizând prefixul dat",
|
"cloned_note_prefix_title": "Notița clonată va fi afișată în ierarhia notiței utilizând prefixul dat",
|
||||||
"help_on_links": "Informații despre legături",
|
"help_on_links": "Informații despre legături",
|
||||||
"no_path_to_clone_to": "Nicio cale de clonat.",
|
"no_path_to_clone_to": "Nicio cale de clonat.",
|
||||||
@@ -350,8 +346,7 @@
|
|||||||
"notes_to_clone": "Notițe de clonat",
|
"notes_to_clone": "Notițe de clonat",
|
||||||
"prefix_optional": "Prefix (opțional)",
|
"prefix_optional": "Prefix (opțional)",
|
||||||
"search_for_note_by_its_name": "căutați notița după nume acesteia",
|
"search_for_note_by_its_name": "căutați notița după nume acesteia",
|
||||||
"target_parent_note": "Notița părinte țintă",
|
"target_parent_note": "Notița părinte țintă"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"close_pane_button": {
|
"close_pane_button": {
|
||||||
"close_this_pane": "Închide acest panou"
|
"close_this_pane": "Închide acest panou"
|
||||||
@@ -378,8 +373,7 @@
|
|||||||
"cancel": "Anulează",
|
"cancel": "Anulează",
|
||||||
"confirmation": "Confirm",
|
"confirmation": "Confirm",
|
||||||
"if_you_dont_check": "Dacă această opțiune nu este bifată, notița va fi ștearsă doar din harta de relații.",
|
"if_you_dont_check": "Dacă această opțiune nu este bifată, notița va fi ștearsă doar din harta de relații.",
|
||||||
"ok": "OK",
|
"ok": "OK"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"consistency_checks": {
|
"consistency_checks": {
|
||||||
"find_and_fix_button": "Caută și repară probleme de consistență",
|
"find_and_fix_button": "Caută și repară probleme de consistență",
|
||||||
@@ -436,14 +430,14 @@
|
|||||||
"undelete_notes_instruction": "După ștergere, se pot recupera din ecranul Schimbări recente."
|
"undelete_notes_instruction": "După ștergere, se pot recupera din ecranul Schimbări recente."
|
||||||
},
|
},
|
||||||
"delete_notes": {
|
"delete_notes": {
|
||||||
"broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{- relationCount}})",
|
"broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{ relationCount}})",
|
||||||
"cancel": "Anulează",
|
"cancel": "Anulează",
|
||||||
"delete_all_clones_description": "Șterge și toate clonele (se pot recupera în ecranul Schimbări recente)",
|
"delete_all_clones_description": "Șterge și toate clonele (se pot recupera în ecranul Schimbări recente)",
|
||||||
"delete_notes_preview": "Previzualizare ștergerea notițelor",
|
"delete_notes_preview": "Previzualizare ștergerea notițelor",
|
||||||
"erase_notes_description": "Ștergerea obișnuită doar marchează notițele ca fiind șterse și pot fi recuperate (în ecranul Schimbări recente) pentru o perioadă de timp. Dacă se bifează această opțiune, notițele vor fi șterse imediat fără posibilitatea de a le recupera.",
|
"erase_notes_description": "Ștergerea obișnuită doar marchează notițele ca fiind șterse și pot fi recuperate (în ecranul Schimbări recente) pentru o perioadă de timp. Dacă se bifează această opțiune, notițele vor fi șterse imediat fără posibilitatea de a le recupera.",
|
||||||
"erase_notes_warning": "Șterge notițele permanent (nu se mai pot recupera), incluzând toate clonele. Va forța reîncărcarea aplicației.",
|
"erase_notes_warning": "Șterge notițele permanent (nu se mai pot recupera), incluzând toate clonele. Va forța reîncărcarea aplicației.",
|
||||||
"no_note_to_delete": "Nicio notiță nu va fi ștearsă (doar clonele).",
|
"no_note_to_delete": "Nicio notiță nu va fi ștearsă (doar clonele).",
|
||||||
"notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{- noteCount}})",
|
"notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{notesCount}})",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"deleted_relation_text": "Notița {{- note}} ce va fi ștearsă este referențiată de relația {{- relation}}, originând din {{- source}}.",
|
"deleted_relation_text": "Notița {{- note}} ce va fi ștearsă este referențiată de relația {{- relation}}, originând din {{- source}}.",
|
||||||
"close": "Închide"
|
"close": "Închide"
|
||||||
@@ -525,8 +519,8 @@
|
|||||||
"export_status": "Starea exportului",
|
"export_status": "Starea exportului",
|
||||||
"export_type_single": "Doar această notiță fără descendenții ei",
|
"export_type_single": "Doar această notiță fără descendenții ei",
|
||||||
"export_type_subtree": "Această notiță și toți descendenții ei",
|
"export_type_subtree": "Această notiță și toți descendenții ei",
|
||||||
"format_html_zip": "HTML în arhivă ZIP - recomandat deoarece păstrează toată formatarea",
|
"format_html_zip": "HTML în arhivă ZIP - recomandat deoarece păstrează toată formatarea.",
|
||||||
"format_markdown": "Markdown - păstrează majoritatea formatării",
|
"format_markdown": "Markdown - păstrează majoritatea formatării.",
|
||||||
"format_opml": "OPML - format de interschimbare pentru editoare cu structură ierarhică (outline). Formatarea, imaginile și fișierele nu vor fi incluse.",
|
"format_opml": "OPML - format de interschimbare pentru editoare cu structură ierarhică (outline). Formatarea, imaginile și fișierele nu vor fi incluse.",
|
||||||
"opml_version_1": "OPML v1.0 - text simplu",
|
"opml_version_1": "OPML v1.0 - text simplu",
|
||||||
"opml_version_2": "OPML v2.0 - permite și HTML",
|
"opml_version_2": "OPML v2.0 - permite și HTML",
|
||||||
@@ -615,13 +609,12 @@
|
|||||||
"activatePreviousTab": "activează tabul anterior",
|
"activatePreviousTab": "activează tabul anterior",
|
||||||
"blockQuote": "începeți un rând cu <code>></code> urmat de spațiu pentru un bloc de citat",
|
"blockQuote": "începeți un rând cu <code>></code> urmat de spațiu pentru un bloc de citat",
|
||||||
"bulletList": "<code>*</code> sau <code>-</code> urmat de spațiu pentru o listă punctată",
|
"bulletList": "<code>*</code> sau <code>-</code> urmat de spațiu pentru o listă punctată",
|
||||||
"close": "Închide",
|
|
||||||
"closeActiveTab": "închide tabul activ",
|
"closeActiveTab": "închide tabul activ",
|
||||||
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - minimizează/expandează nodul",
|
"collapseExpand": "minimizează/expandează nodul",
|
||||||
"collapseSubTree": "minimizează subarborele",
|
"collapseSubTree": "minimizează subarborele",
|
||||||
"collapseWholeTree": "minimizează întregul arbore de notițe",
|
"collapseWholeTree": "minimizează întregul arbore de notițe",
|
||||||
"copyNotes": "copiază notița activă (sau selecția curentă) în clipboard (utilizat pentru <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonare</a>)",
|
"copyNotes": "copiază notița activă (sau selecția curentă) în clipboard (utilizat pentru <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">clonare</a>)",
|
||||||
"createEditLink": "<kbd>Ctrl+K</kbd> - crează/editează legătură externă",
|
"createEditLink": "crează/editează legătură externă",
|
||||||
"createInternalLink": "crează legătură internă",
|
"createInternalLink": "crează legătură internă",
|
||||||
"createNoteAfter": "crează o nouă notiță după notița activă",
|
"createNoteAfter": "crează o nouă notiță după notița activă",
|
||||||
"createNoteInto": "crează o subnotiță în notița activă",
|
"createNoteInto": "crează o subnotiță în notița activă",
|
||||||
@@ -632,23 +625,22 @@
|
|||||||
"editNoteTitle": "va sări de la arborele de notițe către titlul notiței. Enter de la titlul notiței va sări către editorul de text. <kbd>Ctrl+.</kbd> va sări înapoi de la editor către arborele de notițe.",
|
"editNoteTitle": "va sări de la arborele de notițe către titlul notiței. Enter de la titlul notiței va sări către editorul de text. <kbd>Ctrl+.</kbd> va sări înapoi de la editor către arborele de notițe.",
|
||||||
"editingNotes": "Editarea notițelor",
|
"editingNotes": "Editarea notițelor",
|
||||||
"followLink": "urmărește link-ul sub cursor",
|
"followLink": "urmărește link-ul sub cursor",
|
||||||
"fullDocumentation": "Instrucțiuni (documentația completă se regăsește <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)",
|
|
||||||
"goBackForwards": "mergi înapoi/înainte în istoric",
|
"goBackForwards": "mergi înapoi/înainte în istoric",
|
||||||
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - mergi sus/jos în lista de notițe",
|
"goUpDown": "mergi sus/jos în lista de notițe",
|
||||||
"headings": "<code>##</code>, <code>###</code>, <code>####</code> etc. urmat de spațiu pentru titluri",
|
"headings": "<code>##</code>, <code>###</code>, <code>####</code> etc. urmat de spațiu pentru titluri",
|
||||||
"inPageSearch": "caută în interiorul paginii",
|
"inPageSearch": "caută în interiorul paginii",
|
||||||
"insertDateTime": "inserează data și timpul curente la poziția cursorului",
|
"insertDateTime": "inserează data și timpul curente la poziția cursorului",
|
||||||
"jumpToParentNote": "<kbd>Backspace</kbd> - sari la pagina părinte",
|
"jumpToParentNote": "sari la pagina părinte",
|
||||||
"jumpToTreePane": "sari către arborele de notițe și scrolează către notița activă",
|
"jumpToTreePane": "sari către arborele de notițe și scrolează către notița activă",
|
||||||
"markdownAutoformat": "Formatare în stil Markdown",
|
"markdownAutoformat": "Formatare în stil Markdown",
|
||||||
"moveNoteUpDown": "mută notița sus/jos în lista de notițe",
|
"moveNoteUpDown": "mută notița sus/jos în lista de notițe",
|
||||||
"moveNoteUpHierarchy": "mută notița mai sus în ierarhie",
|
"moveNoteUpHierarchy": "mută notița mai sus în ierarhie",
|
||||||
"movingCloningNotes": "Mutarea/clonarea notițelor",
|
"movingCloningNotes": "Mutarea/clonarea notițelor",
|
||||||
"multiSelectNote": "selectează multiplu notița de sus/jos",
|
"multiSelectNote": "selectează multiplu notița de sus/jos",
|
||||||
"newTabNoteLink": "<kbd>CTRL+clic</kbd> - (sau clic mijlociu) pe o legătură către o notiță va deschide notița într-un tab nou",
|
"newTabNoteLink": "pe o legătură către o notiță va deschide notița într-un tab nou",
|
||||||
"notSet": "nesetat",
|
"notSet": "nesetat",
|
||||||
"noteNavigation": "Navigarea printre notițe",
|
"noteNavigation": "Navigarea printre notițe",
|
||||||
"numberedList": "<kbd>1.</code> sau <code>1)</code> urmat de spațiu pentru o listă numerotată",
|
"numberedList": "<code>1.</code> sau <code>1)</code> urmat de spațiu pentru o listă numerotată",
|
||||||
"onlyInDesktop": "Doar pentru desktop (aplicația Electron)",
|
"onlyInDesktop": "Doar pentru desktop (aplicația Electron)",
|
||||||
"openEmptyTab": "deschide un tab nou",
|
"openEmptyTab": "deschide un tab nou",
|
||||||
"other": "Altele",
|
"other": "Altele",
|
||||||
@@ -657,13 +649,14 @@
|
|||||||
"reloadFrontend": "reîncarcă interfața Trilium",
|
"reloadFrontend": "reîncarcă interfața Trilium",
|
||||||
"scrollToActiveNote": "scrolează la notița activă",
|
"scrollToActiveNote": "scrolează la notița activă",
|
||||||
"selectAllNotes": "selectează toate notițele din nivelul curent",
|
"selectAllNotes": "selectează toate notițele din nivelul curent",
|
||||||
"selectNote": "<kbd>Shift+Click</kbd> - selectează notița",
|
"selectNote": "selectează notița",
|
||||||
"showDevTools": "afișează instrumentele de dezvoltatori",
|
"showDevTools": "afișează instrumentele de dezvoltatori",
|
||||||
"showJumpToNoteDialog": "afișează <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">ecranul „Sari la”</a>",
|
"showJumpToNoteDialog": "afișează <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">ecranul „Sari la”</a>",
|
||||||
"showSQLConsole": "afișează consola SQL",
|
"showSQLConsole": "afișează consola SQL",
|
||||||
"tabShortcuts": "Scurtături pentru tab-uri",
|
"tabShortcuts": "Scurtături pentru tab-uri",
|
||||||
"troubleshooting": "Unelte pentru depanare",
|
"troubleshooting": "Unelte pentru depanare",
|
||||||
"newTabWithActivationNoteLink": "<kbd>Ctrl+Shift+click</kbd> - (sau <kbd>Shift+click mouse mijlociu</kbd>) pe o legătură către o notiță deschide și activează notița într-un tab nou"
|
"newTabWithActivationNoteLink": "pe o legătură către o notiță deschide și activează notița într-un tab nou",
|
||||||
|
"title": "Ghid rapid"
|
||||||
},
|
},
|
||||||
"hide_floating_buttons_button": {
|
"hide_floating_buttons_button": {
|
||||||
"button_title": "Ascunde butoanele"
|
"button_title": "Ascunde butoanele"
|
||||||
@@ -718,7 +711,6 @@
|
|||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"chooseImportFile": "Selectați fișierul de importat",
|
"chooseImportFile": "Selectați fișierul de importat",
|
||||||
"close": "Închide",
|
|
||||||
"codeImportedAsCode": "Importă fișiere identificate drept cod sursă (e.g. <code>.json</code>) drept notițe de tip cod dacă nu este clar din metainformații",
|
"codeImportedAsCode": "Importă fișiere identificate drept cod sursă (e.g. <code>.json</code>) drept notițe de tip cod dacă nu este clar din metainformații",
|
||||||
"explodeArchives": "Citește conținutul arhivelor <code>.zip</code>, <code>.enex</code> și <code>.opml</code>.",
|
"explodeArchives": "Citește conținutul arhivelor <code>.zip</code>, <code>.enex</code> și <code>.opml</code>.",
|
||||||
"explodeArchivesTooltip": "Dacă această opțiune este bifată atunci Trilium va citi fișiere de tip <code>.zip</code>, <code>.enex</code> și <code>.opml</code> și va crea notițe din fișierele din interiorul acestor arhive. Dacă este nebifat, atunci Trilium va atașa arhiva propriu-zisă la notiță.",
|
"explodeArchivesTooltip": "Dacă această opțiune este bifată atunci Trilium va citi fișiere de tip <code>.zip</code>, <code>.enex</code> și <code>.opml</code> și va crea notițe din fișierele din interiorul acestor arhive. Dacă este nebifat, atunci Trilium va atașa arhiva propriu-zisă la notiță.",
|
||||||
@@ -751,11 +743,10 @@
|
|||||||
"box_size_medium": "mediu (~ 30 de rânduri)",
|
"box_size_medium": "mediu (~ 30 de rânduri)",
|
||||||
"box_size_prompt": "Dimensiunea căsuței notiței incluse:",
|
"box_size_prompt": "Dimensiunea căsuței notiței incluse:",
|
||||||
"box_size_small": "mică (~ 10 rânduri)",
|
"box_size_small": "mică (~ 10 rânduri)",
|
||||||
"button_include": "Include notița <kbd>Enter</kbd>",
|
"button_include": "Include notița",
|
||||||
"dialog_title": "Includere notița",
|
"dialog_title": "Includere notița",
|
||||||
"label_note": "Notiță",
|
"label_note": "Notiță",
|
||||||
"placeholder_search": "căutați notița după denumirea ei",
|
"placeholder_search": "căutați notița după denumirea ei"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"closeButton": "Închide",
|
"closeButton": "Închide",
|
||||||
@@ -767,8 +758,7 @@
|
|||||||
"title": "Atribute moștenite"
|
"title": "Atribute moștenite"
|
||||||
},
|
},
|
||||||
"jump_to_note": {
|
"jump_to_note": {
|
||||||
"search_button": "Caută în întregul conținut <kbd>Ctrl+Enter</kbd>",
|
"search_button": "Caută în întregul conținut",
|
||||||
"close": "Închide",
|
|
||||||
"search_placeholder": "Căutați notițe după nume sau tastați > pentru comenzi..."
|
"search_placeholder": "Căutați notițe după nume sau tastați > pentru comenzi..."
|
||||||
},
|
},
|
||||||
"left_pane_toggle": {
|
"left_pane_toggle": {
|
||||||
@@ -781,10 +771,9 @@
|
|||||||
},
|
},
|
||||||
"markdown_import": {
|
"markdown_import": {
|
||||||
"dialog_title": "Importă Markdown",
|
"dialog_title": "Importă Markdown",
|
||||||
"import_button": "Importă Ctrl+Enter",
|
"import_button": "Importă",
|
||||||
"import_success": "Conținutul Markdown a fost importat în document.",
|
"import_success": "Conținutul Markdown a fost importat în document.",
|
||||||
"modal_body_text": "Din cauza limitărilor la nivel de navigator, nu este posibilă citirea clipboard-ului din JavaScript. Inserați Markdown-ul pentru a-l importa în caseta de mai jos și dați clic pe butonul Import",
|
"modal_body_text": "Din cauza limitărilor la nivel de navigator, nu este posibilă citirea clipboard-ului din JavaScript. Inserați Markdown-ul pentru a-l importa în caseta de mai jos și dați clic pe butonul Import"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"max_content_width": {
|
"max_content_width": {
|
||||||
"apply_changes_description": "Pentru a aplica schimbările de lățime a conținutului, dați click pe",
|
"apply_changes_description": "Pentru a aplica schimbările de lățime a conținutului, dați click pe",
|
||||||
@@ -817,12 +806,11 @@
|
|||||||
"move_to": {
|
"move_to": {
|
||||||
"dialog_title": "Mută notițele în...",
|
"dialog_title": "Mută notițele în...",
|
||||||
"error_no_path": "Nicio cale la care să poată fi mutate.",
|
"error_no_path": "Nicio cale la care să poată fi mutate.",
|
||||||
"move_button": "Mută la notița selectată <kbd>enter</kbd>",
|
"move_button": "Mută la notița selectată",
|
||||||
"move_success_message": "Notițele selectate au fost mutate în ",
|
"move_success_message": "Notițele selectate au fost mutate în ",
|
||||||
"notes_to_move": "Notițe de mutat",
|
"notes_to_move": "Notițe de mutat",
|
||||||
"search_placeholder": "căutați notița după denumirea ei",
|
"search_placeholder": "căutați notița după denumirea ei",
|
||||||
"target_parent_note": "Notița părinte destinație",
|
"target_parent_note": "Notița părinte destinație"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"native_title_bar": {
|
"native_title_bar": {
|
||||||
"disabled": "dezactivată",
|
"disabled": "dezactivată",
|
||||||
@@ -897,10 +885,10 @@
|
|||||||
"note_type_chooser": {
|
"note_type_chooser": {
|
||||||
"modal_body": "Selectați tipul notiței/șablonul pentru noua notiță:",
|
"modal_body": "Selectați tipul notiței/șablonul pentru noua notiță:",
|
||||||
"modal_title": "Selectați tipul notiței",
|
"modal_title": "Selectați tipul notiței",
|
||||||
"templates": "Șabloane:",
|
"templates": "Șabloane",
|
||||||
"close": "Închide",
|
|
||||||
"change_path_prompt": "Selectați locul unde să se creeze noua notiță:",
|
"change_path_prompt": "Selectați locul unde să se creeze noua notiță:",
|
||||||
"search_placeholder": "căutare cale notiță după nume (cea implicită dacă este necompletat)"
|
"search_placeholder": "căutare cale notiță după nume (cea implicită dacă este necompletat)",
|
||||||
|
"builtin_templates": "Șabloane predefinite"
|
||||||
},
|
},
|
||||||
"onclick_button": {
|
"onclick_button": {
|
||||||
"no_click_handler": "Butonul „{{componentId}}” nu are nicio acțiune la clic definită"
|
"no_click_handler": "Butonul „{{componentId}}” nu are nicio acțiune la clic definită"
|
||||||
@@ -954,9 +942,9 @@
|
|||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"body1": "Notițele protejate sunt criptate utilizând parola de utilizator, dar nu a fost setată nicio parolă.",
|
"body1": "Notițele protejate sunt criptate utilizând parola de utilizator, dar nu a fost setată nicio parolă.",
|
||||||
"body2": "Pentru a putea să protejați notițe, clic <a class=\"open-password-options-button\" href=\"javascript:\">aici</a> pentru a deschide ecranul de opțiuni și pentru a seta parola.",
|
|
||||||
"title": "Parola nu este setată",
|
"title": "Parola nu este setată",
|
||||||
"close": "Închide"
|
"body2": "Pentru a putea proteja notițe, clic pe butonul de mai jos pentru a deschide fereastra de opțiuni și pentru a seta parola.",
|
||||||
|
"go_to_password_options": "Mergi la setările de parolă"
|
||||||
},
|
},
|
||||||
"promoted_attributes": {
|
"promoted_attributes": {
|
||||||
"add_new_attribute": "Adaugă un nou atribut",
|
"add_new_attribute": "Adaugă un nou atribut",
|
||||||
@@ -971,9 +959,8 @@
|
|||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"defaultTitle": "Aviz",
|
"defaultTitle": "Aviz",
|
||||||
"ok": "OK <kbd>enter</kbd>",
|
"ok": "OK",
|
||||||
"title": "Aviz",
|
"title": "Aviz"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"protected_session": {
|
"protected_session": {
|
||||||
"enter_password_instruction": "Afișarea notițelor protejate necesită introducerea parolei:",
|
"enter_password_instruction": "Afișarea notițelor protejate necesită introducerea parolei:",
|
||||||
@@ -992,7 +979,7 @@
|
|||||||
"form_label": "Pentru a putea continua cu acțiunea cerută este nevoie să fie pornită sesiunea protejată prin introducerea parolei:",
|
"form_label": "Pentru a putea continua cu acțiunea cerută este nevoie să fie pornită sesiunea protejată prin introducerea parolei:",
|
||||||
"help_title": "Informații despre notițe protejate",
|
"help_title": "Informații despre notițe protejate",
|
||||||
"modal_title": "Sesiune protejată",
|
"modal_title": "Sesiune protejată",
|
||||||
"start_button": "Pornește sesiunea protejată <kbd>enter</kbd>"
|
"start_button": "Pornește sesiunea protejată"
|
||||||
},
|
},
|
||||||
"protected_session_status": {
|
"protected_session_status": {
|
||||||
"active": "Sesiunea protejată este activă. Clic pentru a închide sesiunea protejată.",
|
"active": "Sesiunea protejată este activă. Clic pentru a închide sesiunea protejată.",
|
||||||
@@ -1004,8 +991,7 @@
|
|||||||
"erase_notes_button": "Elimină notițele șterse",
|
"erase_notes_button": "Elimină notițele șterse",
|
||||||
"no_changes_message": "Încă nicio schimbare...",
|
"no_changes_message": "Încă nicio schimbare...",
|
||||||
"title": "Modificări recente",
|
"title": "Modificări recente",
|
||||||
"undelete_link": "restaurare",
|
"undelete_link": "restaurare"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"relation_map": {
|
"relation_map": {
|
||||||
"cannot_match_transform": "Nu s-a putut identifica transformarea: {{transform}}",
|
"cannot_match_transform": "Nu s-a putut identifica transformarea: {{transform}}",
|
||||||
@@ -1084,14 +1070,13 @@
|
|||||||
"revisions_deleted": "Notița reviziei a fost ștearsă.",
|
"revisions_deleted": "Notița reviziei a fost ștearsă.",
|
||||||
"maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.",
|
"maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.",
|
||||||
"settings": "Setări revizii ale notițelor",
|
"settings": "Setări revizii ale notițelor",
|
||||||
"snapshot_interval": "Intervalul de creare a reviziilor pentru notițe: {{seconds}}s.",
|
"snapshot_interval": "Intervalul de creare a reviziilor pentru notițe: {{seconds}}s."
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"revisions_button": {
|
"revisions_button": {
|
||||||
"note_revisions": "Revizii ale notiței"
|
"note_revisions": "Revizii ale notiței"
|
||||||
},
|
},
|
||||||
"revisions_snapshot_interval": {
|
"revisions_snapshot_interval": {
|
||||||
"note_revisions_snapshot_description": "Intervalul de salvare a reviziilor este timpul după care se crează o nouă revizie a unei notițe. Vedeți <a href=\"https://triliumnext.github.io/Docs/Wiki/note-revisions.html\" class=\"external\">wiki-ul</a> pentru mai multe informații.",
|
"note_revisions_snapshot_description": "Intervalul de salvare a reviziilor este timpul după care se crează o nouă revizie a unei notițe. Vedeți <doc>wiki-ul</doc> pentru mai multe informații.",
|
||||||
"note_revisions_snapshot_interval_title": "Intervalul de salvare a reviziilor",
|
"note_revisions_snapshot_interval_title": "Intervalul de salvare a reviziilor",
|
||||||
"snapshot_time_interval_label": "Intervalul de salvare a reviziilor:"
|
"snapshot_time_interval_label": "Intervalul de salvare a reviziilor:"
|
||||||
},
|
},
|
||||||
@@ -1121,7 +1106,7 @@
|
|||||||
"limit_description": "Limitează numărul de rezultate",
|
"limit_description": "Limitează numărul de rezultate",
|
||||||
"order_by": "ordonează după",
|
"order_by": "ordonează după",
|
||||||
"save_to_note": "Salvează în notiță",
|
"save_to_note": "Salvează în notiță",
|
||||||
"search_button": "Căutare <kbd>Enter</kbd>",
|
"search_button": "Căutare",
|
||||||
"search_execute": "Caută și execută acțiunile",
|
"search_execute": "Caută și execută acțiunile",
|
||||||
"search_note_saved": "Notița de căutare a fost salvată în {{- notePathTitle}}",
|
"search_note_saved": "Notița de căutare a fost salvată în {{- notePathTitle}}",
|
||||||
"search_parameters": "Parametrii de căutare",
|
"search_parameters": "Parametrii de căutare",
|
||||||
@@ -1193,15 +1178,14 @@
|
|||||||
"folders": "Dosare",
|
"folders": "Dosare",
|
||||||
"natural_sort": "Ordonare naturală",
|
"natural_sort": "Ordonare naturală",
|
||||||
"natural_sort_language": "Limba pentru ordonare naturală",
|
"natural_sort_language": "Limba pentru ordonare naturală",
|
||||||
"sort": "Ordonare <kbd>Enter</kbd>",
|
"sort": "Ordonare",
|
||||||
"sort_children_by": "Ordonează subnotițele după...",
|
"sort_children_by": "Ordonează subnotițele după...",
|
||||||
"sort_folders_at_top": "ordonează dosarele primele",
|
"sort_folders_at_top": "ordonează dosarele primele",
|
||||||
"sort_with_respect_to_different_character_sorting": "ordonează respectând regulile de sortare și clasificare diferite în funcție de limbă și regiune.",
|
"sort_with_respect_to_different_character_sorting": "ordonează respectând regulile de sortare și clasificare diferite în funcție de limbă și regiune.",
|
||||||
"sorting_criteria": "Criterii de ordonare",
|
"sorting_criteria": "Criterii de ordonare",
|
||||||
"sorting_direction": "Direcția de ordonare",
|
"sorting_direction": "Direcția de ordonare",
|
||||||
"the_language_code_for_natural_sort": "Codul limbii pentru ordonarea naturală, e.g. „zn-CN” pentru chineză.",
|
"the_language_code_for_natural_sort": "Codul limbii pentru ordonarea naturală, e.g. „zn-CN” pentru chineză.",
|
||||||
"title": "titlu",
|
"title": "titlu"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"spellcheck": {
|
"spellcheck": {
|
||||||
"available_language_codes_label": "Coduri de limbă disponibile:",
|
"available_language_codes_label": "Coduri de limbă disponibile:",
|
||||||
@@ -1253,12 +1237,9 @@
|
|||||||
"unit": "caractere"
|
"unit": "caractere"
|
||||||
},
|
},
|
||||||
"theme": {
|
"theme": {
|
||||||
"auto_theme": "Temă auto (se adaptează la schema de culori a sistemului)",
|
"triliumnext": "Trilium (se adaptează la schema de culori a sistemului)",
|
||||||
"dark_theme": "Temă întunecată",
|
"triliumnext-light": "Trilium (luminoasă)",
|
||||||
"light_theme": "Temă luminoasă",
|
"triliumnext-dark": "Trilium (întunecată)",
|
||||||
"triliumnext": "TriliumNext Beta (se adaptează la schema de culori a sistemului)",
|
|
||||||
"triliumnext-light": "TriliumNext Beta (luminoasă)",
|
|
||||||
"triliumnext-dark": "TriliumNext Beta (întunecată)",
|
|
||||||
"override_theme_fonts_label": "Suprascrie fonturile temei",
|
"override_theme_fonts_label": "Suprascrie fonturile temei",
|
||||||
"theme_label": "Temă",
|
"theme_label": "Temă",
|
||||||
"title": "Tema aplicației",
|
"title": "Tema aplicației",
|
||||||
@@ -1266,7 +1247,10 @@
|
|||||||
"layout-horizontal-description": "bara de lansare se află sub bara de taburi, bara de taburi este pe toată lungimea.",
|
"layout-horizontal-description": "bara de lansare se află sub bara de taburi, bara de taburi este pe toată lungimea.",
|
||||||
"layout-horizontal-title": "Orizontal",
|
"layout-horizontal-title": "Orizontal",
|
||||||
"layout-vertical-title": "Vertical",
|
"layout-vertical-title": "Vertical",
|
||||||
"layout-vertical-description": "bara de lansare se află pe stânga (implicit)"
|
"layout-vertical-description": "bara de lansare se află pe stânga (implicit)",
|
||||||
|
"auto_theme": "Tema clasică (se adaptează la schema de culori a sistemului)",
|
||||||
|
"light_theme": "Tema clasică (luminoasă)",
|
||||||
|
"dark_theme": "Tema clasică (întunecată)"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"critical-error": {
|
"critical-error": {
|
||||||
@@ -1302,7 +1286,7 @@
|
|||||||
"update_relation_target": {
|
"update_relation_target": {
|
||||||
"allowed_characters": "Sunt permise doar caractere alfanumerice, underline și două puncte.",
|
"allowed_characters": "Sunt permise doar caractere alfanumerice, underline și două puncte.",
|
||||||
"change_target_note": "schimbă notița-țintă a unei relații existente",
|
"change_target_note": "schimbă notița-țintă a unei relații existente",
|
||||||
"on_all_matched_notes": "Pentru toate notițele găsite:",
|
"on_all_matched_notes": "Pentru toate notițele găsite",
|
||||||
"relation_name": "denumirea relației",
|
"relation_name": "denumirea relației",
|
||||||
"target_note": "notița destinație",
|
"target_note": "notița destinație",
|
||||||
"to": "la",
|
"to": "la",
|
||||||
@@ -1311,13 +1295,12 @@
|
|||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"choose_files": "Selectați fișierele",
|
"choose_files": "Selectați fișierele",
|
||||||
"files_will_be_uploaded": "Fișierele vor fi încărcate ca atașamente în",
|
"files_will_be_uploaded": "Fișierele vor fi încărcate ca atașamente în {{noteTitle}}",
|
||||||
"options": "Opțuni",
|
"options": "Opțuni",
|
||||||
"shrink_images": "Micșorează imaginile",
|
"shrink_images": "Micșorează imaginile",
|
||||||
"tooltip": "Dacă această opțiune este bifată, Trilium va încerca micșorarea imaginilor încărcate prin scalarea și optimizarea lor, aspect ce va putea afecta calitatea imaginilor. Dacă nu este bifată, imaginile vor fi încărcate fără nicio schimbare.",
|
"tooltip": "Dacă această opțiune este bifată, Trilium va încerca micșorarea imaginilor încărcate prin scalarea și optimizarea lor, aspect ce va putea afecta calitatea imaginilor. Dacă nu este bifată, imaginile vor fi încărcate fără nicio schimbare.",
|
||||||
"upload": "Încărcare",
|
"upload": "Încărcare",
|
||||||
"upload_attachments_to_note": "Încarcă atașamentele la notiță",
|
"upload_attachments_to_note": "Încarcă atașamentele la notiță"
|
||||||
"close": "Închide"
|
|
||||||
},
|
},
|
||||||
"vacuum_database": {
|
"vacuum_database": {
|
||||||
"button_text": "Compactează baza de date",
|
"button_text": "Compactează baza de date",
|
||||||
@@ -1390,8 +1373,8 @@
|
|||||||
},
|
},
|
||||||
"shared_info": {
|
"shared_info": {
|
||||||
"help_link": "Pentru informații vizitați <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki-ul</a>.",
|
"help_link": "Pentru informații vizitați <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki-ul</a>.",
|
||||||
"shared_locally": "Această notiță este partajată local la",
|
"shared_locally": "Această notiță este partajată local la {{- link}}",
|
||||||
"shared_publicly": "Această notiță este partajată public la"
|
"shared_publicly": "Această notiță este partajată public la {{- link}}"
|
||||||
},
|
},
|
||||||
"note_types": {
|
"note_types": {
|
||||||
"book": "Colecție",
|
"book": "Colecție",
|
||||||
@@ -1673,10 +1656,6 @@
|
|||||||
"note-has-been-deleted": "Notița a fost ștearsă.",
|
"note-has-been-deleted": "Notița a fost ștearsă.",
|
||||||
"quick-edit": "Editare rapidă"
|
"quick-edit": "Editare rapidă"
|
||||||
},
|
},
|
||||||
"notes": {
|
|
||||||
"duplicate-note-suffix": "(dupl.)",
|
|
||||||
"duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}"
|
|
||||||
},
|
|
||||||
"geo-map-context": {
|
"geo-map-context": {
|
||||||
"open-location": "Deschide locația",
|
"open-location": "Deschide locația",
|
||||||
"remove-from-map": "Înlătură de pe hartă",
|
"remove-from-map": "Înlătură de pe hartă",
|
||||||
@@ -1731,9 +1710,6 @@
|
|||||||
"description": "Selectați una sau mai multe limbi ce vor apărea în selecția limbii din cadrul secțiunii „Proprietăți de bază” pentru notițele de tip text (editabile sau doar în citire).",
|
"description": "Selectați una sau mai multe limbi ce vor apărea în selecția limbii din cadrul secțiunii „Proprietăți de bază” pentru notițele de tip text (editabile sau doar în citire).",
|
||||||
"title": "Limbi pentru conținutul notițelor"
|
"title": "Limbi pentru conținutul notițelor"
|
||||||
},
|
},
|
||||||
"hidden-subtree": {
|
|
||||||
"localization": "Limbă și regiune"
|
|
||||||
},
|
|
||||||
"note_language": {
|
"note_language": {
|
||||||
"configure-languages": "Configurează limbile...",
|
"configure-languages": "Configurează limbile...",
|
||||||
"not_set": "Nedefinită"
|
"not_set": "Nedefinită"
|
||||||
@@ -1887,15 +1863,20 @@
|
|||||||
},
|
},
|
||||||
"create_new_ai_chat": "Crează o nouă discuție cu AI-ul",
|
"create_new_ai_chat": "Crează o nouă discuție cu AI-ul",
|
||||||
"configuration_warnings": "Sunt câteva probleme la configurația AI-ului. Verificați setările.",
|
"configuration_warnings": "Sunt câteva probleme la configurația AI-ului. Verificați setările.",
|
||||||
"experimental_warning": "Funcția LLM este experimentală!",
|
"experimental_warning": "Funcția LLM este experimentală.",
|
||||||
"selected_provider": "Furnizor selectat",
|
"selected_provider": "Furnizor selectat",
|
||||||
"selected_provider_description": "Selectați furnizorul de AI pentru funcțiile de discuție și completare",
|
"selected_provider_description": "Selectați furnizorul de AI pentru funcțiile de discuție și completare",
|
||||||
"select_model": "Selectați modelul...",
|
"select_model": "Selectați modelul...",
|
||||||
"select_provider": "Selectați furnizorul..."
|
"select_provider": "Selectați furnizorul...",
|
||||||
|
"ai_enabled": "Funcționalitățile AI au fost activate",
|
||||||
|
"ai_disabled": "Funcționalitățile AI au fost dezactivate",
|
||||||
|
"no_models_found_online": "Nu s-a găsit niciun model. Verificați cheia API și configurația.",
|
||||||
|
"no_models_found_ollama": "Nu s-a găsit niciun model Ollama. Verificați dacă Ollama rulează.",
|
||||||
|
"error_fetching": "Eroare la obținerea modelelor: {{error}}"
|
||||||
},
|
},
|
||||||
"custom_date_time_format": {
|
"custom_date_time_format": {
|
||||||
"title": "Format dată/timp personalizat",
|
"title": "Format dată/timp personalizat",
|
||||||
"description": "Personalizați formatul de dată și timp inserat prin <kbd></kbd> sau din bara de unelte. Vedeți <a href=\"https://day.js.org/docs/en/display/format\" target=\"_blank\" rel=\"noopener noreferrer\">Documentația Day.js</a> pentru câmpurile de formatare disponibile.",
|
"description": "Personalizați formatul de dată și timp inserat prin <shortcut /> sau din bara de unelte. Vedeți <doc>Documentația Day.js</doc> pentru câmpurile de formatare disponibile.",
|
||||||
"format_string": "Șir de formatare:",
|
"format_string": "Șir de formatare:",
|
||||||
"formatted_time": "Data și ora formatate:"
|
"formatted_time": "Data și ora formatate:"
|
||||||
},
|
},
|
||||||
@@ -2014,5 +1995,34 @@
|
|||||||
},
|
},
|
||||||
"content_renderer": {
|
"content_renderer": {
|
||||||
"open_externally": "Deschide în afara programului"
|
"open_externally": "Deschide în afara programului"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"close": "Închide",
|
||||||
|
"help_title": "Afișează mai multe informații despre acest ecran"
|
||||||
|
},
|
||||||
|
"call_to_action": {
|
||||||
|
"background_effects_title": "Efectele de fundal sunt acum stabile",
|
||||||
|
"background_effects_message": "Pe dispozitive cu Windows, efectele de fundal sunt complet stabile. Acestea adaugă un strop de culoare interfeței grafice prin estomparea fundalului din spatele ferestrei. Această tehnică este folosită și în alte aplicații precum Windows Explorer.",
|
||||||
|
"background_effects_button": "Activează efectele de fundal",
|
||||||
|
"next_theme_title": "Încercați noua temă Trilium",
|
||||||
|
"next_theme_message": "Utilizați tema clasică, doriți să încercați noua temă?",
|
||||||
|
"next_theme_button": "Testează noua temă",
|
||||||
|
"dismiss": "Treci peste"
|
||||||
|
},
|
||||||
|
"ui-performance": {
|
||||||
|
"title": "Setări de performanță",
|
||||||
|
"enable-motion": "Activează tranzițiile și animațiile",
|
||||||
|
"enable-shadows": "Activează umbrirea elementelor",
|
||||||
|
"enable-backdrop-effects": "Activează efectele de fundal pentru meniuri, popup-uri și panouri"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"related_settings": "Setări similare"
|
||||||
|
},
|
||||||
|
"settings_appearance": {
|
||||||
|
"related_code_blocks": "Tema de culori pentru blocuri de cod în notițe de tip text",
|
||||||
|
"related_code_notes": "Tema de culori pentru notițele de tip cod"
|
||||||
|
},
|
||||||
|
"units": {
|
||||||
|
"percentage": "%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
9
apps/client/src/translations/sl/translation.json
Normal file
9
apps/client/src/translations/sl/translation.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "Podrobnosti Trilium Notes",
|
||||||
|
"homepage": "Domača stran:",
|
||||||
|
"app_version": "Verzija aplikacije:",
|
||||||
|
"db_version": "Verzija DB:",
|
||||||
|
"sync_version": "Verzija Sync:"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"title": "O Trilium Belеškama",
|
"title": "O Trilium Belеškama",
|
||||||
"close": "Zatvori",
|
|
||||||
"homepage": "Početna stranica:",
|
"homepage": "Početna stranica:",
|
||||||
"app_version": "Verzija aplikacije:",
|
"app_version": "Verzija aplikacije:",
|
||||||
"db_version": "Verzija baze podataka:",
|
"db_version": "Verzija baze podataka:",
|
||||||
@@ -28,7 +27,6 @@
|
|||||||
"add_link": {
|
"add_link": {
|
||||||
"add_link": "Dodaj link",
|
"add_link": "Dodaj link",
|
||||||
"help_on_links": "Pomoć na linkovima",
|
"help_on_links": "Pomoć na linkovima",
|
||||||
"close": "Zatvori",
|
|
||||||
"note": "Beleška",
|
"note": "Beleška",
|
||||||
"search_note": "potražite belešku po njenom imenu",
|
"search_note": "potražite belešku po njenom imenu",
|
||||||
"link_title_mirrors": "naziv linka preslikava trenutan naziv beleške",
|
"link_title_mirrors": "naziv linka preslikava trenutan naziv beleške",
|
||||||
@@ -39,14 +37,12 @@
|
|||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"edit_branch_prefix": "Izmeni prefiks grane",
|
"edit_branch_prefix": "Izmeni prefiks grane",
|
||||||
"help_on_tree_prefix": "Pomoć na prefiksu Drveta",
|
"help_on_tree_prefix": "Pomoć na prefiksu Drveta",
|
||||||
"close": "Zatvori",
|
|
||||||
"prefix": "Prefiks: ",
|
"prefix": "Prefiks: ",
|
||||||
"save": "Sačuvaj",
|
"save": "Sačuvaj",
|
||||||
"branch_prefix_saved": "Prefiks grane je sačuvan."
|
"branch_prefix_saved": "Prefiks grane je sačuvan."
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
"bulk_actions": {
|
||||||
"bulk_actions": "Grupne akcije",
|
"bulk_actions": "Grupne akcije",
|
||||||
"close": "Zatvori",
|
|
||||||
"affected_notes": "Pogođene beleške",
|
"affected_notes": "Pogođene beleške",
|
||||||
"include_descendants": "Obuhvati potomke izabranih beleški",
|
"include_descendants": "Obuhvati potomke izabranih beleški",
|
||||||
"available_actions": "Dostupne akcije",
|
"available_actions": "Dostupne akcije",
|
||||||
@@ -61,7 +57,6 @@
|
|||||||
},
|
},
|
||||||
"clone_to": {
|
"clone_to": {
|
||||||
"clone_notes_to": "Klonirajte beleške u...",
|
"clone_notes_to": "Klonirajte beleške u...",
|
||||||
"close": "Zatvori",
|
|
||||||
"help_on_links": "Pomoć na linkovima",
|
"help_on_links": "Pomoć na linkovima",
|
||||||
"notes_to_clone": "Beleške za kloniranje",
|
"notes_to_clone": "Beleške za kloniranje",
|
||||||
"target_parent_note": "Ciljna nadređena beleška",
|
"target_parent_note": "Ciljna nadređena beleška",
|
||||||
@@ -74,7 +69,6 @@
|
|||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"confirmation": "Potvrda",
|
"confirmation": "Potvrda",
|
||||||
"close": "Zatvori",
|
|
||||||
"cancel": "Otkaži",
|
"cancel": "Otkaži",
|
||||||
"ok": "U redu",
|
"ok": "U redu",
|
||||||
"are_you_sure_remove_note": "Da li ste sigurni da želite da uklonite belešku \"{{title}}\" iz mape odnosa? ",
|
"are_you_sure_remove_note": "Da li ste sigurni da želite da uklonite belešku \"{{title}}\" iz mape odnosa? ",
|
||||||
@@ -113,8 +107,6 @@
|
|||||||
"format_pdf": "PDF - za namene štampanja ili deljenja."
|
"format_pdf": "PDF - za namene štampanja ili deljenja."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"fullDocumentation": "Pomoć (puna dokumentacija je dostupna <a class=\"external\" href=\"https://triliumnext.github.io/Docs/\">online</a>)",
|
|
||||||
"close": "Zatvori",
|
|
||||||
"noteNavigation": "Navigacija beleški",
|
"noteNavigation": "Navigacija beleški",
|
||||||
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - kretanje gore/dole u listi sa beleškama",
|
"goUpDown": "<kbd>UP</kbd>, <kbd>DOWN</kbd> - kretanje gore/dole u listi sa beleškama",
|
||||||
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - sakupi/proširi čvor",
|
"collapseExpand": "<kbd>LEFT</kbd>, <kbd>RIGHT</kbd> - sakupi/proširi čvor",
|
||||||
@@ -122,12 +114,12 @@
|
|||||||
"goBackForwards": "idi u nazad/napred kroz istoriju",
|
"goBackForwards": "idi u nazad/napred kroz istoriju",
|
||||||
"showJumpToNoteDialog": "prikaži <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Idi na\" dijalog</a>",
|
"showJumpToNoteDialog": "prikaži <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Idi na\" dijalog</a>",
|
||||||
"scrollToActiveNote": "skroluj do aktivne beleške",
|
"scrollToActiveNote": "skroluj do aktivne beleške",
|
||||||
"jumpToParentNote": "<kbd>Backspace</kbd> - idi do nadređene beleške",
|
"jumpToParentNote": "idi do nadređene beleške",
|
||||||
"collapseWholeTree": "sakupi celo drvo beleški",
|
"collapseWholeTree": "sakupi celo drvo beleški",
|
||||||
"collapseSubTree": "sakupi pod-drvo",
|
"collapseSubTree": "sakupi pod-drvo",
|
||||||
"tabShortcuts": "Prečice na karticama",
|
"tabShortcuts": "Prečice na karticama",
|
||||||
"newTabNoteLink": "<kbd>Ctrl+click</kbd> - (ili <kbd>middle mouse click</kbd>) na link beleške otvara belešku u novoj kartici",
|
"newTabNoteLink": "na link beleške otvara belešku u novoj kartici",
|
||||||
"newTabWithActivationNoteLink": "<kbd>Ctrl+Shift+click</kbd> - (ili <kbd>Shift+middle mouse click</kbd>) na link beleške otvara i aktivira belešku u novoj kartici",
|
"newTabWithActivationNoteLink": "na link beleške otvara i aktivira belešku u novoj kartici",
|
||||||
"onlyInDesktop": "Samo na dektop-u (Electron verzija)",
|
"onlyInDesktop": "Samo na dektop-u (Electron verzija)",
|
||||||
"openEmptyTab": "otvori praznu karticu",
|
"openEmptyTab": "otvori praznu karticu",
|
||||||
"closeActiveTab": "zatvori aktivnu karticu",
|
"closeActiveTab": "zatvori aktivnu karticu",
|
||||||
@@ -142,14 +134,14 @@
|
|||||||
"moveNoteUpHierarchy": "pomeri belešku na gore u hijerarhiji",
|
"moveNoteUpHierarchy": "pomeri belešku na gore u hijerarhiji",
|
||||||
"multiSelectNote": "višestruki izbor beleški iznad/ispod",
|
"multiSelectNote": "višestruki izbor beleški iznad/ispod",
|
||||||
"selectAllNotes": "izaberi sve beleške u trenutnom nivou",
|
"selectAllNotes": "izaberi sve beleške u trenutnom nivou",
|
||||||
"selectNote": "<kbd>Shift+click</kbd> - izaberi belešku",
|
"selectNote": "izaberi belešku",
|
||||||
"copyNotes": "kopiraj aktivnu belešku (ili trenutni izbor) u privremenu memoriju (koristi se za <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">kloniranje</a>)",
|
"copyNotes": "kopiraj aktivnu belešku (ili trenutni izbor) u privremenu memoriju (koristi se za <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">kloniranje</a>)",
|
||||||
"cutNotes": "iseci trenutnu belešku (ili trenutni izbor) u privremenu memoriju (koristi se za premeštanje beleški)",
|
"cutNotes": "iseci trenutnu belešku (ili trenutni izbor) u privremenu memoriju (koristi se za premeštanje beleški)",
|
||||||
"pasteNotes": "nalepi belešku/e kao podbelešku u aktivnoj belešci (koja se ili premešta ili klonira u zavisnosti od toga da li je beleška kopirana ili isečena u privremenu memoriju)",
|
"pasteNotes": "nalepi belešku/e kao podbelešku u aktivnoj belešci (koja se ili premešta ili klonira u zavisnosti od toga da li je beleška kopirana ili isečena u privremenu memoriju)",
|
||||||
"deleteNotes": "obriši belešku / podstablo",
|
"deleteNotes": "obriši belešku / podstablo",
|
||||||
"editingNotes": "Izmena beleški",
|
"editingNotes": "Izmena beleški",
|
||||||
"editNoteTitle": "u ravni drveta će se prebaciti sa ravni drveta na naslov beleške. Ulaz sa naslova beleške će prebaciti fokus na uređivač teksta. <kbd>Ctrl+.</kbd> će se vratiti sa uređivača na ravan drveta.",
|
"editNoteTitle": "u ravni drveta će se prebaciti sa ravni drveta na naslov beleške. Ulaz sa naslova beleške će prebaciti fokus na uređivač teksta. <kbd>Ctrl+.</kbd> će se vratiti sa uređivača na ravan drveta.",
|
||||||
"createEditLink": "<kbd>Ctrl+K</kbd> - napravi / izmeni spoljašnji link",
|
"createEditLink": "napravi / izmeni spoljašnji link",
|
||||||
"createInternalLink": "napravi unutrašnji link",
|
"createInternalLink": "napravi unutrašnji link",
|
||||||
"followLink": "prati link ispod kursora",
|
"followLink": "prati link ispod kursora",
|
||||||
"insertDateTime": "ubaci trenutan datum i vreme na poziciju kursora",
|
"insertDateTime": "ubaci trenutan datum i vreme na poziciju kursora",
|
||||||
@@ -169,7 +161,6 @@
|
|||||||
},
|
},
|
||||||
"import": {
|
"import": {
|
||||||
"importIntoNote": "Uvezi u belešku",
|
"importIntoNote": "Uvezi u belešku",
|
||||||
"close": "Zatvori",
|
|
||||||
"chooseImportFile": "Izaberi datoteku za uvoz",
|
"chooseImportFile": "Izaberi datoteku za uvoz",
|
||||||
"importDescription": "Sadržaj izabranih datoteka će biti uvezen kao podbeleške u",
|
"importDescription": "Sadržaj izabranih datoteka će biti uvezen kao podbeleške u",
|
||||||
"options": "Opcije",
|
"options": "Opcije",
|
||||||
@@ -196,14 +187,13 @@
|
|||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "Uključi belešku",
|
"dialog_title": "Uključi belešku",
|
||||||
"close": "Zatvori",
|
|
||||||
"label_note": "Beleška",
|
"label_note": "Beleška",
|
||||||
"placeholder_search": "pretraži belešku po njenom imenu",
|
"placeholder_search": "pretraži belešku po njenom imenu",
|
||||||
"box_size_prompt": "Veličina kutije priložene beleške:",
|
"box_size_prompt": "Veličina kutije priložene beleške:",
|
||||||
"box_size_small": "mala (~ 10 redova)",
|
"box_size_small": "mala (~ 10 redova)",
|
||||||
"box_size_medium": "srednja (~ 30 redova)",
|
"box_size_medium": "srednja (~ 30 redova)",
|
||||||
"box_size_full": "puna (kutija prikazuje ceo tekst)",
|
"box_size_full": "puna (kutija prikazuje ceo tekst)",
|
||||||
"button_include": "Uključi belešku <kbd>enter</kbd>"
|
"button_include": "Uključi belešku"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"modalTitle": "Informativna poruka",
|
"modalTitle": "Informativna poruka",
|
||||||
@@ -212,23 +202,20 @@
|
|||||||
},
|
},
|
||||||
"jump_to_note": {
|
"jump_to_note": {
|
||||||
"search_placeholder": "Pretraži belešku po njenom imenu ili unesi > za komande...",
|
"search_placeholder": "Pretraži belešku po njenom imenu ili unesi > za komande...",
|
||||||
"close": "Zatvori",
|
|
||||||
"search_button": "Pretraga u punom tekstu <kbd>Ctrl+Enter</kbd>"
|
"search_button": "Pretraga u punom tekstu <kbd>Ctrl+Enter</kbd>"
|
||||||
},
|
},
|
||||||
"markdown_import": {
|
"markdown_import": {
|
||||||
"dialog_title": "Uvoz za Markdown",
|
"dialog_title": "Uvoz za Markdown",
|
||||||
"close": "Zatvori",
|
|
||||||
"modal_body_text": "Zbog Sandbox-a pretraživača nije moguće direktno učitati privremenu memoriju iz JavaScript-a. Molimo vas da nalepite Markdown za uvoz u tekstualno polje ispod i kliknete na dugme za uvoz",
|
"modal_body_text": "Zbog Sandbox-a pretraživača nije moguće direktno učitati privremenu memoriju iz JavaScript-a. Molimo vas da nalepite Markdown za uvoz u tekstualno polje ispod i kliknete na dugme za uvoz",
|
||||||
"import_button": "Uvoz Ctrl+Enter",
|
"import_button": "Uvoz",
|
||||||
"import_success": "Markdown sadržaj je učitan u dokument."
|
"import_success": "Markdown sadržaj je učitan u dokument."
|
||||||
},
|
},
|
||||||
"move_to": {
|
"move_to": {
|
||||||
"dialog_title": "Premesti beleške u ...",
|
"dialog_title": "Premesti beleške u ...",
|
||||||
"close": "Zatvori",
|
|
||||||
"notes_to_move": "Beleške za premeštanje",
|
"notes_to_move": "Beleške za premeštanje",
|
||||||
"target_parent_note": "Ciljana nadbeleška",
|
"target_parent_note": "Ciljana nadbeleška",
|
||||||
"search_placeholder": "potraži belešku po njenom imenu",
|
"search_placeholder": "potraži belešku po njenom imenu",
|
||||||
"move_button": "Pređi na izabranu belešku <kbd>enter</kbd>",
|
"move_button": "Pređi na izabranu belešku",
|
||||||
"error_no_path": "Nema putanje za premeštanje.",
|
"error_no_path": "Nema putanje za premeštanje.",
|
||||||
"move_success_message": "Izabrane beleške su premeštene u "
|
"move_success_message": "Izabrane beleške su premeštene u "
|
||||||
},
|
},
|
||||||
@@ -236,19 +223,16 @@
|
|||||||
"change_path_prompt": "Promenite gde će se napraviti nova beleška:",
|
"change_path_prompt": "Promenite gde će se napraviti nova beleška:",
|
||||||
"search_placeholder": "pretraži putanju po njenom imenu (podrazumevano ako je prazno)",
|
"search_placeholder": "pretraži putanju po njenom imenu (podrazumevano ako je prazno)",
|
||||||
"modal_title": "Izaberite tip beleške",
|
"modal_title": "Izaberite tip beleške",
|
||||||
"close": "Zatvori",
|
|
||||||
"modal_body": "Izaberite tip beleške / šablon za novu belešku:",
|
"modal_body": "Izaberite tip beleške / šablon za novu belešku:",
|
||||||
"templates": "Šabloni:"
|
"templates": "Šabloni"
|
||||||
},
|
},
|
||||||
"password_not_set": {
|
"password_not_set": {
|
||||||
"title": "Lozinka nije podešena",
|
"title": "Lozinka nije podešena",
|
||||||
"close": "Zatvori",
|
|
||||||
"body1": "Zaštićene beleške su enkriptovane sa korisničkom lozinkom, ali lozinka još uvek nije podešena.",
|
"body1": "Zaštićene beleške su enkriptovane sa korisničkom lozinkom, ali lozinka još uvek nije podešena.",
|
||||||
"body2": "Za biste mogli da sačuvate beleške, kliknite <a class=\"open-password-options-button\" href=\"javascript:\">ovde</a> da otvorite dijalog sa Opcijama i podesite svoju lozinku."
|
"body2": "Za biste mogli da sačuvate beleške, kliknite <a class=\"open-password-options-button\" href=\"javascript:\">ovde</a> da otvorite dijalog sa Opcijama i podesite svoju lozinku."
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"title": "Upit",
|
"title": "Upit",
|
||||||
"close": "Zatvori",
|
|
||||||
"ok": "U redu <kbd>enter</kbd>",
|
"ok": "U redu <kbd>enter</kbd>",
|
||||||
"defaultTitle": "Upit"
|
"defaultTitle": "Upit"
|
||||||
},
|
},
|
||||||
@@ -257,12 +241,11 @@
|
|||||||
"help_title": "Pomoć za Zaštićene beleške",
|
"help_title": "Pomoć za Zaštićene beleške",
|
||||||
"close_label": "Zatvori",
|
"close_label": "Zatvori",
|
||||||
"form_label": "Da biste nastavili sa traženom akcijom moraćete započeti zaštićenu sesiju tako što ćete uneti lozinku:",
|
"form_label": "Da biste nastavili sa traženom akcijom moraćete započeti zaštićenu sesiju tako što ćete uneti lozinku:",
|
||||||
"start_button": "Započni zaštićenu sesiju <kbd>enter</kbd>"
|
"start_button": "Započni zaštićenu sesiju"
|
||||||
},
|
},
|
||||||
"recent_changes": {
|
"recent_changes": {
|
||||||
"title": "Nedavne promene",
|
"title": "Nedavne promene",
|
||||||
"erase_notes_button": "Obriši izabrane beleške odmah",
|
"erase_notes_button": "Obriši izabrane beleške odmah",
|
||||||
"close": "Zatvori",
|
|
||||||
"deleted_notes_message": "Obrisane beleške su uklonjene.",
|
"deleted_notes_message": "Obrisane beleške su uklonjene.",
|
||||||
"no_changes_message": "Još uvek nema izmena...",
|
"no_changes_message": "Još uvek nema izmena...",
|
||||||
"undelete_link": "poništi brisanje",
|
"undelete_link": "poništi brisanje",
|
||||||
@@ -273,7 +256,6 @@
|
|||||||
"delete_all_revisions": "Obriši sve revizije ove beleške",
|
"delete_all_revisions": "Obriši sve revizije ove beleške",
|
||||||
"delete_all_button": "Obriši sve revizije",
|
"delete_all_button": "Obriši sve revizije",
|
||||||
"help_title": "Pomoć za Revizije beleški",
|
"help_title": "Pomoć za Revizije beleški",
|
||||||
"close": "Zatvori",
|
|
||||||
"revision_last_edited": "Ova revizija je poslednji put izmenjena {{date}}",
|
"revision_last_edited": "Ova revizija je poslednji put izmenjena {{date}}",
|
||||||
"confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?",
|
"confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?",
|
||||||
"no_revisions": "Još uvek nema revizija za ovu belešku...",
|
"no_revisions": "Još uvek nema revizija za ovu belešku...",
|
||||||
@@ -295,7 +277,6 @@
|
|||||||
},
|
},
|
||||||
"sort_child_notes": {
|
"sort_child_notes": {
|
||||||
"sort_children_by": "Sortiranje podbeleški po...",
|
"sort_children_by": "Sortiranje podbeleški po...",
|
||||||
"close": "Zatvori",
|
|
||||||
"sorting_criteria": "Kriterijum za sortiranje",
|
"sorting_criteria": "Kriterijum za sortiranje",
|
||||||
"title": "naslov",
|
"title": "naslov",
|
||||||
"date_created": "datum kreiranja",
|
"date_created": "datum kreiranja",
|
||||||
@@ -309,13 +290,12 @@
|
|||||||
"sort_with_respect_to_different_character_sorting": "sortiranje sa poštovanjem različitih pravila sortiranja karaktera i kolacija u različitim jezicima ili regionima.",
|
"sort_with_respect_to_different_character_sorting": "sortiranje sa poštovanjem različitih pravila sortiranja karaktera i kolacija u različitim jezicima ili regionima.",
|
||||||
"natural_sort_language": "Jezik za prirodno sortiranje",
|
"natural_sort_language": "Jezik za prirodno sortiranje",
|
||||||
"the_language_code_for_natural_sort": "Kod jezika za prirodno sortiranje, npr. \"zh-CN\" za Kineski.",
|
"the_language_code_for_natural_sort": "Kod jezika za prirodno sortiranje, npr. \"zh-CN\" za Kineski.",
|
||||||
"sort": "Sortiraj <kbd>enter</kbd>"
|
"sort": "Sortiraj"
|
||||||
},
|
},
|
||||||
"upload_attachments": {
|
"upload_attachments": {
|
||||||
"upload_attachments_to_note": "Otpremite priloge uz belešku",
|
"upload_attachments_to_note": "Otpremite priloge uz belešku",
|
||||||
"close": "Zatvori",
|
|
||||||
"choose_files": "Izaberite datoteke",
|
"choose_files": "Izaberite datoteke",
|
||||||
"files_will_be_uploaded": "Datoteke će biti otpremljene kao prilozi u",
|
"files_will_be_uploaded": "Datoteke će biti otpremljene kao prilozi u {{noteTitle}}",
|
||||||
"options": "Opcije",
|
"options": "Opcije",
|
||||||
"shrink_images": "Smanji slike",
|
"shrink_images": "Smanji slike",
|
||||||
"upload": "Otpremi",
|
"upload": "Otpremi",
|
||||||
|
|||||||
@@ -1,71 +1,26 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"close": "Kapat",
|
|
||||||
"homepage": "Giriş sayfası:",
|
"homepage": "Giriş sayfası:",
|
||||||
"app_version": "Uygulama versiyonu:",
|
"app_version": "Uygulama versiyonu:",
|
||||||
"db_version": "Veritabanı versiyonu:"
|
"db_version": "Veritabanı versiyonu:"
|
||||||
},
|
},
|
||||||
"add_link": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"branch_prefix": {
|
"branch_prefix": {
|
||||||
"close": "Kapat",
|
|
||||||
"save": "Kaydet"
|
"save": "Kaydet"
|
||||||
},
|
},
|
||||||
"bulk_actions": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"clone_to": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"confirm": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"recent_changes": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"delete_notes": {
|
"delete_notes": {
|
||||||
"close": "Kapat"
|
"close": "Kapat"
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"close": "Kapat"
|
"close": "Kapat"
|
||||||
},
|
},
|
||||||
"help": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"include_note": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"import": {
|
"import": {
|
||||||
"close": "Kapat",
|
|
||||||
"chooseImportFile": "İçe aktarım dosyası",
|
"chooseImportFile": "İçe aktarım dosyası",
|
||||||
"importDescription": "Seçilen dosya(lar) alt not olarak içe aktarılacaktır"
|
"importDescription": "Seçilen dosya(lar) alt not olarak içe aktarılacaktır"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"closeButton": "Kapat"
|
"closeButton": "Kapat"
|
||||||
},
|
},
|
||||||
"jump_to_note": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"markdown_import": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"move_to": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"note_type_chooser": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"password_not_set": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"prompt": {
|
|
||||||
"close": "Kapat"
|
|
||||||
},
|
|
||||||
"protected_session_password": {
|
"protected_session_password": {
|
||||||
"close_label": "Kapat"
|
"close_label": "Kapat"
|
||||||
},
|
|
||||||
"revisions": {
|
|
||||||
"close": "Kapat"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
2030
apps/client/src/translations/uk/translation.json
Normal file
2030
apps/client/src/translations/uk/translation.json
Normal file
File diff suppressed because it is too large
Load Diff
88
apps/client/src/translations/vi/translation.json
Normal file
88
apps/client/src/translations/vi/translation.json
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"homepage": "Trang chủ:",
|
||||||
|
"title": "Về Trilium Notes",
|
||||||
|
"app_version": "Phiên bản:",
|
||||||
|
"db_version": "Phiên bản DB:",
|
||||||
|
"sync_version": "Phiên bản liên kết:"
|
||||||
|
},
|
||||||
|
"add_link": {
|
||||||
|
"add_link": "Thêm liên kết",
|
||||||
|
"button_add_link": "Thêm liên kết"
|
||||||
|
},
|
||||||
|
"bulk_actions": {
|
||||||
|
"other": "Khác"
|
||||||
|
},
|
||||||
|
"branch_prefix": {
|
||||||
|
"save": "Lưu"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"ok": "OK",
|
||||||
|
"cancel": "Huỷ"
|
||||||
|
},
|
||||||
|
"delete_notes": {
|
||||||
|
"close": "Đóng",
|
||||||
|
"ok": "OK",
|
||||||
|
"cancel": "Huỷ"
|
||||||
|
},
|
||||||
|
"export": {
|
||||||
|
"close": "Đóng"
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"other": "Khác",
|
||||||
|
"notSet": "chưa được đặt"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"critical-error": {
|
||||||
|
"title": "Lỗi nghiêm trọng"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"import": {
|
||||||
|
"options": "Tuỳ chọn"
|
||||||
|
},
|
||||||
|
"info": {
|
||||||
|
"okButton": "OK",
|
||||||
|
"closeButton": "Đóng"
|
||||||
|
},
|
||||||
|
"move_to": {
|
||||||
|
"dialog_title": "Chuyển ghi chép tới..."
|
||||||
|
},
|
||||||
|
"prompt": {
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"protected_session_password": {
|
||||||
|
"close_label": "Đóng"
|
||||||
|
},
|
||||||
|
"revisions": {
|
||||||
|
"restore_button": "Khôi phục",
|
||||||
|
"delete_button": "Xoá"
|
||||||
|
},
|
||||||
|
"upload_attachments": {
|
||||||
|
"options": "Tuỳ chọn"
|
||||||
|
},
|
||||||
|
"attribute_detail": {
|
||||||
|
"name": "Tên",
|
||||||
|
"value": "Giá trị",
|
||||||
|
"text": "Văn bản",
|
||||||
|
"number": "Số",
|
||||||
|
"delete": "Xoá"
|
||||||
|
},
|
||||||
|
"rename_note": {
|
||||||
|
"rename_note": "Đổi tên ghi chép"
|
||||||
|
},
|
||||||
|
"add_label": {
|
||||||
|
"add_label": "Thêm nhãn",
|
||||||
|
"label_name_placeholder": "tên nhãn",
|
||||||
|
"help_text_item2": "hoặc thay đổi giá trị của nhãn có sẵn",
|
||||||
|
"new_value_placeholder": "giá trị mới"
|
||||||
|
},
|
||||||
|
"rename_label": {
|
||||||
|
"rename_label": "Đặt lại tên nhãn"
|
||||||
|
},
|
||||||
|
"call_to_action": {
|
||||||
|
"dismiss": "Bỏ qua"
|
||||||
|
},
|
||||||
|
"abstract_search_option": {
|
||||||
|
"remove_this_search_option": "Xoá lựa chọn tìm kiếm này"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
apps/client/src/types-fancytree.d.ts
vendored
2
apps/client/src/types-fancytree.d.ts
vendored
@@ -113,7 +113,7 @@ declare namespace Fancytree {
|
|||||||
generateFormElements(selected?: boolean, active?: boolean): void;
|
generateFormElements(selected?: boolean, active?: boolean): void;
|
||||||
|
|
||||||
/** Return the currently active node or null. */
|
/** Return the currently active node or null. */
|
||||||
getActiveNode(): FancytreeNode;
|
getActiveNode(): FancytreeNode | null;
|
||||||
|
|
||||||
/** Return the first top level node if any (not the invisible root node). */
|
/** Return the first top level node if any (not the invisible root node). */
|
||||||
getFirstChild(): FancytreeNode;
|
getFirstChild(): FancytreeNode;
|
||||||
|
|||||||
@@ -3,7 +3,11 @@ type DateTimeStyle = "full" | "long" | "medium" | "short" | "none" | undefined;
|
|||||||
/**
|
/**
|
||||||
* Formats the given date and time to a string based on the current locale.
|
* Formats the given date and time to a string based on the current locale.
|
||||||
*/
|
*/
|
||||||
export function formatDateTime(date: string | Date | number, dateStyle: DateTimeStyle = "medium", timeStyle: DateTimeStyle = "medium") {
|
export function formatDateTime(date: string | Date | number | null | undefined, dateStyle: DateTimeStyle = "medium", timeStyle: DateTimeStyle = "medium") {
|
||||||
|
if (!date) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
const locale = navigator.language;
|
const locale = navigator.language;
|
||||||
|
|
||||||
let parsedDate;
|
let parsedDate;
|
||||||
|
|||||||
163
apps/client/src/widgets/FloatingButtons.css
Normal file
163
apps/client/src/widgets/FloatingButtons.css
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
/* #region Generic floating buttons styles */
|
||||||
|
.floating-buttons {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons-children,
|
||||||
|
.show-floating-buttons {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note-split.rtl .floating-buttons-children,
|
||||||
|
.note-split.rtl .show-floating-buttons {
|
||||||
|
right: unset;
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note-split.rtl .close-floating-buttons {
|
||||||
|
order: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.note-split.rtl .close-floating-buttons,
|
||||||
|
.note-split.rtl .show-floating-buttons {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.type-canvas .floating-buttons-children {
|
||||||
|
top: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.type-canvas .floating-buttons-children > * {
|
||||||
|
--border-radius: 0; /* Overridden by themes */
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons-children > *:not(.hidden-int):not(.no-content-hidden) {
|
||||||
|
margin: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons-children > *:not(.has-overflow) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons-children > button, .floating-buttons-children .floating-button {
|
||||||
|
font-size: 150%;
|
||||||
|
padding: 5px 10px 4px 10px;
|
||||||
|
width: 40px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: var(--button-text-color);
|
||||||
|
background: var(--button-background-color);
|
||||||
|
border-radius: var(--button-border-radius);
|
||||||
|
border: 1px solid transparent;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons-children > button:hover, .floating-buttons-children .floating-button:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
border-color: var(--button-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-buttons .floating-buttons-children.temporarily-hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
/* #endregion */
|
||||||
|
|
||||||
|
/* #region Show floating button */
|
||||||
|
.floating-buttons-children.temporarily-hidden+.show-floating-buttons {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-floating-buttons {
|
||||||
|
/* display: none;*/
|
||||||
|
margin-left: 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-floating-buttons-button {
|
||||||
|
border: 1px solid transparent;
|
||||||
|
color: var(--button-text-color);
|
||||||
|
padding: 6px;
|
||||||
|
border-radius: 100px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-floating-buttons-button:hover {
|
||||||
|
border: 1px solid var(--button-border-color);
|
||||||
|
}
|
||||||
|
/* #endregion */
|
||||||
|
|
||||||
|
/* #region Geo map buttons */
|
||||||
|
.leaflet-pane {
|
||||||
|
z-index: 50;
|
||||||
|
}
|
||||||
|
/* #endregion */
|
||||||
|
|
||||||
|
/* #region Close floating buttons */
|
||||||
|
.close-floating-buttons {
|
||||||
|
margin-left: 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-floating-buttons:first-child {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-floating-buttons-button {
|
||||||
|
border: 1px solid transparent;
|
||||||
|
color: var(--button-text-color);
|
||||||
|
padding: 6px;
|
||||||
|
border-radius: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-floating-buttons-button:hover {
|
||||||
|
border: 1px solid var(--button-border-color);
|
||||||
|
}
|
||||||
|
/* #endregion */
|
||||||
|
|
||||||
|
/* #region Backlinks */
|
||||||
|
.backlinks-widget {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backlinks-ticker {
|
||||||
|
border-radius: 10px;
|
||||||
|
border-color: var(--main-border-color);
|
||||||
|
background-color: var(--more-accented-background-color);
|
||||||
|
padding: 4px 10px 4px 10px;
|
||||||
|
opacity: 90%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backlinks-count {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backlinks-items {
|
||||||
|
z-index: 10;
|
||||||
|
position: absolute;
|
||||||
|
top: 50px;
|
||||||
|
right: 10px;
|
||||||
|
width: 400px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: var(--accented-background-color);
|
||||||
|
color: var(--main-text-color);
|
||||||
|
padding: 20px;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backlink-excerpt {
|
||||||
|
border-left: 2px solid var(--main-border-color);
|
||||||
|
padding-left: 10px;
|
||||||
|
opacity: 80%;
|
||||||
|
font-size: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backlink-excerpt .backlink-link { /* the actual backlink */
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: yellow;
|
||||||
|
}
|
||||||
|
/* #endregion */
|
||||||
94
apps/client/src/widgets/FloatingButtons.tsx
Normal file
94
apps/client/src/widgets/FloatingButtons.tsx
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
import { t } from "i18next";
|
||||||
|
import "./FloatingButtons.css";
|
||||||
|
import { useNoteContext, useNoteLabel, useNoteLabelBoolean } from "./react/hooks";
|
||||||
|
import { useContext, useEffect, useMemo, useState } from "preact/hooks";
|
||||||
|
import { ParentComponent } from "./react/react_utils";
|
||||||
|
import { EventData, EventNames } from "../components/app_context";
|
||||||
|
import { type FloatingButtonsList, type FloatingButtonContext } from "./FloatingButtonsDefinitions";
|
||||||
|
import ActionButton from "./react/ActionButton";
|
||||||
|
import { ViewTypeOptions } from "../services/note_list_renderer";
|
||||||
|
|
||||||
|
interface FloatingButtonsProps {
|
||||||
|
items: FloatingButtonsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note:
|
||||||
|
*
|
||||||
|
* For floating button widgets that require content to overflow, the has-overflow CSS class should
|
||||||
|
* be applied to the root element of the widget. Additionally, this root element may need to
|
||||||
|
* properly handle rounded corners, as defined by the --border-radius CSS variable.
|
||||||
|
*/
|
||||||
|
export default function FloatingButtons({ items }: FloatingButtonsProps) {
|
||||||
|
const { note, noteContext } = useNoteContext();
|
||||||
|
const parentComponent = useContext(ParentComponent);
|
||||||
|
const [ viewType ] = useNoteLabel(note, "viewType");
|
||||||
|
const [ isReadOnly ] = useNoteLabelBoolean(note, "readOnly");
|
||||||
|
const context = useMemo<FloatingButtonContext | null>(() => {
|
||||||
|
if (!note || !noteContext || !parentComponent) return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
note,
|
||||||
|
noteContext,
|
||||||
|
parentComponent,
|
||||||
|
isDefaultViewMode: noteContext.viewScope?.viewMode === "default",
|
||||||
|
viewType: viewType as ViewTypeOptions,
|
||||||
|
isReadOnly,
|
||||||
|
triggerEvent<T extends EventNames>(name: T, data?: Omit<EventData<T>, "ntxId">) {
|
||||||
|
parentComponent.triggerEvent(name, {
|
||||||
|
ntxId: noteContext.ntxId,
|
||||||
|
...data
|
||||||
|
} as EventData<T>);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, [ note, noteContext, parentComponent, viewType, isReadOnly ]);
|
||||||
|
|
||||||
|
// Manage the user-adjustable visibility of the floating buttons.
|
||||||
|
const [ visible, setVisible ] = useState(true);
|
||||||
|
useEffect(() => setVisible(true), [ note ]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="floating-buttons no-print">
|
||||||
|
<div className={`floating-buttons-children ${!visible ? "temporarily-hidden" : ""}`}>
|
||||||
|
{context && items.map((Component) => (
|
||||||
|
<Component {...context} />
|
||||||
|
))}
|
||||||
|
|
||||||
|
{visible && <CloseFloatingButton setVisible={setVisible} />}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{!visible && <ShowFloatingButton setVisible={setVisible} /> }
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show button that displays floating button after click on close button
|
||||||
|
*/
|
||||||
|
function ShowFloatingButton({ setVisible }: { setVisible(visible: boolean): void }) {
|
||||||
|
return (
|
||||||
|
<div className="show-floating-buttons">
|
||||||
|
<ActionButton
|
||||||
|
className="show-floating-buttons-button"
|
||||||
|
icon="bx bx-chevrons-left"
|
||||||
|
text={t("show_floating_buttons_button.button_title")}
|
||||||
|
onClick={() => setVisible(true)}
|
||||||
|
noIconActionClass
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CloseFloatingButton({ setVisible }: { setVisible(visible: boolean): void }) {
|
||||||
|
return (
|
||||||
|
<div className="close-floating-buttons">
|
||||||
|
<ActionButton
|
||||||
|
className="close-floating-buttons-button"
|
||||||
|
icon="bx bx-chevrons-right"
|
||||||
|
text={t("hide_floating_buttons_button.button_title")}
|
||||||
|
onClick={() => setVisible(false)}
|
||||||
|
noIconActionClass
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
398
apps/client/src/widgets/FloatingButtonsDefinitions.tsx
Normal file
398
apps/client/src/widgets/FloatingButtonsDefinitions.tsx
Normal file
@@ -0,0 +1,398 @@
|
|||||||
|
import { VNode } from "preact";
|
||||||
|
import appContext, { EventData, EventNames } from "../components/app_context";
|
||||||
|
import Component from "../components/component";
|
||||||
|
import NoteContext from "../components/note_context";
|
||||||
|
import FNote from "../entities/fnote";
|
||||||
|
import ActionButton, { ActionButtonProps } from "./react/ActionButton";
|
||||||
|
import { useNoteLabelBoolean, useTriliumEvent, useTriliumOption, useWindowSize } from "./react/hooks";
|
||||||
|
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "preact/hooks";
|
||||||
|
import { createImageSrcUrl, openInAppHelpFromUrl } from "../services/utils";
|
||||||
|
import server from "../services/server";
|
||||||
|
import { BacklinkCountResponse, BacklinksResponse, SaveSqlConsoleResponse } from "@triliumnext/commons";
|
||||||
|
import toast from "../services/toast";
|
||||||
|
import { t } from "../services/i18n";
|
||||||
|
import { copyImageReferenceToClipboard } from "../services/image";
|
||||||
|
import tree from "../services/tree";
|
||||||
|
import protected_session_holder from "../services/protected_session_holder";
|
||||||
|
import options from "../services/options";
|
||||||
|
import { getHelpUrlForNote } from "../services/in_app_help";
|
||||||
|
import froca from "../services/froca";
|
||||||
|
import NoteLink from "./react/NoteLink";
|
||||||
|
import RawHtml from "./react/RawHtml";
|
||||||
|
import { ViewTypeOptions } from "../services/note_list_renderer";
|
||||||
|
|
||||||
|
export interface FloatingButtonContext {
|
||||||
|
parentComponent: Component;
|
||||||
|
note: FNote;
|
||||||
|
noteContext: NoteContext;
|
||||||
|
isDefaultViewMode: boolean;
|
||||||
|
isReadOnly: boolean;
|
||||||
|
/** Shorthand for triggering an event from the parent component. The `ntxId` is automatically handled for convenience. */
|
||||||
|
triggerEvent<T extends EventNames>(name: T, data?: Omit<EventData<T>, "ntxId">): void;
|
||||||
|
viewType?: ViewTypeOptions | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function FloatingButton({ className, ...props }: ActionButtonProps) {
|
||||||
|
return <ActionButton
|
||||||
|
className={`floating-button ${className ?? ""}`}
|
||||||
|
noIconActionClass
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
export type FloatingButtonsList = ((context: FloatingButtonContext) => false | VNode)[];
|
||||||
|
|
||||||
|
export const DESKTOP_FLOATING_BUTTONS: FloatingButtonsList = [
|
||||||
|
RefreshBackendLogButton,
|
||||||
|
SwitchSplitOrientationButton,
|
||||||
|
ToggleReadOnlyButton,
|
||||||
|
EditButton,
|
||||||
|
ShowTocWidgetButton,
|
||||||
|
ShowHighlightsListWidgetButton,
|
||||||
|
RunActiveNoteButton,
|
||||||
|
OpenTriliumApiDocsButton,
|
||||||
|
SaveToNoteButton,
|
||||||
|
RelationMapButtons,
|
||||||
|
GeoMapButtons,
|
||||||
|
CopyImageReferenceButton,
|
||||||
|
ExportImageButtons,
|
||||||
|
InAppHelpButton,
|
||||||
|
Backlinks
|
||||||
|
];
|
||||||
|
|
||||||
|
export const MOBILE_FLOATING_BUTTONS: FloatingButtonsList = [
|
||||||
|
RefreshBackendLogButton,
|
||||||
|
EditButton,
|
||||||
|
RelationMapButtons,
|
||||||
|
ExportImageButtons,
|
||||||
|
Backlinks
|
||||||
|
]
|
||||||
|
|
||||||
|
function RefreshBackendLogButton({ note, parentComponent, noteContext, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const isEnabled = note.noteId === "_backendLog" && isDefaultViewMode;
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
text={t("backend_log.refresh")}
|
||||||
|
icon="bx bx-refresh"
|
||||||
|
onClick={() => parentComponent.triggerEvent("refreshData", { ntxId: noteContext.ntxId })}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function SwitchSplitOrientationButton({ note, isReadOnly, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const isEnabled = note.type === "mermaid" && note.isContentAvailable() && !isReadOnly && isDefaultViewMode;
|
||||||
|
const [ splitEditorOrientation, setSplitEditorOrientation ] = useTriliumOption("splitEditorOrientation");
|
||||||
|
const upcomingOrientation = splitEditorOrientation === "horizontal" ? "vertical" : "horizontal";
|
||||||
|
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
text={upcomingOrientation === "vertical" ? t("switch_layout_button.title_vertical") : t("switch_layout_button.title_horizontal")}
|
||||||
|
icon={upcomingOrientation === "vertical" ? "bx bxs-dock-bottom" : "bx bxs-dock-left"}
|
||||||
|
onClick={() => setSplitEditorOrientation(upcomingOrientation)}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function ToggleReadOnlyButton({ note, viewType, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const [ isReadOnly, setReadOnly ] = useNoteLabelBoolean(note, "readOnly");
|
||||||
|
const isEnabled = (note.type === "mermaid" || viewType === "geoMap")
|
||||||
|
&& note.isContentAvailable() && isDefaultViewMode;
|
||||||
|
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
text={isReadOnly ? t("toggle_read_only_button.unlock-editing") : t("toggle_read_only_button.lock-editing")}
|
||||||
|
icon={isReadOnly ? "bx bx-lock-open-alt" : "bx bx-lock-alt"}
|
||||||
|
onClick={() => setReadOnly(!isReadOnly)}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function EditButton({ note, noteContext, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const [ animationClass, setAnimationClass ] = useState("");
|
||||||
|
const [ isEnabled, setIsEnabled ] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
noteContext.isReadOnly().then(isReadOnly => {
|
||||||
|
setIsEnabled(
|
||||||
|
isDefaultViewMode
|
||||||
|
&& (!note.isProtected || protected_session_holder.isProtectedSessionAvailable())
|
||||||
|
&& !options.is("databaseReadonly")
|
||||||
|
&& isReadOnly
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}, [ note ]);
|
||||||
|
|
||||||
|
useTriliumEvent("readOnlyTemporarilyDisabled", ({ noteContext: eventNoteContext }) => {
|
||||||
|
if (noteContext?.ntxId === eventNoteContext.ntxId) {
|
||||||
|
setIsEnabled(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// make the edit button stand out on the first display, otherwise
|
||||||
|
// it's difficult to notice that the note is readonly
|
||||||
|
useEffect(() => {
|
||||||
|
if (isEnabled) {
|
||||||
|
setAnimationClass("bx-tada bx-lg");
|
||||||
|
setTimeout(() => {
|
||||||
|
setAnimationClass("");
|
||||||
|
}, 1700);
|
||||||
|
}
|
||||||
|
}, [ isEnabled ]);
|
||||||
|
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
text={t("edit_button.edit_this_note")}
|
||||||
|
icon="bx bx-pencil"
|
||||||
|
className={animationClass}
|
||||||
|
onClick={() => {
|
||||||
|
if (noteContext.viewScope) {
|
||||||
|
noteContext.viewScope.readOnlyTemporarilyDisabled = true;
|
||||||
|
appContext.triggerEvent("readOnlyTemporarilyDisabled", { noteContext });
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function ShowTocWidgetButton({ note, noteContext, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const [ isEnabled, setIsEnabled ] = useState(false);
|
||||||
|
useTriliumEvent("reEvaluateTocWidgetVisibility", () => {
|
||||||
|
setIsEnabled(note.type === "text" && isDefaultViewMode && !!noteContext.viewScope?.tocTemporarilyHidden);
|
||||||
|
});
|
||||||
|
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
text={t("show_toc_widget_button.show_toc")}
|
||||||
|
icon="bx bx-tn-toc"
|
||||||
|
onClick={() => {
|
||||||
|
if (noteContext?.viewScope && noteContext.noteId) {
|
||||||
|
noteContext.viewScope.tocTemporarilyHidden = false;
|
||||||
|
appContext.triggerEvent("showTocWidget", { noteId: noteContext.noteId });
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function ShowHighlightsListWidgetButton({ note, noteContext, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const [ isEnabled, setIsEnabled ] = useState(false);
|
||||||
|
useTriliumEvent("reEvaluateHighlightsListWidgetVisibility", () => {
|
||||||
|
setIsEnabled(note.type === "text" && isDefaultViewMode && !!noteContext.viewScope?.highlightsListTemporarilyHidden);
|
||||||
|
});
|
||||||
|
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
text={t("show_highlights_list_widget_button.show_highlights_list")}
|
||||||
|
icon="bx bx-bookmarks"
|
||||||
|
onClick={() => {
|
||||||
|
if (noteContext?.viewScope && noteContext.noteId) {
|
||||||
|
noteContext.viewScope.highlightsListTemporarilyHidden = false;
|
||||||
|
appContext.triggerEvent("showHighlightsListWidget", { noteId: noteContext.noteId });
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function RunActiveNoteButton({ note }: FloatingButtonContext) {
|
||||||
|
const isEnabled = note.mime.startsWith("application/javascript") || note.mime === "text/x-sqlite;schema=trilium";
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
icon="bx bx-play"
|
||||||
|
text={t("code_buttons.execute_button_title")}
|
||||||
|
triggerCommand="runActiveNote"
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function OpenTriliumApiDocsButton({ note }: FloatingButtonContext) {
|
||||||
|
const isEnabled = note.mime.startsWith("application/javascript;env=");
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
icon="bx bx-help-circle"
|
||||||
|
text={t("code_buttons.trilium_api_docs_button_title")}
|
||||||
|
onClick={() => openInAppHelpFromUrl(note.mime.endsWith("frontend") ? "Q2z6av6JZVWm" : "MEtfsqa5VwNi")}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function SaveToNoteButton({ note }: FloatingButtonContext) {
|
||||||
|
const isEnabled = note.mime === "text/x-sqlite;schema=trilium" && note.isHiddenCompletely();
|
||||||
|
return isEnabled && <FloatingButton
|
||||||
|
icon="bx bx-save"
|
||||||
|
text={t("code_buttons.save_to_note_button_title")}
|
||||||
|
onClick={async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const { notePath } = await server.post<SaveSqlConsoleResponse>("special-notes/save-sql-console", { sqlConsoleNoteId: note.noteId });
|
||||||
|
if (notePath) {
|
||||||
|
toast.showMessage(t("code_buttons.sql_console_saved_message", { "note_path": await tree.getNotePathTitle(notePath) }));
|
||||||
|
// TODO: This hangs the navigation, for some reason.
|
||||||
|
//await ws.waitForMaxKnownEntityChangeId();
|
||||||
|
await appContext.tabManager.getActiveContext()?.setNote(notePath);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
|
||||||
|
function RelationMapButtons({ note, triggerEvent }: FloatingButtonContext) {
|
||||||
|
const isEnabled = (note.type === "relationMap");
|
||||||
|
return isEnabled && (
|
||||||
|
<>
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-folder-plus"
|
||||||
|
text={t("relation_map_buttons.create_child_note_title")}
|
||||||
|
onClick={() => triggerEvent("relationMapCreateChildNote")}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-crop"
|
||||||
|
text={t("relation_map_buttons.reset_pan_zoom_title")}
|
||||||
|
onClick={() => triggerEvent("relationMapResetPanZoom")}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div className="btn-group">
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-zoom-in"
|
||||||
|
text={t("relation_map_buttons.zoom_in_title")}
|
||||||
|
onClick={() => triggerEvent("relationMapResetZoomIn")}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-zoom-out"
|
||||||
|
text={t("relation_map_buttons.zoom_out_title")}
|
||||||
|
onClick={() => triggerEvent("relationMapResetZoomOut")}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function GeoMapButtons({ triggerEvent, viewType, isReadOnly }: FloatingButtonContext) {
|
||||||
|
const isEnabled = viewType === "geoMap" && !isReadOnly;
|
||||||
|
return isEnabled && (
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-plus-circle"
|
||||||
|
text={t("geo-map.create-child-note-title")}
|
||||||
|
onClick={() => triggerEvent("geoMapCreateChildNote")}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CopyImageReferenceButton({ note, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const hiddenImageCopyRef = useRef<HTMLDivElement>(null);
|
||||||
|
const isEnabled = ["mermaid", "canvas", "mindMap"].includes(note?.type ?? "")
|
||||||
|
&& note?.isContentAvailable() && isDefaultViewMode;
|
||||||
|
|
||||||
|
return isEnabled && (
|
||||||
|
<>
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-copy"
|
||||||
|
text={t("copy_image_reference_button.button_title")}
|
||||||
|
onClick={() => {
|
||||||
|
if (!hiddenImageCopyRef.current) return;
|
||||||
|
const imageEl = document.createElement("img");
|
||||||
|
imageEl.src = createImageSrcUrl(note);
|
||||||
|
hiddenImageCopyRef.current.replaceChildren(imageEl);
|
||||||
|
copyImageReferenceToClipboard($(hiddenImageCopyRef.current));
|
||||||
|
hiddenImageCopyRef.current.removeChild(imageEl);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div ref={hiddenImageCopyRef} className="hidden-image-copy" style={{
|
||||||
|
position: "absolute" // Take out of the the hidden image from flexbox to prevent the layout being affected
|
||||||
|
}} />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function ExportImageButtons({ note, triggerEvent, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
const isEnabled = ["mermaid", "mindMap"].includes(note?.type ?? "")
|
||||||
|
&& note?.isContentAvailable() && isDefaultViewMode;
|
||||||
|
return isEnabled && (
|
||||||
|
<>
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bxs-file-image"
|
||||||
|
text={t("svg_export_button.button_title")}
|
||||||
|
onClick={() => triggerEvent("exportSvg")}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bxs-file-png"
|
||||||
|
text={t("png_export_button.button_title")}
|
||||||
|
onClick={() => triggerEvent("exportPng")}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function InAppHelpButton({ note }: FloatingButtonContext) {
|
||||||
|
const helpUrl = getHelpUrlForNote(note);
|
||||||
|
|
||||||
|
return !!helpUrl && (
|
||||||
|
<FloatingButton
|
||||||
|
icon="bx bx-help-circle"
|
||||||
|
text={t("help-button.title")}
|
||||||
|
onClick={() => helpUrl && openInAppHelpFromUrl(helpUrl)}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Backlinks({ note, isDefaultViewMode }: FloatingButtonContext) {
|
||||||
|
let [ backlinkCount, setBacklinkCount ] = useState(0);
|
||||||
|
let [ popupOpen, setPopupOpen ] = useState(false);
|
||||||
|
const backlinksContainerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!isDefaultViewMode) return;
|
||||||
|
|
||||||
|
server.get<BacklinkCountResponse>(`note-map/${note.noteId}/backlink-count`).then(resp => {
|
||||||
|
setBacklinkCount(resp.count);
|
||||||
|
});
|
||||||
|
}, [ note ]);
|
||||||
|
|
||||||
|
// Determine the max height of the container.
|
||||||
|
const { windowHeight } = useWindowSize();
|
||||||
|
useLayoutEffect(() => {
|
||||||
|
const el = backlinksContainerRef.current;
|
||||||
|
if (popupOpen && el) {
|
||||||
|
const box = el.getBoundingClientRect();
|
||||||
|
const maxHeight = windowHeight - box.top - 10;
|
||||||
|
el.style.maxHeight = `${maxHeight}px`;
|
||||||
|
}
|
||||||
|
}, [ popupOpen, windowHeight ]);
|
||||||
|
|
||||||
|
const isEnabled = isDefaultViewMode && backlinkCount > 0;
|
||||||
|
return (isEnabled &&
|
||||||
|
<div className="backlinks-widget has-overflow">
|
||||||
|
<div
|
||||||
|
className="backlinks-ticker"
|
||||||
|
onClick={() => setPopupOpen(!popupOpen)}
|
||||||
|
>
|
||||||
|
<span className="backlinks-count">{t("zpetne_odkazy.backlink", { count: backlinkCount })}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{popupOpen && (
|
||||||
|
<div ref={backlinksContainerRef} className="backlinks-items dropdown-menu" style={{ display: "block" }}>
|
||||||
|
<BacklinksList noteId={note.noteId} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BacklinksList({ noteId }: { noteId: string }) {
|
||||||
|
const [ backlinks, setBacklinks ] = useState<BacklinksResponse>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
server.get<BacklinksResponse>(`note-map/${noteId}/backlinks`).then(async (backlinks) => {
|
||||||
|
// prefetch all
|
||||||
|
const noteIds = backlinks
|
||||||
|
.filter(bl => "noteId" in bl)
|
||||||
|
.map((bl) => bl.noteId);
|
||||||
|
await froca.getNotes(noteIds);
|
||||||
|
setBacklinks(backlinks);
|
||||||
|
});
|
||||||
|
}, [ noteId ]);
|
||||||
|
|
||||||
|
return backlinks.map(backlink => (
|
||||||
|
<div>
|
||||||
|
<NoteLink
|
||||||
|
notePath={backlink.noteId}
|
||||||
|
showNotePath showNoteIcon
|
||||||
|
noPreview
|
||||||
|
/>
|
||||||
|
|
||||||
|
{"relationName" in backlink ? (
|
||||||
|
<p>{backlink.relationName}</p>
|
||||||
|
) : (
|
||||||
|
backlink.excerpts.map(excerpt => (
|
||||||
|
<RawHtml html={excerpt} />
|
||||||
|
))
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
));
|
||||||
|
}
|
||||||
28
apps/client/src/widgets/api_log.css
Normal file
28
apps/client/src/widgets/api_log.css
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
.api-log-widget {
|
||||||
|
flex-grow: 1;
|
||||||
|
max-height: 40%;
|
||||||
|
position: relative;
|
||||||
|
border-top: 1px solid var(--main-border-color);
|
||||||
|
background-color: var(--accented-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-log-container {
|
||||||
|
overflow: auto;
|
||||||
|
height: 100%;
|
||||||
|
font-family: var(--monospace-font-family);
|
||||||
|
font-size: 0.8em;
|
||||||
|
white-space: pre;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-api-log-button {
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid var(--button-border-color);
|
||||||
|
background-color: var(--button-background-color);
|
||||||
|
border-radius: var(--button-border-radius);
|
||||||
|
color: var(--button-text-color);
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
import type { EventData } from "../components/app_context.js";
|
|
||||||
import type FNote from "../entities/fnote.js";
|
|
||||||
import { t } from "../services/i18n.js";
|
|
||||||
import NoteContextAwareWidget from "./note_context_aware_widget.js";
|
|
||||||
|
|
||||||
const TPL = /*html*/`
|
|
||||||
<div class="api-log-widget">
|
|
||||||
<style>
|
|
||||||
.api-log-widget {
|
|
||||||
padding: 15px;
|
|
||||||
flex-grow: 1;
|
|
||||||
max-height: 40%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hidden-api-log {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.api-log-container {
|
|
||||||
overflow: auto;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.close-api-log-button {
|
|
||||||
padding: 5px;
|
|
||||||
border: 1px solid var(--button-border-color);
|
|
||||||
background-color: var(--button-background-color);
|
|
||||||
border-radius: var(--button-border-radius);
|
|
||||||
color: var(--button-text-color);
|
|
||||||
position: absolute;
|
|
||||||
top: 10px;
|
|
||||||
right: 40px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div class="bx bx-x close-api-log-button" title="${t("api_log.close")}"></div>
|
|
||||||
|
|
||||||
<div class="api-log-container"></div>
|
|
||||||
</div>`;
|
|
||||||
|
|
||||||
export default class ApiLogWidget extends NoteContextAwareWidget {
|
|
||||||
|
|
||||||
private $logContainer!: JQuery<HTMLElement>;
|
|
||||||
private $closeButton!: JQuery<HTMLElement>;
|
|
||||||
|
|
||||||
isEnabled() {
|
|
||||||
return !!this.note && this.note.mime.startsWith("application/javascript;env=") && super.isEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
doRender() {
|
|
||||||
this.$widget = $(TPL);
|
|
||||||
this.toggle(false);
|
|
||||||
|
|
||||||
this.$logContainer = this.$widget.find(".api-log-container");
|
|
||||||
this.$closeButton = this.$widget.find(".close-api-log-button");
|
|
||||||
this.$closeButton.on("click", () => this.toggle(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
async refreshWithNote(note: FNote) {
|
|
||||||
this.$logContainer.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
apiLogMessagesEvent({ messages, noteId }: EventData<"apiLogMessages">) {
|
|
||||||
if (!this.isNote(noteId)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.toggle(true);
|
|
||||||
|
|
||||||
for (const message of messages) {
|
|
||||||
this.$logContainer.append(message).append($("<br>"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle(show: boolean) {
|
|
||||||
this.$widget.toggleClass("hidden-api-log", !show);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
41
apps/client/src/widgets/api_log.tsx
Normal file
41
apps/client/src/widgets/api_log.tsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { useEffect, useState } from "preact/hooks";
|
||||||
|
import "./api_log.css";
|
||||||
|
import { useNoteContext, useTriliumEvent } from "./react/hooks";
|
||||||
|
import ActionButton from "./react/ActionButton";
|
||||||
|
import { t } from "../services/i18n";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays the messages that are logged by the current note via `api.log`, for frontend and backend scripts.
|
||||||
|
*/
|
||||||
|
export default function ApiLog() {
|
||||||
|
const { note, noteId } = useNoteContext();
|
||||||
|
const [ messages, setMessages ] = useState<string[]>();
|
||||||
|
|
||||||
|
useTriliumEvent("apiLogMessages", ({ messages, noteId: eventNoteId }) => {
|
||||||
|
if (eventNoteId !== noteId) return;
|
||||||
|
setMessages(messages);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Clear when navigating away.
|
||||||
|
useEffect(() => setMessages(undefined), [ note ]);
|
||||||
|
|
||||||
|
const isEnabled = note?.mime.startsWith("application/javascript;env=") && messages?.length;
|
||||||
|
return (
|
||||||
|
<div className={`api-log-widget ${!isEnabled ? "hidden-ext" : ""}`}>
|
||||||
|
{isEnabled && (
|
||||||
|
<>
|
||||||
|
<ActionButton
|
||||||
|
icon="bx bx-x"
|
||||||
|
className="close-api-log-button"
|
||||||
|
text={t("api_log.close")}
|
||||||
|
onClick={() => setMessages(undefined)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div className="api-log-container">
|
||||||
|
{messages.join("\n")}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user