Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96475f82b2 | ||
|
|
e720c91f72 | ||
|
|
771acbe463 | ||
|
|
a5e4c13759 | ||
|
|
0998fc0ad7 | ||
|
|
d5f3e860b9 | ||
|
|
4e624f7db5 | ||
|
|
5b697b7e16 | ||
|
|
62c3945b8f | ||
|
|
f8a3f509e7 | ||
|
|
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 | ||
|
|
baea44cbd6 | ||
|
|
ab0538df43 | ||
|
|
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 | ||
|
|
77a03599de | ||
|
|
9c057071b5 | ||
|
|
ee3f4beeaf | ||
|
|
7035b1f9f6 | ||
|
|
3aea55ee63 | ||
|
|
28acb4eca6 | ||
|
|
c63c6370b5 | ||
|
|
6046f40e45 | ||
|
|
262159cf73 | ||
|
|
8eb94bc8ab | ||
|
|
a9390affaa | ||
|
|
66392b4e8a | ||
|
|
3283f34c79 | ||
|
|
fd4e5d7d30 | ||
|
|
5bbf9d87c2 | ||
|
|
acf1ff6d1d | ||
|
|
05acc51054 | ||
|
|
eb8841379c | ||
|
|
d601575549 | ||
|
|
0d2f253218 | ||
|
|
349d020da2 | ||
|
|
87ccb86f54 | ||
|
|
20482b2f14 | ||
|
|
47a05fb4ba | ||
|
|
ac0a89625a | ||
|
|
a07638239b | ||
|
|
5143870d3b | ||
|
|
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 | ||
|
|
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 | ||
|
|
c97c337c79 | ||
|
|
0f7deeeac1 | ||
|
|
8c338675d2 | ||
|
|
b126c761cd | ||
|
|
d02513bb70 | ||
|
|
68e8d69d04 | ||
|
|
4eb680d675 | ||
|
|
068dbfffd8 | ||
|
|
d9ec2efa4b | ||
|
|
1c90e9dd7d | ||
|
|
811942d45e | ||
|
|
dbde239a25 | ||
|
|
ab3ba3e2ca | ||
|
|
79e77b5a10 | ||
|
|
c3395133c9 | ||
|
|
b1d073cdeb | ||
|
|
2c115cd074 | ||
|
|
c99bd27e4d | ||
|
|
25d723b373 | ||
|
|
0cfceab151 | ||
|
|
65a0e056c7 | ||
|
|
b27a215c7f | ||
|
|
e9783d050b | ||
|
|
e1be1ead86 | ||
|
|
b129bed69f | ||
|
|
265ad50ce4 | ||
|
|
3e2570601f | ||
|
|
05513e67d2 | ||
|
|
34e4164e2f | ||
|
|
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 | ||
|
|
ed0fae36ad | ||
|
|
35d27f03bd | ||
|
|
1600d27db4 | ||
|
|
0feca7ee7f | ||
|
|
6e0bb6cf8b | ||
|
|
e6d66eba7d | ||
|
|
bd6e77bf32 | ||
|
|
9027f3fb10 | ||
|
|
95eb302a62 | ||
|
|
0be982c798 | ||
|
|
67e5451c7c | ||
|
|
b31721b836 | ||
|
|
03146ed85f | ||
|
|
3007918647 | ||
|
|
c6c4e950db | ||
|
|
40eba9e95e | ||
|
|
51ce7c939d | ||
|
|
972e5aed8a | ||
|
|
8ba9e9efd8 | ||
|
|
63ca925786 | ||
|
|
71d1e6eb82 | ||
|
|
8641f69dae | ||
|
|
120aa066c2 | ||
|
|
27bcf6badb | ||
|
|
465691d5c9 | ||
|
|
48eb115cb9 | ||
|
|
51ee872179 | ||
|
|
c617f43e42 | ||
|
|
4920f64816 | ||
|
|
880134ce80 | ||
|
|
6e47652566 | ||
|
|
cb2df32d91 | ||
|
|
80fff62b34 | ||
|
|
0f6867662c | ||
|
|
3bb431f18e | ||
|
|
91a3adf2a2 | ||
|
|
e27d059376 | ||
|
|
22c61ba603 | ||
|
|
6807f7e07b | ||
|
|
8632ef34eb | ||
|
|
47c0d9500a | ||
|
|
ee01d26915 | ||
|
|
0910dc4e54 | ||
|
|
96cf42fb06 | ||
|
|
8b22f03c09 | ||
|
|
299604838d | ||
|
|
e9e4a0d0db | ||
|
|
c2049b21fc | ||
|
|
a415b9d7ae | ||
|
|
cb4fd1ebf9 | ||
|
|
a28b790256 | ||
|
|
55847fa22f | ||
|
|
6ca0e6adcc | ||
|
|
6542a60d61 | ||
|
|
ef4e1c53b7 | ||
|
|
ec64bf2f0f | ||
|
|
54dc2219fe | ||
|
|
a576ad2a39 | ||
|
|
25a246b6ae | ||
|
|
4840671f0e | ||
|
|
1d284a3528 | ||
|
|
721dd17686 | ||
|
|
3830f5ee46 | ||
|
|
ef8af13500 | ||
|
|
16fb1bda53 | ||
|
|
e8fcb0cc87 | ||
|
|
0e23ea5284 | ||
|
|
f9143ad817 | ||
|
|
925c03acca | ||
|
|
421d7a947f | ||
|
|
7104d5b480 | ||
|
|
ddb631d800 | ||
|
|
6107af625f | ||
|
|
2ce40e0390 | ||
|
|
3f267f3774 | ||
|
|
91ef985353 | ||
|
|
cc759afe16 | ||
|
|
fd405457e4 | ||
|
|
65706980a2 | ||
|
|
04851284ca | ||
|
|
fbedc6b29b | ||
|
|
d228ff9fbd | ||
|
|
0f28060795 | ||
|
|
1df8509e4d | ||
|
|
1229b772fe | ||
|
|
3cf3cd1598 | ||
|
|
c5f1f11f2d | ||
|
|
b4b424bf8a | ||
|
|
2d1aa27955 | ||
|
|
1f803662d3 | ||
|
|
2cbbc7100a | ||
|
|
ed2a6f15fd | ||
|
|
1aa806df85 | ||
|
|
17aa5ae243 | ||
|
|
1a96ee4c6b | ||
|
|
0d9ff26d51 | ||
|
|
ce40813bcf | ||
|
|
ea1db84fcc | ||
|
|
c79ee74b4c | ||
|
|
3407a31cf6 | ||
|
|
2dfe693564 | ||
|
|
e99edd4af9 | ||
|
|
8d43e1215a | ||
|
|
6449289147 | ||
|
|
5a33dcaf07 | ||
|
|
2e804086eb | ||
|
|
5bbedc7e3c | ||
|
|
9455936f19 | ||
|
|
9af4ec7b04 | ||
|
|
fb619a0099 | ||
|
|
35e369ff1a | ||
|
|
2fa8e2ff09 | ||
|
|
eeb9999334 | ||
|
|
e6cbd8c8f8 | ||
|
|
5a40204cb3 | ||
|
|
805cf06af7 | ||
|
|
bdce832fee | ||
|
|
4c97aa8542 | ||
|
|
ca9102d4f5 | ||
|
|
4f8e7b0e2b | ||
|
|
9e92c9230b | ||
|
|
2fef4a0c09 | ||
|
|
00dc711ffa | ||
|
|
a52c261d95 | ||
|
|
c63d8a70b8 | ||
|
|
79f5bcd2fc | ||
|
|
675ef8aefd | ||
|
|
f97bae0b27 | ||
|
|
3361901cd8 | ||
|
|
3db47b575b | ||
|
|
b1ab59b2e6 | ||
|
|
652b852f6d | ||
|
|
54fd2049a8 | ||
|
|
06d807d9ff | ||
|
|
b66b1ba9e6 | ||
|
|
06f71cea24 | ||
|
|
88eed12c78 | ||
|
|
ea75f65e35 | ||
|
|
b1a9b448a6 | ||
|
|
c27c3c48ba | ||
|
|
fdf28c3513 | ||
|
|
018222a1f4 | ||
|
|
ca5d6c5cfe | ||
|
|
d02488f00c | ||
|
|
1d14c8a706 | ||
|
|
573b744293 | ||
|
|
4bd326f72c | ||
|
|
d278809659 | ||
|
|
8053e11b9a | ||
|
|
5f544fba8a | ||
|
|
8ee0d8a73e | ||
|
|
b56352cb4e | ||
|
|
6d0cc97635 | ||
|
|
384c7cd831 | ||
|
|
9ec1e84ed0 | ||
|
|
691521c5b9 | ||
|
|
a1e77b4ccd | ||
|
|
f90da61a85 | ||
|
|
0b0ff15dde | ||
|
|
9b157c7ac3 | ||
|
|
525ba12fc8 | ||
|
|
2785b8ffc5 | ||
|
|
cd9d5db3c2 | ||
|
|
d8ef15a1e2 |
No files matched your search
@@ -6,6 +6,7 @@ _releases/
|
||||
Assets/
|
||||
CliClient/build
|
||||
CliClient/locales
|
||||
CliClient/locales-build
|
||||
CliClient/node_modules
|
||||
CliClient/tests-build
|
||||
CliClient/tests/enex_to_md
|
||||
@@ -14,42 +15,166 @@ CliClient/tests/logs
|
||||
CliClient/tests/support
|
||||
CliClient/tests/sync
|
||||
CliClient/tests/tmp
|
||||
Clipper/joplin-webclipper/content_scripts/JSDOMParser.js
|
||||
Clipper/joplin-webclipper/content_scripts/Readability-readerable.js
|
||||
Clipper/joplin-webclipper/content_scripts/Readability.js
|
||||
Clipper/joplin-webclipper/dist
|
||||
Clipper/joplin-webclipper/icons
|
||||
Clipper/joplin-webclipper/popup/build
|
||||
Clipper/joplin-webclipper/popup/node_modules
|
||||
Clipper/content_scripts/JSDOMParser.js
|
||||
Clipper/content_scripts/Readability-readerable.js
|
||||
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/app/dist
|
||||
ElectronClient/app/lib
|
||||
ElectronClient/app/lib/vendor/sjcl-rn.js
|
||||
ElectronClient/app/lib/vendor/sjcl.js
|
||||
ElectronClient/app/locales
|
||||
ElectronClient/app/node_modules
|
||||
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/app/packageInfo.js
|
||||
ReactNativeClient/pluginAssets/
|
||||
ReactNativeClient/lib/joplin-renderer/vendor/fountain.min.js
|
||||
Tools/node_modules
|
||||
Tools/PortableAppsLauncher
|
||||
Modules/TinyMCE/IconPack/postinstall.js
|
||||
Modules/TinyMCE/langs/
|
||||
|
||||
# Ignore files generated from TypeScript files
|
||||
ElectronClient/app/gui/ShareNoteDialog.js
|
||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||
CliClient/app/LinkSelector.js
|
||||
CliClient/tests/synchronizer_LockHandler.js
|
||||
CliClient/tests/synchronizer_MigrationHandler.js
|
||||
ElectronClient/commands/focusElement.js
|
||||
ElectronClient/commands/startExternalEditing.js
|
||||
ElectronClient/commands/stopExternalEditing.js
|
||||
ElectronClient/global.d.js
|
||||
ElectronClient/gui/ErrorBoundary.js
|
||||
ElectronClient/gui/Header/commands/focusSearch.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/newNote.js
|
||||
ElectronClient/gui/MainScreen/commands/newNotebook.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/toggleNoteList.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleSidebar.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleVisiblePanes.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/AceEditor/AceEditor.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/Toolbar.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/utils/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/utils/types.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/utils/useListIdent.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/useLineSorting.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.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/useFormNote.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMarkupToHtml.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMessageHandler.js
|
||||
ElectronClient/gui/NoteEditor/utils/useNoteSearchBar.js
|
||||
ElectronClient/gui/NoteEditor/utils/useSearchMarkers.js
|
||||
ElectronClient/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||
ElectronClient/gui/NoteList/commands/focusElementNoteList.js
|
||||
ElectronClient/gui/NoteListItem.js
|
||||
ElectronClient/gui/NoteToolbar/NoteToolbar.js
|
||||
ElectronClient/gui/ResourceScreen.js
|
||||
ElectronClient/gui/Root_UpgradeSyncTarget.js
|
||||
ElectronClient/gui/ShareNoteDialog.js
|
||||
ElectronClient/gui/SideBar/commands/focusElementSideBar.js
|
||||
ReactNativeClient/lib/AsyncActionQueue.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/hooks/useEffectDebugger.js
|
||||
ReactNativeClient/lib/hooks/useImperativeHandlerDebugger.js
|
||||
ReactNativeClient/lib/hooks/usePrevious.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/services/CommandService.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/ResourceEditWatcher/index.js
|
||||
ReactNativeClient/lib/services/ResourceEditWatcher/reducer.js
|
||||
ReactNativeClient/lib/services/rest/actionApi.desktop.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/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',
|
||||
},
|
||||
@@ -19,7 +19,10 @@ module.exports = {
|
||||
'expect': 'readonly',
|
||||
'describe': 'readonly',
|
||||
'it': 'readonly',
|
||||
'beforeAll': 'readonly',
|
||||
'afterAll': 'readonly',
|
||||
'beforeEach': 'readonly',
|
||||
'afterEach': 'readonly',
|
||||
'jasmine': 'readonly',
|
||||
|
||||
// React Native variables
|
||||
@@ -29,69 +32,93 @@ 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',
|
||||
'@typescript-eslint/no-unused-vars': 'error',
|
||||
'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'],
|
||||
|
||||
// -------------------------------
|
||||
// Coding style preferences
|
||||
// -------------------------------
|
||||
"enforce-react-hooks/enforce-react-hooks": 2,
|
||||
// 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',
|
||||
// Checks effect dependencies
|
||||
// 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",
|
||||
"enforce-react-hooks",
|
||||
'plugins': [
|
||||
'react',
|
||||
'@typescript-eslint',
|
||||
'react-hooks',
|
||||
'import',
|
||||
],
|
||||
};
|
||||
};
|
||||
@@ -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: ''
|
||||
|
||||
---
|
||||
|
||||
@@ -19,24 +20,26 @@ labels: 'bug'
|
||||
|
||||
## Environment
|
||||
|
||||
Joplin version:
|
||||
Platform:
|
||||
OS specifcs:
|
||||
Joplin version:
|
||||
Platform:
|
||||
OS specifics:
|
||||
|
||||
<!--
|
||||
Platform can be one of: macOS, Linux, Windows, Android, iOS, terminal (or a combination)
|
||||
OS specifcs: e.g. OS version, Linux distribution, Android/iOS version, ...
|
||||
OS specifics: e.g. OS version, Linux distribution, Android/iOS version...
|
||||
-->
|
||||
|
||||
## Steps To Reproduce
|
||||
## Steps to reproduce
|
||||
|
||||
1.
|
||||
2.
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
<!--
|
||||
Issues without reproduction steps are likely to stall.
|
||||
-->
|
||||
|
||||
Describe what you expected to happen:
|
||||
## Describe what you expected to happen
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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,17 +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,16 +37,135 @@ _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/app/gui/note-viewer/fonts/
|
||||
ElectronClient/app/gui/note-viewer/lib.js
|
||||
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
|
||||
|
||||
# Ignore files generated from TypeScript files
|
||||
ElectronClient/app/gui/ShareNoteDialog.js
|
||||
# AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD
|
||||
CliClient/app/LinkSelector.js
|
||||
CliClient/tests/synchronizer_LockHandler.js
|
||||
CliClient/tests/synchronizer_MigrationHandler.js
|
||||
ElectronClient/commands/focusElement.js
|
||||
ElectronClient/commands/startExternalEditing.js
|
||||
ElectronClient/commands/stopExternalEditing.js
|
||||
ElectronClient/global.d.js
|
||||
ElectronClient/gui/ErrorBoundary.js
|
||||
ElectronClient/gui/Header/commands/focusSearch.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/newNote.js
|
||||
ElectronClient/gui/MainScreen/commands/newNotebook.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/toggleNoteList.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleSidebar.js
|
||||
ElectronClient/gui/MainScreen/commands/toggleVisiblePanes.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/AceEditor/AceEditor.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/styles/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/Toolbar.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/utils/index.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/utils/types.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/AceEditor/utils/useListIdent.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/useLineSorting.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useListIdent.js
|
||||
ElectronClient/gui/NoteEditor/NoteBody/CodeMirror/utils/useScrollUtils.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/useFormNote.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMarkupToHtml.js
|
||||
ElectronClient/gui/NoteEditor/utils/useMessageHandler.js
|
||||
ElectronClient/gui/NoteEditor/utils/useNoteSearchBar.js
|
||||
ElectronClient/gui/NoteEditor/utils/useSearchMarkers.js
|
||||
ElectronClient/gui/NoteEditor/utils/useWindowCommandHandler.js
|
||||
ElectronClient/gui/NoteList/commands/focusElementNoteList.js
|
||||
ElectronClient/gui/NoteListItem.js
|
||||
ElectronClient/gui/NoteToolbar/NoteToolbar.js
|
||||
ElectronClient/gui/ResourceScreen.js
|
||||
ElectronClient/gui/Root_UpgradeSyncTarget.js
|
||||
ElectronClient/gui/ShareNoteDialog.js
|
||||
ElectronClient/gui/SideBar/commands/focusElementSideBar.js
|
||||
ReactNativeClient/lib/AsyncActionQueue.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/hooks/useEffectDebugger.js
|
||||
ReactNativeClient/lib/hooks/useImperativeHandlerDebugger.js
|
||||
ReactNativeClient/lib/hooks/usePrevious.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/services/CommandService.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/ResourceEditWatcher/index.js
|
||||
ReactNativeClient/lib/services/ResourceEditWatcher/reducer.js
|
||||
ReactNativeClient/lib/services/rest/actionApi.desktop.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/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,16 +54,13 @@ 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:
|
||||
- |
|
||||
# Copy lib
|
||||
rsync -aP --delete ReactNativeClient/lib/ ElectronClient/app/lib/
|
||||
|
||||
# Install tools
|
||||
npm install
|
||||
npm run tsc
|
||||
cd Tools
|
||||
npm install
|
||||
cd ..
|
||||
@@ -70,8 +70,7 @@ script:
|
||||
# and that would break the desktop release.
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
cd CliClient
|
||||
npm install
|
||||
./run_test.sh
|
||||
npm run test-ci
|
||||
testResult=$?
|
||||
if [ $testResult -ne 0 ]; then
|
||||
exit $testResult
|
||||
@@ -113,5 +112,5 @@ script:
|
||||
fi
|
||||
|
||||
# Prepare the Electron app and build it
|
||||
cd ElectronClient/app
|
||||
npm install && USE_HARD_LINKS=false yarn dist
|
||||
cd ElectronClient
|
||||
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 |
@@ -1,117 +1,96 @@
|
||||
[](https://travis-ci.org/laurent22/joplin) [](https://ci.appveyor.com/project/laurent22/joplin)
|
||||
|
||||
# General information
|
||||
# Building the applications
|
||||
|
||||
- All the applications share the same library, which, for historical reasons, is in ReactNativeClient/lib. This library is copied to the relevant directories when building each app.
|
||||
- In general, most of the backend (anything to do with the database, synchronisation, data import or export, etc.) is shared across all the apps, so when making a change please consider how it will affect all the apps.
|
||||
Note that all the applications share the same library, which, for historical reasons, is in `ReactNativeClient/lib`. This library is copied to the relevant directories when building each app.
|
||||
|
||||
# TypeScript
|
||||
|
||||
Most of the application is written in JavaScript, however new classes and files should generally be written in [TypeScript](https://www.typescriptlang.org/). Even if you don't write TypeScript code, you will need to build the existing .ts and .tsx files. This is done from the root of the project, by running `npm run tsc`.
|
||||
|
||||
If you are modifying TypeScript code, the best is to have the compiler watch for changes from a terminal. To do so, run `npm run tsc-watch`.
|
||||
|
||||
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. If you create a new TypeScript file, make sure you add the generated .js file to .gitignore. It is implemented that way as it requires minimal changes to integrate TypeScript in the existing JavaScript code base.
|
||||
|
||||
## macOS dependencies
|
||||
|
||||
brew install yarn node
|
||||
echo 'export PATH="/usr/local/opt/gettext/bin:$PATH"' >> ~/.bash_profile
|
||||
source ~/.bash_profile
|
||||
|
||||
## Linux and Windows (WSL) dependencies
|
||||
## Required dependencies
|
||||
|
||||
- Install yarn - https://yarnpkg.com/lang/en/docs/install/
|
||||
- Install node v10.x (check with `node --version`) - https://nodejs.org/en/
|
||||
- If you get a node-gyp related error you might need to manually install it: `npm install -g node-gyp`
|
||||
- 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`
|
||||
|
||||
# Building the tools
|
||||
## Building
|
||||
|
||||
Before building any of the applications, you need to build the tools and pre-commit hooks:
|
||||
Before doing anything else, from the root of the project, run:
|
||||
|
||||
```
|
||||
npm install && cd Tools && npm install && cd ..
|
||||
```
|
||||
npm install
|
||||
|
||||
# Building the Electron application
|
||||
Then you can test the various applications:
|
||||
|
||||
## Linux and macOS
|
||||
## Testing the desktop application
|
||||
|
||||
```
|
||||
npm run copyLib
|
||||
npm run tsc
|
||||
cd ElectronClient/app
|
||||
npm install
|
||||
yarn dist
|
||||
```
|
||||
cd ElectronClient
|
||||
npm start
|
||||
|
||||
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`
|
||||
## Testing the Terminal application
|
||||
|
||||
If you get a node-gyp related error you might need to manually install it: `npm install -g node-gyp`.
|
||||
cd CliClient
|
||||
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.
|
||||
|
||||
That will create the executable file in the `dist` directory.
|
||||
|
||||
From `/ElectronClient` you can also run `run.sh` to run the app for testing.
|
||||
|
||||
## Windows
|
||||
|
||||
Run the following commands on Windows Command prompt running as Administrator:
|
||||
|
||||
```
|
||||
xcopy /C /I /H /R /Y /S ReactNativeClient\lib ElectronClient\app\lib
|
||||
npm run tsc
|
||||
cd ElectronClient\app
|
||||
npm install
|
||||
yarn dist
|
||||
```
|
||||
|
||||
If node-gyp does not works (MSBUILD: error MSB3428: Could not load the Visual C++ component "VCBuild.exe"), you might need to install the `windows-build-tools` using `npm install --global windows-build-tools`.
|
||||
|
||||
If `yarn dist` fails, it may need administrative rights.
|
||||
|
||||
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).
|
||||
|
||||
The [building\_win32\_tips on this page](./readme/building_win32_tips.md) might be helpful.
|
||||
|
||||
## Troubleshooting desktop application
|
||||
|
||||
> 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 fail, 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 running as Administrator. You can use `run.bat` to run the app in dev mode.
|
||||
|
||||
# Building the Mobile application
|
||||
## Testing the Mobile application
|
||||
|
||||
First you need to setup React Native to build projects with native code. For this, follow the instructions on the [Get Started](https://facebook.github.io/react-native/docs/getting-started.html) tutorial, in the "React Native CLI Quickstart" tab.
|
||||
|
||||
Then:
|
||||
|
||||
```
|
||||
npm run tsc
|
||||
cd ReactNativeClient
|
||||
npm install
|
||||
react-native run-ios
|
||||
# Or: react-native run-android
|
||||
cd ReactNativeClient
|
||||
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`.
|
||||
|
||||
## Building the clipper
|
||||
|
||||
cd Clipper/popup
|
||||
npm install
|
||||
npm run watch # To watch for changes
|
||||
|
||||
To test the extension please refer to the relevant pages for each browser: [Firefox](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Your_first_WebExtension#Trying_it_out) / [Chrome](https://developer.chrome.com/extensions/faq#faq-dev-01). Please note that the extension in dev mode will only connect to a dev instance of the desktop app (and vice-versa).
|
||||
|
||||
## Watching files
|
||||
|
||||
To make changes to the application, you'll need to rebuild any TypeScript file you've changed, and rebuild the lib. The simplest way to do all this is to watch for changes from the root of the project. Simply run this command, and it should take care of the rest:
|
||||
|
||||
npm run watch
|
||||
|
||||
Running `npm run build` would have the same effect, but without watching.
|
||||
|
||||
## Running an application with additional parameters
|
||||
|
||||
You can specify additional parameters when running the desktop or CLI application. To do so, add `--` to the `npm start` command, followed by your flags. For example:
|
||||
|
||||
npm start -- --profile ~/MyTestProfile
|
||||
|
||||
## TypeScript
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
## Hot reload
|
||||
|
||||
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):
|
||||
|
||||
```sh
|
||||
cd ElectronClient
|
||||
watchman-make -p '**/*.js' '**/*.jsx' --run "npm start"
|
||||
```
|
||||
|
||||
# Building the Terminal application
|
||||
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:
|
||||
|
||||
```
|
||||
cd CliClient
|
||||
npm install
|
||||
./build.sh
|
||||
```
|
||||
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).
|
||||
|
||||
Run `run.sh` to start the application for testing.
|
||||
# Updating Markdown renderer packages
|
||||
|
||||
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.
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
Please read for the [Build Troubleshooting Document](https://github.com/laurent22/joplin/blob/master/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:
|
||||
|
||||
@@ -37,43 +35,58 @@ If you want to start contributing to the project's code, please follow these gui
|
||||
- A good way to easily start contributing is to pick and work on a [good first issue](https://github.com/laurent22/joplin/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). We try to make these issues as clear as possible and provide basic info on how the code should be changed, and if something is unclear feel free to ask for more information on the issue.
|
||||
- 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.
|
||||
|
||||
For new React components, please use [React Hooks](https://reactjs.org/docs/hooks-intro.html). For new code in general, please use TypeScript (unless you are modifying a file that was originally in JavaScript).
|
||||
|
||||
### Unit tests
|
||||
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.
|
||||
|
||||
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.
|
||||
## Automated tests
|
||||
|
||||
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:
|
||||
|
||||
cd CliClient
|
||||
npm i
|
||||
./build.sh
|
||||
```sh
|
||||
npm install
|
||||
cd CliClient
|
||||
```
|
||||
|
||||
To run all the test units:
|
||||
|
||||
./run_test.sh
|
||||
```sh
|
||||
npm test
|
||||
```
|
||||
|
||||
To run just one particular file:
|
||||
|
||||
./run_test.sh markdownUtils # Don't add the .js extension
|
||||
```sh
|
||||
npm test -- --filter=markdownUtils # Don't add the .js extension
|
||||
```
|
||||
|
||||
To filter tests:
|
||||
To filter tests. For example, to run all the test units that contain "should handle conflict" in their description:
|
||||
|
||||
./run_test.sh "should handle conflict" # Will run all the test units that contain "should handle conflict" in their description
|
||||
```sh
|
||||
npm test -- --filter="should handle conflict"
|
||||
```
|
||||
|
||||
## 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,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
};
|
||||
@@ -1,4 +1,3 @@
|
||||
build/
|
||||
node_modules/
|
||||
app/src
|
||||
tests-build/
|
||||
@@ -20,4 +19,7 @@ tests/sync
|
||||
out.txt
|
||||
linkToLocal.sh
|
||||
yarn-error.log
|
||||
tests/support/dropbox-auth.txt
|
||||
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;
|
||||
|
||||
@@ -5,6 +5,7 @@ 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 Setting = require('lib/models/Setting.js');
|
||||
const { reducer, defaultState } = require('lib/reducer.js');
|
||||
const { splitCommandString } = require('lib/string-utils.js');
|
||||
const { reg } = require('lib/registry.js');
|
||||
@@ -32,6 +33,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 +76,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 +139,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 +191,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 +248,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 +343,7 @@ class AppGui {
|
||||
|
||||
if (consoleWidget.isMaximized__ === doMaximize) return;
|
||||
|
||||
let constraints = {
|
||||
const constraints = {
|
||||
type: 'stretch',
|
||||
factor: !doMaximize ? 1 : 4,
|
||||
};
|
||||
@@ -415,10 +420,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 +459,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
|
||||
);
|
||||
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 +514,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 +577,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 +655,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 +779,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 +795,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);
|
||||
|
||||
@@ -47,7 +47,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 +144,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;
|
||||
@@ -181,7 +181,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 +192,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 +207,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 +227,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 +251,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 +324,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 +365,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]);
|
||||
|
||||
@@ -50,7 +50,7 @@ class BaseCommand {
|
||||
async cancel() {}
|
||||
|
||||
name() {
|
||||
let r = this.usage().split(' ');
|
||||
const r = this.usage().split(' ');
|
||||
return r[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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('');
|
||||
|
||||
@@ -2,6 +2,7 @@ const yargParser = require('yargs-parser');
|
||||
const { _ } = require('lib/locale.js');
|
||||
const { time } = require('lib/time-utils.js');
|
||||
const stringPadding = require('string-padding');
|
||||
const { Logger } = require('lib/logger.js');
|
||||
|
||||
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 };
|
||||
@@ -15,6 +15,10 @@ class Command extends BaseCommand {
|
||||
return 'Build the API doc';
|
||||
}
|
||||
|
||||
enabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
createPropertiesTable(tableFields) {
|
||||
const headers = [
|
||||
{ name: 'name', label: 'Name' },
|
||||
@@ -52,7 +56,6 @@ class Command extends BaseCommand {
|
||||
lines.push('# Joplin 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('');
|
||||
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('');
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ const { BaseCommand } = require('./base-command.js');
|
||||
const { app } = require('./app.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 => {
|
||||
@@ -44,6 +43,31 @@ class Command extends BaseCommand {
|
||||
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++;
|
||||
|
||||
@@ -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.'));
|
||||
|
||||
@@ -17,18 +17,20 @@ class Command extends BaseCommand {
|
||||
const service = new InteropService();
|
||||
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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -21,11 +21,15 @@ class Command extends BaseCommand {
|
||||
.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,13 +55,13 @@ 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 result = await service.import(importOptions);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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_,
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()) {
|
||||
@@ -40,7 +40,7 @@ class FolderListWidget extends ListWidget {
|
||||
let output = 0;
|
||||
while (true) {
|
||||
const folder = BaseModel.byId(folders, folderId);
|
||||
if (!folder.parent_id) return output;
|
||||
if (!folder || !folder.parent_id) return output;
|
||||
output++;
|
||||
folderId = folder.parent_id;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -6,11 +6,11 @@ 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(['', '']);
|
||||
|
||||
@@ -29,6 +29,9 @@ const { shimInit } = require('lib/shim-init-node.js');
|
||||
const { _ } = require('lib/locale.js');
|
||||
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,
|
||||
});
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
./build.sh && NODE_PATH=build node build/build-doc.js
|
||||
npm run build && NODE_PATH=build node build/build-doc.js
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
BUILD_DIR="$ROOT_DIR/build"
|
||||
|
||||
rsync -a --exclude "node_modules/" "$ROOT_DIR/app/" "$BUILD_DIR/"
|
||||
rsync -a --delete "$ROOT_DIR/../ReactNativeClient/lib/" "$BUILD_DIR/lib/"
|
||||
rsync -a --delete "$ROOT_DIR/../ReactNativeClient/locales/" "$BUILD_DIR/locales/"
|
||||
cp "$ROOT_DIR/package.json" "$BUILD_DIR"
|
||||
|
||||
# Don't add TypeScript here or make it silent as output of Cli app must be clean
|
||||
# cd $ROOT_DIR/..
|
||||
# npm run tsc
|
||||
# cd $ROOT_DIR
|
||||
|
||||
chmod 755 "$BUILD_DIR/main.js"
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
./build.sh && NODE_PATH="build/" node build/cli-integration-tests.js
|
||||
npm run build && NODE_PATH="build/" node build/cli-integration-tests.js
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
./build.sh && NODE_PATH="build/" node build/fuzzing.js
|
||||
npm run build && NODE_PATH="build/" node build/fuzzing.js
|
||||
@@ -0,0 +1,62 @@
|
||||
const gulp = require('gulp');
|
||||
const fs = require('fs-extra');
|
||||
const utils = require('../Tools/gulp/utils');
|
||||
const tasks = {
|
||||
copyLib: require('../Tools/gulp/tasks/copyLib'),
|
||||
tsc: require('../Tools/gulp/tasks/tsc'),
|
||||
updateIgnoredTypeScriptBuild: require('../Tools/gulp/tasks/updateIgnoredTypeScriptBuild'),
|
||||
};
|
||||
|
||||
tasks.prepareBuild = {
|
||||
fn: async () => {
|
||||
const buildDir = `${__dirname}/build`;
|
||||
await utils.copyDir(`${__dirname}/app`, buildDir, {
|
||||
excluded: ['node_modules'],
|
||||
});
|
||||
await utils.copyDir(`${__dirname}/locales-build`, `${buildDir}/locales`);
|
||||
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 = 'patch-package';
|
||||
await fs.writeFile(`${buildDir}/package.json`, JSON.stringify(package, null, 2), 'utf8');
|
||||
|
||||
fs.chmodSync(`${buildDir}/main.js`, 0o755);
|
||||
},
|
||||
};
|
||||
|
||||
tasks.prepareTestBuild = {
|
||||
fn: async () => {
|
||||
const testBuildDir = `${__dirname}/tests-build`;
|
||||
|
||||
await utils.copyDir(`${__dirname}/tests`, testBuildDir, {
|
||||
excluded: [
|
||||
'lib/',
|
||||
'locales/',
|
||||
'node_modules/',
|
||||
'*.ts',
|
||||
'*.tsx',
|
||||
],
|
||||
});
|
||||
|
||||
await utils.copyDir(`${__dirname}/../ReactNativeClient/lib`, `${testBuildDir}/lib`);
|
||||
await utils.copyDir(`${__dirname}/../ReactNativeClient/locales`, `${testBuildDir}/locales`);
|
||||
await fs.mkdirp(`${testBuildDir}/data`);
|
||||
},
|
||||
};
|
||||
|
||||
utils.registerGulpTasks(gulp, tasks);
|
||||
|
||||
gulp.task('build', gulp.series([
|
||||
'prepareBuild',
|
||||
'copyLib',
|
||||
]));
|
||||
|
||||
gulp.task('buildTests', gulp.series([
|
||||
'prepareTestBuild',
|
||||
'copyLib',
|
||||
]));
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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.":"Χωρίς να ζητείται επιβεβαίωση.","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.":"Εκκίνηση αποκρυπτογράφησης... Παρακαλώ περιμένετε καθώς μπορεί να διαρκέσει αρκετά λεπτά ανάλογα με το μέγεθος αυτών που πρέπει να αποκρυπτογραφηθούν.","Completed decryption.":"Η αποκρυπτογράφηση ολοκληρώθηκε.","Confirm password:":"Επιβεβαίωση κωδικού πρόσβασης:","Passwords do not match!":"Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός!","Enabled":"Ενεργοποιημένη","DisLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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.","Could not synchronise with OneDrive.\n\nThis error often happens when using OneDrive for Business, which unfortunately cannot be supported.\n\nPlease consider using a regular OneDrive account.":"Could not synchronize with OneDrive.\n\nThis error often happens when using OneDrive for Business, which unfortunately cannot be supported.\n\nPlease consider using a regular OneDrive account.","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 settingLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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...","Cancelling... Please wait.":"Nuligante... Atendu.","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 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","View them now":"Vidi ilin nun","Set the password":"Elekti pasvorton","Search...":"Serĉi...","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","Remove tag \"%s\" from all notes?":"Forigi etikedon \"%s\" el ĉiuj notoj?","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","Import":"Importi","Options":"Opcioj","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...","Save":"Konservi","Status":"Stato","Retry":"Reprovi","Please create a notebook first.":"Bonvolu krei notlibron unue.","Please create a notebook first":"Bonvolu krei notlibron unue","Clear":"Klariĝi","Browse...":"Esplori...","Apply":"Apliki","Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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.","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 se recibió token de autenticación).","To alloLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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...","Cancelling... Please wait.":"Tühistamine... Oota.","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 oLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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...","Cancelling... Please wait.":"Bertan behera uzten... itxaron, mesedez.","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 `confiLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"Cannot find \"%s\".":"«%s» یافت نشد.","Reverses the sorting order.":"معکوس کردن ترتیب مرتبسازی.","Either \"text\" or \"json\"":"یا «text» و یا «json»","Please select a notebook first.":"لطفا ابتدا یه دفترچه مشخص کنید.","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...":"بارگذاری یادداشتها...","Default: %s":"پیشفرض: %s","Possible keys/values:":"کلید ها یا مقادیر ممکن:","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.":"ایجاد دفترچه جدید.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Cancelling... Please wait.":"در حال لغو... لطفا منتظر بمانید.","Deletes the given notebook.":"پاک کردن یادداشت مشخص شده.","Notes can only be created within a notebook.":"یادداشتها میتوانند در دفترچه ایجاد شوند.","Displays the given note.":"یادداشت مشخص شده را نمایش بده.","Displays the complete information about note.":"مشخصات کامل یادداشت را نمایش بده.","Edit note.":"تغییر یادداشت.","No active notebook.":"دفترچهی فعالی وجود ندارد.","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 را تایپ کنید","Delete note?":"پاک کردن یادداشت؟","Attaches the given file to the note.":"فایل مشخص شده را به یادداشت پیوست کن.","%s %s (%s)":"%s %s (%s)","Destination format: %s":"فرمت مقصد: %s","Exports only the given note.":"فقط یادداشت مشخص شده را خروجی بده.","Exports only the given notebook.":"فقط دفترجه مشخص شده را خروجی بده.","Creates a new note.":"ایجاد یادداشت جدید.","Displays a geolocation URL for the note.":"آدرس ژئولوکیشن یادداشت را نمایش بده.","Search:":"جستجو:","Missing required argument: %s":"کمبود آرگمان در دستور: %s","%s: %s":"%s: %s","Your choice: ":"انتخاب شما: ","Invalid answer: %s":"پاسخ نامعتبر: %s","Y":"Y","n":"n","Cannot change encrypted item":"نمیتوان مورد رمزگذاری شده را تغییر داد","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 را فشار دهید","Exits the application.":"خروح از نرمافزار.","More than one item match \"%s\". Please narrow down your query.":"بیش از یک مورد مطابق «%s» وجود دارد. لطفاعبارت جستجو را محدودتر کنید.","No notebook selected.":"هیچ دفترچهای انتخاب نشده.","No notebook has been specified.":"هیچ دفترچهای مشخص نشده.","N":"N","y":"y","No such command: %s":"این دستور وجود ندارد: %s","The command \"%s\" is only available in GUI mode":"دستور «%s» فقط در حالت گرافیکی (GUI) کاربرد دارد","Marks a to-do as done.":"علامت زدن فهرست کارها به عنوان انجام شده.","Cancel":"لغو","Goto Anything...":"رفنت به هر چیزی...","Current version is up-to-date.":"ورژن فعلی بهروز است.","Your version: %s":"ورژن شما: %s","New version: %s":"ورژن جدید: %s","Yes":"بله","No":"خیLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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
|
||||
@@ -0,0 +1 @@
|
||||
{"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...","Cancelling... Please wait.":"Cancelando... Agarde.","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 cadeLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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...","Cancelling... Please wait.":"Prekidam... Pričekaj.","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 specifLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Menduplikasi catatan yang sesuai dengan <note> (catatan) ke [notebook] (buku catatan). Jika tidak ada buku catatan yang ditentukan maka catatan akan diduplikasi ke buku catatan saat ini.","Cannot find \"%s\".":"Tidak dapat menemukan \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Menampilkan catatan pada buku catatan saat ini. Gunakan `ls /` untuk menampilkan daftar buku catatan.","Displays only the first top <num> notes.":"Menampilkan hanya <num> (bilangan) catatan teratas.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Mengurutkan item berdasarkan <field> (bidang) (contoh: title (judul), updated_time (waktu diperbarui), created_time (waktu dibuat)).","Reverses the sorting order.":"Membalikkan urutan.","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.":"Menampilkan hanya item dengan tipe-tipe tertentu. Dapat berupa `n` untuk catatan, `t` untuk tugas, atau `nt` untuk catatan dan tugas (contoh: `-tt` hanya akan menampilkan tugas, sedangkan `-ttd` akan menampilkan catatan dan tugas).","Either \"text\" or \"json\"":"Antara \"text\" atau \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Gunakan format daftar yang panjang. Formatnya adalah ID, NOTE_COUNT (jumlah catatan) (untuk buku catatan), DATE (tanggal), TODO_CHECKED (tugas selesai) (untuk tugas), TITLE (judul)","Please select a notebook first.":"Silakan pilih buku catatan terlebih dahulu.","Imports data into Joplin.":"Mengimpor data ke Joplin.","Source format: %s":"Format sumber: %s","Do not ask for confirmation.":"Jangan meminta konfirmasi.","Found: %d.":"Ditemukan: %d.","Created: %d.":"Dibuat: %d.","Updated: %d.":"Diubah: %d.","Skipped: %d.":"Dilewati: %d.","Resources: %d.":"Sumber daya: %d.","Tagged: %d.":"Diberi label: %d.","Importing notes...":"Mengimpor catatan...","The notes have been imported: %s":"Catatan telah berhasil diimpor: %s","Enum":"Enum","Type: %s.":"Tipe: %s.","Possible values: %s.":"Nilai yang mungkin: %s.","Default: %s":"Default: %s","Possible keys/values:":"Kunci/nilai yang mungkin:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Memulai, menghentikan atau memeriksa server API. Untuk menentukan pada port mana server seharusnya berjalan, setel variabel konfigurasi api.port. Perintahnya adalah (%s).","Server is already running on port %d":"Server sudah berjalan pada port %d","Server is running on port %d":"Server berjalan pada port %d","Server is not running.":"Server tidak berjalan.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Mengelola konfigurasi E2EE. Terdapat beberapa perintah yaitu `enable`, `disable`, `decrypt`, `status`, `decrypt-file` dan `target-status`.","Enter master password:":"Masukkan kata sandi master:","Operation cancelled":"Operasi dibatalkan","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Memulai dekripsi… Mohon tunggu beberapa saat, kemungkinan proses akan memakan waktu beberapa menit tergantung seberapa besar yang akan didekripsi.","Decrypted items: %d":"Item terdekripsi: %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Item yang dilewati: %d (gunakan --retry-failed-items untuk mencoba mendekripsinya lagi)","Completed decryption.":"Proses dekripsi selesai.","Confirm password:":"Konfirmasi kata sandi:","Passwords do not match!":"Kata sandi tidak cocok!","Enabled":"Diaktifkan","Disabled":"Dinonaktifkan","Encryption is: %s":"Enkripsi adalah: %s","Creates a new notebook.":"Membuat buku catatan baru.","Moves the notes matching <note> to [notebook].":"Memindahkan catatan yang cocok dengan <note> (catatan) ke [notebook] (buku catatan).","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.":"Mendapatkan atau menyetel nilai konfigurasi. Jika [value] (nilai) tidak tersedia, maka akan menampilkan nilai dari [name] (nama). Jika [name] maupun [value] tidak tersedia juga, maka akan menampilkan daftar konfigurasi saat ini.","Also displays unset and hidden config variables.":"Juga menampilkan variabel konfigurasi yang belum disetel dan yang tersembunyi.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Beralih ke [notebook] (buku catatan) - semua operasi selanjutnya akan terjadi dalam buku catatan ini.","Synchronises with remote storage.":"Menyinkronkan Line truncated
|
||||
@@ -12,11 +12,13 @@ locales['el_GR'] = require('./el_GR.json');
|
||||
locales['en_US'] = require('./en_US.json');
|
||||
locales['eo'] = require('./eo.json');
|
||||
locales['es_ES'] = require('./es_ES.json');
|
||||
locales['et_EE'] = require('./et_EE.json');
|
||||
locales['eu'] = require('./eu.json');
|
||||
locales['fa'] = require('./fa.json');
|
||||
locales['fr_FR'] = require('./fr_FR.json');
|
||||
locales['gl_ES'] = require('./gl_ES.json');
|
||||
locales['hr_HR'] = require('./hr_HR.json');
|
||||
locales['id_ID'] = require('./id_ID.json');
|
||||
locales['it_IT'] = require('./it_IT.json');
|
||||
locales['ja_JP'] = require('./ja_JP.json');
|
||||
locales['ko'] = require('./ko.json');
|
||||
@@ -31,41 +33,47 @@ locales['ru_RU'] = require('./ru_RU.json');
|
||||
locales['sl_SI'] = require('./sl_SI.json');
|
||||
locales['sr_RS'] = require('./sr_RS.json');
|
||||
locales['sv'] = require('./sv.json');
|
||||
locales['th_TH'] = require('./th_TH.json');
|
||||
locales['tr_TR'] = require('./tr_TR.json');
|
||||
locales['vi'] = require('./vi.json');
|
||||
locales['zh_CN'] = require('./zh_CN.json');
|
||||
locales['zh_TW'] = require('./zh_TW.json');
|
||||
stats['ar'] = {"percentDone":97};
|
||||
stats['eu'] = {"percentDone":41};
|
||||
stats['bs_BA'] = {"percentDone":91};
|
||||
stats['bg_BG'] = {"percentDone":81};
|
||||
stats['ca'] = {"percentDone":64};
|
||||
stats['hr_HR'] = {"percentDone":34};
|
||||
stats['cs_CZ'] = {"percentDone":100};
|
||||
stats['da_DK'] = {"percentDone":90};
|
||||
stats['de_DE'] = {"percentDone":100};
|
||||
stats['ar'] = {"percentDone":82};
|
||||
stats['eu'] = {"percentDone":35};
|
||||
stats['bs_BA'] = {"percentDone":85};
|
||||
stats['bg_BG'] = {"percentDone":68};
|
||||
stats['ca'] = {"percentDone":54};
|
||||
stats['hr_HR'] = {"percentDone":28};
|
||||
stats['cs_CZ'] = {"percentDone":84};
|
||||
stats['da_DK'] = {"percentDone":76};
|
||||
stats['de_DE'] = {"percentDone":99};
|
||||
stats['et_EE'] = {"percentDone":68};
|
||||
stats['en_GB'] = {"percentDone":100};
|
||||
stats['en_US'] = {"percentDone":100};
|
||||
stats['es_ES'] = {"percentDone":93};
|
||||
stats['eo'] = {"percentDone":47};
|
||||
stats['fr_FR'] = {"percentDone":100};
|
||||
stats['gl_ES'] = {"percentDone":53};
|
||||
stats['it_IT'] = {"percentDone":94};
|
||||
stats['nl_BE'] = {"percentDone":42};
|
||||
stats['nl_NL'] = {"percentDone":88};
|
||||
stats['nb_NO'] = {"percentDone":93};
|
||||
stats['fa'] = {"percentDone":40};
|
||||
stats['pl_PL'] = {"percentDone":79};
|
||||
stats['pt_PT'] = {"percentDone":96};
|
||||
stats['pt_BR'] = {"percentDone":92};
|
||||
stats['ro'] = {"percentDone":41};
|
||||
stats['sl_SI'] = {"percentDone":52};
|
||||
stats['sv'] = {"percentDone":71};
|
||||
stats['tr_TR'] = {"percentDone":97};
|
||||
stats['el_GR'] = {"percentDone":99};
|
||||
stats['ru_RU'] = {"percentDone":99};
|
||||
stats['sr_RS'] = {"percentDone":79};
|
||||
stats['es_ES'] = {"percentDone":91};
|
||||
stats['eo'] = {"percentDone":39};
|
||||
stats['fr_FR'] = {"percentDone":97};
|
||||
stats['gl_ES'] = {"percentDone":44};
|
||||
stats['id_ID'] = {"percentDone":95};
|
||||
stats['it_IT'] = {"percentDone":93};
|
||||
stats['nl_NL'] = {"percentDone":99};
|
||||
stats['nl_BE'] = {"percentDone":35};
|
||||
stats['nb_NO'] = {"percentDone":91};
|
||||
stats['fa'] = {"percentDone":34};
|
||||
stats['pl_PL'] = {"percentDone":87};
|
||||
stats['pt_PT'] = {"percentDone":91};
|
||||
stats['pt_BR'] = {"percentDone":98};
|
||||
stats['ro'] = {"percentDone":35};
|
||||
stats['sl_SI'] = {"percentDone":44};
|
||||
stats['sv'] = {"percentDone":73};
|
||||
stats['th_TH'] = {"percentDone":54};
|
||||
stats['vi'] = {"percentDone":88};
|
||||
stats['tr_TR'] = {"percentDone":99};
|
||||
stats['el_GR'] = {"percentDone":93};
|
||||
stats['ru_RU'] = {"percentDone":90};
|
||||
stats['sr_RS'] = {"percentDone":74};
|
||||
stats['zh_CN'] = {"percentDone":99};
|
||||
stats['zh_TW'] = {"percentDone":97};
|
||||
stats['zh_TW'] = {"percentDone":98};
|
||||
stats['ja_JP'] = {"percentDone":99};
|
||||
stats['ko'] = {"percentDone":93};
|
||||
stats['ko'] = {"percentDone":89};
|
||||
module.exports = { locales: locales, stats: stats };
|
||||
@@ -0,0 +1 @@
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Duplica le note che corrispondono a <note> nel [notebook]. Se nessun Taccuino è specificato, la nota viene duplicata nel Taccuino corrente.","Cannot find \"%s\".":"Non posso trovare \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Mostra le Note nel seguente Taccuino. Usa `ls /` per mostrare la lista dei Taccuini.","Displays only the first top <num> notes.":"Mostra solo le prima <num> note.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Ordina per <field> (es. titolo, ultimo aggiornamento, creazione).","Reverses the sorting order.":"Inverti l'ordine.","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.":"Mostra solo gli elementi del tipo specificato. Possono essere `n` per le note, `t` per le \"Cose-da-fare\" o `nt` per note e \"Cose-da-fare\". (es. `-tt` mostrerà solo le \"Cose-da-fare\", mentre `-ttd` mostrerà sia note che \"Cose-da-fare\".","Either \"text\" or \"json\"":"Sia \"testo\" che \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Usa un formato lungo di lista. Il formato è ID, NOTE_COUNT (per i blocchi note), DATE, TODO_CHECKED (per le \"Cose-da-fare\"), TITLE","Please select a notebook first.":"Per favore prima seleziona un Taccuino.","Imports data into Joplin.":"Importa i dati in Joplin.","Source format: %s":"Formato sorgente: %s","Do not ask for confirmation.":"Non chiedere conferma.","Found: %d.":"Trovato: %d.","Created: %d.":"Creato: %d.","Updated: %d.":"Aggiornato: %d.","Skipped: %d.":"Saltato: %d.","Resources: %d.":"Risorse: %d.","Tagged: %d.":"Etichettato: %d.","Importing notes...":"Importazione delle note...","The notes have been imported: %s":"Le note sono state importate: %s","Enum":"Enumerare","Type: %s.":"Tipo: %s.","Possible values: %s.":"Valori possibili: %s.","Default: %s":"Predefinito: %s","Possible keys/values:":"Chiave/valore possibili:","Start, stop or check the API server. To specify on which port it should run, set the api.port config variable. Commands are (%s).":"Avvia, ferma o controlla il server API. Per specificare su quale porta deve essere eseguito, setta la variabile api.config. I comandi sono (%s).","Server is already running on port %d":"Il server è già in esecuzione sulla porta %d","Server is running on port %d":"Il server è in esecuzione sulla porta %d","Server is not running.":"Il server non è in esecuzione.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Gestisci la configurazione E2EE. I comandi sono `abilita`, `disabilita`, `decripta`, `stato`, `decripta-file` e `stato-target`.","Enter master password:":"Inserisci password principale:","Operation cancelled":"Operazione annullata","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Avvio decrittazione... Attendere prego, ci potrebbero volere diversi minuti per la decriptazione.","Completed decryption.":"Decrittografia completata.","Confirm password:":"Conferma password:","Passwords do not match!":"Le password non combaciano!","Enabled":"Attivato","Disabled":"Disabilitato","Encryption is: %s":"La crittografia è: %s","Creates a new notebook.":"Crea un nuovo Taccuino.","Moves the notes matching <note> to [notebook].":"Sposta le note che corrispondono a <note> in [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.":"Ricevi o imposta un valore di configurazione. se [value] non è impostato, verrà mostrato il valore del [name]. Se sia [name] che [valore] sono impostati, verrà mostrata la configurazione corrente.","Also displays unset and hidden config variables.":"Mostra anche le variabili di configurazione non impostate o nascoste.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Passa tra [notebook] - tutte le ulteriori operazioni interesseranno il seguente Taccuino.","Synchronises with remote storage.":"Sincronizza con l'archivio remoto.","Sync to provided target (defaults to sync.target config value)":"Sincronizza con l'obiettivo fornito (come predefinito il valore di configurazione sync.target)","Authentication was not completed (did not receive an authentication token).":"Autenticazione non completata (non è stato ricevuto alcun token di autenticazione).","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"Per consentire a Joplin di sincronizzarsi con Dropbox, procedi come indicato di seguito:","Step 1:Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"<note>に一致するノートを[notebook]に複製します。[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>で並び替え (例: 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`でToDoを、`nt`でその両方を指定できます。 (例: `-tt` ではToDoのみを表示し、`-ttd`ではノートとToDoを表示します。)","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 (ToDoのみ), 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":"列挙","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サーバーが使用するポートは 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)の設定コマンドです。<command>には `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.":"復号を開始しました... どのぐらいの数を復号するかによりますが、数分かかりますのでお待ちください。","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":"暗号化: %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]がない場合は、[name]で示された設定項目の値を表示します。両方とも指定されていない場合は、現在の設定のリストを表示します。","Also displays unset and hidden config variables.":"未設定または非表示の設Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"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>별로 정렬합니다 (예시: 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] 가 제공되지 않았다면, [name]의 값을 표시할 것입니다. [name] 과 [value] 모두 제공되지 않았다면, 현재 설정을 표시할 것입니다.","Also displays unset and hidden config variables.":"또한 설정하지 않았거나 숨겨진 설정 변수를 표시합니다.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"[notebook]으로 전환 - 앞으로의 모든 작업은 이 노트북 안에서만 해당됩니다.","Synchronises with remote storage.":"원격 저장소와 동기화 합니다.","Sync to provided target (defaults to sync.target config value)":"지정된 대상으로 동기화 합니다 (기본값은 sync.target config value)","Authentication was not completed (did not receive an autheLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Dupliserer notatene som samsvarer med <note> til [notebook]. Hvis ingen notatbok er spesifisert blir notatet duplisert til gjeldende notatbok.","Cannot find \"%s\".":"Finner ikke \"%s\".","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Viser notatene i gjeldende notatbok. Bruk `ls /` for å vise listen over notatbøker.","Displays only the first top <num> notes.":"Viser kun de første <num> notatene.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sorter etter <field> (f.eks. title, updated_time, created_time).","Reverses the sorting order.":"Reverserer sorteringsrekkefølgen.","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.":"Viser kun elementene av den spesifikke typen. Kan være `n` for notater, `t` for gjøremål eller `nt` for notater og gjøremål (f.eks.` -tt` vile kun vise gjøremål, mens `-ttd` vil vise notater og gjøremål.)","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":"Bruk langt listeformat. Format er ID, NOTE_COUNT (for notatbok), DATE, TODO_CHECKED (for gjøremål), TITLE","Please select a notebook first.":"Vennligst velg en notatbok først.","Imports data into Joplin.":"Importer data til Joplin.","Source format: %s":"Kildeformat: %s","Do not ask for confirmation.":"Ikke spør om bekreftelse.","Found: %d.":"Funnet: %d.","Created: %d.":"Opprettet: %d.","Updated: %d.":"Oppdatert: %d.","Skipped: %d.":"Hoppet over: %d.","Resources: %d.":"Ressurser: %d.","Tagged: %d.":"Merket: %d.","Importing notes...":"Importer notater...","The notes have been imported: %s":"Notatene som har blitt importert: %s","Enum":"Enum","Type: %s.":"Type: %s.","Possible values: %s.":"Mulige verdier: %s.","Default: %s":"Standard: %s","Possible keys/values:":"Mulige nøkler/verdier:","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, stopp eller sjekk API-serveren. For å angi på hvilken port den skal kjøre,sett api.port konfigurasjonsvariablen. Kommandoer er (%s).","Server is already running on port %d":"Serveren kjører allerede på port %d","Server is running on port %d":"Serveren kjører på port %d","Server is not running.":"Serveren kjører ikke","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Konfigurerer E2EE-konfigurasjon. Tilgjengelige kommandoer er: `enable`(aktiver), `disable`(lukk), `decrypt`(dekrypter), `status` og `target-status` (mottager-status).","Enter master password:":"Skriv inn masterpassordet:","Operation cancelled":"Operasjon avbrutt","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Starter dekryptering... Vennligst vent da det kan ta flere minutter avhengig av mengden som skal dekrypteres.","Completed decryption.":"Dekryptering fullført.","Confirm password:":"Bekreft passord:","Passwords do not match!":"Passordene er ikke like!","Enabled":"Aktivert","Disabled":"Deaktivitert","Encryption is: %s":"Kryptering er: %s","Creates a new notebook.":"Oppretter en ny notatbok.","Moves the notes matching <note> to [notebook].":"Flytter notatene som samsvarer med <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.":"Skaffer eller setter en konfigurasjonsverdi. Hvis [value] ikke er angitt vil den vise verdien av [name]. Hvis hverken [name] eller [value] ikke er angitt, vil den vise den gjeldende konfigurasjonen.","Also displays unset and hidden config variables.":"Viser også ikke-satte og skjulte konfigurasjonsvariabler.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Bytter til [notebook] - alle videre operasjoner vil skje i denne notatboken.","Synchronises with remote storage.":"Synkroniser med fjernlagring.","Sync to provided target (defaults to sync.target config value)":"Sync å forsynt mål (uteblivelsene å sync. target config-verdi)","Authentication was not completed (did not receive an authentication token).":"Godkjenning ble ikke fullført (mottok ikke et autoriseringsbevis).","To allow Joplin to synchronise with Dropbox, please follow the steps below:":"For å få Joplin til å synkronisere med Dropbox, vennligst følg trinnene under her:","Step 1: Open this URL in your browser to authorise the application:":"Steg 1: Åpne denne URL i din nettleser for å autorisere applikasjoneLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Dupliceert de notities die voldoen aan <note> in [notitieboek]. Als er geen notitieboek is gespecifeerd, zal de notitie gedupliceerd worden in het huidige notitieboek.","Cannot find \"%s\".":"Kan \"%s\" niet vinden.","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Toont de notities in het huidige notitieboek. Gebruik `ls /` om een lijst van notitieboeken te tonen.","Displays only the first top <num> notes.":"Toont enkel de top <num> notities.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sorteert de items volgens <field> (bv. title, updated_time, created_time).","Reverses the sorting order.":"Draait de sorteervolgorde om.","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.":"Toont enkel de items van de specifieke type(s). Kan `n` zijn voor notities, `t` voor to-do's, of `nt` voor notities en to-do's (bv. `-tt` zou alleen to-do's tonen, terwijl `-ttd` notities en to-do's zou tonen).","Either \"text\" or \"json\"":"Of \"text\" of \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Gebruik lange lijstopmaak. Opmaak is ID, NOTE_COUNT (voor notitieboek), DATE, TODO_CHECKED (voor to-do's), TITLE","Please select a notebook first.":"Selecteer eerst een notitieboek. ","Imports data into Joplin.":"Importeert gegevens in Joplin.","Do not ask for confirmation.":"Vraag niet om bevestiging.","Found: %d.":"Gevonden: %d.","Created: %d.":"Aangemaakt: %d.","Updated: %d.":"Bijgewerkt: %d.","Skipped: %d.":"Overgeslagen: %d.","Resources: %d.":"Bronnen: %d.","Tagged: %d.":"Getagd: %d.","Importing notes...":"Notities importeren...","The notes have been imported: %s":"De notities zijn geïmporteerd: %s","Enum":"Enum","Type: %s.":"Type: %s.","Possible values: %s.":"Mogelijke waarden: %s.","Default: %s":"Standaard: %s","Possible keys/values:":"Mogelijke sleutels/waarden:","Enter master password:":"Geef hoofdpaswoord in:","Operation cancelled":"Actie geannuleerd","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Decodering gestart... Dit kan enkele minuten duren, afhankelijk van hoeveel er te decoderen valt. ","Completed decryption.":"Decodering voltooid.","Enabled":"Ingeschakeld","Disabled":"Uitgeschakeld","Encryption is: %s":"Encryptie is: %s","Creates a new notebook.":"Maakt een nieuw notitieboek aan.","Moves the notes matching <note> to [notebook].":"Verplaatst de notities die voldoen aan <note> naar [notitieboek].","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.":"Haalt een configuratie waarde op of stelt een waarde in. Als [value] niet opgegeven is, zal de waarde van [name] getoond worden. Als noch de [name] of [waarde] opgegeven zijn, zal de huidige configuratie opgelijst worden.","Also displays unset and hidden config variables.":"Toont ook niet-geconfigureerde en verborgen configuratie-opties. ","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Wisselt naar [notitieboek] - Alle verdere acties zullen op dit notitieboek toegepast worden.","Synchronises with remote storage.":"Synchroniseert met remote opslag. ","Sync to provided target (defaults to sync.target config value)":"Synchroniseer naar opgegeven doel (standaard sync.target configuratie optie)","Authentication was not completed (did not receive an authentication token).":"Authenticatie was niet voltooid (geen authenticatietoken ontvangen).","Synchronisation is already in progress.":"Synchronisatie reeds bezig.","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.":"Er is reeds een lockfile. Als u zeker bent dat er geen synchronisatie bezig is, kan de lock file verwijderd worden op \"%s\" en verder gegaan worden met de synchronisatie. ","Synchronisation target: %s (%s)":"Synchronisatiedoel: %s (%s)","Starting synchronisation...":"Synchronisatie starten...","Cancelling... Please wait.":"Annuleren.. Even geduld.","Renames the given <item> (note or notebook) to <name>.":"Hernoemt het gegeven <item> (notitie of notitieboek) naar <name>.","Deletes the given notebook.":"Verwijdert het opgegeven notitieboek.","Deletes the notebook without asking for confirmation.":"Verwijdert het notitieboek zonder te vragen om bevestiging.","Creates a new to-do.":"Maakt nieuwe to-do aan.","Notes can only be created within a notebook.":"Notities kunnen enkel in een notitieboek aangemaakt worden.","Displays the given noLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.":"Dupliceert de notities die overeenkomen met <note> tot [notebook]. Als geen notitieboek wordt opgegeven, dan wordt de notitie gedupliceerd in het huidige notitieboek.","Cannot find \"%s\".":"Kan \"%s\" niet vinden.","Displays the notes in the current notebook. Use `ls /` to display the list of notebooks.":"Toont de notities van het huidige notitieboek. Gebruik `ls /` om de lijst met notitieboeken te tonen.","Displays only the first top <num> notes.":"Toont alleen de eerste <num> notities.","Sorts the item by <field> (eg. title, updated_time, created_time).":"Sorteert de items op <field> (bijv. title, updated_time, created_time).","Reverses the sorting order.":"Keert de sorteervolgorde om.","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.":"Toont alleen items van specifieke type(s). Dit kan zijn: `n` voor notities, `t` voor taken of `nt` voor notities en taken (`-tt` toont alleen de taken, `-ttd` toont notities en taken).","Either \"text\" or \"json\"":"\"text\" of \"json\"","Use long list format. Format is ID, NOTE_COUNT (for notebook), DATE, TODO_CHECKED (for to-dos), TITLE":"Gebruik de langelijstopmaak. De opmaak is ID, NOTE_COUNT (voor het notitieboek), DATA, TODO_CHECKED (voor taken), TITLE","Please select a notebook first.":"Kies eerst een notitieboek.","Imports data into Joplin.":"Importeert gegeven naar Joplin.","Source format: %s":"Bronformaat: %s","Do not ask for confirmation.":"Niet vragen om bevestiging.","Output format: %s":"Uitvoerformaat: %s","Found: %d.":"Gevonden: %d.","Created: %d.":"Gecreëerd: %d.","Updated: %d.":"Bijgewerkt: %d.","Skipped: %d.":"Overgeslagen: %d.","Resources: %d.":"Bronnen: %d.","Tagged: %d.":"Gelabeld: %d.","Importing notes...":"Notities importeren...","The notes have been imported: %s":"De notities zijn geïmporteerd: %s","Enum":"Enum","Type: %s.":"Type: %s.","Possible values: %s.":"Mogelijk waarden: %s.","Default: %s":"Standaard: %s","Possible keys/values:":"Mogelijke sleutels/waarden:","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 of controleer de API-server. Stel de api.port configuratievariabele in om te specificeren op welke poort deze draait. Commando's zijn (%s).","Server is already running on port %d":"Server wordt al uitgevoerd op poort %d","Server is running on port %d":"Server wordt uitgevoerd op poort %d","Server is not running.":"Server is niet actief.","Manages E2EE configuration. Commands are `enable`, `disable`, `decrypt`, `status`, `decrypt-file` and `target-status`.":"Beheert de E2EE-configuratie. Opdrachten zijn: `enable`, `disable`, `decrypt`, `status`, `decrypt-file` en `target-status`.","Enter master password:":"Voer het hoofdwachtwoord in:","Operation cancelled":"Actie geannuleerd","Starting decryption... Please wait as it may take several minutes depending on how much there is to decrypt.":"Decryptie starten... Een ogenblik geduld, het kan enkele minuten duren, afhankelijk van hoeveel er gedecodeerd moet worden.","Decrypted items: %d":"Ontsleutelde items: %d","Skipped items: %d (use --retry-failed-items to retry decrypting them)":"Overgeslagen items: %d (gebruik --retry-failed-items om ze opnieuw te decoderen)","Completed decryption.":"Decryptie voltooid.","Confirm password:":"Bevestig wachtwoord:","Passwords do not match!":"Wachtwoorden komen niet overeen!","Enabled":"Ingeschakeld","Disabled":"Uitgeschakeld","Encryption is: %s":"Gebruikte encryptie: %s","Creates a new notebook.":"Creëert een nieuw notitieboek.","Moves the notes matching <note> to [notebook].":"Verplaatst de notities die overeenkomen met <note> naar [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.":"Verkrijgt of stelt een configuratiewaarde in. Als [value] niet is opgegeven, dan wordt de waarde van [name] getoond. Als zowel [name] als [value] niet zijn opgegeven, dan wordt de huidige configuratie getoond.","Also displays unset and hidden config variables.":"Toont ook niet-ingestelde en verborgen configuratiewaarden.","%s = %s (%s)":"%s = %s (%s)","%s = %s":"%s = %s","Switches to [notebook] - all further operations will happen within this notebook.":"Schakelt over naar [notebook] - alle toekomstige handelingen worden gedaan in dit notitieboek.","Synchronises with remote storage.":"Synchroniseert met cloudopslag.","Sync to provided target (defaults to sync.target config value)":"Synchroniseren naar opgegeven doel (standaard is dit sync.target)","Authentication was not completed (did not receive an authentication token).":"Authenticatie is niet voltooid (geen autheLine truncated
|
||||