Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4693c924c3 | ||
|
|
833fb1264f | ||
|
|
6e7015e8f9 | ||
|
|
f007735936 | ||
|
|
1f1cd9f11b | ||
|
|
ac959b2882 | ||
|
|
4609634259 | ||
|
|
f06b64f3f9 | ||
|
|
80503ad0c1 | ||
|
|
05dfaf7347 | ||
|
|
59be83d958 | ||
|
|
e7676a148f | ||
|
|
73a39d36ea | ||
|
|
a43ab26a46 | ||
|
|
f5f117cb72 | ||
|
|
fc6da04081 | ||
|
|
12ff654986 | ||
|
|
e852ad846f | ||
|
|
cb28021a27 | ||
|
|
d8ab03f3bc | ||
|
|
48b6b83950 | ||
|
|
3e3bad0947 | ||
|
|
e527f590c5 | ||
|
|
88f968aac5 | ||
|
|
bbd01c3a38 | ||
|
|
e8d22a4177 | ||
|
|
6caec4df39 | ||
|
|
28e00fdf2e | ||
|
|
3bd0656eab | ||
|
|
e9af71dd76 | ||
|
|
73b33e8e32 | ||
|
|
eea56fcf94 | ||
|
|
a5a278eced | ||
|
|
a978ae4cfa | ||
|
|
c2c7efee91 | ||
|
|
c9c44d5643 | ||
|
|
0836fca822 | ||
|
|
566df5039c | ||
|
|
dd1c1dded4 | ||
|
|
5407481976 | ||
|
|
5a1f6b13cf | ||
|
|
a904431782 | ||
|
|
b23ec936fd | ||
|
|
73a4517902 | ||
|
|
a966b32583 | ||
|
|
91a3428124 | ||
|
|
93a5ba9490 | ||
|
|
e570f7a226 | ||
|
|
9b28a8995f | ||
|
|
197f509f5d | ||
|
|
559655bf33 | ||
|
|
0eab23fbcf | ||
|
|
f334f4f487 | ||
|
|
4c83d7aa75 | ||
|
|
17e053b358 | ||
|
|
a29c93634d | ||
|
|
a5f5bfcfec | ||
|
|
b509329383 | ||
|
|
91c7abed42 | ||
|
|
54fda6ac97 | ||
|
|
341eefebaf | ||
|
|
af714cbdac | ||
|
|
6a0bf15c28 | ||
|
|
5a2bdad348 | ||
|
|
fd08bfdd86 | ||
|
|
1a5cead659 | ||
|
|
85df133386 | ||
|
|
869d11e113 | ||
|
|
d7a01d3965 | ||
|
|
989036241d | ||
|
|
433cef1827 | ||
|
|
433d34f62b | ||
|
|
e7ec33bbf9 | ||
|
|
a29f42d78d | ||
|
|
74ed234ab9 | ||
|
|
49bfa49489 | ||
|
|
5f81944a3e | ||
|
|
86b76ccb77 | ||
|
|
29aedf8480 | ||
|
|
9486f5e0d2 | ||
|
|
9a458431b8 | ||
|
|
2c9db9d18c | ||
|
|
ae9c535842 | ||
|
|
a518da587e | ||
|
|
92e6e00d9e | ||
|
|
b64c9cf18a | ||
|
|
275d6e230d | ||
|
|
ab8ce15c33 | ||
|
|
3fb6179587 | ||
|
|
28cc38064c | ||
|
|
1fa5ab2b96 | ||
|
|
15f4e635d9 | ||
|
|
7a79d7ef7e | ||
|
|
776e7dfe3f | ||
|
|
790b622cbc | ||
|
|
89117b4ee9 | ||
|
|
c245517e0f | ||
|
|
31db95d0c4 | ||
|
|
2cd50de065 | ||
|
|
6dcb7e2605 | ||
|
|
9c9bd4ba51 | ||
|
|
71e6964945 | ||
|
|
00057da17d | ||
|
|
0a05464013 | ||
|
|
97dc2fa6bd | ||
|
|
161e112e7b | ||
|
|
c93a6f86cd | ||
|
|
9bb178b9d9 | ||
|
|
8087bc5280 | ||
|
|
26f5a606e0 | ||
|
|
9ebb574059 | ||
|
|
d29c3c2466 | ||
|
|
a71f1c19ec | ||
|
|
485921d879 | ||
|
|
15de7572c0 | ||
|
|
09f41dd50e | ||
|
|
7b8ee467a0 | ||
|
|
99a496d684 | ||
|
|
100aaab58d | ||
|
|
126c7b5a75 | ||
|
|
d448ea3a02 | ||
|
|
9d6975a9e2 | ||
|
|
555727e5fe | ||
|
|
f43ee123d8 | ||
|
|
f42fb1b871 | ||
|
|
cf2442c5b2 | ||
|
|
e0e4735b03 | ||
|
|
138faa2aae | ||
|
|
8bd58c9608 | ||
|
|
215a725ded | ||
|
|
12c0a05af0 | ||
|
|
a7fa119041 | ||
|
|
7fb52b8b0e | ||
|
|
3e86ae4a82 | ||
|
|
77eceea426 | ||
|
|
a09c6f152c | ||
|
|
3830195752 | ||
|
|
c9594065c3 | ||
|
|
360d3bbff9 | ||
|
|
6fde8dfe52 | ||
|
|
de2ccfbfe0 | ||
|
|
31f53b12fd | ||
|
|
d45b280ada | ||
|
|
ca46590ff3 | ||
|
|
b5a137545e | ||
|
|
4e80dbb7a7 | ||
|
|
90b0c99806 | ||
|
|
947d81d96d | ||
|
|
6ca640d2ed | ||
|
|
c8c0c3af46 | ||
|
|
110de50bf9 | ||
|
|
b7e110d888 | ||
|
|
f1c557cb43 | ||
|
|
43e9fc92c9 | ||
|
|
10fa331731 | ||
|
|
cc8e122de3 | ||
|
|
bca5fd8db9 | ||
|
|
13101f7d9b | ||
|
|
6aca233b21 | ||
|
|
2200be697e | ||
|
|
25ab3c323b | ||
|
|
5bf30a9586 | ||
|
|
b6779a8074 | ||
|
|
59599d318c | ||
|
|
538600fd6c | ||
|
|
63264ba471 | ||
|
|
95e7f3df7d | ||
|
|
366fd2a333 | ||
|
|
5be99a4a16 | ||
|
|
d86f6a1fbd | ||
|
|
7d68208cb4 | ||
|
|
e9de9d9128 | ||
|
|
1af16d9f0b | ||
|
|
8e11eababa | ||
|
|
4ec9faadd5 | ||
|
|
5cf462c885 | ||
|
|
f7ef0a2b1e | ||
|
|
870f55a6c5 | ||
|
|
7f7e38b434 | ||
|
|
460a07b1a3 | ||
|
|
48c9b86d2b | ||
|
|
7202066c1f | ||
|
|
5226f0019b | ||
|
|
26ac745419 | ||
|
|
b3f2bbee5b | ||
|
|
56c6cfc785 | ||
|
|
1db4932573 | ||
|
|
a2873ebbc5 | ||
|
|
f652011d59 | ||
|
|
27c572b2f5 | ||
|
|
7a4c97618d | ||
|
|
3ac4fbeee5 | ||
|
|
9e05fa553c | ||
|
|
d4f0d2423d | ||
|
|
abdd7e3256 | ||
|
|
f3ea476f27 | ||
|
|
aa22af443c | ||
|
|
ce3bd2a47d | ||
|
|
a9b26246e6 | ||
|
|
cc1e941dd9 | ||
|
|
9610b7e6bd | ||
|
|
4f2884a0f7 | ||
|
|
4872f1419c | ||
|
|
fdcaab3caf | ||
|
|
9f2c4b938f | ||
|
|
8be65acf7d | ||
|
|
ad85a12535 | ||
|
|
b825346829 | ||
|
|
bd4cbaf93d | ||
|
|
e05aa433e4 | ||
|
|
ccfb0b43d6 | ||
|
|
4211e962c6 | ||
|
|
9af2a19bdf | ||
|
|
d3fa906a9a | ||
|
|
6b54c4244b | ||
|
|
1d5a4bd381 | ||
|
|
86a1103a64 | ||
|
|
45edaaa96f | ||
|
|
b7b158aa94 | ||
|
|
e6bc55b6f8 | ||
|
|
111092791c | ||
|
|
4e91e01ddc | ||
|
|
44dce6c6c3 | ||
|
|
b25ad50a1b | ||
|
|
22679641ee | ||
|
|
e2e3be66ee | ||
|
|
4b3119ebba | ||
|
|
1712a67e2e | ||
|
|
cd563b050c | ||
|
|
4426f2dbec | ||
|
|
0fbbf2eee0 | ||
|
|
0ca7457000 | ||
|
|
c84e49c71c | ||
|
|
07ab0e986d | ||
|
|
17957f5da4 | ||
|
|
a7b5d43e69 | ||
|
|
38eda3f151 | ||
|
|
2fdad2fe80 | ||
|
|
0249ff48ca | ||
|
|
142fc02f9c | ||
|
|
842b123285 | ||
|
|
a4aca68b85 | ||
|
|
1397af0692 | ||
|
|
5da760dd0c | ||
|
|
511d58d3af | ||
|
|
a1c9e675ad | ||
|
|
0349ad0b80 | ||
|
|
056285deda | ||
|
|
9d8411a25e | ||
|
|
754ba2267a | ||
|
|
bdedf69439 | ||
|
|
c9451d8675 | ||
|
|
c38834b04c | ||
|
|
851eee1500 | ||
|
|
4cdac308d1 | ||
|
|
c0d5c7c282 | ||
|
|
40e24102ce | ||
|
|
7614a795e9 | ||
|
|
1273a1dc5f | ||
|
|
10909fe4fc | ||
|
|
9b3d3026bf | ||
|
|
96076c84f4 | ||
|
|
2c553db45a | ||
|
|
7d7005596f | ||
|
|
998dd52adc | ||
|
|
2a1c6d6475 | ||
|
|
1ba0644142 | ||
|
|
88ac57d7f3 | ||
|
|
314686bede | ||
|
|
af8845f209 | ||
|
|
c95d7f9d37 | ||
|
|
2510c659e6 | ||
|
|
b7523e1b21 | ||
|
|
e4e9e801a2 | ||
|
|
524ec12d8a | ||
|
|
1108e8c28a | ||
|
|
0f1156ab9c | ||
|
|
2a08cc332a | ||
|
|
5d2baa872e | ||
|
|
4b377589aa | ||
|
|
cf78204c85 | ||
|
|
c513cdd4eb | ||
|
|
5f410e80e6 | ||
|
|
2aa7eaa192 | ||
|
|
b24d060281 | ||
|
|
a014b9347e | ||
|
|
582ab4ac13 | ||
|
|
c9adccad4a | ||
|
|
f41ba67e15 | ||
|
|
1f70a76c7e | ||
|
|
5fe3732a38 | ||
|
|
445533cfcc | ||
|
|
a8e29249d6 | ||
|
|
e4a3cbd2ff | ||
|
|
96b7ce9d50 | ||
|
|
2bbc1e7ecd | ||
|
|
83619b279d | ||
|
|
8b5a99d494 | ||
|
|
67d4123608 | ||
|
|
a424e3c899 | ||
|
|
08d4b5a714 | ||
|
|
68aefd5e4c | ||
|
|
57d750bc9a | ||
|
|
fbe966903b | ||
|
|
652748f969 | ||
|
|
e108fdb1d8 | ||
|
|
a8296e2e37 | ||
|
|
0998fc0ad7 | ||
|
|
d5f3e860b9 | ||
|
|
4e624f7db5 | ||
|
|
5b697b7e16 | ||
|
|
30e0d69a74 | ||
|
|
652816fd26 | ||
|
|
3a33e5f416 | ||
|
|
277dac5512 | ||
|
|
81d97d9f9d | ||
|
|
a4873cd40d | ||
|
|
20cb2daf43 | ||
|
|
e5b5250a91 | ||
|
|
db7d617e2b | ||
|
|
a627884876 | ||
|
|
ed30d09e07 | ||
|
|
179e3f9aee | ||
|
|
a67aedba35 | ||
|
|
199c411a7d | ||
|
|
5cd7bb5bdb | ||
|
|
30b8f5e2aa | ||
|
|
44f2842820 | ||
|
|
569355a318 | ||
|
|
8464e16d5d | ||
|
|
874c1e3e82 | ||
|
|
2530ecfc86 | ||
|
|
6b49f1dfcc | ||
|
|
b1af25ea18 | ||
|
|
3086007a9c | ||
|
|
bdfb6b97f5 | ||
|
|
c01219e6be | ||
|
|
743c11c279 | ||
|
|
11646d1c21 | ||
|
|
797f4a9669 | ||
|
|
815775ad8f | ||
|
|
085109288f | ||
|
|
c6cf0f3ba5 | ||
|
|
f9bdce7e24 | ||
|
|
f8cf4db5db | ||
|
|
14e6ae373f | ||
|
|
39bffd2790 | ||
|
|
f3cb903901 | ||
|
|
abad1883bc | ||
|
|
bb8770a967 | ||
|
|
c903947704 | ||
|
|
82e96840e9 | ||
|
|
e190d90832 | ||
|
|
0ae8d454ad | ||
|
|
77c7f966cf | ||
|
|
619fa1d607 | ||
|
|
157736ff7e | ||
|
|
0b57d906f8 | ||
|
|
86bfdb5c79 | ||
|
|
fc7d34f79c | ||
|
|
9d962f0328 | ||
|
|
79e1a33b28 | ||
|
|
0eedae1f62 | ||
|
|
e1144c098e | ||
|
|
5c5cb0f781 | ||
|
|
656615b571 | ||
|
|
799a9e810d | ||
|
|
aa147bbcdc | ||
|
|
8c7a24282c | ||
|
|
f99f3f8a6d | ||
|
|
29fbafdfff | ||
|
|
3253146dae | ||
|
|
7e4ac0fd73 | ||
|
|
60d77cb5ea | ||
|
|
8299164964 | ||
|
|
488393e75d | ||
|
|
c19f8c8035 | ||
|
|
b0b55718cc | ||
|
|
5ade9ff2f6 | ||
|
|
e4cfb518ba | ||
|
|
89864de1ff | ||
|
|
ee2a474611 | ||
|
|
223caca0f5 | ||
|
|
ee358f70dd | ||
|
|
0718828d60 | ||
|
|
d13f54c2ce | ||
|
|
90f7f99cd1 | ||
|
|
a273bbaeee | ||
|
|
619b426689 | ||
|
|
97c752a39e | ||
|
|
7565f1cada | ||
|
|
0c147236a3 | ||
|
|
88f22fabf7 | ||
|
|
5f46d60c5e | ||
|
|
cc8c200826 | ||
|
|
4485947b0f | ||
|
|
9f1a877f96 | ||
|
|
13280ce1b3 | ||
|
|
7f73931530 | ||
|
|
bbfed9bca8 | ||
|
|
bab29cd582 | ||
|
|
f9296992bf | ||
|
|
baea44cbd6 | ||
|
|
ab0538df43 | ||
|
|
5b06ebde1e | ||
|
|
d309c75974 | ||
|
|
58d4a69053 | ||
|
|
9147b3061a | ||
|
|
1b0102f62c | ||
|
|
471631933b | ||
|
|
cd761932c1 | ||
|
|
e63eee89ef | ||
|
|
4393ebbcc6 | ||
|
|
ed82390a8d | ||
|
|
79e708779f | ||
|
|
98905f6892 | ||
|
|
44e57c3959 | ||
|
|
35d48394ce | ||
|
|
eb42a5f34b | ||
|
|
729c8c6fac | ||
|
|
7a1707d864 | ||
|
|
64d7603eed | ||
|
|
89e6b680a6 | ||
|
|
da071a804c | ||
|
|
7833ca5ae6 | ||
|
|
44d49b57b9 | ||
|
|
9db150f8ff | ||
|
|
e2d3630783 | ||
|
|
cb1b5cae9f | ||
|
|
3af5b31c1c | ||
|
|
b6dafd6da6 | ||
|
|
d08b922632 | ||
|
|
9d4e250f6b | ||
|
|
c19cc1b39a | ||
|
|
73bd6f9776 | ||
|
|
6fef55398f | ||
|
|
d209d5036b | ||
|
|
4be02bc33c | ||
|
|
d6daa34e0a | ||
|
|
9cebbbe7cf | ||
|
|
71e5304298 | ||
|
|
8f8d11c9b3 | ||
|
|
1cd86fd3ea | ||
|
|
7f1f5a8c3d | ||
|
|
9dfb0642da | ||
|
|
0fa8dfa063 | ||
|
|
1d79dedf6d | ||
|
|
a274a56e65 | ||
|
|
44d3a4213f | ||
|
|
e68eb196b7 | ||
|
|
4bef79cd71 | ||
|
|
f3dc3602c8 | ||
|
|
17e140ba56 | ||
|
|
89d0575ccd | ||
|
|
ca0197a319 | ||
|
|
62bc296abe | ||
|
|
e58dc809ec | ||
|
|
abd57ad384 | ||
|
|
bada9286d0 | ||
|
|
3807317e66 | ||
|
|
10ff43f4f0 | ||
|
|
282f6de1a9 | ||
|
|
9a55afec01 | ||
|
|
c8c4bb3245 | ||
|
|
e1f831af62 | ||
|
|
657cebfda9 | ||
|
|
7f1c25793a | ||
|
|
b770ffda4d | ||
|
|
d0b3e15999 | ||
|
|
20433b0282 | ||
|
|
452b41de0f | ||
|
|
b69008225f | ||
|
|
b3a778e983 | ||
|
|
a57c6e9155 | ||
|
|
3fbfba2c03 | ||
|
|
8a5e6875f0 | ||
|
|
e11e57f1d8 | ||
|
|
073bd80f89 | ||
|
|
e3aaee738a | ||
|
|
f1b2b7b86b | ||
|
|
e0a87d6253 | ||
|
|
a7eae2e033 | ||
|
|
51235f191d | ||
|
|
003ead2511 | ||
|
|
8dc8527fdc | ||
|
|
985dcc2605 | ||
|
|
4063cdba11 | ||
|
|
c96c591fa9 | ||
|
|
4913fdb800 | ||
|
|
24bc7f153a | ||
|
|
8732c97dcd | ||
|
|
e092eaef6f | ||
|
|
4ade1bf65f | ||
|
|
807c89a42f | ||
|
|
0b8350e9ea | ||
|
|
49e7be8924 | ||
|
|
810c63e3b2 | ||
|
|
d917ca5551 | ||
|
|
ec642300ab | ||
|
|
9034d646bf | ||
|
|
96f6bbb035 | ||
|
|
e14ed655d2 | ||
|
|
54e5323f54 | ||
|
|
ef58affed1 | ||
|
|
76fa87d878 | ||
|
|
2db2225788 | ||
|
|
425c1763f4 | ||
|
|
77a03599de | ||
|
|
9c057071b5 | ||
|
|
ee3f4beeaf | ||
|
|
7035b1f9f6 | ||
|
|
3aea55ee63 | ||
|
|
28acb4eca6 | ||
|
|
c63c6370b5 | ||
|
|
6046f40e45 | ||
|
|
262159cf73 | ||
|
|
8eb94bc8ab | ||
|
|
a9390affaa | ||
|
|
66392b4e8a | ||
|
|
3283f34c79 | ||
|
|
fd4e5d7d30 | ||
|
|
5bbf9d87c2 | ||
|
|
acf1ff6d1d | ||
|
|
05acc51054 | ||
|
|
eb8841379c | ||
|
|
044f2eac6a | ||
|
|
281f135125 | ||
|
|
6c88f8b8ae | ||
|
|
832abcddf0 | ||
|
|
d601575549 | ||
|
|
e6c481f45c | ||
|
|
11fecfb83a | ||
|
|
2facc9868e | ||
|
|
7b9ad9d1c3 | ||
|
|
3b96a99f3e | ||
|
|
575ce5128b | ||
|
|
0d2f253218 | ||
|
|
349d020da2 | ||
|
|
dece28da35 | ||
|
|
2ffc429971 | ||
|
|
87ccb86f54 | ||
|
|
8baa125842 | ||
|
|
20482b2f14 | ||
|
|
6b6092ffc7 | ||
|
|
47a05fb4ba | ||
|
|
ac0a89625a | ||
|
|
714c912aff | ||
|
|
ebf8b744e1 | ||
|
|
a07638239b | ||
|
|
1039e98396 | ||
|
|
8f00538cb1 | ||
|
|
5143870d3b | ||
|
|
2b530a3ff9 | ||
|
|
d089511aa6 | ||
|
|
f61c4c1374 | ||
|
|
254735fcae | ||
|
|
44024371ff | ||
|
|
be232fa34b | ||
|
|
1a90165255 | ||
|
|
13417d15b7 | ||
|
|
9fe1f6acfc | ||
|
|
1899d86641 | ||
|
|
6ca63ca56b | ||
|
|
e796968ec0 | ||
|
|
7b64c8dbe3 | ||
|
|
2377f7bc07 | ||
|
|
47fdcef182 | ||
|
|
d27b658392 | ||
|
|
07720ed6f8 | ||
|
|
a9cdecf599 | ||
|
|
c6b5a5c328 | ||
|
|
e7f3aa3764 | ||
|
|
89ca8e08d6 | ||
|
|
6350506ce7 | ||
|
|
d5ed611920 | ||
|
|
acc10ccac4 | ||
|
|
45160a2e73 | ||
|
|
e38794171a | ||
|
|
c2d6da83c0 | ||
|
|
fd568b5300 | ||
|
|
77005fc495 | ||
|
|
0273e58783 | ||
|
|
450c8dbf22 | ||
|
|
94d87285dc | ||
|
|
3e88a24753 | ||
|
|
1205908233 | ||
|
|
3a7a068196 | ||
|
|
845ecfe742 | ||
|
|
53355aaad3 | ||
|
|
7cd0e25538 | ||
|
|
2f15178ff6 | ||
|
|
a4b13be0d1 | ||
|
|
23ae4fb790 | ||
|
|
cff036d08b | ||
|
|
7826cc0b03 | ||
|
|
2bfa28a311 | ||
|
|
780c5c80ae | ||
|
|
fcd00b3212 | ||
|
|
6a41d6e85a | ||
|
|
3733858145 | ||
|
|
95d8ee65a5 | ||
|
|
8e57697b71 | ||
|
|
c9c371b297 | ||
|
|
d4f794920e | ||
|
|
13b5ef36d7 | ||
|
|
83e0bac52a | ||
|
|
9943ae0fa5 | ||
|
|
4c95872826 | ||
|
|
4aef72572d | ||
|
|
126918be54 | ||
|
|
1dc4516efc | ||
|
|
9a9cfbd130 | ||
|
|
341c9ba64b | ||
|
|
f432734338 | ||
|
|
b7f5f848f2 | ||
|
|
d80cf6bf37 | ||
|
|
31bce2e644 | ||
|
|
faabd17fc6 | ||
|
|
4c4ed60cfb | ||
|
|
be1895a080 | ||
|
|
b81b6135f6 | ||
|
|
583ac7960b | ||
|
|
b749bb60fc | ||
|
|
2c6a298758 | ||
|
|
42544cc63b | ||
|
|
d2b81d221b | ||
|
|
618d8723d1 | ||
|
|
8058d3f728 | ||
|
|
0bc10acf02 | ||
|
|
e5866e8aa6 | ||
|
|
b4e907ae77 | ||
|
|
ff23248017 | ||
|
|
ac0d01b724 | ||
|
|
40adbc5e9e | ||
|
|
f36e0c2513 | ||
|
|
5be8c2cdcf | ||
|
|
e915549f6d | ||
|
|
30b3f3190b | ||
|
|
3f7390d104 | ||
|
|
005bfe799c | ||
|
|
c9f1715899 | ||
|
|
faf5eac806 | ||
|
|
9c5ab41b05 | ||
|
|
a8c8539e7a | ||
|
|
a3153f1c9f | ||
|
|
f23ab37a11 | ||
|
|
334da21a3b | ||
|
|
4a7c1f54d2 | ||
|
|
643b06ffa7 | ||
|
|
0f4a781df0 | ||
|
|
d6cc84aabd | ||
|
|
33ad0dce15 | ||
|
|
949c92f6d6 | ||
|
|
48098b5c06 | ||
|
|
afcfb0e341 | ||
|
|
a1364a621a | ||
|
|
4113252f18 | ||
|
|
386d11f51a | ||
|
|
39a506ad52 | ||
|
|
d9c266e3f1 | ||
|
|
f4092c0824 | ||
|
|
4fd20b1c5a | ||
|
|
0d5586b379 | ||
|
|
da77de0a08 | ||
|
|
dd34b155b4 | ||
|
|
26ce102113 | ||
|
|
5082181c49 | ||
|
|
0ee370303c | ||
|
|
720494d870 | ||
|
|
cfe1911723 | ||
|
|
b2318b1f9f | ||
|
|
560db37025 | ||
|
|
dd557f66a5 | ||
|
|
0603f179cc | ||
|
|
21fcaf621d | ||
|
|
794c8dd051 | ||
|
|
f020b571da | ||
|
|
071ea5854f | ||
|
|
bfec890632 | ||
|
|
3bb9d2efd6 | ||
|
|
e117b6f732 | ||
|
|
710026c8ac | ||
|
|
79c45af0d5 | ||
|
|
a75db94da5 | ||
|
|
468261906a | ||
|
|
3f1c9c989b | ||
|
|
3b40de1962 | ||
|
|
2dda1c82c5 | ||
|
|
4bc4d41728 | ||
|
|
c8c160d912 | ||
|
|
99354f7dbe | ||
|
|
279310f9a5 | ||
|
|
d0de79bffa | ||
|
|
fbd42726c0 | ||
|
|
dfe02fbe96 | ||
|
|
a8cffb9ac8 | ||
|
|
bdbf2fe583 | ||
|
|
36776cd615 | ||
|
|
1852d9291d | ||
|
|
0e5a0fdbe5 | ||
|
|
7e59c40091 | ||
|
|
53eba3f062 | ||
|
|
334347abcf | ||
|
|
e43e3c198a | ||
|
|
a8b8da4732 | ||
|
|
ea57f5655c | ||
|
|
68496bd1a1 | ||
|
|
097d4d5735 | ||
|
|
89224c8f88 | ||
|
|
22c0a219aa | ||
|
|
9eed42cea0 | ||
|
|
be24cbed2d | ||
|
|
aef3e0aead | ||
|
|
7a06a41502 | ||
|
|
03948d185d | ||
|
|
40d39d6268 | ||
|
|
66f1506429 | ||
|
|
f19f148297 | ||
|
|
79c6eb5503 | ||
|
|
1204bed80a | ||
|
|
dc91b1f7d6 | ||
|
|
66dc2b33de | ||
|
|
ffeb7d0ecd | ||
|
|
c97c337c79 | ||
|
|
aba92857cb | ||
|
|
5918c81dbb | ||
|
|
0f7deeeac1 | ||
|
|
8c338675d2 | ||
|
|
b126c761cd | ||
|
|
d02513bb70 | ||
|
|
68e8d69d04 | ||
|
|
4eb680d675 | ||
|
|
068dbfffd8 | ||
|
|
d9ec2efa4b | ||
|
|
1c90e9dd7d | ||
|
|
811942d45e | ||
|
|
dbde239a25 | ||
|
|
ab3ba3e2ca | ||
|
|
79e77b5a10 | ||
|
|
c3395133c9 | ||
|
|
b1d073cdeb | ||
|
|
2c115cd074 | ||
|
|
c99bd27e4d | ||
|
|
25d723b373 | ||
|
|
819d9fd977 | ||
|
|
0cfceab151 | ||
|
|
65a0e056c7 | ||
|
|
b27a215c7f | ||
|
|
e9783d050b | ||
|
|
e1be1ead86 | ||
|
|
b129bed69f | ||
|
|
265ad50ce4 | ||
|
|
3e2570601f | ||
|
|
05513e67d2 | ||
|
|
34e4164e2f | ||
|
|
ad80e074de | ||
|
|
e4123b4ad9 | ||
|
|
ee6325e3c2 | ||
|
|
a2fce031a2 | ||
|
|
2de30f8b82 | ||
|
|
f1dbc1d41c | ||
|
|
a96734f5be | ||
|
|
b83eee751f | ||
|
|
49451dba20 | ||
|
|
3830f36c0b | ||
|
|
9f7eeb0510 | ||
|
|
58396ea5ce | ||
|
|
b1bb470b0a | ||
|
|
0b6f5581f0 | ||
|
|
c34f762507 | ||
|
|
9eac63c021 | ||
|
|
1fec7d5558 | ||
|
|
5eb084fd3b | ||
|
|
a99db36578 | ||
|
|
bec8a2e7d1 | ||
|
|
38ced8cb09 | ||
|
|
8eff3f5616 | ||
|
|
6f8332bad1 | ||
|
|
01e0c0c21f | ||
|
|
7a1eecc815 | ||
|
|
bec91863e2 | ||
|
|
341b763088 | ||
|
|
e0721493e9 | ||
|
|
2d467f7fa5 | ||
|
|
23ecbfcb3a | ||
|
|
f8ad782991 | ||
|
|
c2684a8149 | ||
|
|
4e7c6b0aea | ||
|
|
c568f5b33c | ||
|
|
e85d4fca5d | ||
|
|
d9601f3136 | ||
|
|
3ee5deb9f3 | ||
|
|
8bc92e88df | ||
|
|
ebe06c9c38 | ||
|
|
b3f32ffc59 | ||
|
|
ecc50790ed | ||
|
|
a09c7b72c7 | ||
|
|
7d767cf0c9 | ||
|
|
b5fc8e7fc1 | ||
|
|
91ec0dce37 | ||
|
|
1aa2786ba0 | ||
|
|
3265fafd76 | ||
|
|
17fd8ee504 | ||
|
|
05adb06aeb | ||
|
|
dacf6377ae | ||
|
|
fa76c5db8d | ||
|
|
17f6d6e8c1 | ||
|
|
347d84526b | ||
|
|
172327613f | ||
|
|
3e1ee7f330 | ||
|
|
22b5888671 | ||
|
|
41edae9719 | ||
|
|
6446a3c4de | ||
|
|
9c4939e051 | ||
|
|
9f9f760ede | ||
|
|
488cb99d4c | ||
|
|
4167ecafd2 | ||
|
|
6ca41ddf80 | ||
|
|
734f83470c | ||
|
|
0f8f7aeb14 | ||
|
|
3b653a95a0 | ||
|
|
06eb389b21 | ||
|
|
17d2d6f959 | ||
|
|
20e065a371 | ||
|
|
57cf826e2c | ||
|
|
dbe8d3a68e | ||
|
|
5a174b2236 | ||
|
|
b8158f3b53 | ||
|
|
e768b8cfea | ||
|
|
c593546575 | ||
|
|
578f93fb90 | ||
|
|
24a90036b7 | ||
|
|
488c0f1828 | ||
|
|
f4717d0a3d | ||
|
|
913c78f45d | ||
|
|
4e90c05472 | ||
|
|
d31d9f2638 | ||
|
|
0cf56d5a9a | ||
|
|
80112e7b35 | ||
|
|
b2f1fac133 | ||
|
|
cd57877175 | ||
|
|
30f515d473 | ||
|
|
199113341f | ||
|
|
64aef69d74 | ||
|
|
2073755498 | ||
|
|
f72b5c1028 | ||
|
|
561b24f6fd | ||
|
|
d41221bd90 | ||
|
|
132c6543b2 | ||
|
|
7152344fe1 | ||
|
|
a04092c99c | ||
|
|
c273fd4d63 | ||
|
|
e06dd9c69f | ||
|
|
463b20013d | ||
|
|
204fbec648 | ||
|
|
d65706aa9c | ||
|
|
f2a1597ecc | ||
|
|
9a2f0bee29 | ||
|
|
3f8833eaf1 | ||
|
|
c3a1e7c6e9 | ||
|
|
f5aec137bd | ||
|
|
20960dbd47 | ||
|
|
e45fd6b4d3 | ||
|
|
8eacba972e | ||
|
|
51732a5adb | ||
|
|
f51873d877 | ||
|
|
d738fa54ad | ||
|
|
ec8ccc94aa | ||
|
|
cb8dca747b | ||
|
|
b16ebbbf7a | ||
|
|
90ccb34916 | ||
|
|
724af8f757 | ||
|
|
125fa8647a | ||
|
|
bf47237d8f | ||
|
|
294b9fc941 | ||
|
|
699c1ab58c | ||
|
|
150ee14de6 | ||
|
|
b207f7a53f | ||
|
|
096698912e | ||
|
|
a5ec1be7d1 | ||
|
|
f9f884a7f3 | ||
|
|
31d59c1e21 | ||
|
|
7663044e9f | ||
|
|
7ceb68d835 | ||
|
|
ac2635a363 | ||
|
|
2496e6e738 | ||
|
|
b4b36c6f22 | ||
|
|
0171ea837f | ||
|
|
79a343c2d9 | ||
|
|
dd5ed48c7e | ||
|
|
e7169cc70d | ||
|
|
c65ee4a424 | ||
|
|
feee162578 | ||
|
|
d1cab4b7f5 | ||
|
|
d2acf314f5 | ||
|
|
b803984773 | ||
|
|
d2582f4fdf | ||
|
|
dfd18ebe24 | ||
|
|
94082bc6a5 | ||
|
|
5c3c72c37e | ||
|
|
d730e068b0 | ||
|
|
b2f8c38842 | ||
|
|
71b2e36429 | ||
|
|
e598c64241 | ||
|
|
2b2ec2c655 | ||
|
|
381d757525 | ||
|
|
d54c59cf74 | ||
|
|
1f481fba4e | ||
|
|
69cd88e4a5 | ||
|
|
b140a9d7de | ||
|
|
b1b530edf2 | ||
|
|
ab63316f83 | ||
|
|
35df8e5d9e | ||
|
|
ea3c82733c | ||
|
|
60f75fe2db | ||
|
|
9214095a64 | ||
|
|
676c43ebab | ||
|
|
e65af8c1e4 | ||
|
|
2321455723 | ||
|
|
9260235224 | ||
|
|
56801c0a08 | ||
|
|
aa738cc086 | ||
|
|
900b0f3eb2 | ||
|
|
b5a64e2c3e | ||
|
|
4163d9e474 | ||
|
|
d769dc2b94 | ||
|
|
c9fc52ec74 | ||
|
|
fe72568d3b | ||
|
|
c5c379f38a | ||
|
|
2050889590 | ||
|
|
6164e2d8eb | ||
|
|
30c175ef29 | ||
|
|
f6fed72b64 | ||
|
|
7596ff2eda | ||
|
|
142976f012 | ||
|
|
ab5c97f75a | ||
|
|
aea3de982a | ||
|
|
83aff6f478 | ||
|
|
6cb7154bf4 | ||
|
|
3aa38d35d7 | ||
|
|
870a76c570 | ||
|
|
206a64eff6 | ||
|
|
6b97839617 | ||
|
|
456d979aa6 | ||
|
|
ea5e0d337c | ||
|
|
9651317695 | ||
|
|
a4cc2076d7 | ||
|
|
db820d500d | ||
|
|
722192127c | ||
|
|
36e23d6432 | ||
|
|
8cfb014f60 | ||
|
|
b4a572c8ae | ||
|
|
531e92e2da | ||
|
|
53a857b706 | ||
|
|
4f5473f8a2 | ||
|
|
1b617a4adc | ||
|
|
7741a43d42 | ||
|
|
776411f882 | ||
|
|
ae4cecc621 | ||
|
|
5be98a46e3 | ||
|
|
1907ef0c99 | ||
|
|
bd99b25848 | ||
|
|
616401ebba | ||
|
|
d0fb6acccd | ||
|
|
12a7b3c73c | ||
|
|
75b28c46af | ||
|
|
93dccf62df | ||
|
|
ec499eecd5 | ||
|
|
7ccd19e21d | ||
|
|
a6459d3641 | ||
|
|
9b26378fdd | ||
|
|
6b8e84332d | ||
|
|
6d56bb8afd | ||
|
|
be9e873277 | ||
|
|
10feeeeb6b | ||
|
|
518af9dc0a | ||
|
|
093fc811eb | ||
|
|
2a8b27033f | ||
|
|
62bddd7c69 | ||
|
|
113f91b3c5 | ||
|
|
d40ad2de89 | ||
|
|
3b7733018c | ||
|
|
e319864669 | ||
|
|
7251813634 | ||
|
|
e024015d5e | ||
|
|
3f5e6d72d6 | ||
|
|
9fd43a30f9 | ||
|
|
0707a0e05f | ||
|
|
f550d847c4 | ||
|
|
1e9a0036e7 | ||
|
|
16cf0a3058 | ||
|
|
0fa19a281c | ||
|
|
9c53f485e6 | ||
|
|
dc131f77d4 | ||
|
|
712601b8c0 | ||
|
|
ff7775b344 | ||
|
|
0512fa6208 | ||
|
|
27ab2b8e30 | ||
|
|
9fa7c9c20a | ||
|
|
6bd0250ef8 | ||
|
|
0d736bcb58 | ||
|
|
c1129604ba | ||
|
|
693f6cbfe7 | ||
|
|
7f397a4da8 | ||
|
|
52ba5c5bb7 | ||
|
|
ce24942a03 | ||
|
|
719afba05a | ||
|
|
c99dd2ba87 | ||
|
|
a59cc94afc | ||
|
|
336cadbc12 | ||
|
|
a946dc69c1 | ||
|
|
e2e95df057 | ||
|
|
e095369e1a | ||
|
|
1c938a5998 | ||
|
|
a45128807e | ||
|
|
d54e52b1a8 | ||
|
|
5743729d11 | ||
|
|
11d8466db1 | ||
|
|
c3360d6c48 | ||
|
|
37158fdb89 | ||
|
|
ae73051797 | ||
|
|
62db3d09ea | ||
|
|
f82aa0adde | ||
|
|
5e5b6cdc42 | ||
|
|
351306eb03 | ||
|
|
e4fffa52d4 | ||
|
|
d622ff4a78 | ||
|
|
b6d4fd16c9 | ||
|
|
a548d695f2 | ||
|
|
499f318192 | ||
|
|
42ecf98344 | ||
|
|
6f08e1e4ff | ||
|
|
9524eb7e37 | ||
|
|
84e478f8fe | ||
|
|
0cc77f99ac | ||
|
|
622049dfad | ||
|
|
65bcc58261 | ||
|
|
9749a2b9b7 | ||
|
|
7b365194ba | ||
|
|
6e5c2730f1 | ||
|
|
8d045f0c96 | ||
|
|
c370358bd1 | ||
|
|
03e8d921d3 | ||
|
|
6cf624c18d | ||
|
|
41acdce165 | ||
|
|
c607444c23 | ||
|
|
940198b9a0 | ||
|
|
9c3cf705c6 | ||
|
|
6027725fae | ||
|
|
054aa52bc8 | ||
|
|
f4a562bc3c | ||
|
|
de8bf33ad9 | ||
|
|
159eaf7899 | ||
|
|
1bc045eb18 | ||
|
|
0f934e48bc | ||
|
|
3ecd29d0b5 | ||
|
|
42498842b5 | ||
|
|
ed4fbf093d | ||
|
|
96b19027ec | ||
|
|
cdb8a1e98c | ||
|
|
8cd26c9380 | ||
|
|
0863f0d564 | ||
|
|
63a2f7b7a5 | ||
|
|
9b562276f3 | ||
|
|
a17e01793e | ||
|
|
7fb061ea76 | ||
|
|
91d864bded | ||
|
|
339d7d16c7 | ||
|
|
8e5762c3a3 | ||
|
|
50a811720f | ||
|
|
c2e1c4c1e1 | ||
|
|
e7b11a2d82 | ||
|
|
61d3582357 | ||
|
|
9e66219690 | ||
|
|
d049b8846c | ||
|
|
bdd760f343 | ||
|
|
1ee88618e8 | ||
|
|
e399474b4e | ||
|
|
e2e55b6e08 | ||
|
|
d0d2bad7f4 | ||
|
|
92bee549a1 | ||
|
|
02121f66de | ||
|
|
115eb6f511 | ||
|
|
d208da577f | ||
|
|
62665899c6 | ||
|
|
7640839f92 | ||
|
|
cda837247a | ||
|
|
8e2ba0d963 | ||
|
|
f4958de885 | ||
|
|
3917e3469d | ||
|
|
5ce79b1761 | ||
|
|
7a621e0cd7 | ||
|
|
34a1c965be | ||
|
|
17b42ae051 | ||
|
|
55ae00af27 | ||
|
|
7e200b1ec7 | ||
|
|
f65a3be231 | ||
|
|
20bec7e26c | ||
|
|
b367955e56 | ||
|
|
84c3ef144d | ||
|
|
ab2c8e3826 | ||
|
|
f2c6ff7904 | ||
|
|
06ee4d08d6 | ||
|
|
e96679c820 | ||
|
|
105e4652c6 | ||
|
|
e5b8f149bf | ||
|
|
334cb23691 | ||
|
|
52d9807648 | ||
|
|
b44a2075a8 | ||
|
|
b60952d684 | ||
|
|
5db362e812 | ||
|
|
0b74168343 | ||
|
|
58e2d7be61 | ||
|
|
728c167660 | ||
|
|
982f274425 | ||
|
|
557c7a2877 | ||
|
|
dbba7af4b5 | ||
|
|
82eefca110 | ||
|
|
778b30b1cf | ||
|
|
2d4616da01 | ||
|
|
37a12326dc | ||
|
|
5516b3284c |
No files matched your search
@@ -21,44 +21,294 @@ Clipper/content_scripts/Readability.js
|
||||
Clipper/dist
|
||||
Clipper/icons
|
||||
Clipper/popup/build
|
||||
Clipper/popup/config/webpack.config.js
|
||||
Clipper/popup/config/webpack_config_at_eject_time.js
|
||||
Clipper/popup/node_modules
|
||||
Clipper/popup/scripts/build.js
|
||||
docs/
|
||||
ElectronClient/dist
|
||||
ElectronClient/lib
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/plugins/lists.js
|
||||
ElectronClient/lib/vendor/sjcl-rn.js
|
||||
ElectronClient/lib/vendor/sjcl.js
|
||||
ElectronClient/locales
|
||||
ElectronClient/node_modules
|
||||
ElectronClient/packageInfo.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/supportedLocales.js
|
||||
highlight.pack.js
|
||||
Modules/TinyMCE/JoplinLists/
|
||||
node_modules/
|
||||
ReactNativeClient/android
|
||||
ReactNativeClient/ios
|
||||
ReactNativeClient/lib/joplin-renderer/assets/
|
||||
ReactNativeClient/lib/joplin-renderer/vendor/fountain.min.js
|
||||
ReactNativeClient/lib/rnInjectedJs/
|
||||
ReactNativeClient/lib/vendor/
|
||||
ReactNativeClient/lib/welcomeAssets.js
|
||||
ReactNativeClient/locales
|
||||
ReactNativeClient/node_modules
|
||||
ReactNativeClient/pluginAssets/
|
||||
readme/
|
||||
Tools/node_modules
|
||||
Tools/PortableAppsLauncher
|
||||
Server/.git/
|
||||
Server/.github/
|
||||
Server/docs/
|
||||
Server/dist/
|
||||
Server/bin/
|
||||
Server/dist/
|
||||
Server/docs/
|
||||
Server/node_modules/
|
||||
ElectronClient/packageInfo.js
|
||||
ReactNativeClient/pluginAssets/
|
||||
ReactNativeClient/lib/joplin-renderer/vendor/fountain.min.js
|
||||
ReactNativeClient/lib/joplin-renderer/assets/
|
||||
ReactNativeClient/lib/rnInjectedJs/
|
||||
Tools/node_modules
|
||||
Tools/PortableAppsLauncher
|
||||
Modules/TinyMCE/IconPack/postinstall.js
|
||||
Modules/TinyMCE/langs/
|
||||
CliClient/build/
|
||||
|
||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||
CliClient/app/LinkSelector.js
|
||||
CliClient/app/services/plugins/PluginRunner.js
|
||||
CliClient/tests/models_Setting.js
|
||||
CliClient/tests/services_CommandService.js
|
||||
CliClient/tests/services_InteropService.js
|
||||
CliClient/tests/services_PluginService.js
|
||||
CliClient/tests/services/plugins/sandboxProxy.js
|
||||
CliClient/tests/synchronizer_LockHandler.js
|
||||
CliClient/tests/synchronizer_MigrationHandler.js
|
||||
ElectronClient/app.js
|
||||
ElectronClient/bridge.js
|
||||
ElectronClient/commands/copyDevCommand.js
|
||||
ElectronClient/commands/focusElement.js
|
||||
ElectronClient/commands/startExternalEditing.js
|
||||
ElectronClient/commands/stopExternalEditing.js
|
||||
ElectronClient/ElectronAppWrapper.js
|
||||
ElectronClient/global.d.js
|
||||
ElectronClient/gui/Button/Button.js
|
||||
ElectronClient/gui/ConfigScreen/ButtonBar.js
|
||||
ElectronClient/gui/ConfigScreen/ConfigScreen.js
|
||||
ElectronClient/gui/ConfigScreen/SideBar.js
|
||||
ElectronClient/gui/DropboxLoginScreen.js
|
||||
ElectronClient/gui/ErrorBoundary.js
|
||||
ElectronClient/gui/KeymapConfig/KeymapConfigScreen.js
|
||||
ElectronClient/gui/KeymapConfig/ShortcutRecorder.js
|
||||
ElectronClient/gui/KeymapConfig/styles/index.js
|
||||
ElectronClient/gui/KeymapConfig/utils/getLabel.js
|
||||
ElectronClient/gui/KeymapConfig/utils/useCommandStatus.js
|
||||
ElectronClient/gui/KeymapConfig/utils/useKeymap.js
|
||||
ElectronClient/gui/MainScreen/commands/editAlarm.js
|
||||
ElectronClient/gui/MainScreen/commands/exportPdf.js
|
||||
ElectronClient/gui/MainScreen/commands/hideModalMessage.js
|
||||
ElectronClient/gui/MainScreen/commands/moveToFolder.js
|
||||
ElectronClient/gui/MainScreen/commands/newFolder.js
|
||||
ElectronClient/gui/MainScreen/commands/newNote.js
|
||||
ElectronClient/gui/MainScreen/commands/newTodo.js
|
||||
ElectronClient/gui/MainScreen/commands/print.js
|
||||
ElectronClient/gui/MainScreen/commands/renameFolder.js
|
||||
ElectronClient/gui/MainScreen/commands/renameTag.js
|
||||
ElectronClient/gui/MainScreen/commands/search.js
|
||||
ElectronClient/gui/MainScreen/commands/selectTemplate.js
|
||||
ElectronClient/gui/MainScreen/commands/setTags.js
|
||||
ElectronClient/gui/MainScreen/commands/showModalMessage.js
|
||||
ElectronClient/gui/MainScreen/commands/showNoteContentProperties.js
|
||||
ElectronClient/gui/MainScreen/commands/showNoteProperties.js
|
||||
ElectronClient/gui/MainScreen/commands/showShareNoteDialog.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleEditors.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleNoteList.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleSidebar.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleVisiblePanes.js
|
||||
ElectronClient/gui/MainScreen/MainScreen.js
|
||||
ElectronClient/gui/MenuBar.js
|
||||
ElectronClient/gui/MultiNoteActions.js
|
||||
ElectronClient/gui/NoteContentPropertiesDialog.js
|
||||
ElectronClient/gui/NoteEditor/commands/editorCommandDeclarations.js
|
||||
ElectronClient/gui/NoteEditor/commands/focusElementNoteBody.js
|
||||
ElectronClient/gui/NoteEditor/commands/focusElementNoteTitle.js
|
||||
ElectronClient/gui/NoteEditor/commands/showLocalSearch.js
|
||||
ElectronClient/gui/NoteEditor/commands/showRevisions.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/Editor.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useCursorUtils.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearch.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useKeymap.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useLineSorting.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||
ElectronClient/gui/NoteEditor/NoteEditor.js
|
||||
ElectronClient/gui/NoteEditor/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
||||
ElectronClient/gui/NoteEditor/utils/index.js
|
||||
ElectronClient/gui/NoteEditor/utils/resourceHandling.js
|
||||
ElectronClient/gui/NoteEditor/utils/types.js
|
||||
ElectronClient/gui/NoteEditor/utils/useDropHandler.js
|
||||
ElectronClient/gui/NoteEditor/utils/useFolder.js
|
||||
ElectronClient/gui/NoteEditor/utils/useFormNote.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMarkupToHtml.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMessageHandler.js
|
||||
ElectronClient/gui/NoteEditor/utils/useNoteSearchBar.js
|
||||
ElectronClient/gui/NoteEditor/utils/usePluginServiceRegistration.js
|
||||
ElectronClient/gui/NoteEditor/utils/useSearchMarkers.js
|
||||
ElectronClient/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||
ElectronClient/gui/NoteList/commands/focusElementNoteList.js
|
||||
ElectronClient/gui/NoteList/NoteList.js
|
||||
ElectronClient/gui/NoteListControls/commands/focusSearch.js
|
||||
ElectronClient/gui/NoteListControls/NoteListControls.js
|
||||
ElectronClient/gui/NoteListItem.js
|
||||
ElectronClient/gui/NoteTextViewer.js
|
||||
ElectronClient/gui/NoteToolbar/NoteToolbar.js
|
||||
ElectronClient/gui/OneDriveLoginScreen.js
|
||||
ElectronClient/gui/ResizableLayout/hooks/useLayoutItemSizes.js
|
||||
ElectronClient/gui/ResizableLayout/hooks/useWindowResizeEvent.js
|
||||
ElectronClient/gui/ResizableLayout/ResizableLayout.js
|
||||
ElectronClient/gui/ResourceScreen.js
|
||||
ElectronClient/gui/Root_UpgradeSyncTarget.js
|
||||
ElectronClient/gui/Root.js
|
||||
ElectronClient/gui/SearchBar/hooks/useSearch.js
|
||||
ElectronClient/gui/SearchBar/SearchBar.js
|
||||
ElectronClient/gui/SearchBar/styles/index.js
|
||||
ElectronClient/gui/ShareNoteDialog.js
|
||||
ElectronClient/gui/SideBar/commands/focusElementSideBar.js
|
||||
ElectronClient/gui/SideBar/SideBar.js
|
||||
ElectronClient/gui/SideBar/styles/index.js
|
||||
ElectronClient/gui/StatusScreen/StatusScreen.js
|
||||
ElectronClient/gui/style/StyledInput.js
|
||||
ElectronClient/gui/style/StyledTextInput.js
|
||||
ElectronClient/gui/ToggleEditorsButton/styles/index.js
|
||||
ElectronClient/gui/ToggleEditorsButton/ToggleEditorsButton.js
|
||||
ElectronClient/gui/ToolbarBase.js
|
||||
ElectronClient/gui/ToolbarButton/styles/index.js
|
||||
ElectronClient/gui/ToolbarButton/ToolbarButton.js
|
||||
ElectronClient/gui/utils/NoteListUtils.js
|
||||
ElectronClient/InteropServiceHelper.js
|
||||
ElectronClient/services/bridge.js
|
||||
ElectronClient/services/plugins/hooks/useThemeCss.js
|
||||
ElectronClient/services/plugins/hooks/useViewIsReady.js
|
||||
ElectronClient/services/plugins/PlatformImplementation.js
|
||||
ElectronClient/services/plugins/PluginRunner.js
|
||||
ElectronClient/services/plugins/UserWebview.js
|
||||
ElectronClient/services/plugins/UserWebviewDialog.js
|
||||
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
||||
ReactNativeClient/lib/AsyncActionQueue.js
|
||||
ReactNativeClient/lib/BaseApplication.js
|
||||
ReactNativeClient/lib/checkPermissions.js
|
||||
ReactNativeClient/lib/commands/historyBackward.js
|
||||
ReactNativeClient/lib/commands/historyForward.js
|
||||
ReactNativeClient/lib/commands/synchronize.js
|
||||
ReactNativeClient/lib/components/screens/UpgradeSyncTargetScreen.js
|
||||
ReactNativeClient/lib/errorUtils.js
|
||||
ReactNativeClient/lib/eventManager.js
|
||||
ReactNativeClient/lib/hooks/useEffectDebugger.js
|
||||
ReactNativeClient/lib/hooks/useImperativeHandlerDebugger.js
|
||||
ReactNativeClient/lib/hooks/usePrevious.js
|
||||
ReactNativeClient/lib/hooks/usePropsDebugger.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/checkbox.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/fence.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/mermaid.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/sanitize_html.js
|
||||
ReactNativeClient/lib/JoplinServerApi.js
|
||||
ReactNativeClient/lib/locale.js
|
||||
ReactNativeClient/lib/Logger.js
|
||||
ReactNativeClient/lib/markdownUtils.js
|
||||
ReactNativeClient/lib/models/Alarm.js
|
||||
ReactNativeClient/lib/models/Setting.js
|
||||
ReactNativeClient/lib/ntpDate.js
|
||||
ReactNativeClient/lib/reducer.js
|
||||
ReactNativeClient/lib/services/AlarmService.js
|
||||
ReactNativeClient/lib/services/AlarmServiceDriver.android.js
|
||||
ReactNativeClient/lib/services/AlarmServiceDriver.ios.js
|
||||
ReactNativeClient/lib/services/AlarmServiceDriverNode.js
|
||||
ReactNativeClient/lib/services/BaseService.js
|
||||
ReactNativeClient/lib/services/BooleanExpression.js
|
||||
ReactNativeClient/lib/services/commands/MenuUtils.js
|
||||
ReactNativeClient/lib/services/commands/propsHaveChanged.js
|
||||
ReactNativeClient/lib/services/commands/ToolbarButtonUtils.js
|
||||
ReactNativeClient/lib/services/CommandService.js
|
||||
ReactNativeClient/lib/services/contextkey/contextkey.js
|
||||
ReactNativeClient/lib/services/debug/populateDatabase.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Base.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Custom.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Html.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Jex.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Md.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Raw.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Base.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Custom.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_EnexToHtml.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_EnexToMd.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Jex.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Md.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Raw.js
|
||||
ReactNativeClient/lib/services/interop/InteropService.js
|
||||
ReactNativeClient/lib/services/interop/types.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainService.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.dummy.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.mobile.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.node.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriverBase.js
|
||||
ReactNativeClient/lib/services/KeymapService.js
|
||||
ReactNativeClient/lib/services/plugins/api/Global.js
|
||||
ReactNativeClient/lib/services/plugins/api/Joplin.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinCommands.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinData.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinFilters.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinInterop.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinPlugins.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinSettings.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViews.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsDialogs.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsMenuItems.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsPanels.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsToolbarButtons.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinWorkspace.js
|
||||
ReactNativeClient/lib/services/plugins/api/types.js
|
||||
ReactNativeClient/lib/services/plugins/BasePluginRunner.js
|
||||
ReactNativeClient/lib/services/plugins/MenuItemController.js
|
||||
ReactNativeClient/lib/services/plugins/Plugin.js
|
||||
ReactNativeClient/lib/services/plugins/PluginService.js
|
||||
ReactNativeClient/lib/services/plugins/reducer.js
|
||||
ReactNativeClient/lib/services/plugins/sandboxProxy.js
|
||||
ReactNativeClient/lib/services/plugins/ToolbarButtonController.js
|
||||
ReactNativeClient/lib/services/plugins/utils/createViewHandle.js
|
||||
ReactNativeClient/lib/services/plugins/utils/executeSandboxCall.js
|
||||
ReactNativeClient/lib/services/plugins/utils/manifestFromObject.js
|
||||
ReactNativeClient/lib/services/plugins/utils/mapEventHandlersToIds.js
|
||||
ReactNativeClient/lib/services/plugins/utils/types.js
|
||||
ReactNativeClient/lib/services/plugins/ViewController.js
|
||||
ReactNativeClient/lib/services/plugins/WebviewController.js
|
||||
ReactNativeClient/lib/services/ResourceEditWatcher/index.js
|
||||
ReactNativeClient/lib/services/ResourceEditWatcher/reducer.js
|
||||
ReactNativeClient/lib/services/rest/actionApi.desktop.js
|
||||
ReactNativeClient/lib/services/rest/Api.js
|
||||
ReactNativeClient/lib/services/rest/errors.js
|
||||
ReactNativeClient/lib/services/searchengine/filterParser.js
|
||||
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
||||
ReactNativeClient/lib/services/SettingUtils.js
|
||||
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
||||
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
||||
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
||||
ReactNativeClient/lib/services/synchronizer/migrations/1.js
|
||||
ReactNativeClient/lib/services/synchronizer/migrations/2.js
|
||||
ReactNativeClient/lib/services/synchronizer/utils/types.js
|
||||
ReactNativeClient/lib/services/UndoRedoService.js
|
||||
ReactNativeClient/lib/ShareExtension.js
|
||||
ReactNativeClient/lib/shareHandler.js
|
||||
ReactNativeClient/lib/shim.js
|
||||
ReactNativeClient/lib/Synchronizer.js
|
||||
ReactNativeClient/lib/theme.js
|
||||
ReactNativeClient/lib/themes/aritimDark.js
|
||||
ReactNativeClient/lib/themes/dark.js
|
||||
ReactNativeClient/lib/themes/dracula.js
|
||||
ReactNativeClient/lib/themes/light.js
|
||||
ReactNativeClient/lib/themes/nord.js
|
||||
ReactNativeClient/lib/themes/oledDark.js
|
||||
ReactNativeClient/lib/themes/solarizedDark.js
|
||||
ReactNativeClient/lib/themes/solarizedLight.js
|
||||
ReactNativeClient/lib/themes/type.js
|
||||
ReactNativeClient/lib/uuid.js
|
||||
ReactNativeClient/lib/versionInfo.js
|
||||
ReactNativeClient/PluginAssetsLoader.js
|
||||
ReactNativeClient/setUpQuickActions.js
|
||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||
@@ -4,9 +4,9 @@ module.exports = {
|
||||
'es6': true,
|
||||
'node': true,
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
'parser': '@typescript-eslint/parser',
|
||||
'extends': ['eslint:recommended'],
|
||||
"settings": {
|
||||
'settings': {
|
||||
'react': {
|
||||
'version': '16.12',
|
||||
},
|
||||
@@ -32,69 +32,105 @@ module.exports = {
|
||||
'browserSupportsPromises_': true,
|
||||
'chrome': 'readonly',
|
||||
'browser': 'readonly',
|
||||
|
||||
'tinymce': 'readonly',
|
||||
},
|
||||
'parserOptions': {
|
||||
'ecmaVersion': 2018,
|
||||
"ecmaFeatures": {
|
||||
"jsx": true,
|
||||
},
|
||||
"sourceType": "module",
|
||||
'ecmaFeatures': {
|
||||
'jsx': true,
|
||||
},
|
||||
'sourceType': 'module',
|
||||
},
|
||||
'rules': {
|
||||
// -------------------------------
|
||||
// Code correctness
|
||||
// -------------------------------
|
||||
"react/jsx-uses-react": "error",
|
||||
"react/jsx-uses-vars": "error",
|
||||
"no-unused-vars": "error",
|
||||
"no-constant-condition": 0,
|
||||
"no-prototype-builtins": 0,
|
||||
'react/jsx-uses-react': 'error',
|
||||
'react/jsx-uses-vars': 'error',
|
||||
'no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
|
||||
'@typescript-eslint/no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
|
||||
'@typescript-eslint/explicit-member-accessibility': 'off',
|
||||
'no-constant-condition': 0,
|
||||
'no-prototype-builtins': 0,
|
||||
// This error is always a false positive so far since it detects
|
||||
// possible race conditions in contexts where we know it cannot happen.
|
||||
"require-atomic-updates": 0,
|
||||
'require-atomic-updates': 0,
|
||||
'prefer-const': ['error'],
|
||||
'no-var': ['error'],
|
||||
'no-new-func': ['error'],
|
||||
'import/prefer-default-export': ['error'],
|
||||
'import/first': ['error'],
|
||||
'no-array-constructor': ['error'],
|
||||
'radix': ['error'],
|
||||
|
||||
// Warn only for now because fixing everything would take too much
|
||||
// refactoring, but new code should try to stick to it.
|
||||
'complexity': ['warn', { max: 10 }],
|
||||
|
||||
// Checks rules of Hooks
|
||||
"react-hooks/rules-of-hooks": "error",
|
||||
'react-hooks/rules-of-hooks': 'error',
|
||||
// Checks effect dependencies
|
||||
"react-hooks/exhaustive-deps": "error",
|
||||
// Disable because of this: https://github.com/facebook/react/issues/16265
|
||||
// "react-hooks/exhaustive-deps": "warn",
|
||||
|
||||
// -------------------------------
|
||||
// Formatting
|
||||
// -------------------------------
|
||||
"space-in-parens": ["error", "never"],
|
||||
"semi": ["error", "always"],
|
||||
"eol-last": ["error", "always"],
|
||||
"quotes": ["error", "single"],
|
||||
"indent": ["error", "tab"],
|
||||
"comma-dangle": ["error", "always-multiline"],
|
||||
"no-trailing-spaces": "error",
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"prefer-template": ["error"],
|
||||
"template-curly-spacing": ["error", "never"],
|
||||
"object-curly-spacing": ["error", "always"],
|
||||
"array-bracket-spacing": ["error", "never"],
|
||||
"key-spacing": ["error", {
|
||||
"beforeColon": false,
|
||||
"afterColon": true,
|
||||
"mode": "strict"
|
||||
'space-in-parens': ['error', 'never'],
|
||||
'space-infix-ops': ['error'],
|
||||
'curly': ['error', 'multi-line', 'consistent'],
|
||||
'semi': ['error', 'always'],
|
||||
'eol-last': ['error', 'always'],
|
||||
'quotes': ['error', 'single'],
|
||||
'indent': ['error', 'tab'],
|
||||
'comma-dangle': ['error', {
|
||||
'arrays': 'always-multiline',
|
||||
'objects': 'always-multiline',
|
||||
'imports': 'always-multiline',
|
||||
'exports': 'always-multiline',
|
||||
'functions': 'never',
|
||||
}],
|
||||
"block-spacing": ["error"],
|
||||
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
|
||||
"no-spaced-func": ["error"],
|
||||
"func-call-spacing": ["error"],
|
||||
"space-before-function-paren": ["error", {
|
||||
"anonymous": "never",
|
||||
"named": "never",
|
||||
"asyncArrow": "always"
|
||||
'no-trailing-spaces': 'error',
|
||||
'linebreak-style': ['error', 'unix'],
|
||||
'prefer-template': ['error'],
|
||||
'template-curly-spacing': ['error', 'never'],
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
'array-bracket-spacing': ['error', 'never'],
|
||||
'key-spacing': ['error', {
|
||||
'beforeColon': false,
|
||||
'afterColon': true,
|
||||
'mode': 'strict',
|
||||
}],
|
||||
"multiline-comment-style": ["error", "separate-lines"],
|
||||
"space-before-blocks": "error",
|
||||
"spaced-comment": ["error", "always"],
|
||||
"keyword-spacing": ["error", { "before": true, "after": true }]
|
||||
'block-spacing': ['error'],
|
||||
'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
|
||||
'no-spaced-func': ['error'],
|
||||
'func-call-spacing': ['error'],
|
||||
'space-before-function-paren': ['error', {
|
||||
'anonymous': 'never',
|
||||
'named': 'never',
|
||||
'asyncArrow': 'always',
|
||||
}],
|
||||
'multiline-comment-style': ['error', 'separate-lines'],
|
||||
'space-before-blocks': 'error',
|
||||
'spaced-comment': ['error', 'always'],
|
||||
'keyword-spacing': ['error', { 'before': true, 'after': true }],
|
||||
},
|
||||
"plugins": [
|
||||
"react",
|
||||
"@typescript-eslint",
|
||||
"react-hooks"
|
||||
'plugins': [
|
||||
'react',
|
||||
'@typescript-eslint',
|
||||
'react-hooks',
|
||||
'import',
|
||||
],
|
||||
'overrides': [
|
||||
{
|
||||
// enable the rule specifically for TypeScript files
|
||||
'files': ['*.ts', '*.tsx'],
|
||||
'rules': {
|
||||
// Warn only because it would make it difficult to convert JS classes to TypeScript, unless we
|
||||
// make everything public which is not great. New code however should specify member accessibility.
|
||||
'@typescript-eslint/explicit-member-accessibility': ['warn'],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
name: "\U0001F914 Feature requests and support"
|
||||
about: 'For non-bug issues we recommend using the forum, where you''ll be more likely
|
||||
to get an answer: https://discourse.joplinapp.org/'
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
If this is a feature request or a support query, please note that you'll not get an answer here.
|
||||
|
||||
Instead we recommend using the forum where you'll are a lot more likely to get an answer: https://discourse.joplinapp.org/
|
||||
|
||||
The forum is also the right place to submit a feature request so that it can be discussed by other users.
|
||||
@@ -1,8 +1,9 @@
|
||||
---
|
||||
name: "🐛 Bug Report"
|
||||
name: "\U0001F41B Bug Report"
|
||||
about: Report a reproducible bug or regression in Joplin.
|
||||
title: ''
|
||||
labels: 'bug'
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
---
|
||||
name: "🤔 Questions and Help"
|
||||
about: The issue tracker is not for questions. Please ask questions on https://discourse.joplinapp.org/.
|
||||
title: ''
|
||||
labels: 'invalid'
|
||||
|
||||
---
|
||||
|
||||
⚠🚨⛔ The issue tracker is not for questions. ⛔🚨⚠
|
||||
|
||||
As it happens, support requests that are created as issues are likely to be closed. We want to make sure you are able to find the help you seek.
|
||||
|
||||
## Questions and Help
|
||||
|
||||
Please read the [documentation](https://joplinapp.org/) and [FAQ](https://joplinapp.org/faq/) first.
|
||||
|
||||
### https://discourse.joplinapp.org/
|
||||
|
||||
If you have still questions related to Joplin, please open a topic in the [forum](https://discourse.joplinapp.org/).
|
||||
You can use your GitHub credentials to login to the forum.
|
||||
|
||||
## Links
|
||||
|
||||
- Documentation: https://joplinapp.org
|
||||
- FAQ: https://joplinapp.org/faq/
|
||||
- Forum: https://discourse.joplinapp.org
|
||||
- How to enable end-to-end encryption: https://joplinapp.org/e2ee/
|
||||
- API documentation: https://joplinapp.org/api/
|
||||
- How to enable debug mode: https://joplinapp.org/debugging/
|
||||
@@ -2,14 +2,24 @@
|
||||
|
||||
Please prefix the title with the platform you are targetting:
|
||||
|
||||
Here are some examples of good titles:
|
||||
|
||||
- Desktop: Resolves #123: Added new setting to change font
|
||||
- Mobile, Desktop: Fixes #456: Fixed config screen error
|
||||
- All: Resolves #777: Made synchronisation faster
|
||||
|
||||
And here's an explanation of the title format:
|
||||
|
||||
- "Desktop" for the Windows/macOS/Linux app (Electron app)
|
||||
- "Mobile" for the mobile app (or "Android" / "iOS" if the pull request only applies to one of the mobile platforms)
|
||||
- "CLI" for the CLI app
|
||||
|
||||
If it's two platforms, separate them with commas - "Desktop, Mobile" or if it's for all platforms, prefix with "All".
|
||||
|
||||
If it's not related to any platform (such as a translation, change to the documentation, etc.), simply don't add a platform.
|
||||
|
||||
For example: "Desktop: Added new setting to change font", or "Mobile: Fixed config screen error"
|
||||
Then please append the issue that you've addressed or fixed. Use "Resolves #123" for new features or improvements and "Fixes #123" for bug fixes.
|
||||
|
||||
PLEASE READ THE GUIDE FIRST: https://github.com/laurent22/joplin/blob/master/CONTRIBUTING.md
|
||||
AND PLEASE READ THE GUIDE: https://github.com/laurent22/joplin/blob/master/CONTRIBUTING.md
|
||||
|
||||
-->
|
||||
@@ -1,18 +1,15 @@
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 90
|
||||
daysUntilStale: 30
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- "good first issue"
|
||||
- "essential"
|
||||
- "essential-reviewed"
|
||||
- "help wanted"
|
||||
- "nice to have"
|
||||
- "upstream"
|
||||
- "backlog"
|
||||
- "high"
|
||||
- "spec"
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
|
||||
@@ -37,25 +37,272 @@ _mydocs
|
||||
Assets/DownloadBadges*.psd
|
||||
node_modules
|
||||
Tools/github_oauth_token.txt
|
||||
CliClient/tests/support/amazon-s3-auth.json
|
||||
_releases
|
||||
ReactNativeClient/lib/csstojs/
|
||||
ReactNativeClient/lib/rnInjectedJs/
|
||||
ElectronClient/gui/note-viewer/fonts/
|
||||
ElectronClient/gui/note-viewer/lib.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/supportedLocales.js
|
||||
Clipper-source/
|
||||
Clipper/joplin-webclipper-source.zip
|
||||
joplin-webclipper-source.zip
|
||||
Tools/commit_hook.txt
|
||||
.vscode/*
|
||||
*.map
|
||||
ReactNativeClient/lib/sql-extensions/spellfix.so
|
||||
ReactNativeClient/lib/sql-extensions/spellfix.dylib
|
||||
CliClient/build/
|
||||
plugin_types/
|
||||
|
||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||
CliClient/app/LinkSelector.js
|
||||
CliClient/app/services/plugins/PluginRunner.js
|
||||
CliClient/tests/models_Setting.js
|
||||
CliClient/tests/services_CommandService.js
|
||||
CliClient/tests/services_InteropService.js
|
||||
CliClient/tests/services_PluginService.js
|
||||
CliClient/tests/services/plugins/sandboxProxy.js
|
||||
CliClient/tests/synchronizer_LockHandler.js
|
||||
CliClient/tests/synchronizer_MigrationHandler.js
|
||||
ElectronClient/app.js
|
||||
ElectronClient/bridge.js
|
||||
ElectronClient/commands/copyDevCommand.js
|
||||
ElectronClient/commands/focusElement.js
|
||||
ElectronClient/commands/startExternalEditing.js
|
||||
ElectronClient/commands/stopExternalEditing.js
|
||||
ElectronClient/ElectronAppWrapper.js
|
||||
ElectronClient/global.d.js
|
||||
ElectronClient/gui/Button/Button.js
|
||||
ElectronClient/gui/ConfigScreen/ButtonBar.js
|
||||
ElectronClient/gui/ConfigScreen/ConfigScreen.js
|
||||
ElectronClient/gui/ConfigScreen/SideBar.js
|
||||
ElectronClient/gui/DropboxLoginScreen.js
|
||||
ElectronClient/gui/ErrorBoundary.js
|
||||
ElectronClient/gui/KeymapConfig/KeymapConfigScreen.js
|
||||
ElectronClient/gui/KeymapConfig/ShortcutRecorder.js
|
||||
ElectronClient/gui/KeymapConfig/styles/index.js
|
||||
ElectronClient/gui/KeymapConfig/utils/getLabel.js
|
||||
ElectronClient/gui/KeymapConfig/utils/useCommandStatus.js
|
||||
ElectronClient/gui/KeymapConfig/utils/useKeymap.js
|
||||
ElectronClient/gui/MainScreen/commands/editAlarm.js
|
||||
ElectronClient/gui/MainScreen/commands/exportPdf.js
|
||||
ElectronClient/gui/MainScreen/commands/hideModalMessage.js
|
||||
ElectronClient/gui/MainScreen/commands/moveToFolder.js
|
||||
ElectronClient/gui/MainScreen/commands/newFolder.js
|
||||
ElectronClient/gui/MainScreen/commands/newNote.js
|
||||
ElectronClient/gui/MainScreen/commands/newTodo.js
|
||||
ElectronClient/gui/MainScreen/commands/print.js
|
||||
ElectronClient/gui/MainScreen/commands/renameFolder.js
|
||||
ElectronClient/gui/MainScreen/commands/renameTag.js
|
||||
ElectronClient/gui/MainScreen/commands/search.js
|
||||
ElectronClient/gui/MainScreen/commands/selectTemplate.js
|
||||
ElectronClient/gui/MainScreen/commands/setTags.js
|
||||
ElectronClient/gui/MainScreen/commands/showModalMessage.js
|
||||
ElectronClient/gui/MainScreen/commands/showNoteContentProperties.js
|
||||
ElectronClient/gui/MainScreen/commands/showNoteProperties.js
|
||||
ElectronClient/gui/MainScreen/commands/showShareNoteDialog.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleEditors.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleNoteList.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleSidebar.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleVisiblePanes.js
|
||||
ElectronClient/gui/MainScreen/MainScreen.js
|
||||
ElectronClient/gui/MenuBar.js
|
||||
ElectronClient/gui/MultiNoteActions.js
|
||||
ElectronClient/gui/NoteContentPropertiesDialog.js
|
||||
ElectronClient/gui/NoteEditor/commands/editorCommandDeclarations.js
|
||||
ElectronClient/gui/NoteEditor/commands/focusElementNoteBody.js
|
||||
ElectronClient/gui/NoteEditor/commands/focusElementNoteTitle.js
|
||||
ElectronClient/gui/NoteEditor/commands/showLocalSearch.js
|
||||
ElectronClient/gui/NoteEditor/commands/showRevisions.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/Editor.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/Toolbar.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useCursorUtils.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useEditorSearch.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useJoplinMode.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useKeymap.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useLineSorting.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/TinyMCE.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/TinyMCE/utils/useScroll.js
|
||||
ElectronClient/gui/NoteEditor/NoteEditor.js
|
||||
ElectronClient/gui/NoteEditor/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/utils/contextMenu.js
|
||||
ElectronClient/gui/NoteEditor/utils/index.js
|
||||
ElectronClient/gui/NoteEditor/utils/resourceHandling.js
|
||||
ElectronClient/gui/NoteEditor/utils/types.js
|
||||
ElectronClient/gui/NoteEditor/utils/useDropHandler.js
|
||||
ElectronClient/gui/NoteEditor/utils/useFolder.js
|
||||
ElectronClient/gui/NoteEditor/utils/useFormNote.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMarkupToHtml.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMessageHandler.js
|
||||
ElectronClient/gui/NoteEditor/utils/useNoteSearchBar.js
|
||||
ElectronClient/gui/NoteEditor/utils/usePluginServiceRegistration.js
|
||||
ElectronClient/gui/NoteEditor/utils/useSearchMarkers.js
|
||||
ElectronClient/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||
ElectronClient/gui/NoteList/commands/focusElementNoteList.js
|
||||
ElectronClient/gui/NoteList/NoteList.js
|
||||
ElectronClient/gui/NoteListControls/commands/focusSearch.js
|
||||
ElectronClient/gui/NoteListControls/NoteListControls.js
|
||||
ElectronClient/gui/NoteListItem.js
|
||||
ElectronClient/gui/NoteTextViewer.js
|
||||
ElectronClient/gui/NoteToolbar/NoteToolbar.js
|
||||
ElectronClient/gui/OneDriveLoginScreen.js
|
||||
ElectronClient/gui/ResizableLayout/hooks/useLayoutItemSizes.js
|
||||
ElectronClient/gui/ResizableLayout/hooks/useWindowResizeEvent.js
|
||||
ElectronClient/gui/ResizableLayout/ResizableLayout.js
|
||||
ElectronClient/gui/ResourceScreen.js
|
||||
ElectronClient/gui/Root_UpgradeSyncTarget.js
|
||||
ElectronClient/gui/Root.js
|
||||
ElectronClient/gui/SearchBar/hooks/useSearch.js
|
||||
ElectronClient/gui/SearchBar/SearchBar.js
|
||||
ElectronClient/gui/SearchBar/styles/index.js
|
||||
ElectronClient/gui/ShareNoteDialog.js
|
||||
ElectronClient/gui/SideBar/commands/focusElementSideBar.js
|
||||
ElectronClient/gui/SideBar/SideBar.js
|
||||
ElectronClient/gui/SideBar/styles/index.js
|
||||
ElectronClient/gui/StatusScreen/StatusScreen.js
|
||||
ElectronClient/gui/style/StyledInput.js
|
||||
ElectronClient/gui/style/StyledTextInput.js
|
||||
ElectronClient/gui/ToggleEditorsButton/styles/index.js
|
||||
ElectronClient/gui/ToggleEditorsButton/ToggleEditorsButton.js
|
||||
ElectronClient/gui/ToolbarBase.js
|
||||
ElectronClient/gui/ToolbarButton/styles/index.js
|
||||
ElectronClient/gui/ToolbarButton/ToolbarButton.js
|
||||
ElectronClient/gui/utils/NoteListUtils.js
|
||||
ElectronClient/InteropServiceHelper.js
|
||||
ElectronClient/services/bridge.js
|
||||
ElectronClient/services/plugins/hooks/useThemeCss.js
|
||||
ElectronClient/services/plugins/hooks/useViewIsReady.js
|
||||
ElectronClient/services/plugins/PlatformImplementation.js
|
||||
ElectronClient/services/plugins/PluginRunner.js
|
||||
ElectronClient/services/plugins/UserWebview.js
|
||||
ElectronClient/services/plugins/UserWebviewDialog.js
|
||||
ElectronClient/services/plugins/UserWebviewDialogButtonBar.js
|
||||
ReactNativeClient/lib/AsyncActionQueue.js
|
||||
ReactNativeClient/lib/BaseApplication.js
|
||||
ReactNativeClient/lib/checkPermissions.js
|
||||
ReactNativeClient/lib/commands/historyBackward.js
|
||||
ReactNativeClient/lib/commands/historyForward.js
|
||||
ReactNativeClient/lib/commands/synchronize.js
|
||||
ReactNativeClient/lib/components/screens/UpgradeSyncTargetScreen.js
|
||||
ReactNativeClient/lib/errorUtils.js
|
||||
ReactNativeClient/lib/eventManager.js
|
||||
ReactNativeClient/lib/hooks/useEffectDebugger.js
|
||||
ReactNativeClient/lib/hooks/useImperativeHandlerDebugger.js
|
||||
ReactNativeClient/lib/hooks/usePrevious.js
|
||||
ReactNativeClient/lib/hooks/usePropsDebugger.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/checkbox.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/fence.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/mermaid.js
|
||||
ReactNativeClient/lib/joplin-renderer/MdToHtml/rules/sanitize_html.js
|
||||
ReactNativeClient/lib/JoplinServerApi.js
|
||||
ReactNativeClient/lib/locale.js
|
||||
ReactNativeClient/lib/Logger.js
|
||||
ReactNativeClient/lib/markdownUtils.js
|
||||
ReactNativeClient/lib/models/Alarm.js
|
||||
ReactNativeClient/lib/models/Setting.js
|
||||
ReactNativeClient/lib/ntpDate.js
|
||||
ReactNativeClient/lib/reducer.js
|
||||
ReactNativeClient/lib/services/AlarmService.js
|
||||
ReactNativeClient/lib/services/AlarmServiceDriver.android.js
|
||||
ReactNativeClient/lib/services/AlarmServiceDriver.ios.js
|
||||
ReactNativeClient/lib/services/AlarmServiceDriverNode.js
|
||||
ReactNativeClient/lib/services/BaseService.js
|
||||
ReactNativeClient/lib/services/BooleanExpression.js
|
||||
ReactNativeClient/lib/services/commands/MenuUtils.js
|
||||
ReactNativeClient/lib/services/commands/propsHaveChanged.js
|
||||
ReactNativeClient/lib/services/commands/ToolbarButtonUtils.js
|
||||
ReactNativeClient/lib/services/CommandService.js
|
||||
ReactNativeClient/lib/services/contextkey/contextkey.js
|
||||
ReactNativeClient/lib/services/debug/populateDatabase.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Base.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Custom.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Html.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Jex.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Md.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Exporter_Raw.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Base.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Custom.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_EnexToHtml.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_EnexToMd.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Jex.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Md.js
|
||||
ReactNativeClient/lib/services/interop/InteropService_Importer_Raw.js
|
||||
ReactNativeClient/lib/services/interop/InteropService.js
|
||||
ReactNativeClient/lib/services/interop/types.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainService.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.dummy.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.mobile.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriver.node.js
|
||||
ReactNativeClient/lib/services/keychain/KeychainServiceDriverBase.js
|
||||
ReactNativeClient/lib/services/KeymapService.js
|
||||
ReactNativeClient/lib/services/plugins/api/Global.js
|
||||
ReactNativeClient/lib/services/plugins/api/Joplin.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinCommands.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinData.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinFilters.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinInterop.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinPlugins.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinSettings.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViews.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsDialogs.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsMenuItems.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsPanels.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinViewsToolbarButtons.js
|
||||
ReactNativeClient/lib/services/plugins/api/JoplinWorkspace.js
|
||||
ReactNativeClient/lib/services/plugins/api/types.js
|
||||
ReactNativeClient/lib/services/plugins/BasePluginRunner.js
|
||||
ReactNativeClient/lib/services/plugins/MenuItemController.js
|
||||
ReactNativeClient/lib/services/plugins/Plugin.js
|
||||
ReactNativeClient/lib/services/plugins/PluginService.js
|
||||
ReactNativeClient/lib/services/plugins/reducer.js
|
||||
ReactNativeClient/lib/services/plugins/sandboxProxy.js
|
||||
ReactNativeClient/lib/services/plugins/ToolbarButtonController.js
|
||||
ReactNativeClient/lib/services/plugins/utils/createViewHandle.js
|
||||
ReactNativeClient/lib/services/plugins/utils/executeSandboxCall.js
|
||||
ReactNativeClient/lib/services/plugins/utils/manifestFromObject.js
|
||||
ReactNativeClient/lib/services/plugins/utils/mapEventHandlersToIds.js
|
||||
ReactNativeClient/lib/services/plugins/utils/types.js
|
||||
ReactNativeClient/lib/services/plugins/ViewController.js
|
||||
ReactNativeClient/lib/services/plugins/WebviewController.js
|
||||
ReactNativeClient/lib/services/ResourceEditWatcher/index.js
|
||||
ReactNativeClient/lib/services/ResourceEditWatcher/reducer.js
|
||||
ReactNativeClient/lib/services/rest/actionApi.desktop.js
|
||||
ReactNativeClient/lib/services/rest/Api.js
|
||||
ReactNativeClient/lib/services/rest/errors.js
|
||||
ReactNativeClient/lib/services/searchengine/filterParser.js
|
||||
ReactNativeClient/lib/services/searchengine/queryBuilder.js
|
||||
ReactNativeClient/lib/services/SettingUtils.js
|
||||
ReactNativeClient/lib/services/synchronizer/gui/useSyncTargetUpgrade.js
|
||||
ReactNativeClient/lib/services/synchronizer/LockHandler.js
|
||||
ReactNativeClient/lib/services/synchronizer/MigrationHandler.js
|
||||
ReactNativeClient/lib/services/synchronizer/migrations/1.js
|
||||
ReactNativeClient/lib/services/synchronizer/migrations/2.js
|
||||
ReactNativeClient/lib/services/synchronizer/utils/types.js
|
||||
ReactNativeClient/lib/services/UndoRedoService.js
|
||||
ReactNativeClient/lib/ShareExtension.js
|
||||
ReactNativeClient/lib/shareHandler.js
|
||||
ReactNativeClient/lib/shim.js
|
||||
ReactNativeClient/lib/Synchronizer.js
|
||||
ReactNativeClient/lib/theme.js
|
||||
ReactNativeClient/lib/themes/aritimDark.js
|
||||
ReactNativeClient/lib/themes/dark.js
|
||||
ReactNativeClient/lib/themes/dracula.js
|
||||
ReactNativeClient/lib/themes/light.js
|
||||
ReactNativeClient/lib/themes/nord.js
|
||||
ReactNativeClient/lib/themes/oledDark.js
|
||||
ReactNativeClient/lib/themes/solarizedDark.js
|
||||
ReactNativeClient/lib/themes/solarizedLight.js
|
||||
ReactNativeClient/lib/themes/type.js
|
||||
ReactNativeClient/lib/uuid.js
|
||||
ReactNativeClient/lib/versionInfo.js
|
||||
ReactNativeClient/PluginAssetsLoader.js
|
||||
ReactNativeClient/setUpQuickActions.js
|
||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||
@@ -9,6 +9,7 @@ rvm: 2.3.3
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- dev
|
||||
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
||||
|
||||
matrix:
|
||||
@@ -16,7 +17,7 @@ matrix:
|
||||
- os: osx
|
||||
osx_image: xcode9.0
|
||||
language: node_js
|
||||
node_js: "8"
|
||||
node_js: "10"
|
||||
env:
|
||||
- ELECTRON_CACHE=$HOME/.cache/electron
|
||||
- ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder
|
||||
@@ -25,7 +26,7 @@ matrix:
|
||||
sudo: required
|
||||
dist: trusty
|
||||
language: node_js
|
||||
node_js: "8"
|
||||
node_js: "10"
|
||||
env:
|
||||
- ELECTRON_CACHE=$HOME/.cache/electron
|
||||
- ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder
|
||||
@@ -42,6 +43,8 @@ before_install:
|
||||
|
||||
# Silence apt-get update errors (for example when a module doesn't exist) since
|
||||
# otherwise it will make the whole build fails, even though all we need is yarn.
|
||||
|
||||
# libsecret-1-dev is required for keytar - https://github.com/atom/node-keytar
|
||||
- |
|
||||
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
HOMEBREW_NO_AUTO_UPDATE=1 brew install yarn
|
||||
@@ -51,6 +54,7 @@ before_install:
|
||||
sudo apt-get update || true
|
||||
sudo apt-get install -y yarn
|
||||
sudo apt-get install -y gettext
|
||||
sudo apt-get install -y libsecret-1-dev
|
||||
fi
|
||||
|
||||
script:
|
||||
@@ -66,7 +70,7 @@ script:
|
||||
# and that would break the desktop release.
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
cd CliClient
|
||||
npm run test
|
||||
npm run test-ci
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
@@ -109,4 +113,4 @@ script:
|
||||
|
||||
# Prepare the Electron app and build it
|
||||
cd ElectronClient
|
||||
USE_HARD_LINKS=false yarn dist
|
||||
USE_HARD_LINKS=false npm run dist
|
||||
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 33 KiB |
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="disegno.svg"
|
||||
inkscape:version="1.0rc1 (09960d6, 2020-04-09)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 70 70"
|
||||
height="70"
|
||||
width="70">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="775"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:guide-bbox="true"
|
||||
showguides="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:showpageshadow="false"
|
||||
showborder="true"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cy="39.253064"
|
||||
inkscape:cx="25.246811"
|
||||
inkscape:zoom="5.8562241"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
units="px">
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1932"
|
||||
orientation="-1,0"
|
||||
position="12,70" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1934"
|
||||
orientation="-1,0"
|
||||
position="58,70" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1936"
|
||||
orientation="0,1"
|
||||
position="0,58" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1938"
|
||||
orientation="0,1"
|
||||
position="0,12" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide2021"
|
||||
orientation="-1,0"
|
||||
position="35,70" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Livello 1">
|
||||
<path
|
||||
inkscape:transform-center-y="23.027731"
|
||||
inkscape:transform-center-x="-17.510929"
|
||||
id="path30"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.133334;stop-opacity:1"
|
||||
d="M 52.1731,12 H 35.107236 c -0.161294,0 -0.291666,0.130494 -0.291666,0.291543 v 5.419239 c 0,0.182381 0.147678,0.330176 0.330178,0.330176 h 2.339824 c 0.94638,0 1.713811,0.727936 1.795988,1.652976 v 3.715485 2.069989 19.715998 0.139708 h -6.44e-4 c 0.0058,0.206545 -0.0023,0.409658 -0.02244,0.609702 -0.0023,0.02918 -0.0062,0.05801 -0.0097,0.08697 -0.01349,0.116897 -0.02846,0.233161 -0.05114,0.346981 -0.01243,0.06489 -0.02993,0.128044 -0.0455,0.191949 -0.02097,0.08499 -0.0379,0.171342 -0.06401,0.254505 -0.1543,0.493916 -0.39825,0.95202 -0.735666,1.355297 -0.01243,0.01438 -0.02771,0.02761 -0.03998,0.04182 -0.102908,0.119222 -0.210962,0.235367 -0.330548,0.34416 -0.120695,0.109778 -0.248492,0.211819 -0.382795,0.306628 -0.954719,0.676302 -2.23974,0.973854 -3.6755,0.836485 -1.830697,-0.172088 -3.646921,-1.002309 -5.114939,-2.337984 -1.467772,-1.335554 -2.380422,-2.988039 -2.569305,-4.653525 -0.169868,-1.489971 0.276578,-2.801116 1.256197,-3.692426 0.0027,-0.0019 0.005,-0.0037 0.0069,-0.0058 0.0379,-0.03398 0.0796,-0.06379 0.1186,-0.09654 0.701076,-0.58738 1.614951,-0.943313 2.657858,-1.041435 0.01172,-0.0011 0.02306,-0.003 0.03423,-0.0039 0.109777,-0.0097 0.221631,-0.01402 0.334471,-0.01827 0.05899,-0.0019 0.117251,-0.0062 0.177111,-0.0065 0.01986,-2.76e-4 0.03875,-0.0023 0.05864,-0.0023 0.03557,0 0.07248,0.0046 0.108055,0.0051 0.164347,0.0027 0.329933,0.0094 0.498825,0.02379 0.02134,0.0017 0.0417,9.78e-4 0.06365,0.003 0.01562,0.0016 0.03103,0.005 0.04662,0.0065 0.956682,0.09592 1.90392,0.381568 2.802834,0.814406 0.01876,8.39e-4 0.04047,0.0065 0.06759,0.02159 0.274004,0.151353 0.326498,-0.01101 0.334593,-0.118351 v -4.688237 -3.46883 c 0,-0.233653 -0.162519,-0.440321 -0.3904,-0.490484 -4.841795,-1.065597 -9.592336,0.04355 -12.944402,3.09499 -2.928307,2.663747 -4.344811,6.507647 -3.885849,10.545461 0.409535,3.596512 2.255685,7.05173 5.198956,9.730318 2.868698,2.609903 6.521262,4.242028 10.288996,4.596993 0.519184,0.04805 1.040822,0.07283 1.549826,0.07283 3.598351,0 6.937296,-1.233851 9.401735,-3.475688 2.33455,-2.125552 3.732902,-5.044294 3.938097,-8.219619 l 0.01901,-20.825138 h 0.0021 V 19.91155 h 7.7e-4 v -0.09714 c 0.02109,-0.982682 0.822378,-1.773296 1.81046,-1.773296 h 2.339824 c 0.182259,0 0.330177,-0.147802 0.330177,-0.330177 v -5.419299 c -2.1e-5,-0.161046 -0.130406,-0.291543 -0.291686,-0.291543"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<inkscape:templateinfo>
|
||||
<inkscape:name>SmallTile</inkscape:name>
|
||||
<inkscape:shortdesc>Small tile</inkscape:shortdesc>
|
||||
<inkscape:date>2020-04-15</inkscape:date>
|
||||
</inkscape:templateinfo>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="disegno-1.svg"
|
||||
inkscape:version="1.0rc1 (09960d6, 2020-04-09)"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 150 150"
|
||||
height="150"
|
||||
width="150">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="775"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:guide-bbox="true"
|
||||
showguides="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:showpageshadow="false"
|
||||
showborder="true"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cy="79.075594"
|
||||
inkscape:cx="91.835957"
|
||||
inkscape:zoom="3.1892627"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
units="px">
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1919"
|
||||
orientation="0,1"
|
||||
position="0,115" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1921"
|
||||
orientation="-1,0"
|
||||
position="25,150" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1923"
|
||||
orientation="-1,0"
|
||||
position="125,150" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide1925"
|
||||
orientation="0,1"
|
||||
position="0,35" />
|
||||
<sodipodi:guide
|
||||
inkscape:color="rgb(0,0,255)"
|
||||
inkscape:locked="false"
|
||||
inkscape:label=""
|
||||
id="guide2879"
|
||||
orientation="-1,0"
|
||||
position="75,150" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Livello 1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 105.30102,35.000001 H 75.621261 c -0.280511,0 -0.507245,0.226946 -0.507245,0.507031 v 9.424762 c 0,0.317185 0.256831,0.574219 0.574223,0.574219 h 4.069258 c 1.645878,0 2.980541,1.265976 3.123457,2.874741 v 6.461712 3.599981 34.288687 0.24297 h -0.0011 c 0.01009,0.359209 -0.004,0.712449 -0.03903,1.060352 -0.004,0.05075 -0.01078,0.100887 -0.01687,0.151252 -0.02346,0.203299 -0.0495,0.405497 -0.08894,0.603445 -0.02162,0.112852 -0.05205,0.222685 -0.07913,0.333824 -0.03647,0.147809 -0.06591,0.297986 -0.111322,0.442618 -0.268348,0.858984 -0.692608,1.655686 -1.279419,2.357038 -0.02162,0.02501 -0.04819,0.04802 -0.06953,0.07273 -0.178971,0.207343 -0.366891,0.409334 -0.574866,0.598539 -0.209904,0.190918 -0.43216,0.368381 -0.66573,0.533266 -1.660381,1.176182 -3.8952,1.693662 -6.392174,1.454752 -3.18382,-0.29928 -6.34247,-1.743142 -8.895544,-4.066054 -2.552647,-2.322703 -4.139864,-5.196589 -4.468356,-8.093086 -0.295423,-2.591254 0.481005,-4.871506 2.18469,-6.42161 0.0047,-0.0033 0.0087,-0.0064 0.012,-0.01009 0.06591,-0.05909 0.138435,-0.110939 0.206261,-0.167895 1.219262,-1.021531 2.80861,-1.640544 4.622361,-1.811191 0.02038,-0.0019 0.0401,-0.0052 0.05953,-0.0068 0.190917,-0.01687 0.385445,-0.02438 0.581689,-0.03177 0.102591,-0.0033 0.203915,-0.01078 0.308019,-0.0113 0.03454,-4.8e-4 0.06739,-0.004 0.101982,-0.004 0.06186,0 0.126053,0.008 0.187922,0.0089 0.285821,0.0047 0.573797,0.01635 0.867522,0.04137 0.03711,0.003 0.07252,0.0017 0.110695,0.0052 0.02717,0.0028 0.05397,0.0087 0.08108,0.0113 1.663794,0.166817 3.311164,0.663596 4.874493,1.416358 0.03263,0.0015 0.07038,0.0113 0.117548,0.03755 0.476528,0.263222 0.567822,-0.01915 0.581901,-0.205828 V 73.11952 67.086773 c 0,-0.406353 -0.282642,-0.765776 -0.678957,-0.853016 -8.420512,-1.853212 -16.682323,0.07574 -22.512002,5.382591 -5.092707,4.632602 -7.556192,11.317645 -6.757997,18.339929 0.712234,6.254803 3.92293,12.263883 9.041661,16.922293 4.989039,4.53896 11.341325,7.37744 17.893905,7.99477 0.902929,0.0836 1.810125,0.12666 2.69535,0.12666 6.258001,0 12.064861,-2.14583 16.350841,-6.04467 4.060086,-3.69661 6.492006,-8.77269 6.848866,-14.294994 l 0.0331,-36.217627 h 0.004 v -9.683497 h 10e-4 v -0.16894 c 0.0367,-1.709012 1.43023,-3.083992 3.148627,-3.083992 h 4.06926 c 0.31697,0 0.57422,-0.257047 0.57422,-0.574221 v -9.424867 c -4e-5,-0.28008 -0.22679,-0.507031 -0.50728,-0.507031"
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.133334;stop-opacity:1"
|
||||
id="path30"
|
||||
inkscape:transform-center-x="-30.453831"
|
||||
inkscape:transform-center-y="40.048222" />
|
||||
</g>
|
||||
<inkscape:templateinfo>
|
||||
<inkscape:name>Square150x150Logo</inkscape:name>
|
||||
<inkscape:shortdesc>Medium tile</inkscape:shortdesc>
|
||||
<inkscape:date>2020-04-15</inkscape:date>
|
||||
</inkscape:templateinfo>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 820 B |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
@@ -7,7 +7,11 @@ Note that all the applications share the same library, which, for historical rea
|
||||
## Required dependencies
|
||||
|
||||
- Install yarn - https://yarnpkg.com/lang/en/docs/install/
|
||||
- Install node - https://nodejs.org/en/
|
||||
- Install node 10+ - https://nodejs.org/en/
|
||||
- macOS, Linux: Install rsync - https://nodejs.org/en/
|
||||
- macOS: Install Cocoapods - `brew install cocoapods`
|
||||
- Windows: Install Windows Build Tools - `npm install -g windows-build-tools`
|
||||
- Linux: Install dependencies - `sudo apt install libnss3 libsecret-1-dev`
|
||||
|
||||
## Building
|
||||
|
||||
@@ -22,18 +26,7 @@ Then you can test the various applications:
|
||||
cd ElectronClient
|
||||
npm start
|
||||
|
||||
If you'd like to auto-reload the app on changes rather than having to quit and restart it manually each time, you can use [watchman-make](https://facebook.github.io/watchman/docs/watchman-make.html):
|
||||
|
||||
```sh
|
||||
cd ElectronClient
|
||||
watchman-make -p '**/*.js' '**/*.jsx' --run "npm start"
|
||||
```
|
||||
|
||||
It still requires you to quit the application each time you want it to rebuild, but at least you don't have to re-run `"npm start"` each time. Here's what the workflow loop looks like in practice:
|
||||
|
||||
1. Edit and save files in your text editor.
|
||||
2. Switch to the Electron app and <kbd>cmd</kbd>+<kbd>Q</kbd> to quit it.
|
||||
3. `watchman` immediately restarts the app for you (whereas usually you'd have to switch back to the terminal, type `"npm start"`, and hit enter).
|
||||
You can also run it under WSL 2. To do so, [follow these instructions](https://www.beekeeperstudio.io/blog/building-electron-windows-ubuntu-wsl2) to setup your environment.
|
||||
|
||||
## Testing the Terminal application
|
||||
|
||||
@@ -47,12 +40,12 @@ First you need to setup React Native to build projects with native code. For thi
|
||||
Then:
|
||||
|
||||
cd ReactNativeClient
|
||||
npm start-android
|
||||
# Or: npm start-ios
|
||||
npm run start-android
|
||||
# Or: npm run start-ios
|
||||
|
||||
To run the iOS application, it might be easier to open the file `ios/Joplin.xcworkspace` on XCode and run the app from there.
|
||||
|
||||
Normally the bundler should start automatically with the application. If it doesn't run `npm start`.
|
||||
Normally the bundler should start automatically with the application. If it doesn't, run `npm start`.
|
||||
|
||||
## Building the clipper
|
||||
|
||||
@@ -80,37 +73,27 @@ You can specify additional parameters when running the desktop or CLI applicatio
|
||||
|
||||
Most of the application is written in JavaScript, however new classes and files should generally be written in [TypeScript](https://www.typescriptlang.org/). All TypeScript files are generated next to the .ts or .tsx file. So for example, if there's a file "lib/MyClass.ts", there will be a generated "lib/MyClass.js" next to it. It is implemented that way as it requires minimal changes to integrate TypeScript in the existing JavaScript code base.
|
||||
|
||||
# Troubleshooting desktop application
|
||||
In the current setup, `tsc` is executed from the root of the project, and will compile everything in CliClient, ElectronClient, etc. This is more convenient to have just one place to compile everything, and it also means there's only one watch command to run. However, one drawback is that TypeScript doesn't find types defined in node_modules folders in sub-directories. For example, if you install `immer` in ElectronClient, then try to use the package, TypeScript will report that it cannot find this module. In theory using `typeRoots`, it should be possible to make it find the right modules but it doesn't seem to work in this case. Currently the workaround is to install any such package at the root of the project. By doing so, TypeScript will find the type definitions and compilation will work. It's not ideal since the module is installed at the root even though it's not used, but for now that will work.
|
||||
|
||||
## On Linux and macOS
|
||||
## Hot reload
|
||||
|
||||
If there's an error `while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory`, run `sudo apt-get install libgconf-2-4`
|
||||
If you'd like to auto-reload the desktop app on changes rather than having to quit and restart it manually each time, you can use [watchman-make](https://facebook.github.io/watchman/docs/watchman-make.html):
|
||||
|
||||
If you get a node-gyp related error, you might need to manually install it: `npm install -g node-gyp`.
|
||||
```sh
|
||||
cd ElectronClient
|
||||
watchman-make -p '**/*.js' '**/*.jsx' --run "npm start"
|
||||
```
|
||||
|
||||
If you get the error `libtool: unrecognized option '-static'`, follow the instructions [in this post](https://stackoverflow.com/a/38552393/561309) to use the correct libtool version.
|
||||
It still requires you to quit the application each time you want it to rebuild, but at least you don't have to re-run `"npm start"` each time. Here's what the workflow loop looks like in practice:
|
||||
|
||||
## On Windows
|
||||
1. Edit and save files in your text editor.
|
||||
2. Switch to the Electron app and <kbd>cmd</kbd>+<kbd>Q</kbd> to quit it.
|
||||
3. `watchman` immediately restarts the app for you (whereas usually you'd have to switch back to the terminal, type `"npm start"`, and hit enter).
|
||||
|
||||
If node-gyp does not work (MSBUILD: error MSB3428: Could not load the Visual C++ component "VCBuild.exe"), you might need to install `windows-build-tools` using `npm install --global windows-build-tools`.
|
||||
# Updating Markdown renderer packages
|
||||
|
||||
If `yarn dist` fails, it may need administrative rights.
|
||||
The Markdown renderer is located under ReactNativeClient/lib/joplin-renderer. Whenever updating one of its dependencies, such as Mermaid or Katex, please run `npm run buildAssets` to make sure all assets such as fonts or CSS files are deployed correctly.
|
||||
|
||||
If you get an `error MSB8020: The build tools for v140 cannot be found.` try to run with a different toolset version, eg `npm install --toolset=v141` (See [here](https://github.com/mapbox/node-sqlite3/issues/1124) for more info).
|
||||
# Troubleshooting
|
||||
|
||||
## Other issues
|
||||
|
||||
> The application window doesn't open or is white
|
||||
|
||||
This is an indication that there's an early initialisation error. Try this:
|
||||
|
||||
- In ElectronAppWrapper, set `debugEarlyBugs` to `true`. This will force the window to show up and should open the console next to it, which should display any error.
|
||||
- In more rare cases, an already open instance of Joplin can create strange low-level bugs that will display no error but will result in this white window. A non-dev instance of Joplin, or a dev instance that wasn't properly closed might cause this. So make sure you close everything and try again. Perhaps even other Electron apps running (Skype, Slack, etc.) could cause this?
|
||||
- Also try to delete node_modules and rebuild.
|
||||
- If all else fails, switch your computer off and on again, to make sure you start clean.
|
||||
|
||||
> How to work on the app from Windows?
|
||||
|
||||
**You should not use WSL at all** because this is a GUI app that lives outside of WSL, and the WSL layer can cause all kind of very hard to debug issues. It can also lock files in node_modules that cannot be unlocked when the app crashes. (You need to restart your computer.) Likewise, don't run the TypeScript watch command from WSL.
|
||||
|
||||
So everything should be done from a Windows Command prompt or Windows PowerShell running as Administrator. All build and start commands are designed to work cross-platform, including on Windows.
|
||||
Please read for the [Build Troubleshooting Document](https://github.com/laurent22/joplin/blob/dev/readme/build_troubleshooting.md) for various tips on how to get the build working.
|
||||
@@ -21,15 +21,13 @@ Please check that your request has not already been posted on the forum or the [
|
||||
|
||||
Avoid listing multiple requests in one topic. One topic per request makes it easier to track and discuss it.
|
||||
|
||||
Finally, when submitting a pull request, don't forget to [test your code](#unit-tests).
|
||||
Finally, when submitting a pull request, don't forget to [test your code](#automated-tests).
|
||||
|
||||
# Contribute to the project
|
||||
|
||||
## Contributing to Joplin's translation
|
||||
# Contributing to Joplin's translation
|
||||
|
||||
Joplin is available in multiple languages thanks to the help of its users. You can help translate Joplin to your language or keep it up to date. Please read the documentation about [Localisation](https://joplinapp.org/#localisation).
|
||||
|
||||
## Contributing to Joplin's code
|
||||
# Contributing to Joplin's code
|
||||
|
||||
If you want to start contributing to the project's code, please follow these guidelines before creating a pull request:
|
||||
|
||||
@@ -38,10 +36,11 @@ If you want to start contributing to the project's code, please follow these gui
|
||||
- Before adding a new feature, ask about it in the [Github Issue Tracker](https://github.com/laurent22/joplin/issues?utf8=%E2%9C%93&q=is%3Aissue) or the [Joplin Forum](https://discourse.joplinapp.org/), or check if existing discussions exist to make sure the new functionality is desired.
|
||||
- **Changes that will consist in more than 50 lines of code should be discussed the [Joplin Forum](https://discourse.joplinapp.org/)**, so that you don't spend too much time implementing something that might not be accepted.
|
||||
- All the applications share the same backend (database, synchronisation, settings, models, business logic, etc.) so if you change something in the backend in one app, makes sure it still work in the other apps. Usually it does, but keep this in mind.
|
||||
- Pull requests that make many changes using an automated tool, like for spell fixing, styling, etc. will not be accepted. An exception would be if the changes have been discussed in the forum and someone has agreed to review **and test** the pull request.
|
||||
|
||||
Building the apps is relatively easy - please [see the build instructions](https://github.com/laurent22/joplin/blob/master/BUILD.md) for more details.
|
||||
|
||||
### Coding style
|
||||
## Coding style
|
||||
|
||||
Coding style is enforced by a pre-commit hook that runs eslint. This hook is installed whenever running `npm install` on any of the application directory. If for some reason the pre-commit hook didn't get installed, you can manually install it by running `npm install` at the root of the repository.
|
||||
|
||||
@@ -49,44 +48,45 @@ For new React components, please use [React Hooks](https://reactjs.org/docs/hook
|
||||
|
||||
For changes made to the Desktop client that affect the user interface, refer to `ElectronClient/app/theme.js` for all styling information. The goal is to create a consistent user interface to allow for easy navigation of Joplin's various features and improve the overall user experience.
|
||||
|
||||
### Unit tests
|
||||
## Automated tests
|
||||
|
||||
When submitting a pull request for a new feature or bug fix, please add unit tests for your code. Unit testing GUI changes is not always possible so it is not required, but any change in a file under /lib for example should be unit tested.
|
||||
When submitting a pull request for a new feature or a bug fix, please add automated tests for your code whenever possible. Tests in Joplin are divided into **unit tests** and **feature tests**.
|
||||
|
||||
* **Unit tests** are used to test models, services or utility classes - they are relatively low level. Unit tests should be prefixed with the type of class that is being tested - for example "models_Folder" or "services_SearchEngine".
|
||||
|
||||
* **Feature tests** on the other hand are to test higher level functionalities such as interactions with the GUI and how they affect the underlying model. Often these tests would dispatch Redux actions, and inspect how the application state has been changed. The feature tests should be prefixed with "feature_", for example "feature_TagList". There's a good explanation on what qualifies as a feature test in [this post](https://github.com/laurent22/joplin/pull/2819#issuecomment-603502230).
|
||||
|
||||
The tests are under CliClient/tests. To get them running, you first need to build the CLI app:
|
||||
|
||||
```sh
|
||||
npm run tsc # Build the .ts and .tsx files
|
||||
cd CliClient
|
||||
npm install
|
||||
cd CliClient
|
||||
```
|
||||
|
||||
To run all the test units:
|
||||
|
||||
```sh
|
||||
npm run test
|
||||
npm test
|
||||
```
|
||||
|
||||
To run just one particular file:
|
||||
|
||||
```sh
|
||||
npm run test -- --filter=markdownUtils # Don't add the .js extension
|
||||
npm test -- --filter=markdownUtils # Don't add the .js extension
|
||||
```
|
||||
|
||||
To filter tests. For example, to run all the test units that contain "should handle conflict" in their description:
|
||||
|
||||
```sh
|
||||
npm run test -- --filter="should handle conflict"
|
||||
npm test -- --filter="should handle conflict"
|
||||
```
|
||||
|
||||
If you get the error `Cannot find module '/joplin/CliClient/node_modules/sqlite3/lib/binding/node-v79-darwin-x64/node_sqlite3.node'`, you may need to run `npm rebuild`.
|
||||
|
||||
## About abandoned pull requests
|
||||
|
||||
It happens that a pull request is started but not finished and despite our attempts to contact the contributor, we don’t hear from them again.
|
||||
It happens that a pull request is started but not finished and despite our attempts to contact the contributor, we don't hear from them again.
|
||||
|
||||
In that case we will not merge the pull request, even if only small changes are missing. Our policy is simply to close the pull request. Why? Because an unfinished pull request essentially means giving us work and moving on. We would rather not encourage this behaviour.
|
||||
|
||||
Also, please note that since we have spent time reviewing the pull request and proposing solutions, we reserve the right to re-use that knowledge to create a new pull request, potentially based on your changes.
|
||||
|
||||
We’d much prefer that you complete the pull request though, so we’ll be sure to ping you a few times before that!
|
||||
We'd much prefer that you complete the pull request though, so we'll be sure to ping you a few times before that!
|
||||
@@ -1,13 +1,13 @@
|
||||
module.exports = {
|
||||
"overrides": [
|
||||
'overrides': [
|
||||
{
|
||||
"files": ["tests/**/*.js"],
|
||||
'files': ['tests/**/*.js'],
|
||||
'rules': {
|
||||
// Ignore all unused function arguments, because in some
|
||||
// case they are kept to indicate the function signature.
|
||||
"no-unused-vars": ["error", { "argsIgnorePattern": ".*" }],
|
||||
"@typescript-eslint/no-unused-vars": 0,
|
||||
}
|
||||
'no-unused-vars': ['error', { 'argsIgnorePattern': '.*' }],
|
||||
'@typescript-eslint/no-unused-vars': 0,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
@@ -20,4 +20,6 @@ out.txt
|
||||
linkToLocal.sh
|
||||
yarn-error.log
|
||||
tests/support/dropbox-auth.txt
|
||||
tests/support/nextcloud-auth.json
|
||||
tests/support/onedrive-auth.txt
|
||||
build/
|
||||
@@ -0,0 +1,134 @@
|
||||
const open = require('open');
|
||||
interface LinkStoreEntry {
|
||||
link: string;
|
||||
noteX: number;
|
||||
noteY: number;
|
||||
}
|
||||
|
||||
class LinkSelector {
|
||||
noteId_: string;
|
||||
scrollTop_: number;
|
||||
renderedText_: string;
|
||||
currentLinkIndex_: number;
|
||||
linkStore_: LinkStoreEntry[];
|
||||
linkRegex_: RegExp;
|
||||
|
||||
constructor() {
|
||||
this.noteId_ = null;
|
||||
this.scrollTop_ = null; // used so 'o' won't open unhighlighted link after scrolling
|
||||
this.renderedText_ = null;
|
||||
this.currentLinkIndex_ = null;
|
||||
this.linkStore_ = null;
|
||||
this.linkRegex_ = /http:\/\/[0-9.]+:[0-9]+\/[0-9]+/g;
|
||||
}
|
||||
|
||||
get link(): string | null {
|
||||
if (this.currentLinkIndex_ === null) return null;
|
||||
return this.linkStore_[this.currentLinkIndex_].link;
|
||||
}
|
||||
|
||||
get noteX(): number | null {
|
||||
if (this.currentLinkIndex_ === null) return null;
|
||||
return this.linkStore_[this.currentLinkIndex_].noteX;
|
||||
}
|
||||
|
||||
get noteY(): number | null {
|
||||
if (this.currentLinkIndex_ === null) return null;
|
||||
return this.linkStore_[this.currentLinkIndex_].noteY;
|
||||
}
|
||||
|
||||
findLinks(renderedText: string): LinkStoreEntry[] {
|
||||
const newLinkStore: LinkStoreEntry[] = [];
|
||||
const lines: string[] = renderedText.split('\n');
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
const matches = [...lines[i].matchAll(this.linkRegex_)];
|
||||
matches.forEach((_e, n) => {
|
||||
newLinkStore.push(
|
||||
{
|
||||
link: matches[n][0],
|
||||
noteX: matches[n].index,
|
||||
noteY: i,
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
return newLinkStore;
|
||||
}
|
||||
|
||||
updateText(renderedText: string): void {
|
||||
this.currentLinkIndex_ = null;
|
||||
this.renderedText_ = renderedText;
|
||||
this.linkStore_ = this.findLinks(this.renderedText_);
|
||||
}
|
||||
|
||||
updateNote(textWidget: any): void {
|
||||
this.noteId_ = textWidget.noteId;
|
||||
this.scrollTop_ = textWidget.scrollTop_;
|
||||
this.updateText(textWidget.renderedText_);
|
||||
}
|
||||
|
||||
scrollWidget(textWidget: any): void {
|
||||
if (this.currentLinkIndex_ === null) return;
|
||||
|
||||
const noteY = this.linkStore_[this.currentLinkIndex_].noteY;
|
||||
|
||||
let viewBoxMin = textWidget.scrollTop_ + 1;
|
||||
let viewBoxMax = viewBoxMin + textWidget.innerHeight - 2;
|
||||
|
||||
if (noteY < viewBoxMin) {
|
||||
for (; noteY < viewBoxMin; textWidget.pageUp()) {
|
||||
viewBoxMin = textWidget.scrollTop_;
|
||||
viewBoxMax = viewBoxMin + textWidget.innerHeight;
|
||||
}
|
||||
return;
|
||||
|
||||
} else if (noteY > viewBoxMax) {
|
||||
for (; noteY > viewBoxMax; textWidget.pageDown()) {
|
||||
viewBoxMin = textWidget.scrollTop_;
|
||||
viewBoxMax = viewBoxMin + textWidget.innerHeight;
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
changeLink(textWidget: any, offset: number): void | null {
|
||||
if (textWidget.noteId !== this.noteId_) {
|
||||
this.updateNote(textWidget);
|
||||
this.changeLink(textWidget, offset);
|
||||
return;
|
||||
}
|
||||
if (textWidget.renderedText_ !== this.renderedText_) {
|
||||
this.updateText(textWidget.renderedText_);
|
||||
this.changeLink(textWidget, offset);
|
||||
return;
|
||||
}
|
||||
if (textWidget.scrollTop_ !== this.scrollTop_) this.scrollTop_ = textWidget.scrollTop_;
|
||||
|
||||
if (!this.linkStore_.length) return null;
|
||||
|
||||
let offsetMod = (offset + this.currentLinkIndex_) % this.linkStore_.length;
|
||||
|
||||
if (this.currentLinkIndex_ === null) {
|
||||
if (offsetMod < 0) this.currentLinkIndex_ = this.linkStore_.length + offsetMod;
|
||||
else if (!offsetMod) this.currentLinkIndex_ = 0;
|
||||
else this.currentLinkIndex_ = offsetMod - 1;
|
||||
return;
|
||||
}
|
||||
|
||||
if (offsetMod < 0) offsetMod = this.linkStore_.length + offsetMod;
|
||||
|
||||
this.currentLinkIndex_ = offsetMod;
|
||||
return;
|
||||
}
|
||||
|
||||
openLink(textWidget: any): void {
|
||||
if (textWidget.noteId !== this.noteId_) return;
|
||||
if (textWidget.renderedText_ !== this.renderedText_) return;
|
||||
if (textWidget.scrollTop_ !== this.scrollTop_) return;
|
||||
open(this.linkStore_[this.currentLinkIndex_].link);
|
||||
}
|
||||
}
|
||||
|
||||
export default LinkSelector;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const Logger = require('lib/Logger').default;
|
||||
const { netUtils } = require('lib/net-utils.js');
|
||||
|
||||
const http = require('http');
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const Logger = require('lib/Logger').default;
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const BaseItem = require('lib/models/BaseItem.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const { reducer, defaultState } = require('lib/reducer.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const reducer = require('lib/reducer').default;
|
||||
const { defaultState } = require('lib/reducer');
|
||||
const { splitCommandString } = require('lib/string-utils.js');
|
||||
const { reg } = require('lib/registry.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const shim = require('lib/shim').default;
|
||||
const Entities = require('html-entities').AllHtmlEntities;
|
||||
const htmlentities = new Entities().encode;
|
||||
|
||||
@@ -32,6 +35,8 @@ const FolderListWidget = require('./gui/FolderListWidget.js');
|
||||
const NoteListWidget = require('./gui/NoteListWidget.js');
|
||||
const StatusBarWidget = require('./gui/StatusBarWidget.js');
|
||||
const ConsoleWidget = require('./gui/ConsoleWidget.js');
|
||||
const LinkSelector = require('./LinkSelector.js').default;
|
||||
|
||||
|
||||
class AppGui {
|
||||
constructor(app, store, keymap) {
|
||||
@@ -73,6 +78,8 @@ class AppGui {
|
||||
this.currentShortcutKeys_ = [];
|
||||
this.lastShortcutKeyTime_ = 0;
|
||||
|
||||
this.linkSelector_ = new LinkSelector();
|
||||
|
||||
// Recurrent sync is setup only when the GUI is started. In
|
||||
// a regular command it's not necessary since the process
|
||||
// exits right away.
|
||||
@@ -134,7 +141,7 @@ class AppGui {
|
||||
const item = folderList.currentItem;
|
||||
|
||||
if (item === '-') {
|
||||
let newIndex = event.currentIndex + (event.previousIndex < event.currentIndex ? +1 : -1);
|
||||
const newIndex = event.currentIndex + (event.previousIndex < event.currentIndex ? +1 : -1);
|
||||
let nextItem = folderList.itemAt(newIndex);
|
||||
if (!nextItem) nextItem = folderList.itemAt(event.previousIndex);
|
||||
|
||||
@@ -186,7 +193,7 @@ class AppGui {
|
||||
borderRightWidth: 1,
|
||||
};
|
||||
noteList.on('currentItemChange', async () => {
|
||||
let note = noteList.currentItem;
|
||||
const note = noteList.currentItem;
|
||||
this.store_.dispatch({
|
||||
type: 'NOTE_SELECT',
|
||||
id: note ? note.id : null,
|
||||
@@ -243,9 +250,9 @@ class AppGui {
|
||||
|
||||
const hLayout = new HLayoutWidget();
|
||||
hLayout.name = 'hLayout';
|
||||
hLayout.addChild(folderList, { type: 'stretch', factor: 1 });
|
||||
hLayout.addChild(noteList, { type: 'stretch', factor: 1 });
|
||||
hLayout.addChild(noteLayout, { type: 'stretch', factor: 2 });
|
||||
hLayout.addChild(folderList, { type: 'stretch', factor: Setting.value('layout.folderList.factor') });
|
||||
hLayout.addChild(noteList, { type: 'stretch', factor: Setting.value('layout.noteList.factor') });
|
||||
hLayout.addChild(noteLayout, { type: 'stretch', factor: Setting.value('layout.note.factor') });
|
||||
|
||||
const vLayout = new VLayoutWidget();
|
||||
vLayout.name = 'vLayout';
|
||||
@@ -338,7 +345,7 @@ class AppGui {
|
||||
|
||||
if (consoleWidget.isMaximized__ === doMaximize) return;
|
||||
|
||||
let constraints = {
|
||||
const constraints = {
|
||||
type: 'stretch',
|
||||
factor: !doMaximize ? 1 : 4,
|
||||
};
|
||||
@@ -415,10 +422,10 @@ class AppGui {
|
||||
async handleModelAction(action) {
|
||||
this.logger().info('Action:', action);
|
||||
|
||||
let state = Object.assign({}, defaultState);
|
||||
const state = Object.assign({}, defaultState);
|
||||
state.notes = this.widget('noteList').items;
|
||||
|
||||
let newState = reducer(state, action);
|
||||
const newState = reducer(state, action);
|
||||
|
||||
if (newState !== state) {
|
||||
this.widget('noteList').items = newState.notes;
|
||||
@@ -454,6 +461,30 @@ class AppGui {
|
||||
} else {
|
||||
this.stdout(_('Please select the note or notebook to be deleted first.'));
|
||||
}
|
||||
} else if (cmd === 'next_link' || cmd === 'previous_link') {
|
||||
const noteText = this.widget('noteText');
|
||||
|
||||
noteText.render();
|
||||
|
||||
if (cmd === 'next_link') this.linkSelector_.changeLink(noteText, 1);
|
||||
else this.linkSelector_.changeLink(noteText, -1);
|
||||
|
||||
this.linkSelector_.scrollWidget(noteText);
|
||||
|
||||
const cursorOffsetX = this.widget('mainWindow').width - noteText.innerWidth - 8;
|
||||
const cursorOffsetY = 1 - noteText.scrollTop_;
|
||||
|
||||
if (this.linkSelector_.link) {
|
||||
this.term_.moveTo(
|
||||
this.linkSelector_.noteX + cursorOffsetX,
|
||||
this.linkSelector_.noteY + cursorOffsetY
|
||||
);
|
||||
shim.setTimeout(() => this.term_.term().inverse(this.linkSelector_.link), 50);
|
||||
}
|
||||
} else if (cmd === 'open_link') {
|
||||
if (this.widget('noteText').hasFocus) {
|
||||
this.linkSelector_.openLink(this.widget('noteText'));
|
||||
}
|
||||
} else if (cmd === 'toggle_console') {
|
||||
if (!this.consoleIsShown()) {
|
||||
this.showConsole();
|
||||
@@ -485,9 +516,9 @@ class AppGui {
|
||||
// this.logger().debug('Got command: ' + cmd);
|
||||
|
||||
try {
|
||||
let note = this.widget('noteList').currentItem;
|
||||
let folder = this.widget('folderList').currentItem;
|
||||
let args = splitCommandString(cmd);
|
||||
const note = this.widget('noteList').currentItem;
|
||||
const folder = this.widget('folderList').currentItem;
|
||||
const args = splitCommandString(cmd);
|
||||
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
if (args[i] == '$n') {
|
||||
@@ -548,7 +579,7 @@ class AppGui {
|
||||
stdout(text) {
|
||||
if (text === null || text === undefined) return;
|
||||
|
||||
let lines = text.split('\n');
|
||||
const lines = text.split('\n');
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
const v = typeof lines[i] === 'object' ? JSON.stringify(lines[i]) : lines[i];
|
||||
this.widget('console').addLine(v);
|
||||
@@ -626,7 +657,7 @@ class AppGui {
|
||||
|
||||
if (link.type === 'item') {
|
||||
const itemId = link.id;
|
||||
let item = await BaseItem.loadItemById(itemId);
|
||||
const item = await BaseItem.loadItemById(itemId);
|
||||
if (!item) throw new Error(`No item with ID ${itemId}`); // Should be nearly impossible
|
||||
|
||||
if (item.type_ === BaseModel.TYPE_RESOURCE) {
|
||||
@@ -750,7 +781,7 @@ class AppGui {
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
const shortcutKey = this.currentShortcutKeys_.join('');
|
||||
let keymapItem = this.keymapItemByKey(shortcutKey);
|
||||
const keymapItem = this.keymapItemByKey(shortcutKey);
|
||||
|
||||
// If this command is an alias to another command, resolve to the actual command
|
||||
|
||||
@@ -766,7 +797,7 @@ class AppGui {
|
||||
if (keymapItem.type === 'function') {
|
||||
this.processFunctionCommand(keymapItem.command);
|
||||
} else if (keymapItem.type === 'prompt') {
|
||||
let promptOptions = {};
|
||||
const promptOptions = {};
|
||||
if ('cursorPosition' in keymapItem) promptOptions.cursorPosition = keymapItem.cursorPosition;
|
||||
const commandString = await statusBar.prompt(keymapItem.command ? keymapItem.command : '', null, promptOptions);
|
||||
this.addCommandToConsole(commandString);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const { BaseApplication } = require('lib/BaseApplication');
|
||||
const BaseApplication = require('lib/BaseApplication').default;
|
||||
const { FoldersScreenUtils } = require('lib/folders-screen-utils.js');
|
||||
const ResourceService = require('lib/services/ResourceService');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
@@ -6,14 +6,15 @@ const Folder = require('lib/models/Folder.js');
|
||||
const BaseItem = require('lib/models/BaseItem.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const { reg } = require('lib/registry.js');
|
||||
const { fileExtension } = require('lib/path-utils.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const fs = require('fs-extra');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
const Cache = require('lib/Cache');
|
||||
const RevisionService = require('lib/services/RevisionService');
|
||||
const shim = require('lib/shim').default;
|
||||
|
||||
class Application extends BaseApplication {
|
||||
constructor() {
|
||||
@@ -47,7 +48,7 @@ class Application extends BaseApplication {
|
||||
}
|
||||
|
||||
async loadItem(type, pattern, options = null) {
|
||||
let output = await this.loadItems(type, pattern, options);
|
||||
const output = await this.loadItems(type, pattern, options);
|
||||
|
||||
if (output.length > 1) {
|
||||
// output.sort((a, b) => { return a.user_updated_time < b.user_updated_time ? +1 : -1; });
|
||||
@@ -144,7 +145,7 @@ class Application extends BaseApplication {
|
||||
if (options.type === 'boolean') {
|
||||
if (answer === null) return false; // Pressed ESCAPE
|
||||
if (!answer) answer = options.answers[0];
|
||||
let positiveIndex = options.booleanAnswerDefault == 'y' ? 0 : 1;
|
||||
const positiveIndex = options.booleanAnswerDefault == 'y' ? 0 : 1;
|
||||
return answer.toLowerCase() === options.answers[positiveIndex].toLowerCase();
|
||||
} else {
|
||||
return answer;
|
||||
@@ -161,7 +162,7 @@ class Application extends BaseApplication {
|
||||
};
|
||||
|
||||
// Give it a few seconds to cancel otherwise exit anyway
|
||||
setTimeout(async () => {
|
||||
shim.setTimeout(async () => {
|
||||
await doExit();
|
||||
}, 5000);
|
||||
|
||||
@@ -181,7 +182,7 @@ class Application extends BaseApplication {
|
||||
const ext = fileExtension(path);
|
||||
if (ext != 'js') return;
|
||||
|
||||
let CommandClass = require(`./${path}`);
|
||||
const CommandClass = require(`./${path}`);
|
||||
let cmd = new CommandClass();
|
||||
if (!cmd.enabled()) return;
|
||||
cmd = this.setupCommand(cmd);
|
||||
@@ -192,8 +193,8 @@ class Application extends BaseApplication {
|
||||
}
|
||||
|
||||
if (uiType !== null) {
|
||||
let temp = [];
|
||||
for (let n in this.commands_) {
|
||||
const temp = [];
|
||||
for (const n in this.commands_) {
|
||||
if (!this.commands_.hasOwnProperty(n)) continue;
|
||||
const c = this.commands_[n];
|
||||
if (!c.supportsUi(uiType)) continue;
|
||||
@@ -207,8 +208,8 @@ class Application extends BaseApplication {
|
||||
|
||||
async commandNames() {
|
||||
const metadata = await this.commandMetadata();
|
||||
let output = [];
|
||||
for (let n in metadata) {
|
||||
const output = [];
|
||||
for (const n in metadata) {
|
||||
if (!metadata.hasOwnProperty(n)) continue;
|
||||
output.push(n);
|
||||
}
|
||||
@@ -227,7 +228,7 @@ class Application extends BaseApplication {
|
||||
const commands = this.commands();
|
||||
|
||||
output = {};
|
||||
for (let n in commands) {
|
||||
for (const n in commands) {
|
||||
if (!commands.hasOwnProperty(n)) continue;
|
||||
const cmd = commands[n];
|
||||
output[n] = cmd.metadata();
|
||||
@@ -251,7 +252,7 @@ class Application extends BaseApplication {
|
||||
CommandClass = require(`${__dirname}/command-${name}.js`);
|
||||
} catch (error) {
|
||||
if (error.message && error.message.indexOf('Cannot find module') >= 0) {
|
||||
let e = new Error(_('No such command: %s', name));
|
||||
const e = new Error(_('No such command: %s', name));
|
||||
e.type = 'notFound';
|
||||
throw e;
|
||||
} else {
|
||||
@@ -324,6 +325,9 @@ class Application extends BaseApplication {
|
||||
{ keys: ['PAGE_DOWN'], type: 'function', command: 'page_down' },
|
||||
{ keys: ['ENTER'], type: 'function', command: 'activate' },
|
||||
{ keys: ['DELETE', 'BACKSPACE'], type: 'function', command: 'delete' },
|
||||
{ keys: ['n'], type: 'function', command: 'next_link' },
|
||||
{ keys: ['b'], type: 'function', command: 'previous_link' },
|
||||
{ keys: ['o'], type: 'function', command: 'open_link' },
|
||||
{ keys: [' '], command: 'todo toggle $n' },
|
||||
{ keys: ['tc'], type: 'function', command: 'toggle_console' },
|
||||
{ keys: ['tm'], type: 'function', command: 'toggle_metadata' },
|
||||
@@ -362,7 +366,7 @@ class Application extends BaseApplication {
|
||||
}
|
||||
|
||||
const output = [];
|
||||
for (let n in itemsByCommand) {
|
||||
for (const n in itemsByCommand) {
|
||||
if (!itemsByCommand.hasOwnProperty(n)) continue;
|
||||
output.push(itemsByCommand[n]);
|
||||
}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
var { app } = require('./app.js');
|
||||
var Note = require('lib/models/Note.js');
|
||||
var Folder = require('lib/models/Folder.js');
|
||||
var Tag = require('lib/models/Tag.js');
|
||||
var { cliUtils } = require('./cli-utils.js');
|
||||
var yargParser = require('yargs-parser');
|
||||
var fs = require('fs-extra');
|
||||
const { app } = require('./app.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
const yargParser = require('yargs-parser');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
async function handleAutocompletionPromise(line) {
|
||||
// Auto-complete the command name
|
||||
const names = await app().commandNames();
|
||||
let words = getArguments(line);
|
||||
const words = getArguments(line);
|
||||
// If there is only one word and it is not already a command name then you
|
||||
// should look for commands it could be
|
||||
if (words.length == 1) {
|
||||
if (names.indexOf(words[0]) === -1) {
|
||||
let x = names.filter(n => n.indexOf(words[0]) === 0);
|
||||
const x = names.filter(n => n.indexOf(words[0]) === 0);
|
||||
if (x.length === 1) {
|
||||
return `${x[0]} `;
|
||||
}
|
||||
@@ -36,8 +36,8 @@ async function handleAutocompletionPromise(line) {
|
||||
}
|
||||
|
||||
// complete an option
|
||||
let next = words.length > 1 ? words[words.length - 1] : '';
|
||||
let l = [];
|
||||
const next = words.length > 1 ? words[words.length - 1] : '';
|
||||
const l = [];
|
||||
if (next[0] === '-') {
|
||||
for (let i = 0; i < metadata.options.length; i++) {
|
||||
const options = metadata.options[i][0].split(' ');
|
||||
@@ -60,7 +60,7 @@ async function handleAutocompletionPromise(line) {
|
||||
if (l.length === 0) {
|
||||
return line;
|
||||
}
|
||||
let ret = l.map(a => toCommandLine(a));
|
||||
const ret = l.map(a => toCommandLine(a));
|
||||
ret.prefix = `${toCommandLine(words.slice(0, -1))} `;
|
||||
return ret;
|
||||
}
|
||||
@@ -69,7 +69,7 @@ async function handleAutocompletionPromise(line) {
|
||||
// words that don't start with a - less one for the command name
|
||||
const positionalArgs = words.filter(a => a.indexOf('-') !== 0).length - 1;
|
||||
|
||||
let cmdUsage = yargParser(metadata.usage)['_'];
|
||||
const cmdUsage = yargParser(metadata.usage)['_'];
|
||||
cmdUsage.splice(0, 1);
|
||||
|
||||
if (cmdUsage.length >= positionalArgs) {
|
||||
@@ -95,29 +95,29 @@ async function handleAutocompletionPromise(line) {
|
||||
}
|
||||
|
||||
if (argName == 'tag') {
|
||||
let tags = await Tag.search({ titlePattern: `${next}*` });
|
||||
const tags = await Tag.search({ titlePattern: `${next}*` });
|
||||
l.push(...tags.map(n => n.title));
|
||||
}
|
||||
|
||||
if (argName == 'file') {
|
||||
let files = await fs.readdir('.');
|
||||
const files = await fs.readdir('.');
|
||||
l.push(...files);
|
||||
}
|
||||
|
||||
if (argName == 'tag-command') {
|
||||
let c = filterList(['add', 'remove', 'list', 'notetags'], next);
|
||||
const c = filterList(['add', 'remove', 'list', 'notetags'], next);
|
||||
l.push(...c);
|
||||
}
|
||||
|
||||
if (argName == 'todo-command') {
|
||||
let c = filterList(['toggle', 'clear'], next);
|
||||
const c = filterList(['toggle', 'clear'], next);
|
||||
l.push(...c);
|
||||
}
|
||||
}
|
||||
if (l.length === 1) {
|
||||
return toCommandLine([...words.slice(0, -1), l[0]]);
|
||||
} else if (l.length > 1) {
|
||||
let ret = l.map(a => toCommandLine(a));
|
||||
const ret = l.map(a => toCommandLine(a));
|
||||
ret.prefix = `${toCommandLine(words.slice(0, -1))} `;
|
||||
return ret;
|
||||
}
|
||||
@@ -155,7 +155,7 @@ function getArguments(line) {
|
||||
let inSingleQuotes = false;
|
||||
let inDoubleQuotes = false;
|
||||
let currentWord = '';
|
||||
let parsed = [];
|
||||
const parsed = [];
|
||||
for (let i = 0; i < line.length; i++) {
|
||||
if (line[i] === '"') {
|
||||
if (inDoubleQuotes) {
|
||||
@@ -192,7 +192,7 @@ function getArguments(line) {
|
||||
return parsed;
|
||||
}
|
||||
function filterList(list, next) {
|
||||
let output = [];
|
||||
const output = [];
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
if (list[i].indexOf(next) !== 0) continue;
|
||||
output.push(list[i]);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const { reg } = require('lib/registry.js');
|
||||
|
||||
class BaseCommand {
|
||||
@@ -50,7 +50,7 @@ class BaseCommand {
|
||||
async cancel() {}
|
||||
|
||||
name() {
|
||||
let r = this.usage().split(' ');
|
||||
const r = this.usage().split(' ');
|
||||
return r[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const fs = require('fs-extra');
|
||||
const { fileExtension, dirname } = require('lib/path-utils.js');
|
||||
const wrap_ = require('word-wrap');
|
||||
const { languageCode } = require('lib/locale.js');
|
||||
const { languageCode } = require('lib/locale');
|
||||
|
||||
const rootDir = dirname(dirname(__dirname));
|
||||
const MAX_WIDTH = 78;
|
||||
@@ -15,11 +15,11 @@ function wrap(text, indent) {
|
||||
}
|
||||
|
||||
function renderOptions(options) {
|
||||
let output = [];
|
||||
const output = [];
|
||||
const optionColWidth = getOptionColWidth(options);
|
||||
|
||||
for (let i = 0; i < options.length; i++) {
|
||||
let option = options[i];
|
||||
const option = options[i];
|
||||
const flag = option[0];
|
||||
const indent = INDENT + INDENT + ' '.repeat(optionColWidth + 2);
|
||||
|
||||
@@ -33,7 +33,7 @@ function renderOptions(options) {
|
||||
}
|
||||
|
||||
function renderCommand(cmd) {
|
||||
let output = [];
|
||||
const output = [];
|
||||
output.push(INDENT + cmd.usage());
|
||||
output.push('');
|
||||
output.push(wrap(cmd.description(), INDENT + INDENT));
|
||||
@@ -48,14 +48,14 @@ function renderCommand(cmd) {
|
||||
}
|
||||
|
||||
function getCommands() {
|
||||
let output = [];
|
||||
const output = [];
|
||||
fs.readdirSync(__dirname).forEach(path => {
|
||||
if (path.indexOf('command-') !== 0) return;
|
||||
const ext = fileExtension(path);
|
||||
if (ext != 'js') return;
|
||||
|
||||
let CommandClass = require(`./${path}`);
|
||||
let cmd = new CommandClass();
|
||||
const CommandClass = require(`./${path}`);
|
||||
const cmd = new CommandClass();
|
||||
if (!cmd.enabled()) return;
|
||||
if (cmd.hidden()) return;
|
||||
output.push(cmd);
|
||||
@@ -73,7 +73,7 @@ function getOptionColWidth(options) {
|
||||
}
|
||||
|
||||
function getHeader() {
|
||||
let output = [];
|
||||
const output = [];
|
||||
|
||||
output.push('NAME');
|
||||
output.push('');
|
||||
@@ -84,7 +84,7 @@ function getHeader() {
|
||||
output.push('DESCRIPTION');
|
||||
output.push('');
|
||||
|
||||
let description = [];
|
||||
const description = [];
|
||||
description.push('Joplin is a note taking and to-do application, which can handle a large number of notes organised into notebooks.');
|
||||
description.push('The notes are searchable, can be copied, tagged and modified with your own text editor.');
|
||||
description.push('\n\n');
|
||||
@@ -98,7 +98,7 @@ function getHeader() {
|
||||
}
|
||||
|
||||
function getFooter() {
|
||||
let output = [];
|
||||
const output = [];
|
||||
|
||||
output.push('WEBSITE');
|
||||
output.push('');
|
||||
@@ -120,10 +120,10 @@ async function main() {
|
||||
// setLocale('fr_FR');
|
||||
|
||||
const commands = getCommands();
|
||||
let commandBlocks = [];
|
||||
const commandBlocks = [];
|
||||
|
||||
for (let i = 0; i < commands.length; i++) {
|
||||
let cmd = commands[i];
|
||||
const cmd = commands[i];
|
||||
commandBlocks.push(renderCommand(cmd));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs-extra');
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const Logger = require('lib/Logger').default;
|
||||
const { dirname } = require('lib/path-utils.js');
|
||||
const { DatabaseDriverNode } = require('lib/database-driver-node.js');
|
||||
const { JoplinDatabase } = require('lib/joplin-database.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const { sprintf } = require('sprintf-js');
|
||||
const exec = require('child_process').exec;
|
||||
|
||||
@@ -40,8 +40,8 @@ function createClient(id) {
|
||||
const client = createClient(1);
|
||||
|
||||
function execCommand(client, command) {
|
||||
let exePath = `node ${joplinAppPath}`;
|
||||
let cmd = `${exePath} --update-geolocation-disabled --env dev --profile ${client.profileDir} ${command}`;
|
||||
const exePath = `node ${joplinAppPath}`;
|
||||
const cmd = `${exePath} --update-geolocation-disabled --env dev --profile ${client.profileDir} ${command}`;
|
||||
logger.info(`${client.id}: ${command}`);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -129,8 +129,8 @@ testUnits.testCat = async () => {
|
||||
await execCommand(client, 'mkbook nb1');
|
||||
await execCommand(client, 'mknote mynote');
|
||||
|
||||
let folder = await Folder.loadByTitle('nb1');
|
||||
let note = await Note.loadFolderNoteByField(folder.id, 'title', 'mynote');
|
||||
const folder = await Folder.loadByTitle('nb1');
|
||||
const note = await Note.loadFolderNoteByField(folder.id, 'title', 'mynote');
|
||||
|
||||
let r = await execCommand(client, 'cat mynote');
|
||||
assertTrue(r.indexOf('mynote') >= 0);
|
||||
@@ -149,7 +149,7 @@ testUnits.testConfig = async () => {
|
||||
await Setting.load();
|
||||
assertEquals('subl', Setting.value('editor'));
|
||||
|
||||
let r = await execCommand(client, 'config');
|
||||
const r = await execCommand(client, 'config');
|
||||
assertTrue(r.indexOf('editor') >= 0);
|
||||
assertTrue(r.indexOf('subl') >= 0);
|
||||
};
|
||||
@@ -161,14 +161,14 @@ testUnits.testCp = async () => {
|
||||
|
||||
await execCommand(client, 'cp n1');
|
||||
|
||||
let f1 = await Folder.loadByTitle('nb1');
|
||||
let f2 = await Folder.loadByTitle('nb2');
|
||||
const f1 = await Folder.loadByTitle('nb1');
|
||||
const f2 = await Folder.loadByTitle('nb2');
|
||||
let notes = await Note.previews(f1.id);
|
||||
|
||||
assertEquals(2, notes.length);
|
||||
|
||||
await execCommand(client, 'cp n1 nb2');
|
||||
let notesF1 = await Note.previews(f1.id);
|
||||
const notesF1 = await Note.previews(f1.id);
|
||||
assertEquals(2, notesF1.length);
|
||||
notes = await Note.previews(f2.id);
|
||||
assertEquals(1, notes.length);
|
||||
@@ -179,7 +179,7 @@ testUnits.testLs = async () => {
|
||||
await execCommand(client, 'mkbook nb1');
|
||||
await execCommand(client, 'mknote note1');
|
||||
await execCommand(client, 'mknote note2');
|
||||
let r = await execCommand(client, 'ls');
|
||||
const r = await execCommand(client, 'ls');
|
||||
|
||||
assertTrue(r.indexOf('note1') >= 0);
|
||||
assertTrue(r.indexOf('note2') >= 0);
|
||||
@@ -191,8 +191,8 @@ testUnits.testMv = async () => {
|
||||
await execCommand(client, 'mknote n1');
|
||||
await execCommand(client, 'mv n1 nb2');
|
||||
|
||||
let f1 = await Folder.loadByTitle('nb1');
|
||||
let f2 = await Folder.loadByTitle('nb2');
|
||||
const f1 = await Folder.loadByTitle('nb1');
|
||||
const f2 = await Folder.loadByTitle('nb2');
|
||||
let notes1 = await Note.previews(f1.id);
|
||||
let notes2 = await Note.previews(f2.id);
|
||||
|
||||
@@ -218,18 +218,18 @@ async function main() {
|
||||
logger.info(await execCommand(client, 'version'));
|
||||
|
||||
await db.open({ name: `${client.profileDir}/database.sqlite` });
|
||||
BaseModel.db_ = db;
|
||||
BaseModel.setDb(db);
|
||||
await Setting.load();
|
||||
|
||||
let onlyThisTest = 'testMv';
|
||||
onlyThisTest = '';
|
||||
|
||||
for (let n in testUnits) {
|
||||
for (const n in testUnits) {
|
||||
if (!testUnits.hasOwnProperty(n)) continue;
|
||||
if (onlyThisTest && n != onlyThisTest) continue;
|
||||
|
||||
await clearDatabase();
|
||||
let testName = n.substr(4).toLowerCase();
|
||||
const testName = n.substr(4).toLowerCase();
|
||||
process.stdout.write(`${testName}: `);
|
||||
await testUnits[n]();
|
||||
console.info('');
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
const yargParser = require('yargs-parser');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const stringPadding = require('string-padding');
|
||||
const Logger = require('lib/Logger').default;
|
||||
|
||||
const cliUtils = {};
|
||||
|
||||
@@ -11,27 +12,27 @@ cliUtils.printArray = function(logFunction, rows) {
|
||||
const ALIGN_LEFT = 0;
|
||||
const ALIGN_RIGHT = 1;
|
||||
|
||||
let colWidths = [];
|
||||
let colAligns = [];
|
||||
const colWidths = [];
|
||||
const colAligns = [];
|
||||
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
let row = rows[i];
|
||||
const row = rows[i];
|
||||
|
||||
for (let j = 0; j < row.length; j++) {
|
||||
let item = row[j];
|
||||
let width = item ? item.toString().length : 0;
|
||||
let align = typeof item == 'number' ? ALIGN_RIGHT : ALIGN_LEFT;
|
||||
const item = row[j];
|
||||
const width = item ? item.toString().length : 0;
|
||||
const align = typeof item == 'number' ? ALIGN_RIGHT : ALIGN_LEFT;
|
||||
if (!colWidths[j] || colWidths[j] < width) colWidths[j] = width;
|
||||
if (colAligns.length <= j) colAligns[j] = align;
|
||||
}
|
||||
}
|
||||
|
||||
for (let row = 0; row < rows.length; row++) {
|
||||
let line = [];
|
||||
const line = [];
|
||||
for (let col = 0; col < colWidths.length; col++) {
|
||||
let item = rows[row][col];
|
||||
let width = colWidths[col];
|
||||
let dir = colAligns[col] == ALIGN_LEFT ? stringPadding.RIGHT : stringPadding.LEFT;
|
||||
const item = rows[row][col];
|
||||
const width = colWidths[col];
|
||||
const dir = colAligns[col] == ALIGN_LEFT ? stringPadding.RIGHT : stringPadding.LEFT;
|
||||
line.push(stringPadding(item, width, ' ', dir));
|
||||
}
|
||||
logFunction(line.join(' '));
|
||||
@@ -39,7 +40,7 @@ cliUtils.printArray = function(logFunction, rows) {
|
||||
};
|
||||
|
||||
cliUtils.parseFlags = function(flags) {
|
||||
let output = {};
|
||||
const output = {};
|
||||
flags = flags.split(',');
|
||||
for (let i = 0; i < flags.length; i++) {
|
||||
let f = flags[i].trim();
|
||||
@@ -76,11 +77,11 @@ cliUtils.parseCommandArg = function(arg) {
|
||||
cliUtils.makeCommandArgs = function(cmd, argv) {
|
||||
let cmdUsage = cmd.usage();
|
||||
cmdUsage = yargParser(cmdUsage);
|
||||
let output = {};
|
||||
const output = {};
|
||||
|
||||
let options = cmd.options();
|
||||
let booleanFlags = [];
|
||||
let aliases = {};
|
||||
const options = cmd.options();
|
||||
const booleanFlags = [];
|
||||
const aliases = {};
|
||||
for (let i = 0; i < options.length; i++) {
|
||||
if (options[i].length != 2) throw new Error(`Invalid options: ${options[i]}`);
|
||||
let flags = options[i][0];
|
||||
@@ -97,7 +98,7 @@ cliUtils.makeCommandArgs = function(cmd, argv) {
|
||||
}
|
||||
}
|
||||
|
||||
let args = yargParser(argv, {
|
||||
const args = yargParser(argv, {
|
||||
boolean: booleanFlags,
|
||||
alias: aliases,
|
||||
string: ['_'],
|
||||
@@ -113,8 +114,8 @@ cliUtils.makeCommandArgs = function(cmd, argv) {
|
||||
}
|
||||
}
|
||||
|
||||
let argOptions = {};
|
||||
for (let key in args) {
|
||||
const argOptions = {};
|
||||
for (const key in args) {
|
||||
if (!args.hasOwnProperty(key)) continue;
|
||||
if (key == '_') continue;
|
||||
argOptions[key] = args[key];
|
||||
@@ -134,7 +135,7 @@ cliUtils.promptMcq = function(message, answers) {
|
||||
});
|
||||
|
||||
message += '\n\n';
|
||||
for (let n in answers) {
|
||||
for (const n in answers) {
|
||||
if (!answers.hasOwnProperty(n)) continue;
|
||||
message += `${_('%s: %s', n, answers[n])}\n`;
|
||||
}
|
||||
@@ -245,4 +246,17 @@ cliUtils.redrawDone = function() {
|
||||
redrawStarted_ = false;
|
||||
};
|
||||
|
||||
cliUtils.stdoutLogger = function(stdout) {
|
||||
const stdoutFn = (...s) => stdout(s.join(' '));
|
||||
|
||||
const logger = new Logger();
|
||||
logger.addTarget('console', { console: {
|
||||
info: stdoutFn,
|
||||
warn: stdoutFn,
|
||||
error: stdoutFn,
|
||||
} });
|
||||
|
||||
return logger;
|
||||
};
|
||||
|
||||
module.exports = { cliUtils };
|
||||
@@ -3,7 +3,7 @@ const BaseItem = require('lib/models/BaseItem');
|
||||
const BaseModel = require('lib/BaseModel');
|
||||
const { toTitleCase } = require('lib/string-utils.js');
|
||||
const { reg } = require('lib/registry.js');
|
||||
const markdownUtils = require('lib/markdownUtils');
|
||||
const markdownUtils = require('lib/markdownUtils').default;
|
||||
const { Database } = require('lib/database.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -15,6 +15,10 @@ class Command extends BaseCommand {
|
||||
return 'Build the API doc';
|
||||
}
|
||||
|
||||
enabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
createPropertiesTable(tableFields) {
|
||||
const headers = [
|
||||
{ name: 'name', label: 'Name' },
|
||||
@@ -49,10 +53,9 @@ class Command extends BaseCommand {
|
||||
|
||||
const lines = [];
|
||||
|
||||
lines.push('# Joplin API');
|
||||
lines.push('# Joplin Data API');
|
||||
lines.push('');
|
||||
|
||||
lines.push('When the Web Clipper service is enabled, Joplin exposes a [REST API](https://en.wikipedia.org/wiki/Representational_state_transfer) which allows third-party applications to access Joplin\'s data and to create, modify or delete notes, notebooks, resources or tags.');
|
||||
lines.push('This API is available when the clipper server is running. It provides access to the notes, notebooks, tags and other Joplin object via a REST API. Plugins can also access this API even when the clipper server is not running.');
|
||||
lines.push('');
|
||||
lines.push('In order to use it, you\'ll first need to find on which port the service is running. To do so, open the Web Clipper Options in Joplin and if the service is running it should tell you on which port. Normally it runs on port **41184**. If you want to find it programmatically, you may follow this kind of algorithm:');
|
||||
lines.push('');
|
||||
@@ -287,7 +290,7 @@ class Command extends BaseCommand {
|
||||
lines.push('');
|
||||
lines.push('### Creating a note with a specific ID');
|
||||
lines.push('');
|
||||
lines.push('When a new note is created, it is automatically assigned a new unique ID so **normally you do not need to set the ID**. However, if for some reason you want to set it, you can supply it as the `id` property. It needs to be a 32 characters long hexadecimal string. **Make sure it is unique**, for example by generating it using whatever GUID function is available in your programming language.');
|
||||
lines.push('When a new note is created, it is automatically assigned a new unique ID so **normally you do not need to set the ID**. However, if for some reason you want to set it, you can supply it as the `id` property. It needs to be a **32 characters long string** in hexadecimal. **Make sure it is unique**, for example by generating it using whatever GUID function is available in your programming language.');
|
||||
lines.push('');
|
||||
lines.push(' curl --data \'{ "id": "00a87474082744c1a8515da6aa5792d2", "title": "My note with custom ID"}\' http://127.0.0.1:41184/notes');
|
||||
lines.push('');
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const { shim } = require('lib/shim.js');
|
||||
const shim = require('lib/shim').default;
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
@@ -14,9 +14,9 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let title = args['note'];
|
||||
const title = args['note'];
|
||||
|
||||
let note = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
||||
const note = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
||||
this.encryptionCheck(note);
|
||||
if (!note) throw new Error(_('Cannot find "%s".', title));
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const BaseItem = require('lib/models/BaseItem.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -18,20 +19,22 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let title = args['note'];
|
||||
const title = args['note'];
|
||||
|
||||
let item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
||||
const item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
||||
if (!item) throw new Error(_('Cannot find "%s".', title));
|
||||
|
||||
const content = args.options.verbose ? await Note.serialize(item) : await Note.serializeForEdit(item);
|
||||
this.stdout(content);
|
||||
let content = '';
|
||||
|
||||
app()
|
||||
.gui()
|
||||
.showConsole();
|
||||
app()
|
||||
.gui()
|
||||
.maximizeConsole();
|
||||
if (item.encryption_applied) {
|
||||
content = BaseItem.displayTitle(item);
|
||||
} else {
|
||||
content = args.options.verbose ? await Note.serialize(item) : await Note.serializeForEdit(item);
|
||||
}
|
||||
|
||||
this.stdout(content);
|
||||
app().gui().showConsole();
|
||||
app().gui().maximizeConsole();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { _, setLocale } = require('lib/locale.js');
|
||||
const { _, setLocale } = require('lib/locale');
|
||||
const { app } = require('./app.js');
|
||||
const fs = require('fs-extra');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
@@ -35,7 +35,7 @@ class Command extends BaseCommand {
|
||||
});
|
||||
|
||||
inputStream.on('end', () => {
|
||||
let json = chunks.join('');
|
||||
const json = chunks.join('');
|
||||
let settingsObj;
|
||||
try {
|
||||
settingsObj = JSON.parse(json);
|
||||
@@ -83,7 +83,7 @@ class Command extends BaseCommand {
|
||||
};
|
||||
|
||||
if (isExport || (!isImport && !args.value)) {
|
||||
let keys = Setting.keys(!verbose, 'cli');
|
||||
const keys = Setting.keys(!verbose, 'cli');
|
||||
keys.sort();
|
||||
|
||||
if (isExport) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
|
||||
@@ -18,15 +18,15 @@ class Command extends BaseCommand {
|
||||
|
||||
async action() {
|
||||
let items = [];
|
||||
let folders = await Folder.all();
|
||||
const folders = await Folder.all();
|
||||
for (let i = 0; i < folders.length; i++) {
|
||||
let folder = folders[i];
|
||||
let notes = await Note.previews(folder.id);
|
||||
const folder = folders[i];
|
||||
const notes = await Note.previews(folder.id);
|
||||
items.push(folder);
|
||||
items = items.concat(notes);
|
||||
}
|
||||
|
||||
let tags = await Tag.all();
|
||||
const tags = await Tag.all();
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
tags[i].notes_ = await Tag.noteIds(tags[i].id);
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const EncryptionService = require('lib/services/EncryptionService');
|
||||
const DecryptionWorker = require('lib/services/DecryptionWorker');
|
||||
const BaseItem = require('lib/models/BaseItem');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { shim } = require('lib/shim');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const shim = require('lib/shim').default;
|
||||
const pathUtils = require('lib/path-utils.js');
|
||||
const imageType = require('image-type');
|
||||
const readChunk = require('read-chunk');
|
||||
@@ -24,12 +24,11 @@ class Command extends BaseCommand {
|
||||
['-p, --password <password>', 'Use this password as master password (For security reasons, it is not recommended to use this option).'],
|
||||
['-v, --verbose', 'More verbose output for the `target-status` command'],
|
||||
['-o, --output <directory>', 'Output directory'],
|
||||
['--retry-failed-items', 'Applies to `decrypt` command - retries decrypting items that previously could not be decrypted.'],
|
||||
];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
// change-password
|
||||
|
||||
const options = args.options;
|
||||
|
||||
const askForMasterKey = async error => {
|
||||
@@ -39,11 +38,36 @@ class Command extends BaseCommand {
|
||||
this.stdout(_('Operation cancelled'));
|
||||
return false;
|
||||
}
|
||||
Setting.setObjectKey('encryption.passwordCache', masterKeyId, password);
|
||||
Setting.setObjectValue('encryption.passwordCache', masterKeyId, password);
|
||||
await EncryptionService.instance().loadMasterKeysFromSettings();
|
||||
return true;
|
||||
};
|
||||
|
||||
const startDecryption = async () => {
|
||||
this.stdout(_('Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.'));
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
const result = await DecryptionWorker.instance().start();
|
||||
const line = [];
|
||||
line.push(_('Decrypted items: %d', result.decryptedItemCount));
|
||||
if (result.skippedItemCount) line.push(_('Skipped items: %d (use --retry-failed-items to retry decrypting them)', result.skippedItemCount));
|
||||
this.stdout(line.join('\n'));
|
||||
break;
|
||||
} catch (error) {
|
||||
if (error.code === 'masterKeyNotLoaded') {
|
||||
const ok = await askForMasterKey(error);
|
||||
if (!ok) return;
|
||||
continue;
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
this.stdout(_('Completed decryption.'));
|
||||
};
|
||||
|
||||
if (args.command === 'enable') {
|
||||
const password = options.password ? options.password.toString() : await this.prompt(_('Enter master password:'), { type: 'string', secure: true });
|
||||
if (!password) {
|
||||
@@ -73,24 +97,8 @@ class Command extends BaseCommand {
|
||||
const plainText = await EncryptionService.instance().decryptString(args.path);
|
||||
this.stdout(plainText);
|
||||
} else {
|
||||
this.stdout(_('Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.'));
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
await DecryptionWorker.instance().start();
|
||||
break;
|
||||
} catch (error) {
|
||||
if (error.code === 'masterKeyNotLoaded') {
|
||||
const ok = await askForMasterKey(error);
|
||||
if (!ok) return;
|
||||
continue;
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
this.stdout(_('Completed decryption.'));
|
||||
if (args.options['retry-failed-items']) await DecryptionWorker.instance().clearDisabledItems();
|
||||
await startDecryption();
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -138,7 +146,7 @@ class Command extends BaseCommand {
|
||||
if (!targetPath) throw new Error('Please specify the sync target path.');
|
||||
|
||||
const dirPaths = function(targetPath) {
|
||||
let paths = [];
|
||||
const paths = [];
|
||||
fs.readdirSync(targetPath).forEach(path => {
|
||||
paths.push(path);
|
||||
});
|
||||
@@ -151,10 +159,10 @@ class Command extends BaseCommand {
|
||||
let encryptedResourceCount = 0;
|
||||
let otherItemCount = 0;
|
||||
|
||||
let encryptedPaths = [];
|
||||
let decryptedPaths = [];
|
||||
const encryptedPaths = [];
|
||||
const decryptedPaths = [];
|
||||
|
||||
let paths = dirPaths(targetPath);
|
||||
const paths = dirPaths(targetPath);
|
||||
|
||||
for (let i = 0; i < paths.length; i++) {
|
||||
const path = paths[i];
|
||||
@@ -164,7 +172,7 @@ class Command extends BaseCommand {
|
||||
// this.stdout(fullPath);
|
||||
|
||||
if (path === '.resource') {
|
||||
let resourcePaths = dirPaths(fullPath);
|
||||
const resourcePaths = dirPaths(fullPath);
|
||||
for (let j = 0; j < resourcePaths.length; j++) {
|
||||
const resourcePath = resourcePaths[j];
|
||||
resourceCount++;
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
const fs = require('fs-extra');
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { splitCommandString } = require('lib/string-utils.js');
|
||||
const { uuid } = require('lib/uuid.js');
|
||||
const uuid = require('lib/uuid').default;
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -35,7 +35,7 @@ class Command extends BaseCommand {
|
||||
// Load note or create it if it doesn't exist
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
let title = args['note'];
|
||||
const title = args['note'];
|
||||
|
||||
if (!app().currentFolder()) throw new Error(_('No active notebook.'));
|
||||
let note = await app().loadItem(BaseModel.TYPE_NOTE, title);
|
||||
@@ -91,7 +91,7 @@ class Command extends BaseCommand {
|
||||
|
||||
const updatedContent = await fs.readFile(tempFilePath, 'utf8');
|
||||
if (updatedContent !== originalContent) {
|
||||
let updatedNote = await Note.unserializeForEdit(updatedContent);
|
||||
const updatedNote = await Note.unserializeForEdit(updatedContent);
|
||||
updatedNote.id = note.id;
|
||||
await Note.save(updatedNote);
|
||||
this.stdout(_('Note has been saved.'));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const { ReportService } = require('lib/services/report.js');
|
||||
const fs = require('fs-extra');
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const InteropService = require('lib/services/InteropService.js');
|
||||
const InteropService = require('lib/services/interop/InteropService').default;
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
@@ -14,21 +14,23 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
options() {
|
||||
const service = new InteropService();
|
||||
const service = InteropService.instance();
|
||||
const formats = service
|
||||
.modules()
|
||||
.filter(m => m.type === 'exporter')
|
||||
.filter(m => m.type === 'exporter' && m.format !== 'html')
|
||||
.map(m => m.format + (m.description ? ` (${m.description})` : ''));
|
||||
|
||||
return [['--format <format>', _('Destination format: %s', formats.join(', '))], ['--note <note>', _('Exports only the given note.')], ['--notebook <notebook>', _('Exports only the given notebook.')]];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let exportOptions = {};
|
||||
const exportOptions = {};
|
||||
exportOptions.path = args.path;
|
||||
|
||||
exportOptions.format = args.options.format ? args.options.format : 'jex';
|
||||
|
||||
if (exportOptions.format === 'html') throw new Error('HTML export is not supported. Please use the desktop application.');
|
||||
|
||||
if (args.options.note) {
|
||||
const notes = await app().loadItems(BaseModel.TYPE_NOTE, args.options.note, { parent: app().currentFolder() });
|
||||
if (!notes.length) throw new Error(_('Cannot find "%s".', args.options.note));
|
||||
@@ -39,7 +41,7 @@ class Command extends BaseCommand {
|
||||
exportOptions.sourceFolderIds = folders.map(n => n.id);
|
||||
}
|
||||
|
||||
const service = new InteropService();
|
||||
const service = InteropService.instance();
|
||||
const result = await service.export(exportOptions);
|
||||
|
||||
result.warnings.map(w => this.stdout(w));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
@@ -14,9 +14,9 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let title = args['note'];
|
||||
const title = args['note'];
|
||||
|
||||
let item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
||||
const item = await app().loadItem(BaseModel.TYPE_NOTE, title, { parent: app().currentFolder() });
|
||||
if (!item) throw new Error(_('Cannot find "%s".', title));
|
||||
const url = Note.geolocationUrl(item);
|
||||
this.stdout(url);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { renderCommandHelp } = require('./help-utils.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -15,8 +15,8 @@ class Command extends BaseCommand {
|
||||
|
||||
allCommands() {
|
||||
const commands = app().commands(app().uiType());
|
||||
let output = [];
|
||||
for (let n in commands) {
|
||||
const output = [];
|
||||
for (const n in commands) {
|
||||
if (!commands.hasOwnProperty(n)) continue;
|
||||
const command = commands[n];
|
||||
if (command.hidden()) continue;
|
||||
@@ -48,7 +48,7 @@ class Command extends BaseCommand {
|
||||
.gui()
|
||||
.keymap();
|
||||
|
||||
let rows = [];
|
||||
const rows = [];
|
||||
|
||||
for (let i = 0; i < keymap.length; i++) {
|
||||
const item = keymap[i];
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const InteropService = require('lib/services/InteropService.js');
|
||||
const InteropService = require('lib/services/interop/InteropService').default;
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
@@ -15,17 +15,21 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
options() {
|
||||
const service = new InteropService();
|
||||
const service = InteropService.instance();
|
||||
const formats = service
|
||||
.modules()
|
||||
.filter(m => m.type === 'importer')
|
||||
.map(m => m.format);
|
||||
|
||||
return [['--format <format>', _('Source format: %s', ['auto'].concat(formats).join(', '))], ['-f, --force', _('Do not ask for confirmation.')]];
|
||||
return [
|
||||
['--format <format>', _('Source format: %s', ['auto'].concat(formats).join(', '))],
|
||||
['-f, --force', _('Do not ask for confirmation.')],
|
||||
['--output-format <output-format>', _('Output format: %s', 'md, html')],
|
||||
];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let folder = await app().loadItem(BaseModel.TYPE_FOLDER, args.notebook);
|
||||
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args.notebook);
|
||||
|
||||
if (args.notebook && !folder) throw new Error(_('Cannot find "%s".', args.notebook));
|
||||
|
||||
@@ -39,7 +43,7 @@ class Command extends BaseCommand {
|
||||
// onProgress/onError supported by Enex import only
|
||||
|
||||
importOptions.onProgress = progressState => {
|
||||
let line = [];
|
||||
const line = [];
|
||||
line.push(_('Found: %d.', progressState.loaded));
|
||||
line.push(_('Created: %d.', progressState.created));
|
||||
if (progressState.updated) line.push(_('Updated: %d.', progressState.updated));
|
||||
@@ -51,15 +55,15 @@ class Command extends BaseCommand {
|
||||
};
|
||||
|
||||
importOptions.onError = error => {
|
||||
let s = error.trace ? error.trace : error.toString();
|
||||
const s = error.trace ? error.trace : error.toString();
|
||||
this.stdout(s);
|
||||
};
|
||||
|
||||
app()
|
||||
.gui()
|
||||
.showConsole();
|
||||
if (args.options.outputFormat) importOptions.outputFormat = args.options.outputFormat;
|
||||
|
||||
app().gui().showConsole();
|
||||
this.stdout(_('Importing notes...'));
|
||||
const service = new InteropService();
|
||||
const service = InteropService.instance();
|
||||
const result = await service.import(importOptions);
|
||||
result.warnings.map(w => this.stdout(w));
|
||||
cliUtils.redrawDone();
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const Note = require('lib/models/Note.js');
|
||||
const { sprintf } = require('sprintf-js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
@@ -19,19 +19,26 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
enabled() {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
options() {
|
||||
return [['-n, --limit <num>', _('Displays only the first top <num> notes.')], ['-s, --sort <field>', _('Sorts the item by <field> (eg. title, updated_time, created_time).')], ['-r, --reverse', _('Reverses the sorting order.')], ['-t, --type <type>', _('Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.')], ['-f, --format <format>', _('Either "text" or "json"')], ['-l, --long', _('Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE')]];
|
||||
return [
|
||||
['-n, --limit <num>', _('Displays only the first top <num> notes.')],
|
||||
['-s, --sort <field>', _('Sorts the item by <field> (eg. title, updated_time, created_time).')],
|
||||
['-r, --reverse', _('Reverses the sorting order.')],
|
||||
['-t, --type <type>', _('Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.')],
|
||||
['-f, --format <format>', _('Either "text" or "json"')],
|
||||
['-l, --long', _('Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE')],
|
||||
];
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let pattern = args['note-pattern'];
|
||||
const pattern = args['note-pattern'];
|
||||
let items = [];
|
||||
let options = args.options;
|
||||
const options = args.options;
|
||||
|
||||
let queryOptions = {};
|
||||
const queryOptions = {};
|
||||
if (options.limit) queryOptions.limit = options.limit;
|
||||
if (options.sort) {
|
||||
queryOptions.orderBy = options.sort;
|
||||
@@ -63,19 +70,19 @@ class Command extends BaseCommand {
|
||||
} else {
|
||||
let hasTodos = false;
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
let item = items[i];
|
||||
const item = items[i];
|
||||
if (item.is_todo) {
|
||||
hasTodos = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let seenTitles = [];
|
||||
let rows = [];
|
||||
const seenTitles = [];
|
||||
const rows = [];
|
||||
let shortIdShown = false;
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
let item = items[i];
|
||||
let row = [];
|
||||
const item = items[i];
|
||||
const row = [];
|
||||
|
||||
if (options.long) {
|
||||
row.push(BaseModel.shortId(item.id));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -13,7 +13,7 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let folder = await Folder.save({ title: args['new-notebook'] }, { userSideValidation: true });
|
||||
const folder = await Folder.save({ title: args['new-notebook'] }, { userSideValidation: true });
|
||||
app().switchCurrentFolder(folder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
|
||||
@@ -26,7 +26,7 @@ class Command extends BaseCommand {
|
||||
|
||||
const ok = force ? true : await this.prompt(notes.length > 1 ? _('%d notes match this pattern. Delete them?', notes.length) : _('Delete note?'), { booleanAnswerDefault: 'n' });
|
||||
if (!ok) return;
|
||||
let ids = notes.map(n => n.id);
|
||||
const ids = notes.map(n => n.id);
|
||||
await Note.batchDelete(ids);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Folder = require('lib/models/Folder.js');
|
||||
const { uuid } = require('lib/uuid.js');
|
||||
const uuid = require('lib/uuid').default;
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
@@ -18,8 +18,8 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let pattern = args['pattern'];
|
||||
let folderTitle = args['notebook'];
|
||||
const pattern = args['pattern'];
|
||||
const folderTitle = args['notebook'];
|
||||
|
||||
let folder = null;
|
||||
if (folderTitle) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const { shim } = require('lib/shim');
|
||||
const { _ } = require('lib/locale');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const Logger = require('lib/Logger').default;
|
||||
const shim = require('lib/shim').default;
|
||||
|
||||
class Command extends BaseCommand {
|
||||
|
||||
@@ -18,7 +18,8 @@ class Command extends BaseCommand {
|
||||
const command = args.command;
|
||||
|
||||
const ClipperServer = require('lib/ClipperServer');
|
||||
const stdoutFn = (s) => this.stdout(s);
|
||||
ClipperServer.instance().initialize();
|
||||
const stdoutFn = (...s) => this.stdout(s.join(' '));
|
||||
const clipperLogger = new Logger();
|
||||
clipperLogger.addTarget('file', { path: `${Setting.value('profileDir')}/log-clipper.txt` });
|
||||
clipperLogger.addTarget('console', { console: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const { Database } = require('lib/database.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
@@ -23,18 +23,18 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let title = args['note'];
|
||||
let propName = args['name'];
|
||||
const title = args['note'];
|
||||
const propName = args['name'];
|
||||
let propValue = args['value'];
|
||||
if (!propValue) propValue = '';
|
||||
|
||||
let notes = await app().loadItems(BaseModel.TYPE_NOTE, title);
|
||||
const notes = await app().loadItems(BaseModel.TYPE_NOTE, title);
|
||||
if (!notes.length) throw new Error(_('Cannot find "%s".', title));
|
||||
|
||||
for (let i = 0; i < notes.length; i++) {
|
||||
this.encryptionCheck(notes[i]);
|
||||
|
||||
let newNote = {
|
||||
const newNote = {
|
||||
id: notes[i].id,
|
||||
type_: notes[i].type_,
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const { _ } = require('lib/locale');
|
||||
const { ReportService } = require('lib/services/report.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -14,30 +14,39 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action() {
|
||||
let service = new ReportService();
|
||||
let report = await service.status(Setting.value('sync.target'));
|
||||
const service = new ReportService();
|
||||
const report = await service.status(Setting.value('sync.target'));
|
||||
|
||||
for (let i = 0; i < report.length; i++) {
|
||||
let section = report[i];
|
||||
const section = report[i];
|
||||
|
||||
if (i > 0) this.stdout('');
|
||||
|
||||
this.stdout(`# ${section.title}`);
|
||||
this.stdout('');
|
||||
|
||||
for (let n in section.body) {
|
||||
let canRetryType = '';
|
||||
|
||||
for (const n in section.body) {
|
||||
if (!section.body.hasOwnProperty(n)) continue;
|
||||
let line = section.body[n];
|
||||
this.stdout(line);
|
||||
const item = section.body[n];
|
||||
|
||||
if (typeof item === 'object') {
|
||||
canRetryType = item.canRetryType;
|
||||
this.stdout(item.text);
|
||||
} else {
|
||||
this.stdout(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (canRetryType === 'e2ee') {
|
||||
this.stdout('');
|
||||
this.stdout(_('To retry decryption of these items. Run `e2ee decrypt --retry-failed-items`'));
|
||||
}
|
||||
}
|
||||
|
||||
app()
|
||||
.gui()
|
||||
.showConsole();
|
||||
app()
|
||||
.gui()
|
||||
.maximizeConsole();
|
||||
app().gui().showConsole();
|
||||
app().gui().maximizeConsole();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const { OneDriveApiNodeUtils } = require('lib/onedrive-api-node-utils.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const ResourceFetcher = require('lib/services/ResourceFetcher');
|
||||
const { Synchronizer } = require('lib/synchronizer.js');
|
||||
const Synchronizer = require('lib/Synchronizer').default;
|
||||
const { reg } = require('lib/registry.js');
|
||||
const { cliUtils } = require('./cli-utils.js');
|
||||
const md5 = require('md5');
|
||||
const locker = require('proper-lockfile');
|
||||
const fs = require('fs-extra');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||
const MigrationHandler = require('lib/services/synchronizer/MigrationHandler').default;
|
||||
|
||||
class Command extends BaseCommand {
|
||||
constructor() {
|
||||
@@ -29,7 +30,10 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
options() {
|
||||
return [['--target <target>', _('Sync to provided target (defaults to sync.target config value)')]];
|
||||
return [
|
||||
['--target <target>', _('Sync to provided target (defaults to sync.target config value)')],
|
||||
['--upgrade', _('Upgrade the sync target to the latest version.')],
|
||||
];
|
||||
}
|
||||
|
||||
static lockFile(filePath) {
|
||||
@@ -148,12 +152,8 @@ class Command extends BaseCommand {
|
||||
const syncTarget = reg.syncTarget(this.syncTargetId_);
|
||||
|
||||
if (!(await syncTarget.isAuthenticated())) {
|
||||
app()
|
||||
.gui()
|
||||
.showConsole();
|
||||
app()
|
||||
.gui()
|
||||
.maximizeConsole();
|
||||
app().gui().showConsole();
|
||||
app().gui().maximizeConsole();
|
||||
|
||||
const authDone = await this.doAuth();
|
||||
if (!authDone) return cleanUp();
|
||||
@@ -161,9 +161,9 @@ class Command extends BaseCommand {
|
||||
|
||||
const sync = await syncTarget.synchronizer();
|
||||
|
||||
let options = {
|
||||
const options = {
|
||||
onProgress: report => {
|
||||
let lines = Synchronizer.reportToLines(report);
|
||||
const lines = Synchronizer.reportToLines(report);
|
||||
if (lines.length) cliUtils.redraw(lines.join(' '));
|
||||
},
|
||||
onMessage: msg => {
|
||||
@@ -174,7 +174,35 @@ class Command extends BaseCommand {
|
||||
|
||||
this.stdout(_('Synchronisation target: %s (%s)', Setting.enumOptionLabel('sync.target', this.syncTargetId_), this.syncTargetId_));
|
||||
|
||||
if (!sync) throw new Error(_('Cannot initialize synchroniser.'));
|
||||
if (!sync) throw new Error(_('Cannot initialise synchroniser.'));
|
||||
|
||||
if (args.options.upgrade) {
|
||||
let migrationError = null;
|
||||
|
||||
try {
|
||||
const migrationHandler = new MigrationHandler(
|
||||
sync.api(),
|
||||
sync.lockHandler(),
|
||||
Setting.value('appType'),
|
||||
Setting.value('clientId')
|
||||
);
|
||||
|
||||
migrationHandler.setLogger(cliUtils.stdoutLogger(this.stdout.bind(this)));
|
||||
|
||||
await migrationHandler.upgrade();
|
||||
} catch (error) {
|
||||
migrationError = error;
|
||||
}
|
||||
|
||||
if (!migrationError) {
|
||||
Setting.setValue('sync.upgradeState', Setting.SYNC_UPGRADE_STATE_IDLE);
|
||||
await Setting.saveAll();
|
||||
}
|
||||
|
||||
if (migrationError) throw migrationError;
|
||||
|
||||
return cleanUp();
|
||||
}
|
||||
|
||||
this.stdout(_('Starting synchronisation...'));
|
||||
|
||||
@@ -185,7 +213,7 @@ class Command extends BaseCommand {
|
||||
options.context = context;
|
||||
|
||||
try {
|
||||
let newContext = await sync.start(options);
|
||||
const newContext = await sync.start(options);
|
||||
Setting.setValue(contextKey, JSON.stringify(newContext));
|
||||
} catch (error) {
|
||||
if (error.code == 'alreadyStarted') {
|
||||
@@ -210,6 +238,12 @@ class Command extends BaseCommand {
|
||||
throw error;
|
||||
}
|
||||
|
||||
if (Setting.value('sync.upgradeState') > Setting.SYNC_UPGRADE_STATE_IDLE) {
|
||||
this.stdout(`/!\\ ${_('Sync target must be upgraded! Run `%s` to proceed.', 'sync --upgrade')}`);
|
||||
app().gui().showConsole();
|
||||
app().gui().maximizeConsole();
|
||||
}
|
||||
|
||||
cleanUp();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
@@ -20,7 +20,7 @@ class Command extends BaseCommand {
|
||||
|
||||
async action(args) {
|
||||
let tag = null;
|
||||
let options = args.options;
|
||||
const options = args.options;
|
||||
|
||||
if (args.tag) tag = await app().loadItem(BaseModel.TYPE_TAG, args.tag);
|
||||
let notes = [];
|
||||
@@ -46,7 +46,7 @@ class Command extends BaseCommand {
|
||||
}
|
||||
} else if (command == 'list') {
|
||||
if (tag) {
|
||||
let notes = await Tag.notes(tag.id);
|
||||
const notes = await Tag.notes(tag.id);
|
||||
notes.map(note => {
|
||||
let line = '';
|
||||
if (options.long) {
|
||||
@@ -70,7 +70,7 @@ class Command extends BaseCommand {
|
||||
this.stdout(line);
|
||||
});
|
||||
} else {
|
||||
let tags = await Tag.all();
|
||||
const tags = await Tag.all();
|
||||
tags.map(tag => {
|
||||
this.stdout(tag.title);
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const Note = require('lib/models/Note.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
const CommandDone = require('./command-done.js');
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
@@ -17,7 +17,7 @@ class Command extends BaseCommand {
|
||||
}
|
||||
|
||||
async action(args) {
|
||||
let folder = await app().loadItem(BaseModel.TYPE_FOLDER, args['notebook']);
|
||||
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args['notebook']);
|
||||
if (!folder) throw new Error(_('Cannot find "%s".', args['notebook']));
|
||||
app().switchCurrentFolder(folder);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const { BaseCommand } = require('./base-command.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
class Command extends BaseCommand {
|
||||
usage() {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const Logger = require('lib/Logger').default;
|
||||
const Resource = require('lib/models/Resource.js');
|
||||
const { dirname } = require('lib/path-utils.js');
|
||||
const { FsDriverNode } = require('./fs-driver-node.js');
|
||||
@@ -12,7 +12,7 @@ const fs = require('fs-extra');
|
||||
const baseDir = `${dirname(__dirname)}/tests/fuzzing`;
|
||||
const syncDir = `${baseDir}/sync`;
|
||||
const joplinAppPath = `${__dirname}/main.js`;
|
||||
let syncDurations = [];
|
||||
const syncDurations = [];
|
||||
|
||||
const fsDriver = new FsDriverNode();
|
||||
Logger.fsDriver_ = fsDriver;
|
||||
@@ -34,10 +34,10 @@ function createClient(id) {
|
||||
}
|
||||
|
||||
async function createClients() {
|
||||
let output = [];
|
||||
let promises = [];
|
||||
const output = [];
|
||||
const promises = [];
|
||||
for (let clientId = 0; clientId < 2; clientId++) {
|
||||
let client = createClient(clientId);
|
||||
const client = createClient(clientId);
|
||||
promises.push(fs.remove(client.profileDir));
|
||||
promises.push(
|
||||
execCommand(client, 'config sync.target 2').then(() => {
|
||||
@@ -2064,8 +2064,8 @@ function randomWord() {
|
||||
}
|
||||
|
||||
function execCommand(client, command, options = {}) {
|
||||
let exePath = `node ${joplinAppPath}`;
|
||||
let cmd = `${exePath} --update-geolocation-disabled --env dev --log-level debug --profile ${client.profileDir} ${command}`;
|
||||
const exePath = `node ${joplinAppPath}`;
|
||||
const cmd = `${exePath} --update-geolocation-disabled --env dev --log-level debug --profile ${client.profileDir} ${command}`;
|
||||
logger.info(`${client.id}: ${command}`);
|
||||
|
||||
if (options.killAfter) {
|
||||
@@ -2073,7 +2073,7 @@ function execCommand(client, command, options = {}) {
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let childProcess = exec(cmd, (error, stdout, stderr) => {
|
||||
const childProcess = exec(cmd, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
if (error.signal == 'SIGTERM') {
|
||||
resolve('Process was killed');
|
||||
@@ -2096,7 +2096,7 @@ function execCommand(client, command, options = {}) {
|
||||
}
|
||||
|
||||
async function clientItems(client) {
|
||||
let itemsJson = await execCommand(client, 'dump');
|
||||
const itemsJson = await execCommand(client, 'dump');
|
||||
try {
|
||||
return JSON.parse(itemsJson);
|
||||
} catch (error) {
|
||||
@@ -2105,7 +2105,7 @@ async function clientItems(client) {
|
||||
}
|
||||
|
||||
function randomTag(items) {
|
||||
let tags = [];
|
||||
const tags = [];
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
if (items[i].type_ != 5) continue;
|
||||
tags.push(items[i]);
|
||||
@@ -2115,7 +2115,7 @@ function randomTag(items) {
|
||||
}
|
||||
|
||||
function randomNote(items) {
|
||||
let notes = [];
|
||||
const notes = [];
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
if (items[i].type_ != 1) continue;
|
||||
notes.push(items[i]);
|
||||
@@ -2125,14 +2125,14 @@ function randomNote(items) {
|
||||
}
|
||||
|
||||
async function execRandomCommand(client) {
|
||||
let possibleCommands = [
|
||||
const possibleCommands = [
|
||||
['mkbook {word}', 40], // CREATE FOLDER
|
||||
['mknote {word}', 70], // CREATE NOTE
|
||||
[
|
||||
async () => {
|
||||
// DELETE RANDOM ITEM
|
||||
let items = await clientItems(client);
|
||||
let item = randomElement(items);
|
||||
const items = await clientItems(client);
|
||||
const item = randomElement(items);
|
||||
if (!item) return;
|
||||
|
||||
if (item.type_ == 1) {
|
||||
@@ -2150,8 +2150,8 @@ async function execRandomCommand(client) {
|
||||
[
|
||||
async () => {
|
||||
// SYNC
|
||||
let avgSyncDuration = averageSyncDuration();
|
||||
let options = {};
|
||||
const avgSyncDuration = averageSyncDuration();
|
||||
const options = {};
|
||||
if (!isNaN(avgSyncDuration)) {
|
||||
if (Math.random() >= 0.5) {
|
||||
options.killAfter = avgSyncDuration * Math.random();
|
||||
@@ -2164,8 +2164,8 @@ async function execRandomCommand(client) {
|
||||
[
|
||||
async () => {
|
||||
// UPDATE RANDOM ITEM
|
||||
let items = await clientItems(client);
|
||||
let item = randomNote(items);
|
||||
const items = await clientItems(client);
|
||||
const item = randomNote(items);
|
||||
if (!item) return;
|
||||
|
||||
return execCommand(client, `set ${item.id} title "${randomWord()}"`);
|
||||
@@ -2175,12 +2175,12 @@ async function execRandomCommand(client) {
|
||||
[
|
||||
async () => {
|
||||
// ADD TAG
|
||||
let items = await clientItems(client);
|
||||
let note = randomNote(items);
|
||||
const items = await clientItems(client);
|
||||
const note = randomNote(items);
|
||||
if (!note) return;
|
||||
|
||||
let tag = randomTag(items);
|
||||
let tagTitle = !tag || Math.random() >= 0.9 ? `tag-${randomWord()}` : tag.title;
|
||||
const tag = randomTag(items);
|
||||
const tagTitle = !tag || Math.random() >= 0.9 ? `tag-${randomWord()}` : tag.title;
|
||||
|
||||
return execCommand(client, `tag add ${tagTitle} ${note.id}`);
|
||||
},
|
||||
@@ -2191,7 +2191,7 @@ async function execRandomCommand(client) {
|
||||
let cmd = null;
|
||||
while (true) {
|
||||
cmd = randomElement(possibleCommands);
|
||||
let r = 1 + Math.floor(Math.random() * 100);
|
||||
const r = 1 + Math.floor(Math.random() * 100);
|
||||
if (r <= cmd[1]) break;
|
||||
}
|
||||
|
||||
@@ -2210,7 +2210,7 @@ function averageSyncDuration() {
|
||||
}
|
||||
|
||||
function randomNextCheckTime() {
|
||||
let output = time.unixMs() + 1000 + Math.random() * 1000 * 120;
|
||||
const output = time.unixMs() + 1000 + Math.random() * 1000 * 120;
|
||||
logger.info(`Next sync check: ${time.unixMsToIso(output)} (${Math.round((output - time.unixMs()) / 1000)} sec.)`);
|
||||
return output;
|
||||
}
|
||||
@@ -2223,11 +2223,11 @@ function findItem(items, itemId) {
|
||||
}
|
||||
|
||||
function compareItems(item1, item2) {
|
||||
let output = [];
|
||||
for (let n in item1) {
|
||||
const output = [];
|
||||
for (const n in item1) {
|
||||
if (!item1.hasOwnProperty(n)) continue;
|
||||
let p1 = item1[n];
|
||||
let p2 = item2[n];
|
||||
const p1 = item1[n];
|
||||
const p2 = item2[n];
|
||||
|
||||
if (n == 'notes_') {
|
||||
p1.sort();
|
||||
@@ -2243,13 +2243,13 @@ function compareItems(item1, item2) {
|
||||
}
|
||||
|
||||
function findMissingItems_(items1, items2) {
|
||||
let output = [];
|
||||
const output = [];
|
||||
|
||||
for (let i = 0; i < items1.length; i++) {
|
||||
let item1 = items1[i];
|
||||
const item1 = items1[i];
|
||||
let found = false;
|
||||
for (let j = 0; j < items2.length; j++) {
|
||||
let item2 = items2[j];
|
||||
const item2 = items2[j];
|
||||
if (item1.id == item2.id) {
|
||||
found = true;
|
||||
break;
|
||||
@@ -2269,33 +2269,33 @@ function findMissingItems(items1, items2) {
|
||||
}
|
||||
|
||||
async function compareClientItems(clientItems) {
|
||||
let itemCounts = [];
|
||||
const itemCounts = [];
|
||||
for (let i = 0; i < clientItems.length; i++) {
|
||||
let items = clientItems[i];
|
||||
const items = clientItems[i];
|
||||
itemCounts.push(items.length);
|
||||
}
|
||||
logger.info(`Item count: ${itemCounts.join(', ')}`);
|
||||
|
||||
let missingItems = findMissingItems(clientItems[0], clientItems[1]);
|
||||
const missingItems = findMissingItems(clientItems[0], clientItems[1]);
|
||||
if (missingItems[0].length || missingItems[1].length) {
|
||||
logger.error('Items are different');
|
||||
logger.error(missingItems);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let differences = [];
|
||||
let items = clientItems[0];
|
||||
const differences = [];
|
||||
const items = clientItems[0];
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
let item1 = items[i];
|
||||
const item1 = items[i];
|
||||
for (let clientId = 1; clientId < clientItems.length; clientId++) {
|
||||
let item2 = findItem(clientItems[clientId], item1.id);
|
||||
const item2 = findItem(clientItems[clientId], item1.id);
|
||||
if (!item2) {
|
||||
logger.error(`Item not found on client ${clientId}:`);
|
||||
logger.error(item1);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let diff = compareItems(item1, item2);
|
||||
const diff = compareItems(item1, item2);
|
||||
if (diff.length) {
|
||||
differences.push({
|
||||
item1: JSON.stringify(item1),
|
||||
@@ -2315,7 +2315,7 @@ async function compareClientItems(clientItems) {
|
||||
async function main() {
|
||||
await fs.remove(syncDir);
|
||||
|
||||
let clients = await createClients();
|
||||
const clients = await createClients();
|
||||
let clientId = 0;
|
||||
|
||||
for (let i = 0; i < clients.length; i++) {
|
||||
@@ -2348,7 +2348,7 @@ async function main() {
|
||||
|
||||
if (state == 'syncCheck') {
|
||||
state = 'waitForSyncCheck';
|
||||
let clientItems = [];
|
||||
const clientItems = [];
|
||||
// Up to 3 sync operations must be performed by each clients in order for them
|
||||
// to be perfectly in sync - in order for each items to send their changes
|
||||
// and get those from the other clients, and to also get changes that are
|
||||
@@ -2356,12 +2356,12 @@ async function main() {
|
||||
// with another one).
|
||||
for (let loopCount = 0; loopCount < 3; loopCount++) {
|
||||
for (let i = 0; i < clients.length; i++) {
|
||||
let beforeTime = time.unixMs();
|
||||
const beforeTime = time.unixMs();
|
||||
await execCommand(clients[i], 'sync');
|
||||
syncDurations.push(time.unixMs() - beforeTime);
|
||||
if (syncDurations.length > 20) syncDurations.splice(0, 1);
|
||||
if (loopCount === 2) {
|
||||
let dump = await execCommand(clients[i], 'dump');
|
||||
const dump = await execCommand(clients[i], 'dump');
|
||||
clientItems[i] = JSON.parse(dump);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ const Folder = require('lib/models/Folder.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const BaseModel = require('lib/BaseModel.js');
|
||||
const ListWidget = require('tkwidgets/ListWidget.js');
|
||||
const _ = require('lib/locale.js')._;
|
||||
const _ = require('lib/locale')._;
|
||||
|
||||
class FolderListWidget extends ListWidget {
|
||||
constructor() {
|
||||
@@ -20,7 +20,7 @@ class FolderListWidget extends ListWidget {
|
||||
this.trimItemTitle = false;
|
||||
|
||||
this.itemRenderer = item => {
|
||||
let output = [];
|
||||
const output = [];
|
||||
if (item === '-') {
|
||||
output.push('-'.repeat(this.innerWidth));
|
||||
} else if (item.type_ === Folder.modelType()) {
|
||||
@@ -121,7 +121,7 @@ class FolderListWidget extends ListWidget {
|
||||
|
||||
folderHasChildren_(folders, folderId) {
|
||||
for (let i = 0; i < folders.length; i++) {
|
||||
let folder = folders[i];
|
||||
const folder = folders[i];
|
||||
if (folder.parent_id === folderId) return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
const Note = require('lib/models/Note.js');
|
||||
const TextWidget = require('tkwidgets/TextWidget.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
class NoteWidget extends TextWidget {
|
||||
constructor() {
|
||||
@@ -46,6 +46,8 @@ class NoteWidget extends TextWidget {
|
||||
|
||||
if (this.note_ && this.note_.encryption_applied) {
|
||||
this.text = _('One or more items are currently encrypted and you may need to supply a master password. To do so please type `e2ee decrypt`. If you have already supplied the password, the encrypted items are being decrypted in the background and will be available soon.');
|
||||
this.text += '\n\n';
|
||||
this.text += _('You may also type `status` for more information.');
|
||||
} else {
|
||||
this.text = this.note_ ? `${this.note_.title}\n\n${this.note_.body}` : '';
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ class StatusBarWidget extends BaseWidget {
|
||||
|
||||
const isSecurePrompt = !!this.promptState_.secure;
|
||||
|
||||
let options = {
|
||||
const options = {
|
||||
cancelable: true,
|
||||
history: this.history,
|
||||
default: this.promptState_.initialText,
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
const { wrap } = require('lib/string-utils.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const { _ } = require('lib/locale');
|
||||
|
||||
const MAX_WIDTH = 78;
|
||||
const INDENT = ' ';
|
||||
|
||||
function renderTwoColumnData(options, baseIndent, width) {
|
||||
let output = [];
|
||||
const output = [];
|
||||
const optionColWidth = getOptionColWidth(options);
|
||||
|
||||
for (let i = 0; i < options.length; i++) {
|
||||
let option = options[i];
|
||||
const option = options[i];
|
||||
const flag = option[0];
|
||||
const indent = baseIndent + INDENT + ' '.repeat(optionColWidth + 2);
|
||||
|
||||
@@ -28,7 +28,7 @@ function renderCommandHelp(cmd, width = null) {
|
||||
|
||||
const baseIndent = '';
|
||||
|
||||
let output = [];
|
||||
const output = [];
|
||||
output.push(baseIndent + cmd.usage());
|
||||
output.push('');
|
||||
output.push(wrap(cmd.description(), baseIndent + INDENT, width));
|
||||
@@ -42,7 +42,7 @@ function renderCommandHelp(cmd, width = null) {
|
||||
|
||||
if (cmd.name() === 'config') {
|
||||
const renderMetadata = md => {
|
||||
let desc = [];
|
||||
const desc = [];
|
||||
|
||||
if (md.label) {
|
||||
let label = md.label();
|
||||
@@ -77,7 +77,7 @@ function renderCommandHelp(cmd, width = null) {
|
||||
output.push(_('Possible keys/values:'));
|
||||
output.push('');
|
||||
|
||||
let keysValues = [];
|
||||
const keysValues = [];
|
||||
const keys = Setting.keys(true, 'cli');
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
if (keysValues.length) keysValues.push(['', '']);
|
||||
|
||||
@@ -21,14 +21,17 @@ const Note = require('lib/models/Note.js');
|
||||
const Tag = require('lib/models/Tag.js');
|
||||
const NoteTag = require('lib/models/NoteTag.js');
|
||||
const MasterKey = require('lib/models/MasterKey');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const Setting = require('lib/models/Setting').default;
|
||||
const Revision = require('lib/models/Revision.js');
|
||||
const { Logger } = require('lib/logger.js');
|
||||
const Logger = require('lib/Logger').default;
|
||||
const { FsDriverNode } = require('lib/fs-driver-node.js');
|
||||
const { shimInit } = require('lib/shim-init-node.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { _ } = require('lib/locale');
|
||||
const { FileApiDriverLocal } = require('lib/file-api-driver-local.js');
|
||||
const EncryptionService = require('lib/services/EncryptionService');
|
||||
const envFromArgs = require('lib/envFromArgs');
|
||||
|
||||
const env = envFromArgs(process.argv);
|
||||
|
||||
const fsDriver = new FsDriverNode();
|
||||
Logger.fsDriver_ = fsDriver;
|
||||
@@ -46,7 +49,7 @@ BaseItem.loadClass('NoteTag', NoteTag);
|
||||
BaseItem.loadClass('MasterKey', MasterKey);
|
||||
BaseItem.loadClass('Revision', Revision);
|
||||
|
||||
Setting.setConstant('appId', 'net.cozic.joplin-cli');
|
||||
Setting.setConstant('appId', `net.cozic.joplin${env === 'dev' ? 'dev' : ''}-cli`);
|
||||
Setting.setConstant('appType', 'cli');
|
||||
|
||||
shimInit();
|
||||
@@ -54,7 +57,7 @@ shimInit();
|
||||
const application = app();
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
var rl = require('readline').createInterface({
|
||||
const rl = require('readline').createInterface({
|
||||
input: process.stdin,
|
||||
output: process.stdout,
|
||||
});
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
import * as vm from 'vm';
|
||||
import Plugin from 'lib/services/plugins/Plugin';
|
||||
import sandboxProxy from 'lib/services/plugins/sandboxProxy';
|
||||
import BasePluginRunner from 'lib/services/plugins/BasePluginRunner';
|
||||
import executeSandboxCall from 'lib/services/plugins/utils/executeSandboxCall';
|
||||
import Global from 'lib/services/plugins/api/Global';
|
||||
import mapEventHandlersToIds, { EventHandlers } from 'lib/services/plugins/utils/mapEventHandlersToIds';
|
||||
|
||||
function createConsoleWrapper(pluginId:string) {
|
||||
const wrapper:any = {};
|
||||
|
||||
for (const n in console) {
|
||||
if (!console.hasOwnProperty(n)) continue;
|
||||
wrapper[n] = (...args:any[]) => {
|
||||
const newArgs = args.slice();
|
||||
newArgs.splice(0, 0, `Plugin "${pluginId}":`);
|
||||
return (console as any)[n](...newArgs);
|
||||
};
|
||||
}
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
// The CLI plugin runner is more complex than it needs to be because it more or less emulates
|
||||
// how it would work in a multi-process architecture, as in the desktop app (and probably how
|
||||
// it would work in the mobile app too). This is mainly to allow doing integration testing.
|
||||
//
|
||||
// For example, all plugin calls go through a proxy, however they could made directly since
|
||||
// the plugin script is running within the same process as the main app.
|
||||
|
||||
export default class PluginRunner extends BasePluginRunner {
|
||||
|
||||
private eventHandlers_:EventHandlers = {};
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.eventHandler = this.eventHandler.bind(this);
|
||||
}
|
||||
|
||||
private async eventHandler(eventHandlerId:string, args:any[]) {
|
||||
const cb = this.eventHandlers_[eventHandlerId];
|
||||
return cb(...args);
|
||||
}
|
||||
|
||||
private newSandboxProxy(pluginId:string, sandbox:Global) {
|
||||
const target = async (path:string, args:any[]) => {
|
||||
return executeSandboxCall(pluginId, sandbox, `joplin.${path}`, mapEventHandlersToIds(args, this.eventHandlers_), this.eventHandler);
|
||||
};
|
||||
|
||||
return {
|
||||
joplin: sandboxProxy(target),
|
||||
console: createConsoleWrapper(pluginId),
|
||||
};
|
||||
}
|
||||
|
||||
async run(plugin:Plugin, sandbox:Global) {
|
||||
const vmSandbox = vm.createContext(this.newSandboxProxy(plugin.id, sandbox));
|
||||
|
||||
try {
|
||||
vm.runInContext(plugin.scriptText, vmSandbox);
|
||||
} catch (error) {
|
||||
this.logger().error(`In plugin ${plugin.id}:`, error);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,10 +2,15 @@ const gulp = require('gulp');
|
||||
const fs = require('fs-extra');
|
||||
const utils = require('../Tools/gulp/utils');
|
||||
const tasks = {
|
||||
compileExtensions: {
|
||||
fn: require('../Tools/gulp/tasks/compileExtensions.js'),
|
||||
},
|
||||
copyLib: require('../Tools/gulp/tasks/copyLib'),
|
||||
tsc: require('../Tools/gulp/tasks/tsc'),
|
||||
updateIgnoredTypeScriptBuild: require('../Tools/gulp/tasks/updateIgnoredTypeScriptBuild'),
|
||||
};
|
||||
|
||||
tasks.build = {
|
||||
tasks.prepareBuild = {
|
||||
fn: async () => {
|
||||
const buildDir = `${__dirname}/build`;
|
||||
await utils.copyDir(`${__dirname}/app`, buildDir, {
|
||||
@@ -15,17 +20,19 @@ tasks.build = {
|
||||
await utils.copyDir(`${__dirname}/../patches`, `${buildDir}/patches`);
|
||||
await tasks.copyLib.fn();
|
||||
await utils.copyFile(`${__dirname}/package.json`, `${buildDir}/package.json`);
|
||||
await utils.copyFile(`${__dirname}/package-lock.json`, `${buildDir}/package-lock.json`);
|
||||
await utils.copyFile(`${__dirname}/gulpfile.js`, `${buildDir}/gulpfile.js`);
|
||||
|
||||
const packageRaw = await fs.readFile(`${buildDir}/package.json`);
|
||||
const package = JSON.parse(packageRaw.toString());
|
||||
package.scripts.postinstall = package.scripts.postinstall.replace(/\.\.\/patches/, './patches');
|
||||
package.scripts.postinstall = 'patch-package';
|
||||
await fs.writeFile(`${buildDir}/package.json`, JSON.stringify(package, null, 2), 'utf8');
|
||||
|
||||
fs.chmodSync(`${buildDir}/main.js`, 0o755);
|
||||
},
|
||||
};
|
||||
|
||||
tasks.buildTests = {
|
||||
tasks.prepareTestBuild = {
|
||||
fn: async () => {
|
||||
const testBuildDir = `${__dirname}/tests-build`;
|
||||
|
||||
@@ -34,14 +41,33 @@ tasks.buildTests = {
|
||||
'lib/',
|
||||
'locales/',
|
||||
'node_modules/',
|
||||
'*.ts',
|
||||
'*.tsx',
|
||||
],
|
||||
});
|
||||
|
||||
await utils.copyDir(`${__dirname}/../ReactNativeClient/lib`, `${testBuildDir}/lib`);
|
||||
await utils.copyDir(`${__dirname}/../ReactNativeClient/locales`, `${testBuildDir}/locales`);
|
||||
const rootDir = utils.rootDir();
|
||||
|
||||
await utils.copyDir(`${rootDir}/ReactNativeClient/lib`, `${testBuildDir}/lib`, {
|
||||
excluded: [
|
||||
`${rootDir}/ReactNativeClient/lib/joplin-renderer/node_modules`,
|
||||
],
|
||||
});
|
||||
await utils.copyDir(`${rootDir}/ReactNativeClient/locales`, `${testBuildDir}/locales`);
|
||||
await fs.mkdirp(`${testBuildDir}/data`);
|
||||
},
|
||||
};
|
||||
|
||||
gulp.task('build', tasks.build.fn);
|
||||
gulp.task('buildTests', tasks.buildTests.fn);
|
||||
utils.registerGulpTasks(gulp, tasks);
|
||||
|
||||
gulp.task('build', gulp.series([
|
||||
'prepareBuild',
|
||||
'compileExtensions',
|
||||
'copyLib',
|
||||
]));
|
||||
|
||||
gulp.task('buildTests', gulp.series([
|
||||
'prepareTestBuild',
|
||||
'compileExtensions',
|
||||
'copyLib',
|
||||
]));
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"لتحذف الوسم، أزل الوسم عن الملاحظات التي وسمت به.","Please select the note or notebook to be deleted first.":"يرجى اختيار الملاحظة أو دفتر الملاحظات المراد حذفه أولاً.","Press Ctrl+D or type \"exit\" to exit the application":"اضغط Ctrl+D أو اكتب \"exit\" للخروج من التطبيق","More than one item match \"%s\". Please narrow down your query.":"أكثر من عنصر واحد يطابق \"%s\". يرجى تضييق الاستعلام الخاص بك.","No notebook selected.":"لم يتم اختيار دفتر ملاحظات.","No notebook has been specified.":"لم يتم تحديد دفتر ملاحظات.","Y":"نعم","n":"لا","N":"لا","y":"نعم","Cancelling background synchronisation... Please wait.":"يجري إلغاء مزامنة الخلفية... فضلاً انتظر.","No such command: %s":"أمر غير موجود: %s","The command \"%s\" is only available in GUI mode":"الأمر \"%s\" متوفر فقط في وضع الواجهة الرسومية","Cannot change encrypted item":"لا يمكن تغيير العنصر المشفَّر","Missing required argument: %s":"المعامل المطلوب %s مفقود","%s: %s":"%s: %s","Your choice: ":"اختيارك هو: ","Invalid answer: %s":"إجابة غير صحيحة: %s","Attaches the given file to the note.":"يرفق الملف المعطى بالملاحظة.","Cannot find \"%s\".":"لا يمكن العثور على \"%s\".","Displays the given note.":"يعرض الملاحظة المعطاة.","Displays the complete information about note.":"يعرض المعلومات الكاملة عن الملاحظة.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"يستخرج قيمة إعداد أو يضبطها. إذا لم يجر التزويد بـ [value] (قيمة) فسيعرض التطبيق قيمة [name] (اسم). إذا لم يجر التزويد بـ [name] ولا [value] فسيسرد التطبيق الإعداد الحالي.","Also displays unset and hidden config variables.":"يظهر أيضاً متغيرات الإعداد غير المضبوطة أو تلك المخفية.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"ينشئ نسخة من الملاحظات المطابقة لـ <note> (ملاحظة) في [notebook] (دفتر ملاحظات). إذا لم يحدد دفتر ملاحظات فستنسخ الملاحظة في دفتر الملاحظات الحالي.","Marks a to-do as done.":"يعلّم قائمة مهام أنها تمت.","Note is not a to-do: \"%s\"":"الملاحظة: \"%s\" ليست قائمة مهام","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"يدير ترتيبات (E2EE). الأوامر هي `enable`، `disable`، `decrypt`، `status`، `target-status`.","Enter master password:":"أدخل كلمة المرور الرئيسة:","Operation cancelled":"ألغيت العملية","Confirm password:":"تأكيد كلمة المرور:","Passwords do not match!":"كلمات المرور غير متطابقة!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"بدء فك التشفير جارٍ... يرجى الانتظار حيث قد تستغرق العملية عدة دقائق بحسب كمية البيانات المطلوب فك تشفيرها.","Completed decryption.":"اكتمل فك التشفير.","Enabled":"مفعََّل","Disabled":"معطَّل","Encryption is: %s":"التشفير هو: %s","Edit note.":"تحرير الملاحظة.","No text editor is defined. Please set it using `config editor <editor-path>`":"لم يعرَّف محرر نصوص. فضلاً اضبطه باستخدام `config editor <editor-path>`","No active notebook.":"لا يوجد دفتر ملاحظات نشط.","Note does not exist: \"%s\". Create it?":"الملاحظة: \"%s\" غير موجودة. تريد إنشائها؟","Exits the application.":"الخروج من التطبيق.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"تصدير بيانات Joplin إلى المسار المعطى. سيصدِّر التطبيق تلقائياً كامل قاعدة البيانات بما في ذلك دفاتر الملاحظات ، الملاحظات ، الوسوم والموارد.","Destination format: %s":"التنسيق الوجهة: %s","Exports only the given note.":"تصدير الملاحظة المعطاة فقط.","Exports only the given notebook.":"تصدير دفتLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"ينشئ نسخة من الملاحظات المطابقة لـ <note> (ملاحظة) في [notebook] (دفتر ملاحظات). إذا لم يحدد دفتر ملاحظات فستنسخ الملاحظة في دفتر الملاحظات الحالي.","Cannot find \"%s\".":"لا يمكن العثور على \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"يعرض الملاحظات في الدفتر الحالي. استخدم `ls /` لعرض قائمة دفاتر الملاحظات.","Displays only the first top <num> notes.":"يعرض أول أعلى <رقم> ملاحظات فقط.","Sorts the item by <field> (eg. title, updated_time, created_time).":"يرتب العناصر حسب <حقل> (على سبيل المثال، العنوان ، تاريخ التحديث ، تاريخ الإنشاء).","Reverses the sorting order.":"يعكس طريقة الترتيب.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"يعرض العناصر من النوع/الأنواع المحددة فقط. يمكن أن يكون `n` للملاحظات ، أو `t` لقوائم المهام أو `nt` للملاحظات و قوائم المهام (مثلاً ، `-tt` ستعرض قوائم المهام فقط ، بينما ستعرض `-ttd` الملاحظات و قوائم المهام.","Either \"text\" or \"json\"":"إما \"text\" أو \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"استخدام نسق القائمة الطويلة. النسق هو ID (معرِّف) ، NOTE_COUNT (عدد الملاحظات (لدفتر الملاحظات)) ، DATE (التاريخ) ، TODO_CHECKED (تم عنصر المهمة (لقوائم المهام)) ، TITLE (العنوان)","Please select a notebook first.":"يرجى اختيار دفتر ملاحظات أولاً.","Imports data into Joplin.":"استيراد البيانات إلى Joplin.","Source format: %s":"تنسيق المصدر: %s","Do not ask for confirmation.":"لا تطلب التأكيد.","Found: %d.":"تم العثور عليها: %d.","Created: %d.":"تم إنشاؤها: %d.","Updated: %d.":"تم تحديثها: %d.","Skipped: %d.":"تم تجاوزها: %d.","Resources: %d.":"الموارد: %d.","Tagged: %d.":"تم وسمها: %d.","Importing notes...":"استيراد الملاحظات جارٍ...","The notes have been imported: %s":"جرى استيراد الملاحظات: %s","Enum":"تعداد","Type: %s.":"النوع: %s.","Possible values: %s.":"القيم الممكنة : %s.","Default: %s":"التلقائية: %s","Possible keys/values:":"المفاتيح/القيم الممكنة:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"ابدأ، أوقف أو تحقق من خادم API. لتحديد أي منفذ يجب تشغيله، قم بتعيين متغير تكوين api.port. الأوامر هي (%s).","Server is already running on port %d":"الخادم قيد التشغيل بالفعل على المنفذ %d","Server is running on port %d":"الخادم قيد التشغيل على المنفذ %d","Server is not running.":"الخادم لا يعمل.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"يدير ترتيبات (E2EE). الأوامر هي `enable`، `disable`، `decrypt`، `status`، `target-status`.","Enter master password:":"أدخل كلمة المرور الرئيسة:","Operation cancelled":"ألغيت العملية","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"بدء فك التشفير جارٍ... يرجى الانتظار حيث قد تستغرق العملية عدة دقائق بحسب كمية البيانات المطلوب فك تشفيرها.","Completed decryption.":"اكتمل فك التشفير.","Confirm password:":"تأكيد كلمة المرور:","Passwords do not match!":"كلمات المرور غير متطابقة!","Enabled":"مفعََّل","Disabled":"معطَّل","Encryption is: %s":"التشفير هو: %s","Creates a new notebook.":"ينشئ دفتر ملاحظات جديد.","Moves the notes matching <note> to [notebook].":"ينقل الملاحظات المطابقة لـ <note> إلى [notebook].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"يستخرج قيمة إعداد أو يضبطها. إذا لم يجر التزويد بـ [value] (قيمة) فLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"За да изтриете таг, премахнете го от всички бележки.","Please select the note or notebook to be deleted first.":"Моля първо изберете бележката или тетрадката, която искате да изтриете.","Press Ctrl+D or type \"exit\" to exit the application":"Натиснете Ctrl+D или напишете \"exit\" за да напуснете приложението","More than one item match \"%s\". Please narrow down your query.":"Повече от едно нещо съответства на \"%s\". Моля рафинирайте търсенето си.","No notebook selected.":"Няма избрани тетрадки.","No notebook has been specified.":"Няма зададени тетрадки.","Y":"Д","n":"н","N":"Н","y":"д","Cancelling background synchronisation... Please wait.":"Отменя се синхронизацията течаща на заден план... Моля изчакайте.","No such command: %s":"Няма такава команда: %s","The command \"%s\" is only available in GUI mode":"Командата \"%s\" е приложима само в графичен режим","Cannot change encrypted item":"Криптираният обект не може да бъде променен","Missing required argument: %s":"Липсващ задължителен параметър: %s","%s: %s":"%s: %s","Your choice: ":"Вашият избор: ","Invalid answer: %s":"Невалиден отговор: %s","Attaches the given file to the note.":"Прикачва зададения файл към бележката.","Cannot find \"%s\".":"Не успях да намеря \"%s\".","Displays the given note.":"Показва зададената бележка.","Displays the complete information about note.":"Показва пълната информация за бележката.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Показва или променя конфигурационна стойност. Ако [стойност] не е дадена, ще покаже стойността на [име]. Ако нито [име] нито [стойност] са дадени, изрежда цялата настояща конфигурация.","Also displays unset and hidden config variables.":"Показва също и конфигурации, които нямат стойност, или са скрити.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Дуплицира бележките съответстващи на <бележка> в [тетрадка]. Ако тетрадка не е зададена, бележките ще бъдат дуплицирани в настоящата тетрадка.","Marks a to-do as done.":"Маркира задача като изпълнена.","Note is not a to-do: \"%s\"":"Бележката не е задача: \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Управлява E2EE конфигурацията. Командите са `enable`, `disable`, `decrypt`, `status`, `decrypt-file` и `target-status`.","Enter master password:":"Въведете главната парола:","Operation cancelled":"Действието бе отменено","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Започвам да декриптирам... Моля изчакайте, защото това може да отнеме няколко минути, в зависимост от колко има за декриптиране.","Completed decryption.":"Завърших декриптирането.","Enabled":"Включено","Disabled":"Изключено","Encryption is: %s":"Криптирането е: %s","Edit note.":"Редактиране на бележка.","No text editor is defined. Please set it using `config editor <editor-path>`":"Няма зададен текстови редактор. Моля задайте го с командата: `config editor <път-до-редактора>`","No active notebook.":"Няма активна тетрадка.","Note does not exist: \"%s\". Create it?":"Бележката не съществува:\"%s\". Да я създам ли?","Exits the application.":"Напуска приложението.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Експортира данните от Joplin в зададенияLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Дуплицира бележките съответстващи на <бележка> в [тетрадка]. Ако тетрадка не е зададена, бележките ще бъдат дуплицирани в настоящата тетрадка.","Cannot find \"%s\".":"Не успях да намеря \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Показва бележките в настоящата тетрадка. Използвайте `ls /` за да покажете списъка от тетрадки.","Displays only the first top <num> notes.":"Показва първите <брой> бележки.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Сортира обектите по <поле>. Напр. title (заглавие), updated_time (последна промяна), created_time (създадена).","Reverses the sorting order.":"Обръща реда на сортиране.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Показва само обекти от даден тип или типове. Може да е `n` за бележки, `t` за задачи, или `nt` за бележки и задачи (напр. `-tt` би показало само задачи, а `-ttd` би показало бележки и задачи.","Either \"text\" or \"json\"":"Или \"text\" или \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Използване на дългия формат на списъци. Форматът е ID, NOTE_COUNT (брой бележки, за тетрадки), DATE (дата), TODO_CHECKED (брой завършени, за задачи), TITLE (заглавие)","Please select a notebook first.":"Моля първо изберете тетрадка.","Imports data into Joplin.":"Импортира данни в Joplin.","Source format: %s":"Формат на източника: %s","Do not ask for confirmation.":"Не питай за потвърждение.","Found: %d.":"Намерени: %d.","Created: %d.":"Създадени: %d.","Updated: %d.":"Обновени: %d.","Skipped: %d.":"Пропуснати: %d.","Resources: %d.":"Ресурси: %d.","Tagged: %d.":"Тагнати: %d.","Importing notes...":"Импортирам на бележки...","The notes have been imported: %s":"Бележките бяха импортирани: %s","Enum":"Изброим","Type: %s.":"Тип: %s.","Possible values: %s.":"Възможни стойности: %s.","Default: %s":"Стойност по подразбиране: %s","Possible keys/values:":"Възможни ключове/стойности:","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Управлява E2EE конфигурацията. Командите са `enable`, `disable`, `decrypt`, `status`, `decrypt-file` и `target-status`.","Enter master password:":"Въведете главната парола:","Operation cancelled":"Действието бе отменено","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Започвам да декриптирам... Моля изчакайте, защото това може да отнеме няколко минути, в зависимост от колко има за декриптиране.","Completed decryption.":"Завърших декриптирането.","Enabled":"Включено","Disabled":"Изключено","Encryption is: %s":"Криптирането е: %s","Creates a new notebook.":"Създава нова тетрадка.","Moves the notes matching <note> to [notebook].":"Премества бележките съответстващи на <бележка> в [тетрадка].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Показва или променя конфигурационна стойност. Ако [стойност] не е дадена, ще покаже стойността на [име]. Ако нито [име] нито [стойност] са дадени, изрежда цялата настояща конфигурация.","Also displays unset and hidden config variables.":"Показва също и конфигурации, които нямат стойност, или са скрити.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [noteboLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Da izbrišete oznaku, prvo je uklonite iz bilješki kojima je dodijeljena.","Please select the note or notebook to be deleted first.":"Prvo odaberite bilješku ili bilježnicu koju želite izbrisati","Press Ctrl+D or type \"exit\" to exit the application":"Pritisnite Ctrl+D ili kucajte \"exit\" da zatvorite aplikaciju","More than one item match \"%s\". Please narrow down your query.":"Više od jednog rezultata odgovara \"%s\". Molimo suzite obim pretrage.","No notebook selected.":"Nije odabrana bilježnica.","No notebook has been specified.":"Nije precizirana bilježnica","Y":"Y","n":"n","N":"N","y":"y","Cancelling background synchronisation... Please wait.":"Prekidam sinhronizaciju... Pričekajte.","No such command: %s":"Nepostojeća komanda: %s","The command \"%s\" is only available in GUI mode":"Komanda \"%s\" dostupna je samo u grafičkom okruženju","Cannot change encrypted item":"Nije moguće promijeniti šifriranu stavku","Missing required argument: %s":"Nedostaje neophodni argument: %s","%s: %s":"%s: %s","Your choice: ":"Vaš izbor: ","Invalid answer: %s":"Nevažeći odgovor: %s","Attaches the given file to the note.":"Prilaže datu datoteku bilješci.","Cannot find \"%s\".":"Ne mogu pronaći \"%s\".","Displays the given note.":"Prikazuje datu bilješku.","Displays the complete information about note.":"Prikazuje potpune informacije o bilješci.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Prima ili podešava konfiguracijske vrijednosti. Ako [value] nije navedena, tada će biti prikazana vrijednost [name]. Ako ni [name] ni [value] nisu precizirane, prikazat će se trenutna konfiguracija.","Also displays unset and hidden config variables.":"Prikazuje i nepodešene i skrivene konfiguracijske varijable.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Kreira duplikat bilješke <note> u [notebook]. Ako bilježnica nije navedena, duplikat će biti pohranjen u trenutno otvorenu bilježnicu.","Marks a to-do as done.":"Označava da je zadatak obavljen.","Note is not a to-do: \"%s\"":"Bilješka nije zadatak: \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Upravlja konfiguracijom šifriranja s kraja na kraj (E2EE). Komande glase: `enable` (uključi), `disable` (isključi), `decrypt` (dešifruj), `status` (stanje), `decrypt-file` (dešifruj datoteku) i `target-status` (stanje odredišta).","Enter master password:":"Unesite glavnu lozinku:","Operation cancelled":"Radnja je prekinuta","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Počinjem sa dešifrovanjem... Molim Vas da pričekate, jer proces može trajati nekoliko minuta, zavisno od količine podataka koje treba dešifrovati.","Completed decryption.":"Dešifrovanje završeno.","Enabled":"Uključeno","Disabled":"Isključeno","Encryption is: %s":"Šifriranje je: %s","Edit note.":"Uredi bilješku.","No text editor is defined. Please set it using `config editor <editor-path>`":"Nije određen program za uređivanje teksta. Precizirajte ga pomoću `config editor <editor-path>`","No active notebook.":"Nema aktivne bilježnice.","Note does not exist: \"%s\". Create it?":"Bilješka ne postoji: \"%s\". Želite li je kreirati?","Exits the application.":"Zatvara aplikaciju.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Prenosi kopiju Joplin podataka na datu lokaciju. Čitava će baza podataka biti pohranjena, uključujući bilježnice, bilješke, oznake i resurse.","Destination format: %s":"Format: %s","Exports only the given note.":"Prenosi samo kopiju date bilješke.","Exports only the given notebook.":"Prenosi samo kopiju date bilježnice.","Displays a geolocation URL for the note.":"Prikazuje geografsku lokaciju bilješke.","Displays usage information.":"Prikazuje informacije o korištenju.","For information on how to customise the shortcuts please visit %s":"Da biste saznali kako raditi sa kraticama, posjetite %s","Shortcuts are not available in CLI mode.":"Kratice nisu dostupne u negrafičkom okruženju.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Kucajte `help [command]` za više informacija o komandi; ili kucajte `help all` za detaljne informacije o načinu korištenja.","The possible commands are:":"Moguće komande glase:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected itLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Kreira duplikat bilješke <note> u [notebook]. Ako bilježnica nije navedena, duplikat će biti pohranjen u trenutno otvorenu bilježnicu.","Cannot find \"%s\".":"Ne mogu pronaći \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Prikazuje bilješke u trenutnoj bilježnici. Koristite komandu `ls /` da prikažete popis bilježnica.","Displays only the first top <num> notes.":"Prikazuje samo prvih <num> bilješki.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sortira stavke prema <field> (npr. title, updated_time, created_time).","Reverses the sorting order.":"Inverzni redoslijed sortiranja.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Prikazuje samo stavke određenog tipa. To može biti `n` za bilješke, `t` za zadatke, ili `nt` za bilješke i zadatke (npr. `-tt` prikazuje samo zadatke, dok `-ttd` prikazuje i bilješke i zadatke.)","Either \"text\" or \"json\"":"Ili \"text\" ili \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Koristi dugi format. Format je ID, NOTE_COUNT (za bilježnice), DATE, TODO_CHECKED (za zadatke), TITLE","Please select a notebook first.":"Prvo odaberite bilježnicu.","Imports data into Joplin.":"Unosi podatke u Joplin","Source format: %s":"Izvorni format: %s","Do not ask for confirmation.":"Ne pitaj za potvrdu.","Found: %d.":"Pronađeno: %d.","Created: %d.":"Kreirano: %d.","Updated: %d.":"Ažurirano: %d.","Skipped: %d.":"Preskočeno: %d.","Resources: %d.":"Resursi: %d.","Tagged: %d.":"Označeno: %d.","Importing notes...":"Unosim bilješke...","The notes have been imported: %s":"Bilješke su unesene: %s","Enum":"Enum","Type: %s.":"Vrsta: %s.","Possible values: %s.":"Moguće vrijednosti: %s.","Default: %s":"Prekonfigurisano: %s","Possible keys/values:":"Moguće stavke/vrijednosti:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Pokreni, zaustavi ili provjeri API server. Da precizirate koji port treba koristiti, podesite api.port konfiguracijsku varijablu. Komande su (%s).","Server is already running on port %d":"Server je već pokrenut preko porta %d","Server is running on port %d":"Server je u funkciji preko porta %d","Server is not running.":"Server nije pokrenut.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Upravlja konfiguracijom šifriranja s kraja na kraj (E2EE). Komande glase: `enable` (uključi), `disable` (isključi), `decrypt` (dešifruj), `status` (stanje), `decrypt-file` (dešifruj datoteku) i `target-status` (stanje odredišta).","Enter master password:":"Unesite glavnu lozinku:","Operation cancelled":"Radnja je prekinuta","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Počinjem sa dešifrovanjem... Molim Vas da pričekate, jer proces može trajati nekoliko minuta, zavisno od količine podataka koje treba dešifrovati.","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Preskočene stavke: %d (koristite --retry-failed-items da ih ponovo pokušate dešifrovati)","Completed decryption.":"Dešifrovanje završeno.","Enabled":"Uključeno","Disabled":"Isključeno","Encryption is: %s":"Šifriranje je: %s","Creates a new notebook.":"Kreira novu bilježnicu.","Moves the notes matching <note> to [notebook].":"Premješta bilješke <note> u [notebook].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Prima ili podešava konfiguracijske vrijednosti. Ako [value] nije navedena, tada će biti prikazana vrijednost [name]. Ako ni [name] ni [value] nisu precizirane, prikazat će se trenutna konfiguracija.","Also displays unset and hidden config variables.":"Prikazuje i nepodešene i skrivene konfiguracijske varijable.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Prelazi u [notebook] – sve dalje radnje vršit će se u ovoj bilježnici.","Synchronises with remote storage.":"Sinhronizuje sa vanjskim medijem za pohranu podataka.","Sync to provided target (defaults to sync.target config value)":"Sinhronizuj sa datim odredištem (prekonfigurisano sync.target config value)","Authentication was not completed (did not receive an authentication token).":"Ovjera nije završena (nije primljena potvrda /token/).","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"Slijedite ove korake Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Per a suprimir una etiqueta, traieu l'etiqueta en les notes associades.","Please select the note or notebook to be deleted first.":"Primer seleccioneu la nota o el bloc de notes que vulgueu suprimir.","Press Ctrl+D or type \"exit\" to exit the application":"Premeu Ctrl+D o escriviu «exit» per a sortir de l'aplicació","More than one item match \"%s\". Please narrow down your query.":"Hi ha més d'un element que coincideix amb «%s». Restringiu la consulta.","No notebook selected.":"No heu seleccionat cap bloc de notes.","No notebook has been specified.":"No heu indicat cap bloc de notes.","Y":"S","n":"n","N":"N","y":"s","Cancelling background synchronisation... Please wait.":"S'està cancel·lant la sincronització en segon pla... Espereu.","No such command: %s":"No existeix l'ordre: %s","The command \"%s\" is only available in GUI mode":"L'ordre «%s» només és disponible en mode IGU","Cannot change encrypted item":"No es pot canviar l'element xifrat","Missing required argument: %s":"Manca un argument requerit: %s","%s: %s":"%s: %s","Your choice: ":"La vostra tria:","Invalid answer: %s":"La resposta no és vàlida: %s","Attaches the given file to the note.":"Adjunta el fitxer indicat a la nota.","Cannot find \"%s\".":"No es pot trobar «%s»","Displays the given note.":"Mostra la nota indicada.","Displays the complete information about note.":"Mostra la informació completa sobre la nota.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obté o estableix un valor de configuració. Si no s'indica [valor], mostrarà el valor de [nom]. Altrament, si no s'indica [nom] ni [valor], es mostrarà un llistat amb la configuració actual.","Also displays unset and hidden config variables.":"També mostra variables de configuració ocultes o sense definir.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica les notes que coincideixen amb en [blocdenotes]. Si no indiqueu cap bloc de notes es dupliquen en el bloc de notes actual.","Marks a to-do as done.":"Marca un llistat de tasques pendents com a fet.","Note is not a to-do: \"%s\"":"La nota no és un llistat de tasques pendents: «%s»","Enter master password:":"Introduïu una contrasenya mestra:","Operation cancelled":"L'operació s'ha cancel·lat","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"S'està iniciant el desxifratge... Espereu perquè això pot durar alguns minuts, depenent de quanta informació calgui desxifrar.","Completed decryption.":"El desxifratge ha finalitzat.","Enabled":"Activat","Disabled":"Desactivat","Encryption is: %s":"El xifratge és: %s","Edit note.":"Edita la nota.","No text editor is defined. Please set it using `config editor <editor-path>`":"No hi ha definit cap editor de text. Establiu-ne un usant `config editor <editor-path>`","No active notebook.":"No hi ha cap bloc de notes actiu.","Note does not exist: \"%s\". Create it?":"No existeix «%s». Voleu crear-lo?","Exits the application.":"Surt de l'aplicació","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exporta les dades del Joplin al camí indicat. Per defecte, exportarà tota la base de dades, incloent-hi blocs de notes, notes, etiquetes i recursos.","Destination format: %s":"Format de destinació: %s","Exports only the given note.":"Exporta només la nota indicada.","Exports only the given notebook.":"Exporta només el bloc de notes indicat.","Displays a geolocation URL for the note.":"Motra una URL de geolocalitzacio de la nota.","Displays usage information.":"Mostra la informació d'ús.","For information on how to customise the shortcuts please visit %s":"Per a obtenir informació sobre com personalitzar les dreceres de teclat, visiteu %s","Shortcuts are not available in CLI mode.":"Les dreceres no són disponibles en el mode de línia d'ordres.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Escriviu «ajuda [ordre]» per a més informació sobre l'ordre; o escriviu «ajuda all» per a la informació d'ús completa.","The possible commands are:":"Les ordres possibles són:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"En qualsevol ordre, podeu referenciar una nota o bloc de notes per el títol o l'ID, o podeu usar dreceres «$n» o «$b» per a, respectivament, la nota o el bloc de nota seleccionat actual. Podeu usar «$c» per a fer referència a l'element Line truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica les notes que coincideixen amb en [blocdenotes]. Si no indiqueu cap bloc de notes es dupliquen en el bloc de notes actual.","Cannot find \"%s\".":"No es pot trobar «%s»","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Mostra les notes en el bloc de notes actual. Useu «ls /» per a mostrar la llista de blocs de notes.","Displays only the first top <num> notes.":"Només mostra les <num> primeres notes superiors.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Ordena l'element per <field> (p. ex. títol, actualització o creació).","Reverses the sorting order.":"Inverteix el criteri d'ordenació","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Només mostra els elements dels tipus específics. Pot ser «n» per a les notes, «t» per les tasques pendents, o «nt» per a notes i tasques pendents (p. ex. «-tt» mostrarà només les tasques pendents, mentre que «-ttd» mostrarà notes i tasques pendents).","Either \"text\" or \"json\"":"«text» o «json»","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Usa el format de llista llarga. El format és ID, NRE_NOTES (per a blocs de notes), DATA, TASQUES_MARCADES (per a llistats de tasques pendents), TÍTOL","Please select a notebook first.":"Cal que primer seleccioneu un bloc de notes.","Imports data into Joplin.":"Importa les dades al Joplin.","Source format: %s":"Format d'origen: %s","Do not ask for confirmation.":"No demanis confirmació.","Found: %d.":"Trobades: %d.","Created: %d.":"Creades: %d.","Updated: %d.":"Actualitzades: %d.","Skipped: %d.":"Omeses: %d.","Resources: %d.":"Recursos: %d.","Tagged: %d.":"Etiquetats: %d.","Importing notes...":"S'estan important notes...","The notes have been imported: %s":"Notes que s'han importat: %s","Enum":"Enumeració","Type: %s.":"Tipus: %s.","Possible values: %s.":"Valors possibles: %s.","Default: %s":"Per defecte: %s","Possible keys/values:":"Valors o claus possibles:","Enter master password:":"Introduïu una contrasenya mestra:","Operation cancelled":"L'operació s'ha cancel·lat","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"S'està iniciant el desxifratge... Espereu perquè això pot durar alguns minuts, depenent de quanta informació calgui desxifrar.","Completed decryption.":"El desxifratge ha finalitzat.","Enabled":"Activat","Disabled":"Desactivat","Encryption is: %s":"El xifratge és: %s","Creates a new notebook.":"Crea un bloc de notes nou.","Moves the notes matching <note> to [notebook].":"Mou les notes que coincideixen amb <note> a [notebook].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obté o estableix un valor de configuració. Si no s'indica [valor], mostrarà el valor de [nom]. Altrament, si no s'indica [nom] ni [valor], es mostrarà un llistat amb la configuració actual.","Also displays unset and hidden config variables.":"També mostra variables de configuració ocultes o sense definir.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Canvia a [notebook] - totes les operacions posteriors s'aplicaran en aquest bloc de notes.","Synchronises with remote storage.":"Sincronitza amb un emmagatzemament remot.","Sync to provided target (defaults to sync.target config value)":"Sincronitza a la destinació indicada (de forma predeterminada al valor de configuració sync.target)","Authentication was not completed (did not receive an authentication token).":"No s'ha completat l'autenticació (no ha rebut el testimoni d'autenticació).","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"Per a permetre que el Joplin sincronitzi amb el Dropbox, seguiu les passes següents:","Step 1: Open this URL in your browser to authorise the application:":"Pas 1: Obriu aquest URL al navegador i autoritzeu l'aplicació:","Step 2: Enter the code provided by Dropbox:":"Pas 2: Introduïu el codi proporcionat per Dropbox:","Not authentified with %s. Please provide any missing credentials.":"No esteu autenticats amb %s. Proporcioneu les credencials necessàries.","Synchronisation is already in progress.":"La sincronització és en curs.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"El fitxer de bloqueig està ús. Si sabeu que no s'està executant cap sincronització ara mateix, podeu suprimir el fiLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Pro smazání tagu jej odeberte od přiřazených poznámek.","Please select the note or notebook to be deleted first.":"Nejprve prosím vyberte poznámku či zápisník ke smazání.","Press Ctrl+D or type \"exit\" to exit the application":"Stiskněte Ctrl+D nebo napište \"exit\" pro ukončení aplikace","More than one item match \"%s\". Please narrow down your query.":"Výrazu \"%s\" odpovídá více než jedna položka, upřesněte prosím hledaný text.","No notebook selected.":"Není vybrán žádný zápisník.","No notebook has been specified.":"Nebyl vybrán žádný zápisník.","Y":"Y","n":"n","N":"N","y":"y","Cancelling background synchronisation... Please wait.":"Zastavuji synchronizaci, chvíli strpení...","No such command: %s":"Příkaz neexistuje\" %s","The command \"%s\" is only available in GUI mode":"Příkaz \"%s\" je dostupný pouze v grafickém rozhraní","Cannot change encrypted item":"Nelze editovat zašifrovanou položku","Missing required argument: %s":"Chybí povinný parametr: %s","%s: %s":"%s: %s","Your choice: ":"Vaše volba: ","Invalid answer: %s":"Neplatná odpověď: %s","Attaches the given file to the note.":"Přiloží soubor k poznámce.","Cannot find \"%s\".":"Výraz \"%s\" nebyl nalezen.","Displays the given note.":"Zobrazí vybranou poznámku.","Displays the complete information about note.":"Zobrazí veškeré informace o poznámce.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Získá nebo nastaví konfigurační hodnotu. Pokud není [hodnota] specifikována, zobrazí hodnotu položky [jméno]. Pokud není specifikována [hodnota] ani [jméno], je zobrazena současná konfigurace.","Also displays unset and hidden config variables.":"Zobrazí i nenastavené a schované konfigurační proměnné.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplikuje poznámky vyhovující <note> do [notebook]. Pokud není notebook (zápisník) specifikován, je poznámka duplikována v tom současném.","Marks a to-do as done.":"Označí to-do jako hotové.","Note is not a to-do: \"%s\"":"Poznámka není to-do: \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Nastavuje šifrování. Příkazy jsou `enable` (zapnout), `disable` (vypnout), `decrypt` (dešifrovat), `status` (stav) a `target-status` (stav v cíli synchronizace).","Enter master password:":"Zadejte master heslo:","Operation cancelled":"Operace zrušena","Confirm password:":"Potvrďte heslo:","Passwords do not match!":"Hesla se neshodují!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Dešifruji... Chvíli strpení, podle množství dat k dešifrování to může zabrat i několik minut.","Completed decryption.":"Dešifrování dokončeno.","Enabled":"Zapnuto","Disabled":"Vypnuto","Encryption is: %s":"Šifrování je: %s","Edit note.":"Upravit poznámku.","No text editor is defined. Please set it using `config editor <editor-path>`":"Nebyl vybrán textový editor. Prosím nastavte jej pomocí `config editor <editor-path>`","No active notebook.":"Není vybrán žádný zápisník.","Note does not exist: \"%s\". Create it?":"Poznámka \"%s\" neexistuje. Chcete ji vytvořit?","Exits the application.":"Ukončí aplikaci.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exportuje data Joplinu do zadané cesty. Bez dalších voleb exportuje veškerý obsah databáze včetně zápisníků, poznámek, tagů a příloh.","Destination format: %s":"Formát destinace: %s","Exports only the given note.":"Exportuje pouze vybranou poznámku.","Exports only the given notebook.":"Exportuje pouze vybraný zápisník.","Displays a geolocation URL for the note.":"Zobrazí geolokační URL poznámky.","Displays usage information.":"Zobrazí informace o použití.","For information on how to customise the shortcuts please visit %s":"Pro informace k úpravě klávesových zkratek prosím běžte na %s","Shortcuts are not available in CLI mode.":"Klávesové zkratky nejsou v konzoli dostupné.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Zadejte `help [příkaz]` pro více informací o příkazu; nebo `help all` pro kompletní nápovědu.","The possible commands are:":"Dostupné příkazy:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"Ve všech přLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplikuje poznámky vyhovující <note> do [notebook]. Pokud není notebook (zápisník) specifikován, je poznámka duplikována v tom současném.","Cannot find \"%s\".":"Výraz \"%s\" nebyl nalezen.","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Zobrazí poznámky v používaném zápisníku. Pro seznam zápisníků zadejte `ls /`.","Displays only the first top <num> notes.":"Zobrazí jen prvních <num> poznámek.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Řadit položky podle <pole> (např. title, updated_time, created_time).","Reverses the sorting order.":"Řadit opačně.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Zobrazit pouze položky vybraného typu. Možnosti jsou `n` pro poznámky (notes), `t` pro to-do, a `nt` pro poznámky a to-do (tedy `-tt` zobrazí pouze to-do, zatímco `-ttd` zobrazí poznámky a to-do).","Either \"text\" or \"json\"":"Buď \"text\" nebo \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Použít formát dlouhého seznamu. Formát je ID, NOTE_COUNT (u zápisníků), DATE, TODO_CHECKED (pro to-do), TITLE","Please select a notebook first.":"Nejprve prosím vyberte zápisník.","Imports data into Joplin.":"Importuje data do Joplinu.","Source format: %s":"Zdrojový formát: %s","Do not ask for confirmation.":"Neptat se na potvrzení.","Found: %d.":"Nalezeno: %d.","Created: %d.":"Vytvořeno: %d.","Updated: %d.":"Upraveno: %d.","Skipped: %d.":"Přeskočeno: %d.","Resources: %d.":"Zdroje: %d.","Tagged: %d.":"Otagováno: %d.","Importing notes...":"Importuji poznámky...","The notes have been imported: %s":"Poznámky importovány: %s","Enum":"Enum","Type: %s.":"Typ: %s.","Possible values: %s.":"Možné hodnoty: %s.","Default: %s":"Default: %s","Possible keys/values:":"Možné klíče/hodnoty:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Spustit, zastavit či zkontrolovat API server. Pro specifikování portu pro server nastavte api.port proměnnou v config. Příkazy jsou (%s).","Server is already running on port %d":"Server je již spuštěný na portu %d","Server is running on port %d":"Server je spuštěný na portu %d","Server is not running.":"Server není spuštěný.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Nastavuje šifrování. Příkazy jsou `enable` (zapnout), `disable` (vypnout), `decrypt` (dešifrovat), `status` (stav) a `target-status` (stav v cíli synchronizace).","Enter master password:":"Zadejte master heslo:","Operation cancelled":"Operace zrušena","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Dešifruji... Chvíli strpení, podle množství dat k dešifrování to může zabrat i několik minut.","Completed decryption.":"Dešifrování dokončeno.","Confirm password:":"Potvrďte heslo:","Passwords do not match!":"Hesla se neshodují!","Enabled":"Zapnuto","Disabled":"Vypnuto","Encryption is: %s":"Šifrování je: %s","Creates a new notebook.":"Vytvoří nový zápisník.","Moves the notes matching <note> to [notebook].":"Přesune poznámky vyhovující <poznámka> do [zápisník].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Získá nebo nastaví konfigurační hodnotu. Pokud není [hodnota] specifikována, zobrazí hodnotu položky [jméno]. Pokud není specifikována [hodnota] ani [jméno], je zobrazena současná konfigurace.","Also displays unset and hidden config variables.":"Zobrazí i nenastavené a schované konfigurační proměnné.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Přepne do zápisníku [notebook]. Všechny další operace budou prováděny na tomto zápisníku.","Synchronises with remote storage.":"Synchronizuje se vzdáleným úložištěm.","Sync to provided target (defaults to sync.target config value)":"Synchronizovat se specifikovanou destinací (defaultně hodnota sync.target)","Authentication was not completed (did not receive an authentication token).":"Autentizace nebyla dokončena (nedostali jsme autentizační token).","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"Chcete-li povolit synchronizaci služby Joplin se službou Dropbox, postupujte podle následujících kroků:","Step 1: Open this URL in your browser tLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"For at slette et mærke, afmærk de tilhørende noter.","Please select the note or notebook to be deleted first.":"Vælg først en note eller en notesbog der skal slettes.","Press Ctrl+D or type \"exit\" to exit the application":"Tast Ctrl+D eller tast \"exit\" for at afslutte app'en","More than one item match \"%s\". Please narrow down your query.":"Mere end et emne matcher \"%s\". Præciser din søgning.","No notebook selected.":"Ingen notesbog er valgt.","No notebook has been specified.":"Ingen notesbog er specificeret.","Y":"J","n":"n","N":"N","y":"j","Cancelling background synchronisation... Please wait.":"Annullerer baggrunds synkronisering... Vent venligst.","No such command: %s":"Kommando findes ikke: %s","The command \"%s\" is only available in GUI mode":"Kommando \"%s\" er kun til rådighed i GUI tilstand","Cannot change encrypted item":"Kan ikke ændre krypteret emne","Missing required argument: %s":"Mangler krævet argument: %s","%s: %s":"%s: %s","Your choice: ":"Dit valg: ","Invalid answer: %s":"Forkert svar: %s","Attaches the given file to the note.":"Vedhæfter valgt fil til noten.","Cannot find \"%s\".":"Kan ikke finde \"%s\".","Displays the given note.":"Viser valgt note.","Displays the complete information about note.":"Viser komplet note information.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Henter eller tilføjer konfigurations værdi. Hvis [value] er tilføjet, vises værdien af [name]. Hvis hverken [name] eller [value] er tilføjet, vises aktuel konfiguration.","Also displays unset and hidden config variables.":"Viser også tomme eller skjulte konfigurations variabler.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Kopierer alle noter der matcher <note> til [notebook]. Hvis notesbog ikke er udfyldt, kopieres til aktuel notesbog.","Marks a to-do as done.":"Markerer en opgave som udført.","Note is not a to-do: \"%s\"":"Noten er ikke en opgave: \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Håndterer E2EE konfiguration. Kommandoer er `enable`(aktiver), `disable`(sluk), `decrypt`(dekrypter), `status`, `decrypt-file`(dekrypter fil) og `target-status` (modtager-status).","Enter master password:":"Indtast Hoved kodeord:","Operation cancelled":"Udførelse annulleret","Confirm password:":"Bekræft kodeord:","Passwords do not match!":"Kodeord stemmer ikke overens!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Dekryptering startet... Vent venligst da kan tage adskillige minutter afhængig af mængden der skal dekrypteres.","Completed decryption.":"Dekryptering færdig.","Enabled":"Aktiveret","Disabled":"Deaktiveret","Encryption is: %s":"Kryptering er: %s","Edit note.":"Rediger note.","No text editor is defined. Please set it using `config editor <editor-path>`":"Ingen teksteditor er valgt. Vælg en ved at indstille `config editor <editor-path>`","No active notebook.":"Ingen aktiv notesbog.","Note does not exist: \"%s\". Create it?":"Note eksisterer ikke: \"%s\". Skal den oprettes?","Exits the application.":"Forlad/luk program.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Eksporterer Joplin data til valgt sti. Standard er eksport af hele databasen inkl. notesbøger, noter, mærker og ressourcer.","Destination format: %s":"Destinations format: %s","Exports only the given note.":"Eksporter kun valgt note.","Exports only the given notebook.":"Eksporter kun valgt notesbog.","Displays a geolocation URL for the note.":"Vis geolokations URL for noten.","Displays usage information.":"Viser årsags information.","For information on how to customise the shortcuts please visit %s":"For info om tilpasning af links, besøg %s","Shortcuts are not available in CLI mode.":"Links er ikke til rådighed i GUI tilstand.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Tast `help[kommando]` for mere info om en kommando; eller tast `help all` for fuld hjælpe liste .","The possible commands are:":"Mulige kommandoer er:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"I enhver kommando kan en note eller notesbog refereres med titel eller ID, eller ved at bruge links `$n` eller `$b` for valgte noter eller notesbøger. `$c` kan bruges som reference til aktuel/valgt emne.","To move from one pane to another, press Tab Line truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Kopierer alle noter der matcher <note> til [notebook]. Hvis notesbog ikke er udfyldt, kopieres til aktuel notesbog.","Cannot find \"%s\".":"Kan ikke finde \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Viser noterne i den aktuelle notesbog. Brug `ls /` for at vise en liste med notesbøger.","Displays only the first top <num> notes.":"Viser kun de første <num> noter.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sorterer emner ud fra <field> (fx titel, opdateret_tid, oprettelses_tid).","Reverses the sorting order.":"Modsat sortering.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Vis kun emner af specifik(ke) type(r). Kan være `n` for noter. `t` for opgaver eller `nt` for noter og opgaver (tilsvarende `-tt` vil kun vise opgaver, mens `-ttd` vil vise noter og opgaver).","Either \"text\" or \"json\"":"Enten \"text\" eller \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Brug langt liste format. Formatet er ID,NOTE_TÆLLER (for notesbøger), DATO, MARKEREDE_OPGAVER (for opgaver), TITEL","Please select a notebook first.":"Vælg først en notesbog.","Imports data into Joplin.":"Importerer data til Joplin.","Source format: %s":"Kildeformat: %s","Do not ask for confirmation.":"Spørg ikke om bekræftelse.","Found: %d.":"Fundet: %d.","Created: %d.":"Oprettet: %d.","Updated: %d.":"Opdateret %d.","Skipped: %d.":"Droppet %d.","Resources: %d.":"Ressourcer: %d.","Tagged: %d.":"Markeret: %d.","Importing notes...":"Importerer noter...","The notes have been imported: %s":"Noterne er importeret: %s","Enum":"Enum","Type: %s.":"Tast: %s.","Possible values: %s.":"Mulige værdier: %s.","Default: %s":"Standard: %s","Possible keys/values:":"Mulige nøgler/værdier:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Start, stop eller tjek API serveren. Sæt api.port variablen for at vælge hvilken port den skal køre på. Kommandoerne er (%s).","Server is already running on port %d":"Serveren kører allerede på port %d","Server is running on port %d":"Serveren kører på port %d","Server is not running.":"Serveren kører ikke.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Håndterer E2EE konfiguration. Kommandoer er `enable`(aktiver), `disable`(sluk), `decrypt`(dekrypter), `status`, `decrypt-file`(dekrypter fil) og `target-status` (modtager-status).","Enter master password:":"Indtast Hoved kodeord:","Operation cancelled":"Udførelse annulleret","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Dekryptering startet... Vent venligst da kan tage adskillige minutter afhængig af mængden der skal dekrypteres.","Completed decryption.":"Dekryptering færdig.","Confirm password:":"Bekræft kodeord:","Passwords do not match!":"Kodeord stemmer ikke overens!","Enabled":"Aktiveret","Disabled":"Deaktiveret","Encryption is: %s":"Kryptering er: %s","Creates a new notebook.":"Opretter en ny notesbog.","Moves the notes matching <note> to [notebook].":"Flytter alle noter der matcher <note> til [notebook].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Henter eller tilføjer konfigurations værdi. Hvis [value] er tilføjet, vises værdien af [name]. Hvis hverken [name] eller [value] er tilføjet, vises aktuel konfiguration.","Also displays unset and hidden config variables.":"Viser også tomme eller skjulte konfigurations variabler.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Skifter til [notebook] - alle fremtidige handlinger sker i denne notesbog.","Synchronises with remote storage.":"Synkroniserer med fjern-lager.","Sync to provided target (defaults to sync.target config value)":"Synk til valgt mål (standard er sync.target config.value)","Authentication was not completed (did not receive an authentication token).":"Godkendelse blev ikke fuldført (modtog ikke godkendelses token).","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"For at Joplin kan synkronisere med Dropbox, skal man igennem nedenstående trin:","Step 1: Open this URL in your browser to authorise the application:":"Trin 1: Åben denne URL i din browser for at autorisere applikationen:","Step 2: Enter the code provided by Dropbox:":"Trin 2: Indtast koden, som er oplyst af Dropbox:",Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Um ein Schlagwort zu löschen, entferne es bei allen damit verbundenen Notizen.","Please select the note or notebook to be deleted first.":"Wähle bitte zuerst eine Notiz oder ein Notizbuch aus, das gelöscht werden soll.","Press Ctrl+D or type \"exit\" to exit the application":"Drücke Strg+D oder tippe \"exit\" um das Programm zu verlassen","More than one item match \"%s\". Please narrow down your query.":"Mehr als eine Notiz stimmt mit \"%s\" überein. Bitte die Suche einschränken.","No notebook selected.":"Kein Notizbuch ausgewählt.","No notebook has been specified.":"Es wurde kein Notizbuch festgelegt.","Y":"Y","n":"n","N":"N","y":"y","Cancelling background synchronisation... Please wait.":"Breche Hintergrundsynchronisation ab… Bitte warten.","No such command: %s":"Ungültiger Befehl: %s","The command \"%s\" is only available in GUI mode":"Der Befehl \"%s\" ist nur im GUI Modus verfügbar","Cannot change encrypted item":"Kann verschlüsseltes Objekt nicht ändern","Missing required argument: %s":"Fehlendes erforderliches Argument: %s","%s: %s":"%s: %s","Your choice: ":"Deine Auswahl: ","Invalid answer: %s":"Ungültige Antwort: %s","Attaches the given file to the note.":"Hängt die ausgewählte Datei an die Notiz an.","Cannot find \"%s\".":"Kann \"%s\" nicht finden.","Displays the given note.":"Zeigt die jeweilige Notiz an.","Displays the complete information about note.":"Zeigt alle Informationen über die Notiz an.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Zeigt an oder stellt einen Optionswert. Wenn kein [Wert] angegeben ist, wird der Wert vom gegebenen [Namen] angezeigt. Wenn weder [Name] noch [Wert] gegeben sind, wird eine Liste der momentanen Konfiguration angezeigt.","Also displays unset and hidden config variables.":"Zeigt auch nicht gesetzte und versteckte Konfigurationsvariablen an.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Dupliziert die Notizen die mit <note> übereinstimmen in [Notizbuch]. Wenn kein Notizbuch angegeben ist, wird die Notiz in das aktuelle Notizbuch kopiert.","Marks a to-do as done.":"Markiert ein To-Do als erledigt.","Note is not a to-do: \"%s\"":"Notiz ist kein To-Do: \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Verwaltet die E2EE-Konfiguration. Die Befehle lauten `enable`, `disable`, `decrypt`, `status` und `target-status`.","Enter master password:":"Master-Passwort eingeben:","Operation cancelled":"Vorgang abgebrochen","Confirm password:":"Passwort bestätigen:","Passwords do not match!":"Passwörter sind nicht identisch!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Starte Entschlüsselung.... Bitte warten, da dies je nach Anzahl der betreffenden Objekte einige Minuten dauern kann.","Completed decryption.":"Entschlüsselung abgeschlossen.","Enabled":"Aktiviert","Disabled":"Deaktiviert","Encryption is: %s":"Verschlüsselung ist: %s","Edit note.":"Notiz bearbeiten.","No text editor is defined. Please set it using `config editor <editor-path>`":"Kein Texteditor definiert. Bitte lege einen mit `config editor <Pfad-Zum-Texteditor>` fest","No active notebook.":"Kein aktives Notizbuch.","Note does not exist: \"%s\". Create it?":"Notiz \"%s\" existiert nicht. Soll sie erstellt werden?","Exits the application.":"Beendet das Programm.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exportiert Joplin-Dateien in den angegebenen Pfad. Standardmäßig wird die komplette Datenbank inklusive Notizbüchern, Notizen, Schlagwörtern und Anhängen exportiert.","Destination format: %s":"Zielformat: %s","Exports only the given note.":"Exportiert nur die angegebene Notiz.","Exports only the given notebook.":"Exportiert nur das angegebene Notizbuch.","Displays a geolocation URL for the note.":"Zeigt die Standort-URL der Notiz an.","Displays usage information.":"Zeigt die Nutzungsstatistik an.","For information on how to customise the shortcuts please visit %s":"Für weitere Informationen über die Anpassung von Tastenkürzel besuche bitte %s","Shortcuts are not available in CLI mode.":"Tastenkürzel sind im CLI Modus nicht verfügbar.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Tippe `help [Befehl]` um weitere Informationen über einen Befehl zu erhalten oder tippe `help all` für die vollständigen Informationen zur Befehlsverwendung.","The possible commands are:":"Mögliche Befehle lauten:","In any command, a note or notebook can be referred to by title orLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Dupliziert die Notizen die mit <note> übereinstimmen in [notebook]. Wenn kein Notizbuch angegeben ist, wird die Notiz in das aktuelle Notizbuch kopiert.","Cannot find \"%s\".":"Kann \"%s\" nicht finden.","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Zeigt die Notizen im aktuellen Notizbuch an. Benutze `ls /` um eine Liste aller Notizbücher anzuzeigen.","Displays only the first top <num> notes.":"Zeigt nur die ersten <num> Notizen an.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sortiert nach <field> (z. B. Titel, Bearbeitungszeitpunkt, Erstellungszeitpunkt)","Reverses the sorting order.":"Kehrt die Sortierreihenfolge um.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Zeigt nur Elemente bestimmter Typen an. Kann `n` für Notizen sein, `t` für To-Dos, oder `nt` für Notizen und To-Dos (z. B. zeigt `-tt` nur To-Dos an, während `-ttd` Notizen und To-Dos anzeigt).","Either \"text\" or \"json\"":"Entweder \"text\" oder \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Verwende ausführliches Listenformat. Das Format lautet: ID, NOTIZEN_ANZAHL (für Notizbuch), DATUM, TODO_BEARBEITET (für To-Dos), TITEL","Please select a notebook first.":"Bitte wähle erst ein Notizbuch aus.","Imports data into Joplin.":"Importiert Daten in Joplin.","Source format: %s":"Quellformat: %s","Do not ask for confirmation.":"Nicht nach einer Bestätigung fragen.","Output format: %s":"Ausgabeformat: %s","Found: %d.":"Gefunden: %d.","Created: %d.":"Erstellt: %d.","Updated: %d.":"Aktualisiert: %d.","Skipped: %d.":"Übersprungen: %d.","Resources: %d.":"Anhänge: %d.","Tagged: %d.":"Verschlagwortet: %d.","Importing notes...":"Importiere Notizen...","The notes have been imported: %s":"Die Notizen wurden importiert: %s","Enum":"Aufzählung","Type: %s.":"Typ: %s.","Possible values: %s.":"Mögliche Werte: %s.","Default: %s":"Standard: %s","Possible keys/values:":"Mögliche Schlüssel/Werte:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Starte, stoppe oder überprüfe den API Server. Um den Port zu spezifizieren, auf dem er laufen soll, setze die api.port Konfigurationsvariable. Die Befehle lauten (%s).","Server is already running on port %d":"Der Server läuft schon auf Port %d","Server is running on port %d":"Der Server läuft auf Port %d","Server is not running.":"Der Server ist nicht gestartet.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Verwaltet die E2EE-Konfiguration. Die Befehle lauten `enable`, `disable`, `decrypt`, `status`, `decrypt-file` und `target-status`.","Enter master password:":"Master-Passwort eingeben:","Operation cancelled":"Vorgang abgebrochen","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Starte Entschlüsselung.... Bitte warten, da dies je nach Anzahl der betreffenden Objekte einige Minuten dauern kann.","Decrypted items: %d":"Entschlüsselte Objekte: %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Übersprungene Objekte: %d (benutze --retry-failed-items um erneut eine Entschlüsselung zu versuchen)","Completed decryption.":"Entschlüsselung abgeschlossen.","Confirm password:":"Passwort bestätigen:","Passwords do not match!":"Passwörter sind nicht identisch!","Enabled":"Aktiviert","Disabled":"Deaktiviert","Encryption is: %s":"Verschlüsselung ist: %s","Creates a new notebook.":"Erstellt ein neues Notizbuch.","Moves the notes matching <note> to [notebook].":"Verschiebt die Notizen, die mit <note> übereinstimmen, zu [notebook]","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Zeig oder setzt einen Konfigurationswert. Wenn [value] nicht angegeben ist, wird der Wert von [name] angezeigt. Wenn weder [name] noch [value] gegeben sind, wird eine Liste der aktuellen Konfiguration angezeigt.","Also displays unset and hidden config variables.":"Zeigt auch nicht gesetzte und versteckte Konfigurationsvariablen an.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Wechselt zu [notebook] - alle weiteren Aktionen werden in diesem Notizbuch ausgeführt.","Synchronises with remote storage.":"Synchronisiert mit Remotespeicher.","Sync to provided target (defaults to sync.target config value)":"Mit dem angegebenen Ziel synchronisieren (voreingestelLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Για να διαγράψετε μία ετικέτα, αφαιρέστε την πρώτα από τις σχετικές σημειώσεις.","Please select the note or notebook to be deleted first.":"Παρακαλώ πρώτα επιλέξτε τη σημείωση ή το σημειωματάριο που θέλετε να διαγραφτεί.","Press Ctrl+D or type \"exit\" to exit the application":"Πατήστε Ctrl+D ή πληκτρολογήστε \"exit\" για να βγείτε από την εφαρμογή","More than one item match \"%s\". Please narrow down your query.":"Περισσότερα από ένα στοιχεία ταιριάζουν με το \"%s\". Παρακαλώ περιορίστε το ερώτημά σας.","No notebook selected.":"Κανένα σημειωματάριο δεν έχει επιλεχθεί.","No notebook has been specified.":"Κανένα σημειωματάριο δεν έχει καθοριστεί.","Y":"Ν","n":"ο","N":"Ο","y":"ν","Cancelling background synchronisation... Please wait.":"Ακύρωση συγχρονισμού ... Παρακαλώ περιμένετε.","No such command: %s":"Δεν υπάρχει τέτοια εντολή: %s","The command \"%s\" is only available in GUI mode":"Η εντολή \"%s\" είναι διαθέσιμη μόνο σε λειτουργία γραφικού περιβάλλοντος (GUI)","Cannot change encrypted item":"Δεν είναι δυνατή η αλλαγή κρυπτογραφημένου στοιχείου","Missing required argument: %s":"Λείπει το απαιτούμενο όρισμα: %s","%s: %s":"%s: %s","Your choice: ":"Η επιλογή σας: ","Invalid answer: %s":"Μη έγκυρη απάντηση: %s","Attaches the given file to the note.":"Προσθέτει το καθορισμένο αρχείο στη σημείωση.","Cannot find \"%s\".":"Δεν είναι δυνατή η εύρεση του \"%s\".","Displays the given note.":"Εμφανίζει τη καθορισμένη σημείωση.","Displays the complete information about note.":"Εμφανίζει όλες τις πληροφορίες σχετικά με τη σημείωση.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Αποκτά ή ορίζει την τιμή μιας παραμέτρου. Αν δεν υπάρχει [τιμή], θα εμφανιστεί το [όνομα]. Εάν δεν υπάρχει ούτε [όνομα] ούτε [τιμή], θα εμφανιστεί η τρέχουσα παράμετρος.","Also displays unset and hidden config variables.":"Εμφανίζει επίσης μη ορισμένες και κρυφές μεταβλητές.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Αντιγράφει τις σημειώσεις που ταιριάζουν με τη <note> στο [σημειωματάριο]. Εάν δεν έχει οριστεί κανένα σημειωματάριο, η σημείωση αντιγράφεται στον τρέχον.","Marks a to-do as done.":"Επισημαίνει μία σημείωση to-do ως ολοκληρωμένη.","Note is not a to-do: \"%s\"":"Η σημείωση δεν είναι to-do: \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Διαχειρίζεται τις ρυθμίσεις του E2EE. Οι εντολές είναι `enable`, `disable`, `decrypt`, `status`, `decrypt-file` και `target-status`.","Enter master password:":"Πληκτρολογήστε τον κωδικό πρόσβασης:","Operation cancelled":"Η λειτουργία ακυρώθηκε","Confirm password:":"Επιβεβαίωση κωδικού πρόσβασης:","Passwords do not match!":"Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Εκκίνηση αποκρυπτογράφησης... Παρακαλώ περιμένετε καθώς μπορεί να διαρκέσει αρκετά λεπτά ανάλογα με το μέγεθος αυτών που πρέπει να αποκρυπτογραφηθούν.","Completed decryption.":"Η αποκρυπτογράφηση ολοκληρώθηκε.","Enabled":"Ενεργοποιημένη","Disabled":"Απενεργοποιημένη","Encryption is: %s":"Η κρυπτογράφηση είναι: %s","Edit note.":"Eπεξεργασία σημείωσης.","No text editor is defined. Please set it using `config editor <editor-path>`":"Δεν Line truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Αντιγράφει τις σημειώσεις που ταιριάζουν με τη <note> στο [σημειωματάριο]. Εάν δεν έχει οριστεί κανένα σημειωματάριο, η σημείωση αντιγράφεται στον τρέχον.","Cannot find \"%s\".":"Δεν είναι δυνατή η εύρεση του \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Εμφανίζει τις σημειώσεις στο τρέχον σημειωματάριο. Χρησιμοποιήστε το `ls /` για να εμφανίσετε τη λίστα των σημειωματάριων.","Displays only the first top <num> notes.":"Εμφανίζει μόνο τις πρώτες <num> σημειώσεις.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Ταξινόμηση του στοιχείου με <field> (π.χ. τίτλος, ώρα_ενημέρωσης, ώρα_δημιουργίας).","Reverses the sorting order.":"Αντιστρέφει τη σειρά ταξινόμησης.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Εμφανίζει μόνο τα στοιχεία του συγκεκριμένου τύπου. Μπορεί να είναι `n` για σημειώσεις, `t` για to-dos ή `nt` για σημειώσεις και to-dos (π.χ. `-tt` θα εμφανίζει μόνο τα to-dos, ενώ το `-ttd` και σημειώσεις και to-dos.","Either \"text\" or \"json\"":"Είτε \"text\" ή \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Χρησιμοποιήστε τη μορφή μακράς λίστας. Η μορφή είναι ID, NOTE_COUNT (για σημειωματάριο), DATE, TODO_CHECKED (για to-dos), TITLE","Please select a notebook first.":"Παρακαλώ επιλέξτε πρώτα σημειωματάριο.","Imports data into Joplin.":"Εισάγει δεδομένα στο Joplin.","Source format: %s":"Μορφή προέλευσης: %s","Do not ask for confirmation.":"Χωρίς να ζητείται επιβεβαίωση.","Output format: %s":"Μορφή εξόδου: %s","Found: %d.":"Βρέθηκε: %d.","Created: %d.":"Δημιουργήθηκε: %d.","Updated: %d.":"Ενημερώθηκε: %d.","Skipped: %d.":"Παραλείφθηκε: %d.","Resources: %d.":"Πόροι: %d.","Tagged: %d.":"Με ετικέτα: %d.","Importing notes...":"Εισαγωγή σημειώσεων...","The notes have been imported: %s":"Οι σημειώσεις έχουν εισαχθεί: %s","Enum":"Enum","Type: %s.":"Τύπος: %s.","Possible values: %s.":"Πιθανές τιμές: %s.","Default: %s":"Προεπιλογή: %s","Possible keys/values:":"Πιθανά πλήκτρα / τιμές:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Ξεκινήστε, σταματήστε ή ελέγξτε τον διακομιστή API. Για να καθορίσετε σε ποια θύρα θα πρέπει να εκτελεστεί, ορίστε τη μεταβλητή api.port. Οι εντολές είναι (%s).","Server is already running on port %d":"Ο διακομιστής εκτελείται ήδη στη θύρα %d","Server is running on port %d":"Ο διακομιστής εκτελείται στη θύρα %d","Server is not running.":"Ο διακομιστής δεν εκτελείται.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Διαχειρίζεται τις ρυθμίσεις του E2EE. Οι εντολές είναι `enable`, `disable`, `decrypt`, `status`, `decrypt-file` και `target-status`.","Enter master password:":"Πληκτρολογήστε τον κωδικό πρόσβασης:","Operation cancelled":"Η λειτουργία ακυρώθηκε","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Εκκίνηση αποκρυπτογράφησης... Παρακαλώ περιμένετε καθώς μπορεί να διαρκέσει αρκετά λεπτά ανάλογα με το μέγεθος αυτών που πρέπει να αποκρυπτογραφηθούν.","Decrypted items: %d":"Αποκρυπτογραφημένα στοιχεία: %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Στοιχεία που έχουν παραλειφθεί: %d (χρήσιμοποίησε --retry-failed-items για εLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"Cancelling background synchronisation... Please wait.":"Cancelling background synchronization... Please wait.","For information on how to customise the shortcuts please visit %s":"For information on how to customize the shortcuts please visit %s","To maximise/minimise the console, press \"tc\".":"To maximize/minimize the console, press \"tc\".","Synchronises with remote storage.":"Synchronizes with remote storage.","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"To allow Joplin to synchronize with Dropbox, please follow the steps below:","Step 1: Open this URL in your browser to authorise the application:":"Step 1: Open this URL in your browser to authorize the application:","Not authentified with %s. Please provide any missing credentials.":"Not authenticated with %s. Please provide any missing credentials.","Synchronisation is already in progress.":"Synchronization is already in progress.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"Lock file is already being held. If you know that no synchronization is taking place, you may delete the lock file at \"%s\" and resume the operation.","Synchronisation target: %s (%s)":"Synchronization target: %s (%s)","Cannot initialize synchroniser.":"Cannot initialize synchronizer.","Starting synchronisation...":"Starting synchronization...","Synchronisation Status":"Synchronization Status","Synchronise":"Synchronize","Search in all the notes":"Search in all notes","Authorisation token:":"Authorization token:","This authorisation token is only needed to allow third-party applications to access Joplin.":"This authorization token is only needed to allow third-party applications to access Joplin.","Check synchronisation configuration":"Check synchronization configuration","Disabling encryption means *all* your notes and attachments are going to be re-synchronised and sent unencrypted to the sync target. Do you wish to continue?":"Disabling encryption means *all* your notes and attachments are going to be re-synchronized and sent unencrypted to the sync target. Do you wish to continue?","Enabling encryption means *all* your notes and attachments are going to be re-synchronised and sent encrypted to the sync target. Do not lose the password as, for security purposes, this will be the *only* way to decrypt the data! To enable encryption, please enter your password below.":"Enabling encryption means *all* your notes and attachments are going to be re-synchronized and sent encrypted to the sync target. Do not lose the password as, for security purposes, this will be the *only* way to decrypt the data! To enable encryption, please enter your password below.","The master keys with these IDs are used to encrypt some of your items, however the application does not currently have access to them. It is likely they will eventually be downloaded via synchronisation.":"The master keys with these IDs are used to encrypt some of your items, however the application does not currently have access to them. It is likely they will eventually be downloaded via synchronization.","Some items cannot be synchronised.":"Some items cannot be synchronized.","Synchronising...":"Synchronizing...","Could not connect to the Joplin Nextcloud app. Please check the configuration in the Synchronisation config screen. Full error was:\n\n%s":"Could not connect to the Joplin Nextcloud app. Please check the configuration in the Synchronization config screen. Full error was:\n\n%s","The application has been authorised - you may now close this browser tab.":"The application has been authorized - you may now close this browser tab.","The application has been successfully authorised.":"The application has been successfully authorized.","Cannot refresh token: authentication data is missing. Starting the synchronisation again may fix the problem.":"Cannot refresh token: authentication data is missing. Starting the synchronization again may fix the problem.","Synchronisation target":"Synchronization target","The target to synchonise to. Each sync target may have additional parameters which are named as `sync.NUM.NAME` (all documented below).":"The target to synchonize to. Each sync target may have additional parameters which are named as `sync.NUM.NAME` (all documented below).","Directory to synchronise with (absolute path)":"Directory to synchronize with (absolute path)","Attachment download behaviour":"Attachment download behavior","Solarised Light":"Solarized Light","Solarised Dark":"Solarized Dark","This will allow Joplin to run in the background. It is recommended to enable this setting so that your notes are constantly being synchronised, thus reducing the number of conflicts.":"This will allow Joplin to run in the background. It is recommended to enable this setting so that your notes are constantly being synchronized, thus reducing the number of conflicts.","Start applicatiLine truncated
|
||||
{"Synchronises with remote storage.":"Synchronizes with remote storage.","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"To allow Joplin to synchronize with Dropbox, please follow the steps below:","Step 1: Open this URL in your browser to authorise the application:":"Step 1: Open this URL in your browser to authorize the application:","Not authentified with %s. Please provide any missing credentials.":"Not authenticated with %s. Please provide any missing credentials.","Synchronisation is already in progress.":"Synchronization is already in progress.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"Lock file is already being held. If you know that no synchronization is taking place, you may delete the lock file at \"%s\" and resume the operation.","Synchronisation target: %s (%s)":"Synchronization target: %s (%s)","Cannot initialise synchroniser.":"Cannot initialize synchronizer.","Starting synchronisation...":"Starting synchronization...","For information on how to customise the shortcuts please visit %s":"For information on how to customize the shortcuts please visit %s","To maximise/minimise the console, press \"tc\".":"To maximize/minimize the console, press \"tc\".","Cancelling background synchronisation... Please wait.":"Cancelling background synchronization... Please wait.","Synchronise":"Synchronize","emphasised text":"emphasized text","Some items cannot be synchronised.":"Some items cannot be synchronized.","Some items cannot be decrypted.":"Some items cannot be synchronized.","Authorisation token:":"Authorization token:","This authorisation token is only needed to allow third-party applications to access Joplin.":"This authorization token is only needed to allow third-party applications to access Joplin.","Synchronisation Status":"Synchronization Status","In order to do so, your entire data set will have to be encrypted and synchronised, so it is best to run it overnight.\n\nTo start, please follow these instructions:\n\n1. Synchronise all your devices.\n2. Click \"%s\".\n3. Let it run to completion. While it runs, avoid changing any note on your other devices, to avoid conflicts.\n4. Once sync is done on this device, sync all your other devices and let it run to completion.\n\nImportant: you only need to run this ONCE on one device.":"In order to do so, your entire data set will have to be encrypted and synchronized, so it is best to run it overnight.\n\nTo start, please follow these instructions:\n\n1. Synchronize all your devices.\n2. Click \"%s\".\n3. Let it run to completion. While it runs, avoid changing any note on your other devices, to avoid conflicts.\n4. Once sync is done on this device, sync all your other devices and let it run to completion.\n\nImportant: you only need to run this ONCE on one device.","Check synchronisation configuration":"Check synchronization configuration","Search in all the notes":"Search in all notes","Synchronising...":"Synchronizing...","The application has been authorised - you may now close this browser tab.":"The application has been authorized - you may now close this browser tab.","The application has been successfully authorised.":"The application has been successfully authorized.","Solarised Light":"Solarized Light","Solarised Dark":"Solarized Dark","Synchronisation target":"Synchronization target","The target to synchonise to. Each sync target may have additional parameters which are named as `sync.NUM.NAME` (all documented below).":"The target to synchonize to. Each sync target may have additional parameters which are named as `sync.NUM.NAME` (all documented below).","Directory to synchronise with (absolute path)":"Directory to synchronize with (absolute path)","Attachment download behaviour":"Attachment download behavior","This will allow Joplin to run in the background. It is recommended to enable this setting so that your notes are constantly being synchronised, thus reducing the number of conflicts.":"This will allow Joplin to run in the background. It is recommended to enable this setting so that your notes are constantly being synchronized, thus reducing the number of conflicts.","Start application minimised in the tray icon":"Start application minimized in the tray icon","Synchronisation interval":"Synchronization interval","Comma-separated list of paths to directories to load the certificates from, or path to individual cert files. For example: /my/cert_dir, /other/custom.pem. Note that if you make changes to the TLS settings, you must save your changes before clicking on \"Check synchronisation configuration\".":"Comma-separated list of paths to directories to load the certificates from, or path to individual cert files. For example: /my/cert_dir, /other/custom.pem. Note that if you make changes to the TLS settings, you must save your changes before clicking on \"Check synchronization configuration\".","SyLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"No notebook selected.":"Neniu notlibro elektita.","Y":"J","n":"n","N":"N","y":"j","%s: %s":"%s: %s","Your choice: ":"Via elekto: ","Invalid answer: %s":"Malvalida respondo: %s","Cannot find \"%s\".":"Ne eblas trovi \"%s\".","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Marks a to-do as done.":"Marki taskon kiel farita.","Note is not a to-do: \"%s\"":"Noto ne estas tasko: \"%s\"","Enter master password:":"Entajpu ĉefan pasvorton:","Operation cancelled":"Operacio nuligita","Confirm password:":"Konfirmi pasvorton:","Passwords do not match!":"Pasvorto ne kongruas!","Enabled":"Ebligita","Disabled":"Malebligita","Edit note.":"Redakti noton.","No active notebook.":"Ne estas aktiva notlibro.","Note does not exist: \"%s\". Create it?":"Noto ne ekzistas: \"%s\". Ĉu krei ĝin?","Exits the application.":"Eliri la aplikaĵon.","The possible commands are:":"Eblaj komandoj estas:","Source format: %s":"Fonta aranĝo: %s","Do not ask for confirmation.":"Ne demandi pri konfirmo.","Found: %d.":"Trovita: %d.","Created: %d.":"Kreita: %d.","Updated: %d.":"Ĝisdatigita: %d.","Importing notes...":"Importante notojn...","The notes have been imported: %s":"La notoj estis importitaj: %s","Either \"text\" or \"json\"":"Aŭ \"teksto\" aŭ \"json\"","Please select a notebook first.":"Bonvolu elekti noton unue.","Creates a new notebook.":"Kreas novan notlibron.","Creates a new note.":"Kreas novan noton.","Notes can only be created within a notebook.":"Nur eblas krei notojn ene de notlibro.","Creates a new to-do.":"Kreas novan taskon.","Deletes the notebook without asking for confirmation.":"Forigi la notlibron sen peti konfirmon.","Delete note?":"Ĉu forigi noton?","Downloading resources...":"Elŝutante risurcojn...","Cancelling... Please wait.":"Nuligante... Atendu.","Invalid command: \"%s\"":"Malvalida komando: \"%s\"","%s %s (%s)":"%s %s (%s)","Type: %s.":"Tipo: %s.","Possible values: %s.":"Eblaj valoroj: %s.","Default: %s":"Defaŭlto: %s","Possible keys/values:":"Eblaj valoroj/klavoj:","Fatal error:":"Neriparebla eraro:","Search:":"Serĉi:","PDF File":"PDF-dosiero","New note":"Nova noto","New to-do":"Nova tasko","New notebook":"Nova notlibro","New sub-notebook":"Nova subnotlibro","Options":"Opcioj","&File":"&Dosiero","About Joplin":"Pri Joplin","Preferences...":"Preferoj...","Check for updates...":"Kontrolu ĝisdatigojn...","Templates":"Modeloj","Import":"Importi","Export":"Eksporti","Synchronise":"Sinkronigi","Hide %s":"Kaŝi %s","Quit":"Eliri","Close Window":"Fermi Fenestron","&Edit":"&Redakti","Copy":"Kopii","Cut":"Eltondi","Paste":"Alglui","Select all":"Elekti ĉiujn","Bold":"Grasa","Italic":"Kursiva","Link":"Ligilo","Code":"Kodo","Tags":"Etikedoj","Search in all the notes":"Ŝerci en ĉiuj notoj","&View":"&Monti","Focus":"Fokusi","&Tools":"&Ilaro","&Help":"&Helpo","Website and documentation":"Retejo kaj dokumentado","Joplin Forum":"Joplin-forumo","Open %s":"Malfermi %s","Exit":"Eliri","OK":"Bone","Cancel":"Nuligi","%s (pre-release)":"%s (antaŭeldono)","Your version: %s":"Via versio: %s","New version: %s":"Nova versio: %s","Yes":"Jes","No":"Ne","Status: %s":"Stato: %s","Advanced options":"Altnivelaj opcioj","Copy token":"Kopii ĵetonon","Notes and settings are stored in: %s":"Notoj kaj agordoj estas konservitaj en: %s","Browse...":"Esplori...","Edit":"Redakti","Back":"Reen","Apply":"Apliki","Submit":"Submeti","Save":"Konservi","Master Keys":"Ĉefaj Klavoj","Active":"Aktiva","ID":"Identigilo","Source":"Fonto","Created":"Kreita","Updated":"Ĝisdatigita","Password":"Pasvorto","Password OK":"Pasvorto bone","Status":"Stato","Get it now:":"Akiri ĝin nun:","Usage":"Konsumado","New notebook \"%s\" will be created and file \"%s\" will be imported into it":"Nova notlibro \"%s\" estos kreita kaj dosiero \"%s\" estos importita al ĝi","Please create a notebook first.":"Bonvolu krei notlibron unue.","Please create a notebook first":"Bonvolu krei notlibron unue","Notebook title:":"Notlibra titolo:","Add or remove tags:":"Aldoni aŭ forigi etikedojn:","Rename notebook:":"Renomi notlibron:","Rename tag:":"Renomi etikedon:","Template file:":"Modela dosiero:","Layout":"Aspektigo","Search...":"Serĉi...","View them now":"Vidi ilin nun","Set the password":"Elekti pasvorton","No notes in here. Create one by clicking on \"New note\".":"Neniu noto ĉi tie. Por krei noton, alklaku \"Nova noto\".","Location":"Loko","URL":"URL","Note History":"Nota Historio","Markup":"Markado","Note properties":"Notaj atributoj","This note has no history":"Tiu noto ne havas historion","Restore":"Restaŭri","Open...":"Malfermi...","Save as...":"Konservi kiel...","Attach file":"Aldoni dosieron","In: %s":"En: %s","Hyperlink":"Hiperligilo","Checkbox":"Markobutono","Watching...":"Rigardante...","to-do":"tasko","note":"noto","Creating new %s...":"Kreante novan %s...","Clear":"Klariĝi","Delete":"Forigi","OneDrive Login":"OneDrive-salutnomo","Dropbox Login":"Dropbox-salutnomo","Remove":"Forigi","Delete notebook \"%s\"?\n\nAll notes and sub-notebooks within this notebLine truncated
|
||||
{"Cannot find \"%s\".":"Ne eblas trovi \"%s\".","Either \"text\" or \"json\"":"Aŭ \"teksto\" aŭ \"json\"","Please select a notebook first.":"Bonvolu elekti noton unue.","Source format: %s":"Fonta aranĝo: %s","Do not ask for confirmation.":"Ne demandi pri konfirmo.","Found: %d.":"Trovita: %d.","Created: %d.":"Kreita: %d.","Updated: %d.":"Ĝisdatigita: %d.","Importing notes...":"Importante notojn...","The notes have been imported: %s":"La notoj estis importitaj: %s","Type: %s.":"Tipo: %s.","Possible values: %s.":"Eblaj valoroj: %s.","Default: %s":"Defaŭlto: %s","Possible keys/values:":"Eblaj valoroj/klavoj:","Enter master password:":"Entajpu ĉefan pasvorton:","Operation cancelled":"Operacio nuligita","Confirm password:":"Konfirmi pasvorton:","Passwords do not match!":"Pasvorto ne kongruas!","Enabled":"Ebligita","Disabled":"Malebligita","Creates a new notebook.":"Kreas novan notlibron.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Downloading resources...":"Elŝutante risurcojn...","Deletes the notebook without asking for confirmation.":"Forigi la notlibron sen peti konfirmon.","Creates a new to-do.":"Kreas novan taskon.","Notes can only be created within a notebook.":"Nur eblas krei notojn ene de notlibro.","Edit note.":"Redakti noton.","No active notebook.":"Ne estas aktiva notlibro.","Note does not exist: \"%s\". Create it?":"Noto ne ekzistas: \"%s\". Ĉu krei ĝin?","Delete note?":"Ĉu forigi noton?","%s %s (%s)":"%s %s (%s)","Creates a new note.":"Kreas novan noton.","Fatal error:":"Neriparebla eraro:","Search:":"Serĉi:","%s: %s":"%s: %s","Your choice: ":"Via elekto: ","Invalid answer: %s":"Malvalida respondo: %s","Y":"J","n":"n","The possible commands are:":"Eblaj komandoj estas:","Exits the application.":"Eliri la aplikaĵon.","No notebook selected.":"Neniu notlibro elektita.","N":"N","y":"j","Invalid command: \"%s\"":"Malvalida komando: \"%s\"","Marks a to-do as done.":"Marki taskon kiel farita.","Note is not a to-do: \"%s\"":"Noto ne estas tasko: \"%s\"","OK":"Bone","Cancel":"Nuligi","%s (pre-release)":"%s (antaŭeldono)","Your version: %s":"Via versio: %s","New version: %s":"Nova versio: %s","Yes":"Jes","No":"Ne","This note has no history":"Tiu noto ne havas historion","Restore":"Restaŭri","Back":"Reen","Remove":"Forigi","Delete notebook \"%s\"?\n\nAll notes and sub-notebooks within this notebook will also be deleted.":"Forigi notlibron \"%s\"?\n\nĈiuj notoj kaj subnotlibroj ene de tiu notlibro estos ankaŭ forigitaj.","Delete":"Forigi","Remove tag \"%s\" from all notes?":"Forigi etikedon \"%s\" el ĉiuj notoj?","Remove this search from the sidebar?":"Forigi tiun sercôn el la flankpanelo?","Export":"Eksporti","Synchronise":"Sinkronigi","All notes":"Ĉiuj notoj","Notebooks":"Notlibroj","Tags":"Etikedoj","Cut":"Eltondi","Copy":"Kopii","Paste":"Alglui","Layout":"Aspektigo","Edit":"Redakti","Attach file":"Aldoni dosieron","Open...":"Malfermi...","Save as...":"Konservi kiel...","to-do":"tasko","note":"noto","Creating new %s...":"Kreante novan %s...","Select all":"Elekti ĉiujn","Bold":"Grasa","Italic":"Kursiva","Hyperlink":"Hiperligilo","Code":"Kodo","Checkbox":"Markobutono","ID":"Identigilo","Created":"Kreita","Updated":"Ĝisdatigita","Location":"Loko","URL":"URL","Note History":"Nota Historio","Markup":"Markado","Note properties":"Notaj atributoj","Search...":"Serĉi...","Import":"Importi","Quit":"Eliri","Website and documentation":"Retejo kaj dokumentado","Close Window":"Fermi Fenestron","Options":"Opcioj","Save":"Konservi","View them now":"Vidi ilin nun","Set the password":"Elekti pasvorton","Rename":"Renomi","Rename notebook:":"Renomi notlibron:","New to-do":"Nova tasko","PDF File":"PDF-dosiero","New note":"Nova noto","Rename tag:":"Renomi etikedon:","New notebook":"Nova notlibro","Notebook title:":"Notlibra titolo:","Template file:":"Modela dosiero:","Add or remove tags:":"Aldoni aŭ forigi etikedojn:","In: %s":"En: %s","New sub-notebook":"Nova subnotlibro","Status: %s":"Stato: %s","Advanced options":"Altnivelaj opcioj","Copy token":"Kopii ĵetonon","OneDrive Login":"OneDrive-salutnomo","Dropbox Login":"Dropbox-salutnomo","Get it now:":"Akiri ĝin nun:","New notebook \"%s\" will be created and file \"%s\" will be imported into it":"Nova notlibro \"%s\" estos kreita kaj dosiero \"%s\" estos importita al ĝi","Submit":"Submeti","Sort notes by":"Ordigi notojn laŭ","No notes in here. Create one by clicking on \"New note\".":"Neniu noto ĉi tie. Por krei noton, alklaku \"Nova noto\".","Duplicate":"Duobligi","%s - Copy":"%s - Kopii","Switch between note and to-do type":"Ŝalti inter nota kaj taska tipo","Switch to note type":"Ŝalti al nota tipo","Switch to to-do type":"Ŝalti al taska tipo","Delete note \"%s\"?":"Forigi noton \"%s\"?","Delete these %d notes?":"Forigi tiujn %d notojn?","Watching...":"Rigardante...","Status":"Stato","Retry":"Reprovi","Please create a notebook first.":"Bonvolu krei notlibron unue.","Please create a notebook first":"Bonvolu krei notlibron unue","Clear":"KlarLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Desmarque las notas asociadas para eliminar una etiqueta.","Please select the note or notebook to be deleted first.":"Seleccione primero la nota o libreta que desea eliminar.","Press Ctrl+D or type \"exit\" to exit the application":"Pulse Ctrl+D o escriba «salir» para salir de la aplicación","More than one item match \"%s\". Please narrow down your query.":"Hay más de un elemento que coincide con «%s». Intente mejorar su consulta.","No notebook selected.":"No se ha seleccionado ninguna libreta.","No notebook has been specified.":"Ninguna libreta fue especificada.","Y":"Y","n":"n","N":"N","y":"y","Cancelling background synchronisation... Please wait.":"Cancelando sincronización en segundo plano... Por favor espere.","No such command: %s":"El comando no existe: %s","The command \"%s\" is only available in GUI mode":"El comando «%s» solamente está disponible en modo GUI","Cannot change encrypted item":"No se puede cambiar el elemento cifrado","Missing required argument: %s":"Falta un argumento requerido: %s","%s: %s":"%s: %s","Your choice: ":"Su elección: ","Invalid answer: %s":"Respuesta inválida: %s","Attaches the given file to the note.":"Adjuntar archivo a la nota.","Cannot find \"%s\".":"No se puede encontrar «%s».","Displays the given note.":"Mostrar la nota dada.","Displays the complete information about note.":"Mostrar la información completa acerca de la nota.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtener o configurar un valor. Si no se provee el [valor], se mostrará el valor de [nombre]. Si no se provee [nombre] ni [valor], se listará la configuración actual.","Also displays unset and hidden config variables.":"También muestra variables ocultas o no configuradas.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica las notas que coincidan con <note> en la libreta. Si no se especifica una libreta la nota se duplica en la libreta actual.","Marks a to-do as done.":"Marca una tarea como hecha.","Note is not a to-do: \"%s\"":"La nota no es una tarea: «%s»","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Gestiona la configuración E2EE. Los comandos disponibles son: `enable`, `disable`, `decrypt`, `status`, `decrypt-file` y `target-status`.","Enter master password:":"Introduzca la contraseña maestra:","Operation cancelled":"Operación cancelada","Confirm password:":"Confirma la contraseña:","Passwords do not match!":"¡Las contraseñas no coinciden!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Iniciando descifrado... Por favor espere, puede tardar varios minutos dependiendo de cuanto haya que descifrar.","Completed decryption.":"Descifrado completado.","Enabled":"Habilitado","Disabled":"Deshabilitado","Encryption is: %s":"El cifrado es: %s","Edit note.":"Editar una nota.","No text editor is defined. Please set it using `config editor <editor-path>`":"No hay editor de texto definido. Por favor configure uno usando `config editor <editor-path>`","No active notebook.":"No hay libreta activa.","Note does not exist: \"%s\". Create it?":"La nota no existe: «%s». ¿Crearla?","Exits the application.":"Sale de la aplicación.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exporta datos de Joplin al directorio indicado. Por defecto, se exportará la base de datos completa incluyendo libretas, notas, etiquetas y recursos.","Destination format: %s":"Formato de destino: %s","Exports only the given note.":"Exporta únicamente la nota indicada.","Exports only the given notebook.":"Exporta únicamente la libreta indicada.","Displays a geolocation URL for the note.":"Muestra la URL de la geolocalización de la nota.","Displays usage information.":"Muestra información de uso.","For information on how to customise the shortcuts please visit %s":"Para información de cómo personalizar los atajos, por favor visite %s","Shortcuts are not available in CLI mode.":"Atajos no disponibles en modo CLI.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Escriba `help [comando]` para obtener más información sobre el comando, o escriba `help all` para obtener toda la información acerca del uso del programa.","The possible commands are:":"Los posibles comandos son:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"CLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica las notas que coincidan con <note> en la libreta. Si no se especifica una libreta la nota se duplica en la libreta actual.","Cannot find \"%s\".":"No se puede encontrar «%s».","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Muestra las notas en la libreta actual. Usa `ls /` para mostrar la lista de libretas.","Displays only the first top <num> notes.":"Muestra las primeras <num> notas.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Ordena los elementos por campo ( ej. title, updated_time, created_time).","Reverses the sorting order.":"Invierte el orden.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Muestra únicamente los elementos de los tipos especificados. Pueden ser `n` para notas, `t` para tareas, o `nt` para libretas y tareas (ej. `-tt` mostrará unicamente las tareas, mientras `-ttd` mostrará notas y tareas).","Either \"text\" or \"json\"":"Puede ser «text» o «json»","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Usar formato largo de lista. El formato es ID, NOTE_COUNT ( para libretas), DATE,TODO_CHECKED ( para tareas), TITLE","Please select a notebook first.":"Por favor seleccione la libreta.","Imports data into Joplin.":"Importa los datos en Joplin.","Source format: %s":"Formato de origen: %s","Do not ask for confirmation.":"No requiere confirmación.","Output format: %s":"Formato de destino: %s","Found: %d.":"Encontrado: %d.","Created: %d.":"Creado: %d.","Updated: %d.":"Actualizado: %d.","Skipped: %d.":"Omitido: %d.","Resources: %d.":"Recursos: %d.","Tagged: %d.":"Etiquetado: %d.","Importing notes...":"Importando notas...","The notes have been imported: %s":"Las notas han sido importadas: %s","Enum":"Enumeración","Type: %s.":"Tipo: %s.","Possible values: %s.":"Posibles valores: %s.","Default: %s":"Por defecto: %s","Possible keys/values:":"Claves/valores posbiles:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Inicie, pare o compruebe el servidor API. Para especificar el puerto que debe ejecutarse use api.port como variable en la configuración. Los comandos son (%s).","Server is already running on port %d":"El servidor ya esta iniciado en el puerto %d","Server is running on port %d":"El servidor se está ejecutando en el puerto %d","Server is not running.":"El servidor no se está ejecutando.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Gestiona la configuración E2EE. Los comandos disponibles son: `enable`, `disable`, `decrypt`, `status`, `decrypt-file` y `target-status`.","Enter master password:":"Introduzca la contraseña maestra:","Operation cancelled":"Operación cancelada","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Iniciando descifrado... Por favor espere, puede tardar varios minutos dependiendo de cuanto haya que descifrar.","Decrypted items: %d":"Elementos descifrados: %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Elementos omitidos: %d (use --retry-failed-items para intentar descifrarlos nuevamente)","Completed decryption.":"Descifrado completado.","Confirm password:":"Confirma la contraseña:","Passwords do not match!":"¡Las contraseñas no coinciden!","Enabled":"Habilitado","Disabled":"Deshabilitado","Encryption is: %s":"El cifrado es: %s","Creates a new notebook.":"Crea una nueva libreta.","Moves the notes matching <note> to [notebook].":"Mueve las notas que coincidan con <note> a la [libreta].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtener o configurar un valor. Si no se provee el [valor], se mostrará el valor de [nombre]. Si no se provee [nombre] ni [valor], se listará la configuración actual.","Also displays unset and hidden config variables.":"También muestra variables ocultas o no configuradas.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Cambia una [libreta] - todas las demás operaciones se realizan en ésta libreta.","Synchronises with remote storage.":"Sincroniza con el almacenamiento remoto.","Sync to provided target (defaults to sync.target config value)":"Sincroniza con el destino indicado (por defecto al valor de configuración sync.target)","Authentication was not completed (did not receive an authentication token).":"Autenticación no completada (no seLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Sildi kustutamiseks eemaldage märkmed seotud silt.","Please select the note or notebook to be deleted first.":"Valige esmalt kustutatav märkus või märkmik.","Press Ctrl+D or type \"exit\" to exit the application":"Rakendusest väljumiseks vajutage Ctrl+D või kirjutage \"exit\"","More than one item match \"%s\". Please narrow down your query.":"\"%s\" vastab rohkem kui ühele üksusele. Palun kitsendage oma päringut.","No notebook selected.":"Ühtegi märkmikku pole valitud.","No notebook has been specified.":"Ühtegi märkmikku pole määratud.","Y":"Y","n":"n","N":"N","y":"y","Cancelling background synchronisation... Please wait.":"Tausta sünkroniseerimise tühistamine... Oota.","No such command: %s":"Sellist käsku pole: %s","The command \"%s\" is only available in GUI mode":"Käsk %s on saadaval ainult graafilises kasutajaliideses","Cannot change encrypted item":"Krüpteeritud üksust ei saa muuta","Missing required argument: %s":"Puuduv nõutav argument: %s","%s: %s":"%s: %s","Your choice: ":"Sinu valik: ","Invalid answer: %s":"Sobimatu vastus: %s","Attaches the given file to the note.":"Manustab antud faili märkmele.","Cannot find \"%s\".":"Ei leia \" %s\".","Displays the given note.":"Kuvab antud märkme.","Displays the complete information about note.":"Kuvatakse märkme kohta täielik teave.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Saab või seab seadistusväärtuse. Kui väärtust [value] ei ole esitatud, näitab see [name] väärtust. Kui ei ole esitatud [name] ega [value], loetatakse praegune konfiguratsioon.","Also displays unset and hidden config variables.":"Kuvab ka seatud ja peidetud konfiguratsioonimuutujad.","%s = %s (%s)":"%s = %s ( %s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Kopeerib märkmed, mis vastavad märkusele <note> ja [notebook]. Kui ühtegi märkmikku pole täpsustatud, dubleeritakse see praeguses märkmikus.","Marks a to-do as done.":"Märgib, et ülesannete loetelu on tehtud .","Note is not a to-do: \"%s\"":"Märkus ei ole ülesannete loetelu: %s","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Haldab E2EE konfigureerimist. Käsud on `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.","Enter master password:":"Sisestage põhiparool:","Operation cancelled":"Toiming tühistati","Confirm password:":"Kinnitage parool:","Passwords do not match!":"Paroolid ei kattu!","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Dekrüpteerimise käivitamine... Palun oodake. See võib võtta mitu minutit sõltuvalt sellest, kui palju on dekrüpteerida.","Completed decryption.":"Dekrüpteerimine on lõpetatud.","Enabled":"Lubatud","Disabled":"Keelatud","Encryption is: %s":"Krüpteerimine on: %s","Edit note.":"Redigeeri märkust.","No text editor is defined. Please set it using `config editor <editor-path>`":"Tekstiredaktorit pole määratletud. Seadistage see kasutades konfiguratsiooniredaktorit <editor-path>","No active notebook.":"Aktiivset märkmikku pole.","Note does not exist: \"%s\". Create it?":"Märget pole olemas: \"%s\". Kas luua?","Exits the application.":"Väljub rakendusest.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Ekspordib Joplini andmed antud teele. Vaikimisi ekspordime täieliku andmebaasi, sealhulgas märkmikud, märkmed, sildid ja ressursid.","Destination format: %s":"Sihtkoha Formaat: %s","Exports only the given note.":"Ekspordib ainult antud märkuse.","Exports only the given notebook.":"Ekspordib ainult antud märkmiku.","Displays a geolocation URL for the note.":"Kuvatakse märkme geograafilise asukoha URL.","Displays usage information.":"Kuvab kasutusteabe.","For information on how to customise the shortcuts please visit %s":"Teavet selle kohta, kuidas kohandada otseteed Palun külastage %s","Shortcuts are not available in CLI mode.":"Otseteed pole CLI režiimis saadaval.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Käsu kohta lisateabe saamiseks tippige käsk `help [command]`; või tippige täieliku kasutamise teabe saamiseks `help all`.","The possible commands are:":"Võimalikud käsud on:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"Mis tahes käsu, Märkus või märkmiku saab viidatud pealkirja või ID või kasutades otseteed `$n` või `$b` vastavalt praeguLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Kopeerib märkmed, mis vastavad märkusele <note> ja [notebook]. Kui ühtegi märkmikku pole täpsustatud, dubleeritakse see praeguses märkmikus.","Cannot find \"%s\".":"Ei leia \" %s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Kuvab märkmed praeguses märkmikus. Kasutage märkmike loendi kuvamiseks ' ls /'.","Displays only the first top <num> notes.":"Kuvab ainult esimesed <num> märkmed.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sordib üksuse järgi <field> (nt pealkiri, uuendatud_aeg, loodud_aeg).","Reverses the sorting order.":"Pöörab sorteerimis järjestuse ümber.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Kuvab ainult konkreetset tüüpi tüübid. Võib olla `n` märkmete jaoks, `t` ülesannete jaoks või `nt` märkmete ja ülesannete jaoks (nt `-tt` kuvaks ainult ülesandeid, `-ttd` aga märkmeid ja ülesanded.","Either \"text\" or \"json\"":"Kas \"tekst\" või \"JSON\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Kasutage pikka nimekirja vormingut. ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE","Please select a notebook first.":"Palun valige esmalt märkmik.","Imports data into Joplin.":"Impordib andmed Joplini.","Source format: %s":"Allika Formaat: %s","Do not ask for confirmation.":"Ära küsi kinnitust.","Found: %d.":"Leitud: %d.","Created: %d.":"Loodud: %d.","Updated: %d.":"Värskendatud: %d.","Skipped: %d.":"Vahele jäetud: %d.","Resources: %d.":"Ressursid: %d.","Tagged: %d.":"Sildistatud: %d.","Importing notes...":"Märkmete importimine...","The notes have been imported: %s":"Märkmed on imporditud: %s","Type: %s.":"Tüüp: %s.","Possible values: %s.":"Võimalikud väärtused: %s.","Default: %s":"Default: %s","Possible keys/values:":"Võimalikud klahvid/väärtused:","Server is already running on port %d":"Server töötab juba pordis %d","Server is running on port %d":"Serveris töötab port %d","Server is not running.":"Server ei tööta.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Haldab E2EE konfigureerimist. Käsud on `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.","Enter master password:":"Sisestage põhiparool:","Operation cancelled":"Toiming tühistati","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Dekrüpteerimise käivitamine... Palun oodake. See võib võtta mitu minutit sõltuvalt sellest, kui palju on dekrüpteerida.","Completed decryption.":"Dekrüpteerimine on lõpetatud.","Confirm password:":"Kinnitage parool:","Passwords do not match!":"Paroolid ei kattu!","Enabled":"Lubatud","Disabled":"Keelatud","Encryption is: %s":"Krüpteerimine on: %s","Creates a new notebook.":"Loob uue märkmiku.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Saab või seab seadistusväärtuse. Kui väärtust [value] ei ole esitatud, näitab see [name] väärtust. Kui ei ole esitatud [name] ega [value], loetatakse praegune konfiguratsioon.","Also displays unset and hidden config variables.":"Kuvab ka seatud ja peidetud konfiguratsioonimuutujad.","%s = %s (%s)":"%s = %s ( %s)","%s = %s":"%s = %s","Synchronisation is already in progress.":"Sünkroniseerimine on juba teoksil.","Starting synchronisation...":"Sünkroonimise käivitamine...","Downloading resources...":"Ressursside allalaadimine...","Renames the given <item> (note or notebook) to <name>.":"Nimetab antud <item> (Märkus või märkmik) <name>.","Deletes the given notebook.":"Kustutab antud märkmiku.","Creates a new to-do.":"Loob uue tee.","Notes can only be created within a notebook.":"Märkmeid saab luua ainult märkmiku sees.","Displays the given note.":"Kuvab antud märkme.","Displays the complete information about note.":"Kuvatakse märkme kohta täielik teave.","Edit note.":"Redigeeri märkust.","No text editor is defined. Please set it using `config editor <editor-path>`":"Tekstiredaktorit pole määratletud. Seadistage see kasutades konfiguratsiooniredaktorit <editor-path>","No active notebook.":"Aktiivset märkmikku pole.","Note does not exist: \"%s\". Create it?":"Märget pole olemas: \"%s\". Kas luua?","To delete a tag, untag the associated notes.":"Sildi kustutamiseks eemaldage märkmed seotud silt.","Please select the note or notebook to be deleted first.":"Valige esmalt kustutatav märkus või märkmik.","Press Ctrl+D or type \"exit\" to exit the application":"RakendusestLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Etiketa ezabatzeko, kendu etiketa duten oharrei","Please select the note or notebook to be deleted first.":"Aurretik aukeratu ezabatzeko oharra edo koadernoa, mesedez.","Press Ctrl+D or type \"exit\" to exit the application":"Sakatu Ktrl+D edo idatzi \"exit\" aplikaziotik irteteko","More than one item match \"%s\". Please narrow down your query.":"Elementu bat baino gehiago bat dator \"%s\" bilaketarekin. Mugatu zure bilaketa, mesedez.","No notebook selected.":"Ez dago koadernorik aukeratuta","No notebook has been specified.":"Ez dago koadernorik aukeratuta.","Y":"B","n":"e","N":"E","y":"b","Cancelling background synchronisation... Please wait.":"Atzeko sinkronizazioa uzten... Mesedez itxaron.","No such command: %s":"Ez dago komandorik: %s","The command \"%s\" is only available in GUI mode":"\"%s\" komandoa soilik eskuragarri GUI moduan","Cannot change encrypted item":"Ezinezkoa zifratutako itema aldatzea","Missing required argument: %s":"Beharrezko argumentua faltan: %s","%s: %s":"%s: %s","Your choice: ":"Zure aukera:","Invalid answer: %s":"Erantzun baliogabea: %s","Attaches the given file to the note.":"Erantsi fitxategia notan","Cannot find \"%s\".":"Ezin aurkitu \"%s\"","Displays the given note.":"Oharra erakutsi","Displays the complete information about note.":"Erakutsi oharrari buruzko informazio guztia.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Konfigurazio balioa hartu edo ezartzen du. Baldin eta [balioa] ez bada ematen, [izena]ren balioa erakutsiko du. Ez bada ematen [izena] ez [balioa], oraingo konfigurazioaren zerrenda erakutsiko da.","Also displays unset and hidden config variables.":"Ezkutuko edo zehaztu gabeko konfigurazio aldagaiak ere erakusten ditu.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"<oharra>rekin bat datozen oharrak [koaderno]ra kopiatzen ditu. Koadernorik ez bada zehazten, oharra oraingo koadernoan bikoiztuko da","Marks a to-do as done.":"Markatu zeregina egindakotzat.","Note is not a to-do: \"%s\"":"Oharra ez da zeregina: \"%s\"","Enter master password:":"Sartu pasahitz nagusia:","Operation cancelled":" Eragiketa utzita","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Deszifratzearen hasiera... Mesedez itxaron, prozesua luzea izan daiteke, zenbat dagoen prozesatzeko.","Completed decryption.":"Deszifratuta.","Enabled":"Gaituta","Disabled":"Desgaituta","Encryption is: %s":"Zifratzea da: %s","Edit note.":"Oharra editatu.","No text editor is defined. Please set it using `config editor <editor-path>`":"Testu editorerik ez dago definituta. Egin hau erabilita, mesedez: `config editor <editorearen-helbidea>`","No active notebook.":"Ez dago koadernorik aukeratuta.","Note does not exist: \"%s\". Create it?":"Ez dago oharrik: \"%s\". Sortu?","Exits the application.":"Irten aplikaziotik.","Exports only the given note.":"Esportatu emandako oharra soilik.","Exports only the given notebook.":"Esportatu emandako koadernoa soilik.","Displays a geolocation URL for the note.":"Erakutsi URL geolokalizazioa oharrean.","Displays usage information.":"Erakutsi erabilera datuak.","Shortcuts are not available in CLI mode.":"CLI moduan ez dago lasterbiderik erabilgarri.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Idatzi `help [command]` komandoari buruzko informazio gehiagorako; edo idatzi `help all` erabilerari buruzko informazio osoa lortzeko.","The possible commands are:":"Litezkeen komandoak hauek dira:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"Edozein komandotan, oharra edo koadernoari erreferentzia egin ahal zaio izenburuz edo ID erabilita, edo `$n` edo `$b` lasterbideak erabilita, aukeratuta dagoen oharra edo koadernoa erabiltzeko. `$c` ere erabil daiteke aukeratutako elementua erabiltzeko.","To move from one pane to another, press Tab or Shift+Tab.":"Panel batetik bestera mugitzeko, sakatu Tab edo Shifft + Tab.","Use the arrows and page up/down to scroll the lists and text areas (including this console).":"Erabili geziak edo page up/down list eta testu guneen artean aldatzeko (kontsola hau ere kontuan izanda).","To enter command line mode, press \":\"":"Komando lerroa sartzeko, idatzi \":\"","To exit command line mode, press ESCAPE":"Komando lerrotik irteteko, sakatu ESC, mesedez","Do not ask for confirmation.":"Ez galdetu berresteko.","Found: %d.":"Aurkitua: %d","Created: %d.":"Sortuta: %d.","Updated: %d.":"Eguneratuta: %d.","Skipped: %d.":"Saltatuta: %d.","RLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"<oharra>rekin bat datozen oharrak [koaderno]ra kopiatzen ditu. Koadernorik ez bada zehazten, oharra oraingo koadernoan bikoiztuko da","Cannot find \"%s\".":"Ezin aurkitu \"%s\"","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Oraingo koadernoko oharrak erakusten ditu. Erabili `ls /` koadernoen zerrenda erakusteko.","Displays only the first top <num> notes.":"Erakusten ditu soilik gorengo <num> oharrak.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Itemak antolatzen ditu <field> arabera (esate baterako, izenburua, eguneratze_unea, sortze_unea).","Reverses the sorting order.":"Alderantziz antolatzen du.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Zehaztutako item motak baino ez du erakusten. Izan daiteke `n` oharretarako, `t` zereginetarako, edo `nt` ohar eta zereginetarako (esate batrako, `-tt` zereginak erakutsiko ditu soilik, `-ttd` berriz zereginak eta oharrak.","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Zerrenda luzearen formatua erabili. Formatua hau da, ID, NOTE_COUNT (libururako), DATE, TODO_CHECKED (zereginetarako), TITLE","Please select a notebook first.":"Aurretik aukeratu formatua, mesedez.","Do not ask for confirmation.":"Ez galdetu berresteko.","Found: %d.":"Aurkitua: %d","Created: %d.":"Sortuta: %d.","Updated: %d.":"Eguneratuta: %d.","Skipped: %d.":"Saltatuta: %d.","Resources: %d.":"Baliabideak: %d.","Tagged: %d.":"Etiketatuta: %d.","Importing notes...":"Oharrak inportatzen...","The notes have been imported: %s":"Oharrak inportatu dira: %s","Enum":"Zenbakitu","Type: %s.":"Idatz: %s.","Possible values: %s.":"Litezkeen balioak: %s.","Default: %s":"Lehenetsia: %s","Possible keys/values:":"Litezkeen balioak:","Enter master password:":"Sartu pasahitz nagusia:","Operation cancelled":" Eragiketa utzita","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Deszifratzearen hasiera... Mesedez itxaron, prozesua luzea izan daiteke, zenbat dagoen prozesatzeko.","Completed decryption.":"Deszifratuta.","Enabled":"Gaituta","Disabled":"Desgaituta","Encryption is: %s":"Zifratzea da: %s","Creates a new notebook.":"Koaderno berria sortzen du.","Moves the notes matching <note> to [notebook].":"Oharrak eramaten ditu <note> bilatuta [notebook]era.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Konfigurazio balioa hartu edo ezartzen du. Baldin eta [balioa] ez bada ematen, [izena]ren balioa erakutsiko du. Ez bada ematen [izena] ez [balioa], oraingo konfigurazioaren zerrenda erakutsiko da.","Also displays unset and hidden config variables.":"Ezkutuko edo zehaztu gabeko konfigurazio aldagaiak ere erakusten ditu.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Aldatu [koaderno]ra - hurrengo eragiketak koaderno horretan jazoko dira.","Synchronises with remote storage.":"Urruneko biltegiarekin sinkronizatzen du.","Authentication was not completed (did not receive an authentication token).":"Autentifikazioa ez da egin osorik (ez du token-ik hartu).","Not authentified with %s. Please provide any missing credentials.":"Ez da autentifikatu %s -rekin. Eman galdutako kredentzialak.","Synchronisation is already in progress.":"Sinkronizazio prozesua dagoeneko abian da.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"Giltzatzeko fitxategia dagoeneko eutsita dagoeneko. Baldin eta badakizu ez dena sinkronizaziorik egiten ari, ken dezakezu giltzatzeko fitxategia \"%s\"-n eta berrekin eragiketari.","Synchronisation target: %s (%s)":"Sinkronizazio helburua: %s (%s)","Starting synchronisation...":"Sinkronizazioa hasten...","Renames the given <item> (note or notebook) to <name>.":"Ber izendatu emandako <item> (oharra edo koadernoa) <name> izen berriaz.","Deletes the given notebook.":"Ezabatu emandako koadernoak.","Deletes the notebook without asking for confirmation.":"Ezabatu koadernoak berrespenik gabe.","Creates a new to-do.":"Zeregin berria sortu.","Notes can only be created within a notebook.":"Oharrak soilik sor daitezke koaderno baten barruan.","Displays the given note.":"Oharra erakutsi","Displays the complete information about note.":"Erakutsi oharrari buruzko informazio guztia.","Edit note.":"Oharra editatu.","No text editor is defined. Please set it using `config editor <editor-path>`":"Testu editorerik ez dago definituta. Egin hau Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"برای حذف یک برچسب، این برچسب را از یادداشت های مرتبط پاک کنید.","Please select the note or notebook to be deleted first.":"برای پاک کردن لطفاً ابتدا یادداشت یا دفترچه را انتخاب کنید.","Press Ctrl+D or type \"exit\" to exit the application":"برای خروج Ctrl+D را فشار دهید یا exit را تایپ کنید","More than one item match \"%s\". Please narrow down your query.":"بیش از یک مورد مطابق «%s» وجود دارد. لطفاعبارت جستجو را محدودتر کنید.","No notebook selected.":"هیچ دفترچهای انتخاب نشده.","No notebook has been specified.":"هیچ دفترچهای مشخص نشده.","Y":"Y","n":"n","N":"N","y":"y","No such command: %s":"این دستور وجود ندارد: %s","The command \"%s\" is only available in GUI mode":"دستور «%s» فقط در حالت گرافیکی (GUI) کاربرد دارد","Cannot change encrypted item":"نمیتوان مورد رمزگذاری شده را تغییر داد","Missing required argument: %s":"کمبود آرگمان در دستور: %s","%s: %s":"%s: %s","Your choice: ":"انتخاب شما: ","Invalid answer: %s":"پاسخ نامعتبر: %s","Attaches the given file to the note.":"فایل مشخص شده را به یادداشت پیوست کن.","Cannot find \"%s\".":"«%s» یافت نشد.","Displays the given note.":"یادداشت مشخص شده را نمایش بده.","Displays the complete information about note.":"مشخصات کامل یادداشت را نمایش بده.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Marks a to-do as done.":"علامت زدن فهرست کارها به عنوان انجام شده.","Enter master password:":"رمز اصلی را وارد کنید:","Operation cancelled":"عملیات لغو شد","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"شروع رمزگشایی... این کار ممکن است چند دقیقه طول بکشد، لطفا صبر کنید.","Completed decryption.":"رمزگشایی کامل شد.","Enabled":"فعال","Disabled":"غیرفعال","Encryption is: %s":"رمزنگاری: %s","Edit note.":"تغییر یادداشت.","No active notebook.":"دفترچهی فعالی وجود ندارد.","Exits the application.":"خروح از نرمافزار.","Destination format: %s":"فرمت مقصد: %s","Exports only the given note.":"فقط یادداشت مشخص شده را خروجی بده.","Exports only the given notebook.":"فقط دفترجه مشخص شده را خروجی بده.","Displays a geolocation URL for the note.":"آدرس ژئولوکیشن یادداشت را نمایش بده.","Displays usage information.":"نمایش اطلاعات مربوط به استفاده.","Shortcuts are not available in CLI mode.":"کلید میانبر در حالت خط فرمان (CLI) کار نمیکند.","The possible commands are:":"دستور های ممکن عبارتند از:","To enter command line mode, press \":\"":"برای ورود به حالت خط فرمان، : را فشار دهید","To exit command line mode, press ESCAPE":"برای خروج از حالت خط فرمان، دکمه ی Esc را فشار دهید","Imports data into Joplin.":"بارگذاری اطلاعات در جاپلین.","Source format: %s":"فرمت مبدا: %s","Do not ask for confirmation.":"برای تایید سوال نکن.","Found: %d.":"پیدا شده: %d.","Created: %d.":"ایجاد شده: %d.","Updated: %d.":"بهروز شده: %d.","Resources: %d.":"منابع: %d.","Tagged: %d.":"برچسب گذاری شده: %d.","Importing notes...":"بارگذاری یادداشتها...","Reverses the sorting order.":"معکوس کردن ترتیب مرتبسازی.","Either \"text\" or \"json\"":"یا «text» و یا «json»","Please select a notebook first.":"لطفا ابتدا یه دفترچه مشخص کنید.","Creates a new notebook.":"ایجاد دفترچه جدید.","Creates a new note.":"ایجاد یادداشت جدید.","Notes can only be created within a notebook.":"یادداشتها میتوانند در دفترچه ایجاد شوند.","Deletes the given notebook.":"پاک کردن یادداشت مشخص شده.","Delete note?":"پاک کردن یادداشت؟","Cancelling... Please wait.":"در حال لغو... لطفا منتظر بمانید.","%s %s (%s)":"%s %s (%s)","Default: %s":"پیشفرض: %s","Possible keys/values:":"کلید ها یا مقادیر ممکن:","Search:":"جستجو:","Sidebar":"نوار کناری","Note title":"موضوع یادداشت","Note body":"بدنه ی یادداشت","PDF File":"فایل PDF","New note":"یادداشت جدید","New to-do":"فهرست کارهای جدید","New notebook":"دفترچه Line truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"یادداشت های مطابق با <note> را در [notebook] کپی میکند. اگر هیچ دفترچهای مشخص نشده باشد یادداشت در دفترچه کنونی کپی میشود.","Cannot find \"%s\".":"«%s» یافت نشد.","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"یادداشت های موجود در دفترچه کنونی را نمایش میدهد. برای نمایش لیست دفترچه ها از `ls /` استفاده کنید.","Displays only the first top <num> notes.":"فقط <num> یادداشت اول را نمایش میدهد.","Sorts the item by <field> (eg. title, updated_time, created_time).":"مورد را بر اساس <field> مرتب میکند (به عنوان مثال: عنوان، زمان بهروزرسانی، زمان ایجاد).","Reverses the sorting order.":"معکوس کردن ترتیب مرتبسازی.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"تنها موارد نوع/انواع مشخص شده را نمایش میدهد. میتواند برای یادداشتها `n`، برای فهرست کارها `t` یا برای یادداشتها و فهرست کارها `nt` باشد. (به عنوان مثال: `-tt` تنها فهرست کارها را نمایش خواهد داد در حالی که `-ttd` یادداشتها و فهرست کارها را نمایش خواهد داد.)","Either \"text\" or \"json\"":"یا «text» و یا «json»","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"استفاده از فرمت لیست طولانی. فرمت به صورت ID (شناسه)، NOTE_COUNT (تعداد یادداشت (برای دفترچه))، DATE (تاریخ)، TODO_CHECKED (فهرست کار بررسی شده (برای فهرست کارها))، TITLE (عنوان) میباشد","Please select a notebook first.":"لطفا ابتدا یه دفترچه مشخص کنید.","Imports data into Joplin.":"داده را در Joplin وارد میکند.","Source format: %s":"فرمت مبدا: %s","Do not ask for confirmation.":"برای تایید سوال نکن.","Output format: %s":"فرمت خروجی: %s","Found: %d.":"پیدا شده: %d.","Created: %d.":"ایجاد شده: %d.","Updated: %d.":"بهروز شده: %d.","Skipped: %d.":"رد شده: %d.","Resources: %d.":"منابع: %d.","Tagged: %d.":"برچسب گذاری شده: %d.","Importing notes...":"در حال وارد کردن یادداشتها...","The notes have been imported: %s":"یادداشتها وارد شدند: %s","Type: %s.":"نوع: %s.","Possible values: %s.":"مقادیر احتمالی: %s.","Default: %s":"پیشفرض: %s","Possible keys/values:":"کلید ها یا مقادیر ممکن:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"شروع، توقف یا بررسی سرور API. از متغیر تنظیمات api.port برای مشخص کردن پورتی که باید روی آن اجرا شود استفاده کنید. دستورات بصورت (%s) هستند.","Server is already running on port %d":"سرور در حال حاضر بر روی پورت %d در حال اجراست","Server is running on port %d":"سرور بر روی پورت %d در حال اجراست","Server is not running.":"سرور در حال اجرا نیست.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"تنظیمات E2EE را مدیریت میکند. دستورات شامل `enable`، `disable`، `decrypt`، `status`، `decrypt-file` و `target-status` هستند.","Enter master password:":"گذرواژه اصلی را وارد کنید:","Operation cancelled":"عملیات لغو شد","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"شروع رمزگشایی... این کار ممکن است چند دقیقه طول بکشد، لطفا صبر کنید.","Decrypted items: %d":"موارد رمزگشایی شده: %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"موارد رد شده: %d (از --retry-failed-items برای تلاش مجدد رمزگشایی آنها استفاده کنید)","Completed decryption.":"رمزگشایی کامل شد.","Confirm password:":"تایید گذرواژه:","Passwords do not match!":"گذرواژهها با یکدیگر مطابق نیستند!","Enabled":"فعال","Disabled":"غیرفعال","Encryption is: %s":"Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Pour supprimer une vignette, enlever là des notes associées.","Please select the note or notebook to be deleted first.":"Veuillez d'abord sélectionner un carnet.","Press Ctrl+D or type \"exit\" to exit the application":"Appuyez sur Ctrl+D ou tapez \"exit\" pour sortir du logiciel","More than one item match \"%s\". Please narrow down your query.":"Plus d'un objet correspond à \"%s\". Veuillez préciser votre requête.","No notebook selected.":"Aucun carnet n'est sélectionné.","No notebook has been specified.":"Aucun carnet n'est spécifié.","Y":"O","n":"n","N":"N","y":"o","Cancelling background synchronisation... Please wait.":"Annulation de la synchronisation... Veuillez patienter.","No such command: %s":"Commande invalide : %s","The command \"%s\" is only available in GUI mode":"La commande \"%s\" est disponible uniquement en mode d'interface graphique","Cannot change encrypted item":"Un objet chiffré ne peut pas être modifié","Missing required argument: %s":"Paramètre requis manquant : %s","%s: %s":"%s : %s","Your choice: ":"Votre choix : ","Invalid answer: %s":"Réponse invalide : %s","Attaches the given file to the note.":"Joindre le fichier fourni à la note.","Cannot find \"%s\".":"Impossible de trouver \"%s\".","Displays the given note.":"Affiche la note.","Displays the complete information about note.":"Affiche tous les détails de la note.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtient ou modifie une valeur de configuration. Si la [valeur] n'est pas fournie, la valeur de [nom] sera affichée. Si ni le [nom] ni la [valeur] ne sont fournis, la configuration complète sera affichée.","Also displays unset and hidden config variables.":"Afficher également les variables cachées.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Copier les notes correspondant à <nom> vers [carnet]. Si aucun carnet n'est spécifié, la note est dupliquée sur place.","Marks a to-do as done.":"Marquer la tâche comme complétée.","Note is not a to-do: \"%s\"":"La note n'est pas une tâche : \"%s\"","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Gérer la configuration E2EE (Chiffrement de bout à bout). Les commandes sont `enable`, `disable`, `decrypt` et `status`, `decrypt-file` et `target-status`.","Enter master password:":"Entrer le mot de passe maître :","Operation cancelled":"Opération annulée","Confirm password:":"Confirmer le mot de passe :","Passwords do not match!":"Les mots de passe ne correspondent pas !","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Démarrage du déchiffrement... Veuillez patienter car cela pourrait prendre plusieurs minutes selon le nombre d'objets à déchiffrer.","Completed decryption.":"Déchiffrement complété.","Enabled":"Activé","Disabled":"Désactivé","Encryption is: %s":"Le chiffrement est : %s","Edit note.":"Éditer la note.","No text editor is defined. Please set it using `config editor <editor-path>`":"Aucun éditeur de texte n'est défini. Veuillez le définir en utilisant la commande `config editor <chemin-editeur>`","No active notebook.":"Aucun carnet actif.","Note does not exist: \"%s\". Create it?":"Cette note n'existe pas : \"%s\". La créer ?","Exits the application.":"Quitter le logiciel.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exporter les données de Joplin. Par défaut, la base de donnée complète sera exportée, y compris les carnets, notes, tags et ressources.","Destination format: %s":"Format de la destination : %s","Exports only the given note.":"Exporter uniquement la note spécifiée.","Exports only the given notebook.":"Exporter uniquement le carnet spécifié.","Displays a geolocation URL for the note.":"Afficher l'URL de l'emplacement de la note.","Displays usage information.":"Affiche les informations d'utilisation.","For information on how to customise the shortcuts please visit %s":"Pour personnaliser les raccourcis veuillez consulter la documentation à %s","Shortcuts are not available in CLI mode.":"Les raccourcis ne sont pas disponible en mode de ligne de commande.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Tapez `help [command]` pour plus d'information sur une commande ; ou tapez `help all` pour l'aide complète.","The possible commands are:":"Les commandes possibles sont :","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the curreLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Copier les notes correspondant à <nom> vers [carnet]. Si aucun carnet n'est spécifié, la note est dupliquée sur place.","Cannot find \"%s\".":"Impossible de trouver \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Affiche les notes dans le carnet. Utilisez `ls /` pour afficher la liste des carnets.","Displays only the first top <num> notes.":"Affiche uniquement les <num> premières notes.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Trier les notes par <field> (par exemple, title, updated_time, created_time).","Reverses the sorting order.":"Inverser l'ordre.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Affiche uniquement les notes du ou des types spécifiés. Le type peut-être `n` pour les notes, `t` pour les tâches (par exemple, `-tt` affiche uniquement les tâches, tandis que `-ttd` affiche les notes et les tâches).","Either \"text\" or \"json\"":"Soit \"text\" soit \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Utilise le format de liste longue. Le format est ID, NOMBRE_DE_NOTES (pour les carnets), DATE, TACHE_TERMINE (pour les tâches), TITRE","Please select a notebook first.":"Veuillez d'abord sélectionner un carnet.","Imports data into Joplin.":"Importer des données dans Joplin.","Source format: %s":"Format de la source : %s","Do not ask for confirmation.":"Ne pas demander de confirmation.","Found: %d.":"Trouvés : %d.","Created: %d.":"Créés : %d.","Updated: %d.":"Mis à jour : %d.","Skipped: %d.":"Ignorés : %d.","Resources: %d.":"Ressources : %d.","Tagged: %d.":"Étiquettes : %d.","Importing notes...":"Importation des notes...","The notes have been imported: %s":"Les notes ont été importées : %s","Enum":"Enum","Type: %s.":"Type : %s.","Possible values: %s.":"Valeurs possibles : %s.","Default: %s":"Défaut : %s","Possible keys/values:":"Clefs/Valeurs possibles :","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Démarre, stop ou vérifie l'état du serveur API. Pour spécifier sur quel port il doit tourner, veuillez utiliser la variable de config api.port. Les commandes sont (%s).","Server is already running on port %d":"Le serveur tourne déjà sur le port %d","Server is running on port %d":"Le serveur tourne sur le port %d","Server is not running.":"Le serveur est arrêté.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Gérer la configuration E2EE (Chiffrement de bout à bout). Les commandes sont `enable`, `disable`, `decrypt` et `status`, `decrypt-file` et `target-status`.","Enter master password:":"Entrer le mot de passe maître :","Operation cancelled":"Opération annulée","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Démarrage du déchiffrement... Veuillez patienter car cela pourrait prendre plusieurs minutes selon le nombre d'objets à déchiffrer.","Decrypted items: %d":"Objets déchiffrés : %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Objets ignorés : %d (utilisez --retry-failed-items pour les déchiffrer à nouveau)","Completed decryption.":"Déchiffrement complété.","Confirm password:":"Confirmer le mot de passe :","Passwords do not match!":"Les mots de passe ne correspondent pas !","Enabled":"Activé","Disabled":"Désactivé","Encryption is: %s":"Le chiffrement est : %s","Creates a new notebook.":"Créer un carnet.","Moves the notes matching <note> to [notebook].":"Déplacer les notes correspondant à <note> vers [notebook].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtient ou modifie une valeur de configuration. Si la [valeur] n'est pas fournie, la valeur de [nom] sera affichée. Si ni le [nom] ni la [valeur] ne sont fournis, la configuration complète sera affichée.","Also displays unset and hidden config variables.":"Afficher également les variables cachées.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Changer de carnet - toutes les opérations à venir se feront dans ce carnet.","Synchronises with remote storage.":"Synchroniser les notes et carnets.","Sync to provided target (defaults to sync.target config value)":"Synchroniser avec la cible donnée (par défaut, la valeur de configuration `sync.target`).","Authentication was not completed (did not receLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Para eliminar unha etiqueta, retire a etiqueta ás notas asociadas.","Please select the note or notebook to be deleted first.":"Selecciona a nota ou caderno para eliminar primeiro.","Press Ctrl+D or type \"exit\" to exit the application":"Prema Ctrl+D ou escriba «exit» para saír do aplicativo","More than one item match \"%s\". Please narrow down your query.":"Hai máis dun elemento que coincide con «%s». Refine a busca.","No notebook selected.":"Non hai ningún caderno seleccionado.","No notebook has been specified.":"Non se especificou ningún caderno.","Y":"S","n":"n","N":"N","y":"s","Cancelling background synchronisation... Please wait.":"Cancelando sincronización en segundo plano... Agarde.","No such command: %s":"Non hai tal orde: %s","The command \"%s\" is only available in GUI mode":"A orde «%s» só está dispoñíbel no modo interface gráfico de usuario","Cannot change encrypted item":"Non é posíbel cambiar un elemento cifrado","Missing required argument: %s":"Falta un argumento requirido: %s","%s: %s":"%s: %s","Your choice: ":"A súa elección: ","Invalid answer: %s":"Resposta non válida: %s","Attaches the given file to the note.":"Anexa o ficheiro dado á nota.","Cannot find \"%s\".":"Non é posíbel atopar «%s».","Displays the given note.":"Mostra a nota dada.","Displays the complete information about note.":"Mostra toda a información da nota.","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtén ou estabelece un valor da configuración. Se non se indica [value], mostrará o valor de [name]. Se non se indica [name] nin [value] listará a configuración actual.","Also displays unset and hidden config variables.":"Mostra tamén variábeis de configuración non estabelecidas e ocultas.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica as notas que corresponden a <note> ao [notebook]. Se non se especifica un, a nota será duplicada no caderno atual.","Marks a to-do as done.":"Marca unha tarefa como feita.","Note is not a to-do: \"%s\"":"A nota non é unha tarefa: «%s»","Enter master password:":"Introducir contrasinal mestre:","Operation cancelled":"Operación cancelada","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Iniciando o descifrado... Agarde xa que pode tardar varios minutos dependendo de canto haxa que descifrar.","Completed decryption.":"Descifrado completado.","Enabled":"Activado","Disabled":"Desactivado","Encryption is: %s":"O cifrado é: %s","Edit note.":"Editar nota.","No text editor is defined. Please set it using `config editor <editor-path>`":"Non se estabeleceu ningún editor de texto. Estabelézao usando «config editor <editor-path>»","No active notebook.":"Ningún caderno activo.","Note does not exist: \"%s\". Create it?":"A nota non existe: «%s». Desexa creala?","Exits the application.":"Sae do aplicativo.","Exports Joplin data to the given path. By default, it will export the complete database including notebooks, notes, tags and resources.":"Exporta os datos do Joplin á ruta dada. De forma predeterminada exportará toda a base de datos incluíndo cadernos, notas, etiquetas e recursos.","Destination format: %s":"Formato de destino: %s","Exports only the given note.":"Exporta só a nota indicada.","Exports only the given notebook.":"Exporta só o caderno indicado.","Displays a geolocation URL for the note.":"Mostra a URL de xeolocalización da nota.","Displays usage information.":"Mostra a información de uso.","For information on how to customise the shortcuts please visit %s":"Para obter máis información sobre como personalizar os atallos, visite %s","Shortcuts are not available in CLI mode.":"Os atallos non están dispoñíbeis no modo CLI.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Escriba «help [command]» para obter máis información sobre unha orde ou escriba «help all» para ver toda a información de uso.","The possible commands are:":"As ordes posíbeis son:","In any command, a note or notebook can be referred to by title or ID, or using the shortcuts `$n` or `$b` for, respectively, the currently selected note or notebook. `$c` can be used to refer to the currently selected item.":"En calquera orde podemos referirnos a unha nota ou caderno polo título ou identificador usando os atallos «$n» ou «$b» para, respectivamente a nota ou cadernos seleccionados actualmente. «$c» pode usarse para referirse ao elemento seleccionado actualmente.","To move from one pane to another, press Tab or Shift+Tab.":"Para mover dun panel ao outro, prema Tab ou Maiús+Tab.","Use the arrows and page up/down tLine truncated
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica as notas que corresponden a <note> ao [notebook]. Se non se especifica un, a nota será duplicada no caderno atual.","Cannot find \"%s\".":"Non é posíbel atopar «%s».","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Mostra as notas no caderno actual. Use «ls /» para ver a lista de cadernos.","Displays only the first top <num> notes.":"Mostra só as primeiras <num> notas.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Ordena os elementos por <field> (p.e.: title, updated_time, created_time).","Reverses the sorting order.":"Inverte a orde.","Displays only the items of the specific type(s). Can be `n` for notes, `t` for to-dos, or `nt` for notes and to-dos (eg. `-tt` would display only the to-dos, while `-ttd` would display notes and to-dos.":"Motra só os elementos do tipo específicado. Pode ser «n» para notas, «t» para tarefas ou «nt» para notas e tarefas (p.e: «-tt» mostraría só as tarefas mentres «-ttd» mostraría notas e tarefas).","Either \"text\" or \"json\"":"Pode ser «text» ou «json»","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Usar o formato de lista longa. O formato -e ID, NOTE_COUNT (para caderno), DATE, TODO_CHECKED (para tarefas), TITLE","Please select a notebook first.":"Seleccione un caderno primeiro.","Imports data into Joplin.":"Importa os datos en Joplin.","Source format: %s":"Formato da orixe: %s","Do not ask for confirmation.":"Non pedir confirmación.","Found: %d.":"Atopado: %d.","Created: %d.":"Creado: %d.","Updated: %d.":"Actualizado: %d.","Skipped: %d.":"Ignorado: %d.","Resources: %d.":"Recursos: %d.","Tagged: %d.":"Etiquetado: %d.","Importing notes...":"Importando notas...","The notes have been imported: %s":"As notas foron importadas: %s","Enum":"Enum.","Type: %s.":"Tipo: %s.","Possible values: %s.":"Valores posíbeis: %s.","Default: %s":"Predeterminado: %s","Possible keys/values:":"Posíbeis chaves/valores:","Enter master password:":"Introducir contrasinal mestre:","Operation cancelled":"Operación cancelada","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Iniciando o descifrado... Agarde xa que pode tardar varios minutos dependendo de canto haxa que descifrar.","Completed decryption.":"Descifrado completado.","Enabled":"Activado","Disabled":"Desactivado","Encryption is: %s":"O cifrado é: %s","Creates a new notebook.":"Crea un caderno novo.","Moves the notes matching <note> to [notebook].":"Move as notas que coinciden con <note> a [notebook].","Gets or sets a config value. If [value] is not provided, it will show the value of [name]. If neither [name] nor [value] is provided, it will list the current configuration.":"Obtén ou estabelece un valor da configuración. Se non se indica [value], mostrará o valor de [name]. Se non se indica [name] nin [value] listará a configuración actual.","Also displays unset and hidden config variables.":"Mostra tamén variábeis de configuración non estabelecidas e ocultas.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Cambia a [notebook] - todas as demais operacións sucederán neste caderno.","Synchronises with remote storage.":"Sincroniza sen almacenaxe remoto.","Sync to provided target (defaults to sync.target config value)":"Sincronizar co destino indicado (predeterminados ao valor da configuración sync.target)","Authentication was not completed (did not receive an authentication token).":"A autenticación non foi completada (non recibiu un token de autenticación).","Not authentified with %s. Please provide any missing credentials.":"Non está autenticado en %s. Proporcione as credencias que faltan.","Synchronisation is already in progress.":"A sincronización xa está en progreso.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"O ficheiro de bloqueo xa está en espera. Se sabe que a sincronización non se está realizando pode eliminar o ficheiro de bloqueo en «%s» e continuar coa operación.","Synchronisation target: %s (%s)":"Destino da sincronización: %s (%s)","Starting synchronisation...":"Iniciando sincronización...","Renames the given <item> (note or notebook) to <name>.":"Renomea o <item> dado (nota ou caderno) a <name>.","Deletes the given notebook.":"Eliminar o carderno indicado.","Deletes the notebook without asking for confirmation.":"Elimina o caderno indicado sen solicitar confirmación.","Creates a new to-do.":"Crea unha nova tarefa.","Notes can only be created within a notebook.":"As notas só se poden crear dentro dun caderno.","Displays the given note.":"Mostra a nota dada.Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"To delete a tag, untag the associated notes.":"Da bi mogao obrisati oznaku, skini oznaku s povezanih bilješki.","Please select the note or notebook to be deleted first.":"Odaberi bilješku ili bilježnicu za brisanje.","Press Ctrl+D or type \"exit\" to exit the application":"Pritisni Ctrl+D ili napiši \"exit\" za izlazak iz aplikacije","More than one item match \"%s\". Please narrow down your query.":"Više od jednog rezultata odgovara \"%s\". Promijeni upit.","No notebook selected.":"Nije odabrana bilježnica.","No notebook has been specified.":"Nije specificirana bilježnica.","Y":"Y","n":"n","N":"N","y":"y","Cancelling background synchronisation... Please wait.":"Prekid sinkronizacije u pozadini... Pričekaj.","No such command: %s":"Ne postoji naredba: %s","The command \"%s\" is only available in GUI mode":"Naredba \"%s\" postoji samo u inačici s grafičkim sučeljem","Missing required argument: %s":"Nedostaje obavezni argument: %s","%s: %s":"%s: %s","Your choice: ":"Tvoj izbor: ","Invalid answer: %s":"Nevažeći odgovor: %s","Attaches the given file to the note.":"Prilaže datu datoteku bilješci.","Cannot find \"%s\".":"Ne mogu naći \"%s\".","Displays the given note.":"Prikazuje datu bilješku.","Displays the complete information about note.":"Prikazuje potpunu informaciju o bilješci.","Also displays unset and hidden config variables.":"Također prikazuje nepostavljene i skrivene konfiguracijske varijable.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Marks a to-do as done.":"Označava zadatak završenim.","Note is not a to-do: \"%s\"":"Bilješka nije zadatak: \"%s\"","Disabled":"Onemogućeno","Edit note.":"Uredi bilješku.","No active notebook.":"Nema aktivne bilježnice.","Note does not exist: \"%s\". Create it?":"Bilješka ne postoji: \"%s\". Napravi je?","Exits the application.":"Izlaz iz aplikacije.","Exports only the given note.":"Izvozi samo datu bilješku.","Exports only the given notebook.":"Izvozi samo datu bilježnicu.","Displays a geolocation URL for the note.":"Prikazuje geolokacijski URL bilješke.","Displays usage information.":"Prikazuje informacije o korištenju.","Shortcuts are not available in CLI mode.":"Prečaci nisu podržani u naredbenom retku.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Upiši `help [naredba]` za više informacija o naredbi ili `help all` za sve informacije o korištenju.","The possible commands are:":"Moguće naredbe su:","To move from one pane to another, press Tab or Shift+Tab.":"Za prijelaz iz jednog okna u drugo, pritisni Tab ili Shift+Tab.","To enter command line mode, press \":\"":"Za ulaz u naredbeni redak, pritisni \":\"","To exit command line mode, press ESCAPE":"Za izlaz iz naredbenog retka, pritisni Esc","Do not ask for confirmation.":"Ne pitaj za potvrdu.","Found: %d.":"Nađeno: %d.","Created: %d.":"Stvoreno: %d.","Updated: %d.":"Ažurirano: %d.","Skipped: %d.":"Preskočeno: %d.","Resources: %d.":"Resursi: %d.","Tagged: %d.":"Označeno: %d.","Importing notes...":"Uvozim bilješke...","The notes have been imported: %s":"Bilješke su uvezene: %s","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Prikazuje bilješke u trenutnoj bilježnici. Upiši `ls /` za prikaz liste bilježnica.","Displays only the first top <num> notes.":"Prikaži samo prvih <num> bilješki.","Reverses the sorting order.":"Mijenja redoslijed.","Either \"text\" or \"json\"":"Ili \"text\" ili \"json\"","Please select a notebook first.":"Odaberi bilježnicu.","Creates a new notebook.":"Stvara novu bilježnicu.","Creates a new note.":"Stvara novu bilješku.","Notes can only be created within a notebook.":"Bilješke je moguće stvoriti samo u sklopu bilježnice.","Creates a new to-do.":"Stvara novi zadatak.","Moves the notes matching <note> to [notebook].":"Premješta podudarajuće bilješke <note> u [bilježnicu].","Deletes the given notebook.":"Briše datu bilježnicu.","Deletes the notebook without asking for confirmation.":"Briše bilježnicu bez traženja potvrde.","Deletes the notes without asking for confirmation.":"Briše bilješke bez traženja potvrde.","%d notes match this pattern. Delete them?":"%d bilješki se podudara s pojmom pretraživanja. Obriši ih?","Delete note?":"Obrisati bilješku?","Displays summary about the notes and notebooks.":"Prikazuje sažetak o bilješkama i bilježnicama.","Synchronises with remote storage.":"Sinkronizira sa udaljenom pohranom podataka.","Sync to provided target (defaults to sync.target config value)":"Sinkroniziraj sa metom (default je polje sync.target u konfiguraciji)","Synchronisation is already in progress.":"Sinkronizacija je već u toku.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"Ako sinkronizacija nije u toku, obriši lock datoteku u \"%s\" i nastavi...","Synchronisation target: %s (%s)":"MLine truncated
|
||||
{"Cannot find \"%s\".":"Ne mogu naći \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Prikazuje bilješke u trenutnoj bilježnici. Upiši `ls /` za prikaz liste bilježnica.","Displays only the first top <num> notes.":"Prikaži samo prvih <num> bilješki.","Reverses the sorting order.":"Mijenja redoslijed.","Either \"text\" or \"json\"":"Ili \"text\" ili \"json\"","Please select a notebook first.":"Odaberi bilježnicu.","Do not ask for confirmation.":"Ne pitaj za potvrdu.","Found: %d.":"Nađeno: %d.","Created: %d.":"Stvoreno: %d.","Updated: %d.":"Ažurirano: %d.","Skipped: %d.":"Preskočeno: %d.","Resources: %d.":"Resursi: %d.","Tagged: %d.":"Označeno: %d.","Importing notes...":"Uvozim bilješke...","The notes have been imported: %s":"Bilješke su uvezene: %s","Enum":"Enumeracija","Type: %s.":"Vrsta: %s.","Possible values: %s.":"Moguće vrijednosti: %s.","Default: %s":"Default: %s","Possible keys/values:":"Mogući ključevi/vrijednosti:","Disabled":"Onemogućeno","Creates a new notebook.":"Stvara novu bilježnicu.","Moves the notes matching <note> to [notebook].":"Premješta podudarajuće bilješke <note> u [bilježnicu].","Also displays unset and hidden config variables.":"Također prikazuje nepostavljene i skrivene konfiguracijske varijable.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Synchronises with remote storage.":"Sinkronizira sa udaljenom pohranom podataka.","Sync to provided target (defaults to sync.target config value)":"Sinkroniziraj sa metom (default je polje sync.target u konfiguraciji)","Synchronisation is already in progress.":"Sinkronizacija je već u toku.","Lock file is already being hold. If you know that no synchronisation is taking place, you may delete the lock file at \"%s\" and resume the operation.":"Ako sinkronizacija nije u toku, obriši lock datoteku u \"%s\" i nastavi...","Synchronisation target: %s (%s)":"Meta sinkronizacije: %s (%s)","Starting synchronisation...":"Započinjem sinkronizaciju...","Deletes the given notebook.":"Briše datu bilježnicu.","Deletes the notebook without asking for confirmation.":"Briše bilježnicu bez traženja potvrde.","Creates a new to-do.":"Stvara novi zadatak.","Notes can only be created within a notebook.":"Bilješke je moguće stvoriti samo u sklopu bilježnice.","Displays the given note.":"Prikazuje datu bilješku.","Displays the complete information about note.":"Prikazuje potpunu informaciju o bilješci.","Edit note.":"Uredi bilješku.","No active notebook.":"Nema aktivne bilježnice.","Note does not exist: \"%s\". Create it?":"Bilješka ne postoji: \"%s\". Napravi je?","To delete a tag, untag the associated notes.":"Da bi mogao obrisati oznaku, skini oznaku s povezanih bilješki.","Please select the note or notebook to be deleted first.":"Odaberi bilješku ili bilježnicu za brisanje.","Press Ctrl+D or type \"exit\" to exit the application":"Pritisni Ctrl+D ili napiši \"exit\" za izlazak iz aplikacije","Deletes the notes without asking for confirmation.":"Briše bilješke bez traženja potvrde.","%d notes match this pattern. Delete them?":"%d bilješki se podudara s pojmom pretraživanja. Obriši ih?","Delete note?":"Obrisati bilješku?","Attaches the given file to the note.":"Prilaže datu datoteku bilješci.","Displays version information":"Prikazuje verziju","%s %s (%s)":"%s %s (%s)","Marks a to-do as non-completed.":"Označava zadatak kao nezavršen.","Exports only the given note.":"Izvozi samo datu bilješku.","Exports only the given notebook.":"Izvozi samo datu bilježnicu.","Creates a new note.":"Stvara novu bilješku.","Fatal error:":"Fatalna greška:","Displays a geolocation URL for the note.":"Prikazuje geolokacijski URL bilješke.","Search:":"Traži:","Missing required argument: %s":"Nedostaje obavezni argument: %s","%s: %s":"%s: %s","Your choice: ":"Tvoj izbor: ","Invalid answer: %s":"Nevažeći odgovor: %s","Y":"Y","n":"n","Displays usage information.":"Prikazuje informacije o korištenju.","Shortcuts are not available in CLI mode.":"Prečaci nisu podržani u naredbenom retku.","Type `help [command]` for more information about a command; or type `help all` for the complete usage information.":"Upiši `help [naredba]` za više informacija o naredbi ili `help all` za sve informacije o korištenju.","The possible commands are:":"Moguće naredbe su:","To move from one pane to another, press Tab or Shift+Tab.":"Za prijelaz iz jednog okna u drugo, pritisni Tab ili Shift+Tab.","To enter command line mode, press \":\"":"Za ulaz u naredbeni redak, pritisni \":\"","To exit command line mode, press ESCAPE":"Za izlaz iz naredbenog retka, pritisni Esc","Exits the application.":"Izlaz iz aplikacije.","More than one item match \"%s\". Please narrow down your query.":"Više od jednog rezultata odgovara \"%s\". Promijeni upit.","No notebook selected.":"Nije odabrana bilježnica.","No notebook has been specified.":"Nije specificirana bilježnica.","N":"N","y":"y","Cancelling backLine truncated
|
||||