forked from Archives/Athou_commafeed
Compare commits
785 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2832e8c638 | ||
|
|
d711cbab49 | ||
|
|
2e8fd737af | ||
|
|
a080ede15b | ||
|
|
ab3d41508f | ||
|
|
1ab4a5e925 | ||
|
|
543ce08be6 | ||
|
|
21829056ba | ||
|
|
1af59c87d0 | ||
|
|
799e6c082c | ||
|
|
09635cf0fd | ||
|
|
1dfbd30471 | ||
|
|
48e0a77d1f | ||
|
|
7ae8594c00 | ||
|
|
19663b0f38 | ||
|
|
4bcb9adb83 | ||
|
|
f7505298d7 | ||
|
|
df722ffa8b | ||
|
|
2a852fe08d | ||
|
|
540f796200 | ||
|
|
b726ac84fe | ||
|
|
61ac2bb6a3 | ||
|
|
5d702b3992 | ||
|
|
3bf4a004d4 | ||
|
|
7ac5876d2d | ||
|
|
0f18c612af | ||
|
|
03f4a3c478 | ||
|
|
7069343cf4 | ||
|
|
7fae79f2c5 | ||
|
|
66b714ed39 | ||
|
|
d371ebe354 | ||
|
|
9093d0d5e5 | ||
|
|
1139df0637 | ||
|
|
c1810de316 | ||
|
|
863ced57f8 | ||
|
|
2147aeb4ae | ||
|
|
a810b4fc9a | ||
|
|
abcbb61b4c | ||
|
|
83332223ef | ||
|
|
fd8d981ea0 | ||
|
|
03e3ade09d | ||
|
|
68305f2e00 | ||
|
|
b7d6b06242 | ||
|
|
9098050c5a | ||
|
|
0147ec0a6a | ||
|
|
c6b71605d0 | ||
|
|
64009c82e9 | ||
|
|
5b24cb370f | ||
|
|
2d261cd97b | ||
|
|
9455d91b3d | ||
|
|
cb645c56b4 | ||
|
|
1a6b91dee5 | ||
|
|
8d2edad488 | ||
|
|
522e26b1fa | ||
|
|
259b22c255 | ||
|
|
b61cf82b46 | ||
|
|
4f06f7424c | ||
|
|
d2d65437f8 | ||
|
|
3ae0f7558e | ||
|
|
604801686d | ||
|
|
554d4190ff | ||
|
|
1d71390349 | ||
|
|
fe24c6d682 | ||
|
|
4359d91a23 | ||
|
|
ae42eac7fd | ||
|
|
37a8888a32 | ||
|
|
2d7e065d39 | ||
|
|
35cf640691 | ||
|
|
b308fbe0ad | ||
|
|
d5e2b51b6d | ||
|
|
9b7844542d | ||
|
|
9f6fac0d58 | ||
|
|
f6011dc3f2 | ||
|
|
fdb7fa21f6 | ||
|
|
29bbe41e51 | ||
|
|
004ada8204 | ||
|
|
9a2894944c | ||
|
|
dfcff5029b | ||
|
|
853fc600dd | ||
|
|
a546b21755 | ||
|
|
e40c4e3779 | ||
|
|
60cbf6cff3 | ||
|
|
6d3f4b98d7 | ||
|
|
4812a2b401 | ||
|
|
5f99376d58 | ||
|
|
3e76c142c3 | ||
|
|
28f23a73af | ||
|
|
68b94fed8e | ||
|
|
657b02727c | ||
|
|
7d7a10073c | ||
|
|
9d5f0c791c | ||
|
|
212493e4ff | ||
|
|
9fc8e9c6d7 | ||
|
|
f69ddb71a0 | ||
|
|
290beec0c5 | ||
|
|
dcb2f6f8cd | ||
|
|
d200845906 | ||
|
|
a52e02695d | ||
|
|
febd7c3063 | ||
|
|
d5ae0b99f0 | ||
|
|
8b10c608fc | ||
|
|
0d49b91cc6 | ||
|
|
2af4b83e09 | ||
|
|
cde3ca3d9e | ||
|
|
429798190a | ||
|
|
583db4c70f | ||
|
|
3ec35eec91 | ||
|
|
65bfbfc7fd | ||
|
|
1b93701df2 | ||
|
|
d6debc55f5 | ||
|
|
87fd9ae686 | ||
|
|
3225a3b337 | ||
|
|
4eb98a6c31 | ||
|
|
38a6e2fc98 | ||
|
|
c171cf1487 | ||
|
|
b64a0f1d55 | ||
|
|
3ab124b2db | ||
|
|
d710f3995f | ||
|
|
f53c209082 | ||
|
|
9997be3462 | ||
|
|
c3b06e375c | ||
|
|
1476c5a932 | ||
|
|
8e1c9b9703 | ||
|
|
27c89f7cc7 | ||
|
|
9210198766 | ||
|
|
ce6fa0bf8f | ||
|
|
cd6629b424 | ||
|
|
f25a62ad71 | ||
|
|
cec3c872b6 | ||
|
|
e666e71281 | ||
|
|
3d0c303d41 | ||
|
|
d70a97cf77 | ||
|
|
c67c433258 | ||
|
|
0da6bd5ab6 | ||
|
|
e5cdb1580e | ||
|
|
2c10292073 | ||
|
|
30036a456e | ||
|
|
6349ae9e2b | ||
|
|
8d746669c3 | ||
|
|
0081abc9a7 | ||
|
|
a2f9ac05fe | ||
|
|
6c1f24bad7 | ||
|
|
77cd01e91f | ||
|
|
5487aac81d | ||
|
|
8a6257dc63 | ||
|
|
8146c69ebf | ||
|
|
78ece1abf2 | ||
|
|
baab35c4c5 | ||
|
|
357f9d46f9 | ||
|
|
4eb26302a7 | ||
|
|
a2071d9527 | ||
|
|
65c32c52ff | ||
|
|
fa4353f47d | ||
|
|
46fea1a3e5 | ||
|
|
497cf111d1 | ||
|
|
b1f2fd26e3 | ||
|
|
ae60d4a60f | ||
|
|
ae78e4691d | ||
|
|
9c058cf6d6 | ||
|
|
1ac9af23c5 | ||
|
|
f783bb660e | ||
|
|
e5c271ca1c | ||
|
|
f927247955 | ||
|
|
087e38bec8 | ||
|
|
bab3c8e6b0 | ||
|
|
54ac5d9e27 | ||
|
|
36519d9053 | ||
|
|
ccce4c622d | ||
|
|
4cbf677e55 | ||
|
|
1dbac44a93 | ||
|
|
7e1cfb5cd2 | ||
|
|
df9fb956fa | ||
|
|
16dc383f2b | ||
|
|
0dd7c4851b | ||
|
|
fce4e75eef | ||
|
|
16b578a76d | ||
|
|
483db9881e | ||
|
|
a4053c6084 | ||
|
|
e4f4b46047 | ||
|
|
36f77d5408 | ||
|
|
b3533771dc | ||
|
|
45372cba92 | ||
|
|
dd7fb5bb0d | ||
|
|
41bdc19a22 | ||
|
|
8b7f22021a | ||
|
|
f0160e4d2b | ||
|
|
39d727f98f | ||
|
|
13cc8ac70d | ||
|
|
eb2a219ec8 | ||
|
|
4a59565b20 | ||
|
|
4b7fa96308 | ||
|
|
1ebc8a1e7b | ||
|
|
df2a9aae20 | ||
|
|
dd8287c9d7 | ||
|
|
22fcb08dad | ||
|
|
8c2cf181bd | ||
|
|
69adae36b6 | ||
|
|
8ab700dfa9 | ||
|
|
0177529b45 | ||
|
|
4c6ae3364e | ||
|
|
6df8511a6d | ||
|
|
6fa39517f8 | ||
|
|
c69ce39424 | ||
|
|
a47f6736ac | ||
|
|
79bd7cfff3 | ||
|
|
bc02f23f0f | ||
|
|
715dffb6c8 | ||
|
|
702b3eb971 | ||
|
|
17f62bf491 | ||
|
|
28471302ee | ||
|
|
d8bfdd5d3b | ||
|
|
a36e68e9c3 | ||
|
|
343aed16fb | ||
|
|
142d873c8b | ||
|
|
a94b3e05d3 | ||
|
|
26a79d58f0 | ||
|
|
7c5e68e47d | ||
|
|
ba68627060 | ||
|
|
5bb6a7d4d4 | ||
|
|
76f7999046 | ||
|
|
547693df4f | ||
|
|
0206f8211a | ||
|
|
e061f2e259 | ||
|
|
560ccff04a | ||
|
|
2f0a84557b | ||
|
|
3ae7318ded | ||
|
|
6b7d66e833 | ||
|
|
ec8e594a5c | ||
|
|
858041772e | ||
|
|
b355c04d87 | ||
|
|
4918eaf752 | ||
|
|
80706f006d | ||
|
|
8a7fec1207 | ||
|
|
22a5b6e85e | ||
|
|
a51c533712 | ||
|
|
1f74674a11 | ||
|
|
2eada58ce5 | ||
|
|
31e74bd4a8 | ||
|
|
903f73ee78 | ||
|
|
b21198b239 | ||
|
|
e20ff09457 | ||
|
|
674393eabc | ||
|
|
d78a131713 | ||
|
|
e3816bf05b | ||
|
|
37fe1c60cc | ||
|
|
e705a0d32b | ||
|
|
eb658a644b | ||
|
|
cb905bfc8c | ||
|
|
d0accf6a84 | ||
|
|
55e6f89fc1 | ||
|
|
60695a0ffc | ||
|
|
8a8e4655cd | ||
|
|
2f4b390be1 | ||
|
|
31146cc713 | ||
|
|
9e020ff268 | ||
|
|
7e825192d0 | ||
|
|
8871ae894f | ||
|
|
2808f4b1a2 | ||
|
|
0324c22061 | ||
|
|
57227f9544 | ||
|
|
59c5131f1a | ||
|
|
ccbc07d7d8 | ||
|
|
a0247f0036 | ||
|
|
0979c2767b | ||
|
|
9a9613bba3 | ||
|
|
6451f5f3b7 | ||
|
|
4a4430ce9b | ||
|
|
a38d3dcf72 | ||
|
|
60e1e0d037 | ||
|
|
8071b85b3d | ||
|
|
c867bfb846 | ||
|
|
24b32ab69b | ||
|
|
b1fc65262f | ||
|
|
5af3fea74c | ||
|
|
dde38985e4 | ||
|
|
3f0084fa1c | ||
|
|
8936d4fdce | ||
|
|
4c47b7d838 | ||
|
|
093a9cb8e4 | ||
|
|
f27b3f8933 | ||
|
|
74a9e48e55 | ||
|
|
bafef26ffc | ||
|
|
f8e66170bf | ||
|
|
00bf99fe5a | ||
|
|
05dd66177f | ||
|
|
d5a9e6401e | ||
|
|
660ba67433 | ||
|
|
7ad948065b | ||
|
|
40fcb85c93 | ||
|
|
dcddb80f7b | ||
|
|
8e349aea19 | ||
|
|
3d72725ae0 | ||
|
|
270cb340f5 | ||
|
|
42b5462889 | ||
|
|
b98ab8d011 | ||
|
|
b4264a8ba3 | ||
|
|
a395246d1e | ||
|
|
4b7a2afd07 | ||
|
|
7f49ff20cf | ||
|
|
4e9995e610 | ||
|
|
9f61442cec | ||
|
|
9339847d09 | ||
|
|
39e57cb3ef | ||
|
|
f3a574d05c | ||
|
|
297c76006a | ||
|
|
62d025d827 | ||
|
|
999799ea68 | ||
|
|
331f68253e | ||
|
|
70d3c7a4be | ||
|
|
b3c75a0286 | ||
|
|
9946120304 | ||
|
|
7030a67389 | ||
|
|
eda5ef6965 | ||
|
|
0324479fda | ||
|
|
aeafecb88d | ||
|
|
fde7fbe21a | ||
|
|
7116efc490 | ||
|
|
1ac6058200 | ||
|
|
32b80b64f4 | ||
|
|
9e348767dc | ||
|
|
bce72e1152 | ||
|
|
64aba75be2 | ||
|
|
ca65e13f9a | ||
|
|
54797607c6 | ||
|
|
e174254a95 | ||
|
|
4378e24b49 | ||
|
|
35d276ea98 | ||
|
|
678c89d9c0 | ||
|
|
0a42223de0 | ||
|
|
54d3f3b007 | ||
|
|
3ee58ee464 | ||
|
|
3b5ff016fe | ||
|
|
8a8e786f5e | ||
|
|
2a15f68ffb | ||
|
|
9387e014c1 | ||
|
|
1ef37fcaff | ||
|
|
c5906a481f | ||
|
|
ac0bc916a1 | ||
|
|
5bbe76d56e | ||
|
|
1e6195d74c | ||
|
|
85acea7e64 | ||
|
|
0e4ff99602 | ||
|
|
575d2a0940 | ||
|
|
c548462eef | ||
|
|
3b4cc66b24 | ||
|
|
6d7273f822 | ||
|
|
65014d330a | ||
|
|
d9e3cf0190 | ||
|
|
2d8ee54d28 | ||
|
|
98c3bb780d | ||
|
|
7247c10615 | ||
|
|
0787284d80 | ||
|
|
1c73bffc95 | ||
|
|
6f79815933 | ||
|
|
bb108d594a | ||
|
|
f7716c8834 | ||
|
|
5ba076b1dd | ||
|
|
7861b5a414 | ||
|
|
f36a5988d8 | ||
|
|
8b57240db3 | ||
|
|
7b52efd2d1 | ||
|
|
4901b838e2 | ||
|
|
2313a60f32 | ||
|
|
c38e958588 | ||
|
|
43b1e14f41 | ||
|
|
1e23b3c355 | ||
|
|
85e1556148 | ||
|
|
b65f333a89 | ||
|
|
3dbcbb8280 | ||
|
|
06e464854a | ||
|
|
f7a944a78a | ||
|
|
7f53531489 | ||
|
|
8386c2889f | ||
|
|
13d2332984 | ||
|
|
ce496c205a | ||
|
|
66547661b5 | ||
|
|
8568a29461 | ||
|
|
5d42229aec | ||
|
|
ad8c928cf1 | ||
|
|
cc90883342 | ||
|
|
a4071da5de | ||
|
|
c65dbf978b | ||
|
|
c4ea804fee | ||
|
|
f71720c809 | ||
|
|
03ba601491 | ||
|
|
bdee3fc1b5 | ||
|
|
2e472fa90d | ||
|
|
aad7e896f2 | ||
|
|
2478fc2967 | ||
|
|
2db96c968d | ||
|
|
9bc1a69ace | ||
|
|
cca74e9e54 | ||
|
|
8185411071 | ||
|
|
c89addab2e | ||
|
|
6c617bf9e7 | ||
|
|
5847e340bf | ||
|
|
5a5fd8f425 | ||
|
|
d6283e326d | ||
|
|
c63deb70dd | ||
|
|
c071781099 | ||
|
|
0820b4b70a | ||
|
|
ac42d11251 | ||
|
|
324248ff1e | ||
|
|
f32e83d43b | ||
|
|
3820aaed21 | ||
|
|
a45ef79c6f | ||
|
|
9b9266a6c9 | ||
|
|
06e22030c3 | ||
|
|
ca146c977b | ||
|
|
6a96a3617f | ||
|
|
6dd6e05e0c | ||
|
|
1fb33d51d3 | ||
|
|
4841f2d7f6 | ||
|
|
ad388ae056 | ||
|
|
a80769fae3 | ||
|
|
b34c6f4c34 | ||
|
|
d6d084fbd1 | ||
|
|
1fca44c0da | ||
|
|
8bf1d0b776 | ||
|
|
484412514f | ||
|
|
6987449a7e | ||
|
|
18dac92fc1 | ||
|
|
54774fcfe5 | ||
|
|
b431229273 | ||
|
|
658dde158e | ||
|
|
ced3ada6fc | ||
|
|
0db236639b | ||
|
|
036ce7f94f | ||
|
|
68c887ffe0 | ||
|
|
e96da49d0a | ||
|
|
794684bc4e | ||
|
|
dd944c5293 | ||
|
|
be878454a9 | ||
|
|
e567f81046 | ||
|
|
6164ca5f91 | ||
|
|
655332e3fd | ||
|
|
7e300fea87 | ||
|
|
cea3e0aba8 | ||
|
|
459e270561 | ||
|
|
cba660e785 | ||
|
|
758301a39d | ||
|
|
a8d0bae16e | ||
|
|
583cc39849 | ||
|
|
3585bd3d2d | ||
|
|
3a895b6418 | ||
|
|
bb67733723 | ||
|
|
f380fd553f | ||
|
|
d22ef12adf | ||
|
|
eaec088348 | ||
|
|
fa1d0b9151 | ||
|
|
c0a418b8b1 | ||
|
|
1a4f633a28 | ||
|
|
c92ae40db6 | ||
|
|
0b42bea600 | ||
|
|
d8565cb3d3 | ||
|
|
f68798c10e | ||
|
|
a2ab927433 | ||
|
|
c7eae71c56 | ||
|
|
c3784c2606 | ||
|
|
60fe263b53 | ||
|
|
aaa0cfd0c8 | ||
|
|
a209b2774a | ||
|
|
84d67b6166 | ||
|
|
a7a215e6c7 | ||
|
|
8686fe4e97 | ||
|
|
afe2e8f95b | ||
|
|
f580226c27 | ||
|
|
e93db46e0a | ||
|
|
daea4b7f84 | ||
|
|
eb942b07b1 | ||
|
|
804ca38db7 | ||
|
|
7278c0beae | ||
|
|
096e3a0f5f | ||
|
|
5090c15f20 | ||
|
|
cb7e74fc21 | ||
|
|
ff90041ed4 | ||
|
|
f8fbe1844a | ||
|
|
1902172a04 | ||
|
|
2df384b847 | ||
|
|
65bb35b4de | ||
|
|
97516100f5 | ||
|
|
009ec7a59b | ||
|
|
02890c2b69 | ||
|
|
0f690bf00e | ||
|
|
cfe427b34c | ||
|
|
a44c76cdc3 | ||
|
|
730bde3d0d | ||
|
|
aa006fe22a | ||
|
|
ca77090ecd | ||
|
|
5619d1a4c5 | ||
|
|
b7c80c397d | ||
|
|
d1e7cd2f85 | ||
|
|
7da7aeb796 | ||
|
|
26b46166aa | ||
|
|
6d5eb51a5d | ||
|
|
917b6b318f | ||
|
|
bfd95687b8 | ||
|
|
4198ee1af1 | ||
|
|
e9b1280ae6 | ||
|
|
3c42831db0 | ||
|
|
b8482006b9 | ||
|
|
53f0c33c1d | ||
|
|
563516901e | ||
|
|
73b40fd8b7 | ||
|
|
08224a8486 | ||
|
|
993f3d3aa8 | ||
|
|
3a975de136 | ||
|
|
48b5195798 | ||
|
|
8eb34c7539 | ||
|
|
d75d7a9209 | ||
|
|
ddf851f1eb | ||
|
|
889dd00c23 | ||
|
|
c5ea2a1aa1 | ||
|
|
1489aff78e | ||
|
|
640296d42f | ||
|
|
3b12b2a5f6 | ||
|
|
d5c41a5167 | ||
|
|
58bf86d25d | ||
|
|
d73034d6d9 | ||
|
|
151a613dcc | ||
|
|
4bb741a42f | ||
|
|
cc9c8d3db3 | ||
|
|
c3d4831550 | ||
|
|
31e385fbfb | ||
|
|
a8c47d717c | ||
|
|
9a25157d3f | ||
|
|
9176e0f7b7 | ||
|
|
ff7aa890a6 | ||
|
|
03312c1592 | ||
|
|
9d1ec2c636 | ||
|
|
c49c31a44e | ||
|
|
947c1f562f | ||
|
|
2d1dbb6988 | ||
|
|
622e46ff67 | ||
|
|
4ff45a65c3 | ||
|
|
a62676061b | ||
|
|
11d77d2265 | ||
|
|
1e7d44b250 | ||
|
|
ffd86c6d8c | ||
|
|
a566c9460d | ||
|
|
24edae3d58 | ||
|
|
97876344c4 | ||
|
|
95dbeb9a47 | ||
|
|
3fc64859b1 | ||
|
|
896fe3b5b2 | ||
|
|
85404781a3 | ||
|
|
efe2abc86e | ||
|
|
b70b7a0b40 | ||
|
|
865c80f87b | ||
|
|
23a91aab12 | ||
|
|
085a3cbb50 | ||
|
|
fb9d875c31 | ||
|
|
5ee15c6f68 | ||
|
|
9853205849 | ||
|
|
2c9ce7e8fc | ||
|
|
9753ae60e2 | ||
|
|
bd66f1e682 | ||
|
|
ed6a45c119 | ||
|
|
8f53ce27fc | ||
|
|
f7ae2e6689 | ||
|
|
c6cc47192c | ||
|
|
1c447fe369 | ||
|
|
6b5c92db48 | ||
|
|
427e020d27 | ||
|
|
18084995b2 | ||
|
|
f894fdf564 | ||
|
|
0b0a964a90 | ||
|
|
d6df979d0d | ||
|
|
c366c37afe | ||
|
|
20cbd239b2 | ||
|
|
a9c7595ee7 | ||
|
|
3f09e3ca64 | ||
|
|
ed42db7a0d | ||
|
|
c85daeb46e | ||
|
|
3f2b93f1f8 | ||
|
|
78d2e66c56 | ||
|
|
0f2de651ff | ||
|
|
2eb7c7237e | ||
|
|
3b8f62ff11 | ||
|
|
f8bf9370de | ||
|
|
30cd0ec089 | ||
|
|
e984be9289 | ||
|
|
8069787754 | ||
|
|
343e442dff | ||
|
|
313ccdeae9 | ||
|
|
fdec8ebfd3 | ||
|
|
efddd86263 | ||
|
|
7d18bde40b | ||
|
|
7fee410be4 | ||
|
|
ebc2516a53 | ||
|
|
ade4d1d782 | ||
|
|
07f7a288d2 | ||
|
|
380ed16caf | ||
|
|
db654a10d1 | ||
|
|
2cf84d35cd | ||
|
|
a4eac86913 | ||
|
|
5168be45a8 | ||
|
|
163ab43da3 | ||
|
|
e5fa517270 | ||
|
|
b8b8ea5ce2 | ||
|
|
991b147af5 | ||
|
|
ecff62d0fa | ||
|
|
cdec4c0879 | ||
|
|
e8085ac4cf | ||
|
|
327062112b | ||
|
|
6dfc23c33a | ||
|
|
a601b0ab35 | ||
|
|
a48c8ca87a | ||
|
|
b59e64a3d1 | ||
|
|
5fc62dd06d | ||
|
|
d81a0cae91 | ||
|
|
50e31c6b69 | ||
|
|
92d3d88127 | ||
|
|
517fdb2095 | ||
|
|
d16ebb02b4 | ||
|
|
a5c64c8b7b | ||
|
|
5287a93484 | ||
|
|
06e84d9032 | ||
|
|
3a63dd032a | ||
|
|
889e227523 | ||
|
|
57d895daf5 | ||
|
|
a744394faa | ||
|
|
64e3c25bad | ||
|
|
75f85e1fb2 | ||
|
|
00bd4cab37 | ||
|
|
a9527f59a9 | ||
|
|
77661930f0 | ||
|
|
80a09bd9a0 | ||
|
|
6eb7cfbdc2 | ||
|
|
fb186530aa | ||
|
|
6c121ccb90 | ||
|
|
c08ad3b365 | ||
|
|
1668bc88ad | ||
|
|
3a43f62460 | ||
|
|
bfba5179d1 | ||
|
|
78bf7856dc | ||
|
|
e0c708f677 | ||
|
|
794d6824e8 | ||
|
|
15573a7bee | ||
|
|
31c61a79c6 | ||
|
|
87ca427094 | ||
|
|
99bdc904e0 | ||
|
|
2fdee68feb | ||
|
|
7be014f83e | ||
|
|
5668fe0a33 | ||
|
|
32c07efe19 | ||
|
|
21b23d0f79 | ||
|
|
793d0dd13f | ||
|
|
14e8ff4c1b | ||
|
|
416ab06997 | ||
|
|
493cd60dae | ||
|
|
e0948e1e9e | ||
|
|
5776b8c044 | ||
|
|
38ab4105d8 | ||
|
|
5ed9dadcc2 | ||
|
|
357d7e2381 | ||
|
|
8cfaab3e9f | ||
|
|
fef2404357 | ||
|
|
1aa1bce8c8 | ||
|
|
124b2761f6 | ||
|
|
066ca1af7c | ||
|
|
c20520879b | ||
|
|
4fa5b2b856 | ||
|
|
5c1b1fad76 | ||
|
|
c18d248c06 | ||
|
|
d46ee7f673 | ||
|
|
f2c0d99bd9 | ||
|
|
60ee0b9185 | ||
|
|
4b3e660ae7 | ||
|
|
0b42392bfc | ||
|
|
a94d7ce235 | ||
|
|
72aec432ed | ||
|
|
0e5db8d604 | ||
|
|
dc45fb4b84 | ||
|
|
6503d38fe3 | ||
|
|
32c89d9a11 | ||
|
|
f279465750 | ||
|
|
58ec1b022a | ||
|
|
612199429e | ||
|
|
e5482f9051 | ||
|
|
05df14fda2 | ||
|
|
29898ba1ba | ||
|
|
93d1cec503 | ||
|
|
9884f44122 | ||
|
|
d400456685 | ||
|
|
c39069cafd | ||
|
|
5fb0edc318 | ||
|
|
21a6b2d780 | ||
|
|
40c9063a54 | ||
|
|
59b0103ed5 | ||
|
|
f4730e9338 | ||
|
|
b7b520ca3c | ||
|
|
21d44e6a55 | ||
|
|
607886f0f0 | ||
|
|
7cd3c68256 | ||
|
|
6e37c1bd86 | ||
|
|
5db1a0748f | ||
|
|
a7584df4f4 | ||
|
|
4421197403 | ||
|
|
15b59467fb | ||
|
|
c95ff0a2ce | ||
|
|
7eff9df025 | ||
|
|
2f05e53e14 | ||
|
|
6089fe4036 | ||
|
|
10d9af0d86 | ||
|
|
c119d5062a | ||
|
|
324609ee60 | ||
|
|
a0a65f2b45 | ||
|
|
45e5ca704c | ||
|
|
f361be0c72 | ||
|
|
1611dc5703 | ||
|
|
04faad84a4 | ||
|
|
19c42e5838 | ||
|
|
4918b69d0a | ||
|
|
c7cec464aa | ||
|
|
91857c4d73 | ||
|
|
fc6f9f4258 | ||
|
|
34f9f9374a | ||
|
|
0ae4c1621f | ||
|
|
c393f5c045 | ||
|
|
1624290dc1 | ||
|
|
c6491990ac | ||
|
|
15dea17923 | ||
|
|
689d5ac7b2 | ||
|
|
2142e20e7d | ||
|
|
dc23126570 | ||
|
|
55856f9060 | ||
|
|
c756ce5fc8 | ||
|
|
0546f25d55 | ||
|
|
7b33717333 | ||
|
|
6ea6d16e58 | ||
|
|
a9b65c83aa | ||
|
|
a497802b50 | ||
|
|
42b0428b9a | ||
|
|
931c553e1d | ||
|
|
f3c0b92a3c | ||
|
|
970cabf241 | ||
|
|
e321ecde5d | ||
|
|
32ac326a77 | ||
|
|
134dcd4466 | ||
|
|
26a44353d4 | ||
|
|
55acb3ef28 | ||
|
|
0e96307726 | ||
|
|
0199a36238 | ||
|
|
3f2f6e83fa | ||
|
|
4fa780cac2 | ||
|
|
edb0f655b0 | ||
|
|
651ada7073 | ||
|
|
efb5d49d04 | ||
|
|
f78cc18b06 | ||
|
|
8acffa11e5 | ||
|
|
f4246807ff | ||
|
|
abf6e7131b | ||
|
|
b2688520cc | ||
|
|
fad0aea108 | ||
|
|
0b63773c83 | ||
|
|
3ef28009ac | ||
|
|
8979e2b191 | ||
|
|
d6910aa1e8 | ||
|
|
afc56c6053 | ||
|
|
1bd504cbfb | ||
|
|
2c089ddb5e | ||
|
|
0b5245643a | ||
|
|
ae35d43f7f | ||
|
|
fe55682c9f | ||
|
|
0d3e6f17e2 | ||
|
|
d5659c4278 | ||
|
|
69b87b9026 | ||
|
|
168bcd3a37 | ||
|
|
e3b6be0cd0 | ||
|
|
eeceda0ca8 | ||
|
|
aa903039c8 | ||
|
|
73d81d0cdb | ||
|
|
01fe539af6 | ||
|
|
c08063ca57 | ||
|
|
60d4af2890 | ||
|
|
6378f074a8 | ||
|
|
5082ec86fd | ||
|
|
6cff5bb099 | ||
|
|
d54562d56f | ||
|
|
2b45a8fae5 | ||
|
|
8654df8994 | ||
|
|
4d5145c17e | ||
|
|
b5c197f499 | ||
|
|
d417655a86 |
73
.github/workflows/ci.yml
vendored
73
.github/workflows/ci.yml
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_VERSION: 21
|
JAVA_VERSION: 25
|
||||||
DOCKER_BUILD_SUMMARY: false
|
DOCKER_BUILD_SUMMARY: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -23,13 +23,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
# Checkout
|
# Checkout
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
# Setup
|
# Setup
|
||||||
- name: Set up GraalVM
|
- name: Set up GraalVM
|
||||||
uses: graalvm/setup-graalvm@01ed653ac833fe80569f1ef9f25585ba2811baab # v1
|
uses: graalvm/setup-graalvm@54b4f5a65c1a84b2fdfdc2078fe43df32819e4b1 # v1
|
||||||
with:
|
with:
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
distribution: "graalvm"
|
distribution: "graalvm"
|
||||||
@@ -44,34 +44,43 @@ jobs:
|
|||||||
run: mvn --batch-mode --no-transfer-progress install -Pnative -P${{ matrix.database }} -DskipTests=${{ matrix.os == 'windows-latest' && matrix.database != 'h2' }}
|
run: mvn --batch-mode --no-transfer-progress install -Pnative -P${{ matrix.database }} -DskipTests=${{ matrix.os == 'windows-latest' && matrix.database != 'h2' }}
|
||||||
|
|
||||||
# Build pages
|
# Build pages
|
||||||
- name: Copy generated markdown documentation to /documentation
|
- name: Create pages directory structure
|
||||||
run: mkdir documentation && cp ./commafeed-server/target/quarkus-generated-doc/config/commafeed-server.md ./documentation/README.md
|
run: mkdir -p target/pages/documentation/custom-css
|
||||||
|
|
||||||
- name: Generate pages
|
- name: Convert readme file to html
|
||||||
uses: wranders/markdown-to-pages-action@8d8a750832932ac785f5424c8c5543aa0b26bb9a # v1
|
uses: jaywcjlove/markdown-to-html-cli@d2c8ffd676de1801e2586904bc540a938e4bc480 # v5.0.3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
source: README.md
|
||||||
out_path: target/pages
|
output: target/pages/index.html
|
||||||
files: |-
|
|
||||||
README.md
|
- name: Convert config documentation to html
|
||||||
documentation/README.md
|
uses: jaywcjlove/markdown-to-html-cli@d2c8ffd676de1801e2586904bc540a938e4bc480 # v5.0.3
|
||||||
|
with:
|
||||||
|
source: commafeed-server/target/quarkus-generated-doc/config/commafeed-server.md
|
||||||
|
output: target/pages/documentation/index.html
|
||||||
|
|
||||||
|
- name: Convert custom css documentation to html
|
||||||
|
uses: jaywcjlove/markdown-to-html-cli@d2c8ffd676de1801e2586904bc540a938e4bc480 # v5.0.3
|
||||||
|
with:
|
||||||
|
source: documentation/CUSTOMCSS.md
|
||||||
|
output: target/pages/documentation/custom-css/index.html
|
||||||
|
|
||||||
# Upload artifacts
|
# Upload artifacts
|
||||||
- name: Upload cross-platform app
|
- name: Upload cross-platform app
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
|
||||||
if: matrix.os == 'ubuntu-latest' # we only need to upload the cross-platform artifact once per database
|
if: matrix.os == 'ubuntu-latest' # we only need to upload the cross-platform artifact once per database
|
||||||
with:
|
with:
|
||||||
name: commafeed-${{ matrix.database }}-jvm
|
name: commafeed-${{ matrix.database }}-jvm
|
||||||
path: commafeed-server/target/commafeed-*.zip
|
path: commafeed-server/target/commafeed-*.zip
|
||||||
|
|
||||||
- name: Upload native executable
|
- name: Upload native executable
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
|
||||||
with:
|
with:
|
||||||
name: commafeed-${{ matrix.database }}-${{ runner.os }}-${{ runner.arch }}
|
name: commafeed-${{ matrix.database }}-${{ runner.os }}-${{ runner.arch }}
|
||||||
path: commafeed-server/target/commafeed-*-runner*
|
path: commafeed-server/target/commafeed-*-runner*
|
||||||
|
|
||||||
- name: Upload pages
|
- name: Upload pages
|
||||||
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
|
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4
|
||||||
if: matrix.os == 'ubuntu-latest' && matrix.database == 'h2' # we only need to upload the pages once
|
if: matrix.os == 'ubuntu-latest' && matrix.database == 'h2' # we only need to upload the pages once
|
||||||
with:
|
with:
|
||||||
path: target/pages
|
path: target/pages
|
||||||
@@ -89,23 +98,23 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
# Checkout
|
# Checkout
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
# Setup
|
# Setup
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3
|
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
|
||||||
|
|
||||||
- name: Install required packages
|
- name: Install required packages
|
||||||
run: sudo apt-get install -y rename unzip
|
run: sudo apt-get install -y rename unzip
|
||||||
|
|
||||||
# Prepare artifacts
|
# Prepare artifacts
|
||||||
- name: Download artifacts
|
- name: Download artifacts
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
|
||||||
with:
|
with:
|
||||||
pattern: commafeed-${{ matrix.database }}-*
|
pattern: commafeed-${{ matrix.database }}-*
|
||||||
path: ./artifacts
|
path: ./artifacts
|
||||||
@@ -126,7 +135,7 @@ jobs:
|
|||||||
|
|
||||||
# Docker
|
# Docker
|
||||||
- name: Login to Container Registry
|
- name: Login to Container Registry
|
||||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
|
||||||
if: ${{ env.DOCKERHUB_USERNAME != '' }}
|
if: ${{ env.DOCKERHUB_USERNAME != '' }}
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
@@ -134,7 +143,7 @@ jobs:
|
|||||||
|
|
||||||
## build but don't push for PRs and renovate
|
## build but don't push for PRs and renovate
|
||||||
- name: Docker build - native
|
- name: Docker build - native
|
||||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: commafeed-server/src/main/docker/Dockerfile.native
|
file: commafeed-server/src/main/docker/Dockerfile.native
|
||||||
@@ -142,7 +151,7 @@ jobs:
|
|||||||
platforms: linux/amd64,linux/arm64/v8
|
platforms: linux/amd64,linux/arm64/v8
|
||||||
|
|
||||||
- name: Docker build - jvm
|
- name: Docker build - jvm
|
||||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: commafeed-server/src/main/docker/Dockerfile.jvm
|
file: commafeed-server/src/main/docker/Dockerfile.jvm
|
||||||
@@ -151,7 +160,7 @@ jobs:
|
|||||||
|
|
||||||
## build and push tag
|
## build and push tag
|
||||||
- name: Docker build and push tag - native
|
- name: Docker build and push tag - native
|
||||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
|
||||||
if: ${{ github.ref_type == 'tag' }}
|
if: ${{ github.ref_type == 'tag' }}
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
@@ -163,7 +172,7 @@ jobs:
|
|||||||
athou/commafeed:${{ github.ref_name }}-${{ matrix.database }}
|
athou/commafeed:${{ github.ref_name }}-${{ matrix.database }}
|
||||||
|
|
||||||
- name: Docker build and push tag - jvm
|
- name: Docker build and push tag - jvm
|
||||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
|
||||||
if: ${{ github.ref_type == 'tag' }}
|
if: ${{ github.ref_type == 'tag' }}
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
@@ -176,7 +185,7 @@ jobs:
|
|||||||
|
|
||||||
## build and push master
|
## build and push master
|
||||||
- name: Docker build and push master - native
|
- name: Docker build and push master - native
|
||||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
|
||||||
if: ${{ github.ref_name == 'master' }}
|
if: ${{ github.ref_name == 'master' }}
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
@@ -186,7 +195,7 @@ jobs:
|
|||||||
tags: athou/commafeed:master-${{ matrix.database }}
|
tags: athou/commafeed:master-${{ matrix.database }}
|
||||||
|
|
||||||
- name: Docker build and push master - jvm
|
- name: Docker build and push master - jvm
|
||||||
uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
|
||||||
if: ${{ github.ref_name == 'master' }}
|
if: ${{ github.ref_name == 'master' }}
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
@@ -206,12 +215,12 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Download artifacts
|
- name: Download artifacts
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
|
||||||
with:
|
with:
|
||||||
pattern: commafeed-*
|
pattern: commafeed-*
|
||||||
path: ./artifacts
|
path: ./artifacts
|
||||||
@@ -227,7 +236,7 @@ jobs:
|
|||||||
version: ${{ github.ref_name }}
|
version: ${{ github.ref_name }}
|
||||||
|
|
||||||
- name: Create GitHub release
|
- name: Create GitHub release
|
||||||
uses: ncipollo/release-action@440c8c1cb0ed28b9f43e4d1d670870f059653174 # v1
|
uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1
|
||||||
with:
|
with:
|
||||||
name: CommaFeed ${{ github.ref_name }}
|
name: CommaFeed ${{ github.ref_name }}
|
||||||
body: ${{ steps.changelog_reader.outputs.changes }}
|
body: ${{ steps.changelog_reader.outputs.changes }}
|
||||||
@@ -240,12 +249,12 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Update Docker Hub Description
|
- name: Update Docker Hub Description
|
||||||
uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4
|
uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|||||||
19
.mvn/wrapper/maven-wrapper.properties
vendored
19
.mvn/wrapper/maven-wrapper.properties
vendored
@@ -1,18 +1,3 @@
|
|||||||
# Licensed to the Apache Software Foundation (ASF) under one
|
wrapperVersion=3.3.4
|
||||||
# or more contributor license agreements. See the NOTICE file
|
|
||||||
# distributed with this work for additional information
|
|
||||||
# regarding copyright ownership. The ASF licenses this file
|
|
||||||
# to you under the Apache License, Version 2.0 (the
|
|
||||||
# "License"); you may not use this file except in compliance
|
|
||||||
# with the License. You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing,
|
|
||||||
# software distributed under the License is distributed on an
|
|
||||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
# KIND, either express or implied. See the License for the
|
|
||||||
# specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
distributionType=only-script
|
distributionType=only-script
|
||||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip
|
||||||
|
|||||||
45
CHANGELOG.md
45
CHANGELOG.md
@@ -1,5 +1,50 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [6.0.0]
|
||||||
|
|
||||||
|
- When booting CommaFeed for the first time, the default "admin" account is no longer created automatically. A setup wizard will guide you through the creation of an admin account
|
||||||
|
- Default password complexity requirements have been lowered for local network deployments, where strict password rules are often unnecessary. The `commafeed.users.strict-password-policy` setting has been replaced by `commafeed.users.minimum-password-length` with a default value of `4` (#1916)
|
||||||
|
- Email addresses are no longer required when creating users and when they update their profile. The `commafeed.users.email-address-required` setting has been added to restore the previous behavior (#1914)
|
||||||
|
- Java 25+ is now required to build and run CommaFeed
|
||||||
|
|
||||||
|
## [5.12.1]
|
||||||
|
|
||||||
|
- The favicon is now crispier (#1978)
|
||||||
|
- The ReadKit iOS app now works via the Fever API (#1602)
|
||||||
|
|
||||||
|
## [5.12.0]
|
||||||
|
|
||||||
|
- Added a setting to disable the "disable pull to refresh" feature because it messes with some browsers (#1168)
|
||||||
|
- Emojis in feeds are now correctly displayed (#1955)
|
||||||
|
- Don't show "Star/Unstar" in the context menu if the entry is too old to be starred (#1935)
|
||||||
|
- Invalid relative urls in feeds no longer prevent those feeds from being parsed (#1939)
|
||||||
|
- Fix an issue that could prevent large feeds from being parsed when using Java 24+ (#1961)
|
||||||
|
- Enforce user password validation when created in the admin view (#1937)
|
||||||
|
- The process in the docker native image is now called "commafeed" instead of "application"
|
||||||
|
|
||||||
|
## [5.11.1]
|
||||||
|
|
||||||
|
- The search limit of 3 characters has been removed (#1887)
|
||||||
|
- Fix an issue that caused feed filtering expressions to be incorrectly converted to lowercase when saving them (#1899)
|
||||||
|
|
||||||
|
## [5.11.0]
|
||||||
|
|
||||||
|
- Add an option to navigate to the next unread category/feed when marking all entries as read (#1807)
|
||||||
|
- Google Analytics support has been removed
|
||||||
|
|
||||||
|
## [5.10.0]
|
||||||
|
|
||||||
|
- Add an indicator next to each feed's unread count in the tree to show when new entries are discovered while the app is open (#1762)
|
||||||
|
- Feeds with uppercase HTTP:// or HTTPS:// URLs are now correctly handled again
|
||||||
|
- The aarch64 native executable now also works on the Raspberry Pi 5 (#1795)
|
||||||
|
- Improve general performance of the UI by reducing the number of re-renders, especially when a lot of entries are displayed (#1087)
|
||||||
|
|
||||||
|
## [5.9.0]
|
||||||
|
|
||||||
|
- A lot of CSS classes have been added to the elements of the application to ease custom CSS rules (#1757)
|
||||||
|
- Added a link in the README to the [documentation](https://athou.github.io/commafeed/documentation/custom-css/) of the new CSS classes
|
||||||
|
- Static resources are now cached for much longer (#1782)
|
||||||
|
|
||||||
## [5.8.0]
|
## [5.8.0]
|
||||||
|
|
||||||
- A color picker is now available on the settings page to change the orange accent of the application (#1598)
|
- A color picker is now available on the settings page to change the orange accent of the application (#1598)
|
||||||
|
|||||||
15
README.md
15
README.md
@@ -17,6 +17,7 @@ Google Reader inspired self-hosted RSS reader, based on Quarkus and React/TypeSc
|
|||||||
- REST API
|
- REST API
|
||||||
- Fever-compatible API for native mobile apps
|
- Fever-compatible API for native mobile apps
|
||||||
- Can automatically mark articles as read based on user-defined rules
|
- Can automatically mark articles as read based on user-defined rules
|
||||||
|
- Highly customizable with [custom CSS](https://athou.github.io/commafeed/documentation/custom-css) and JavaScript
|
||||||
- [Browser extension](https://github.com/Athou/commafeed-browser-extension)
|
- [Browser extension](https://github.com/Athou/commafeed-browser-extension)
|
||||||
- Compiles to native code for blazing fast startup and low memory usage
|
- Compiles to native code for blazing fast startup and low memory usage
|
||||||
- Supports 4 databases
|
- Supports 4 databases
|
||||||
@@ -25,11 +26,18 @@ Google Reader inspired self-hosted RSS reader, based on Quarkus and React/TypeSc
|
|||||||
- MySQL
|
- MySQL
|
||||||
- MariaDB
|
- MariaDB
|
||||||
|
|
||||||
## Deployment
|
## Usage
|
||||||
|
|
||||||
|
### Public instance
|
||||||
|
|
||||||
|
A free public instance is available at https://www.commafeed.com.
|
||||||
|
|
||||||
|
It has no ads, no tracking, and your data is never exploited or sold to third parties. The service is funded entirely through donations.
|
||||||
|
However, this public instance does have a few limitations compared to self-hosted setups, outlined [here](https://github.com/Athou/commafeed/discussions/1567).
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
Docker is the easiest way to get started with CommaFeed.
|
Docker is the easiest way to get started with self-hosted CommaFeed.
|
||||||
|
|
||||||
Docker images are built automatically and are available at https://hub.docker.com/r/athou/commafeed
|
Docker images are built automatically and are available at https://hub.docker.com/r/athou/commafeed
|
||||||
|
|
||||||
@@ -102,7 +110,7 @@ There are multiple ways to configure CommaFeed:
|
|||||||
- Environment variables (keys in UPPER_CASE)
|
- Environment variables (keys in UPPER_CASE)
|
||||||
- a `.env` file in the working directory (keys in UPPER_CASE)
|
- a `.env` file in the working directory (keys in UPPER_CASE)
|
||||||
|
|
||||||
The properties file is recommended because CommaFeed will be able to warn about invalid properties and typos.
|
When in doubt, the properties file is recommended because CommaFeed will be able to warn about invalid properties and typos.
|
||||||
|
|
||||||
All [CommaFeed settings](https://athou.github.io/commafeed/documentation) are optional and have sensible default values.
|
All [CommaFeed settings](https://athou.github.io/commafeed/documentation) are optional and have sensible default values.
|
||||||
|
|
||||||
@@ -112,7 +120,6 @@ meaning that you will have to log back in after each restart of the application.
|
|||||||
All other Quarkus settings can be found [here](https://quarkus.io/guides/all-config).
|
All other Quarkus settings can be found [here](https://quarkus.io/guides/all-config).
|
||||||
|
|
||||||
When started, the server will listen on http://localhost:8082.
|
When started, the server will listen on http://localhost:8082.
|
||||||
The default user is `admin` and the default password is `admin`.
|
|
||||||
|
|
||||||
### Updates
|
### Updates
|
||||||
|
|
||||||
|
|||||||
@@ -2,5 +2,4 @@
|
|||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
If you found a vulnerability that you deem too sensitive to disclose publicly in a Github issue, please send an email at jeremiepanzer at gmail dot com.
|
If you found a vulnerability that you deem too sensitive to disclose publicly in a Github issue, please create a private security advisory here: https://github.com/Athou/commafeed/security/advisories
|
||||||
Thanks !
|
|
||||||
|
|||||||
3
commafeed-client/.gitignore
vendored
3
commafeed-client/.gitignore
vendored
@@ -23,9 +23,6 @@ dist-ssr
|
|||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
# rollup-plugin-visualizer
|
|
||||||
/stats.html
|
|
||||||
|
|
||||||
# vite
|
# vite
|
||||||
vite.config.ts.timestamp-*.mjs
|
vite.config.ts.timestamp-*.mjs
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
"$schema": "https://biomejs.dev/schemas/2.3.11/schema.json",
|
||||||
"formatter": {
|
"formatter": {
|
||||||
"indentStyle": "space",
|
"indentStyle": "space",
|
||||||
"indentWidth": 4,
|
"indentWidth": 4,
|
||||||
@@ -13,15 +13,7 @@
|
|||||||
"arrowParentheses": "asNeeded"
|
"arrowParentheses": "asNeeded"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"linter": {
|
|
||||||
"rules": {
|
|
||||||
"correctness": {
|
|
||||||
"noUnusedImports": "error",
|
|
||||||
"noUnusedVariables": "error"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"files": {
|
"files": {
|
||||||
"ignore": ["dist", "node_modules", "target", "target-ide"]
|
"includes": ["**", "!**/dist", "!**/node_modules", "!**/target", "!**/target-ide"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
|
||||||
<link rel="icon" type="image/x-icon" href="favicon.ico" />
|
<link rel="icon" type="image/x-icon" href="favicon.ico" />
|
||||||
<link rel="manifest" href="manifest.json" />
|
<link rel="manifest" href="manifest.json" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||||
|
|||||||
4582
commafeed-client/package-lock.json
generated
4582
commafeed-client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -16,69 +16,66 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.14.0",
|
"@emotion/react": "^11.14.0",
|
||||||
"@fontsource/open-sans": "^5.2.5",
|
"@fontsource/open-sans": "^5.2.7",
|
||||||
"@lingui/core": "^5.3.1",
|
"@lingui/core": "^5.7.0",
|
||||||
"@lingui/react": "^5.3.1",
|
"@lingui/react": "^5.7.0",
|
||||||
"@mantine/core": "^8.0.0",
|
"@mantine/core": "^8.3.11",
|
||||||
"@mantine/form": "^8.0.0",
|
"@mantine/form": "^8.3.11",
|
||||||
"@mantine/hooks": "^8.0.0",
|
"@mantine/hooks": "^8.3.11",
|
||||||
"@mantine/modals": "^8.0.0",
|
"@mantine/modals": "^8.3.11",
|
||||||
"@mantine/notifications": "^8.0.0",
|
"@mantine/notifications": "^8.3.11",
|
||||||
"@mantine/spotlight": "^8.0.0",
|
"@mantine/spotlight": "^8.3.11",
|
||||||
"@monaco-editor/react": "^4.7.0",
|
"@monaco-editor/react": "^4.7.0",
|
||||||
"@reduxjs/toolkit": "^2.7.0",
|
"@reduxjs/toolkit": "^2.11.2",
|
||||||
"axios": "^1.9.0",
|
"axios": "^1.13.2",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.19",
|
||||||
"escape-string-regexp": "^5.0.0",
|
"escape-string-regexp": "^5.0.0",
|
||||||
"interweave": "^13.1.1",
|
"interweave": "^13.1.1",
|
||||||
"monaco-editor": "^0.52.2",
|
"monaco-editor": "^0.55.1",
|
||||||
"mousetrap": "^1.6.5",
|
"mousetrap": "^1.6.5",
|
||||||
"react": "^19.1.0",
|
"react": "^19.2.3",
|
||||||
"react-async-hook": "^4.0.0",
|
"react-async-hook": "^4.0.0",
|
||||||
"react-contexify": "^6.0.0",
|
"react-contexify": "^6.0.0",
|
||||||
"react-device-detect": "^2.2.3",
|
"react-dom": "^19.2.3",
|
||||||
"react-dom": "^19.1.0",
|
"react-draggable": "^4.5.0",
|
||||||
"react-draggable": "^4.4.6",
|
|
||||||
"react-ga4": "^2.1.0",
|
|
||||||
"react-icons": "^5.5.0",
|
"react-icons": "^5.5.0",
|
||||||
"react-infinite-scroller": "^1.2.6",
|
"react-infinite-scroller": "^1.2.6",
|
||||||
"react-redux": "^9.2.0",
|
"react-redux": "^9.2.0",
|
||||||
"react-router-dom": "^7.5.3",
|
"react-router-dom": "^7.11.0",
|
||||||
"react-swipeable": "^7.0.2",
|
"react-swipeable": "^7.0.2",
|
||||||
"redoc": "^2.5.0",
|
"style-to-object": "^1.0.14",
|
||||||
"style-to-object": "^1.0.8",
|
|
||||||
"throttle-debounce": "^5.0.2",
|
"throttle-debounce": "^5.0.2",
|
||||||
"tinycon": "^0.6.8",
|
"tinycon": "^0.6.8",
|
||||||
"tss-react": "^4.9.17",
|
"tss-react": "^4.9.20",
|
||||||
"websocket-heartbeat-js": "^1.1.3"
|
"websocket-heartbeat-js": "^1.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "^1.9.4",
|
"@biomejs/biome": "^2.3.11",
|
||||||
"@lingui/babel-plugin-lingui-macro": "^5.3.1",
|
"@lingui/babel-plugin-lingui-macro": "^5.7.0",
|
||||||
"@lingui/cli": "^5.3.1",
|
"@lingui/cli": "^5.7.0",
|
||||||
"@lingui/vite-plugin": "^5.3.1",
|
"@lingui/vite-plugin": "^5.7.0",
|
||||||
"@testing-library/jest-dom": "^6.6.3",
|
"@testing-library/jest-dom": "^6.9.1",
|
||||||
"@testing-library/react": "^16.3.0",
|
"@testing-library/react": "^16.3.1",
|
||||||
"@testing-library/user-event": "^14.6.1",
|
"@testing-library/user-event": "^14.6.1",
|
||||||
"@types/mousetrap": "^1.6.15",
|
"@types/mousetrap": "^1.6.15",
|
||||||
"@types/react": "^19.1.3",
|
"@types/react": "^19.2.7",
|
||||||
"@types/react-dom": "^19.1.3",
|
"@types/react-dom": "^19.2.3",
|
||||||
"@types/react-infinite-scroller": "^1.2.5",
|
"@types/react-infinite-scroller": "^1.2.5",
|
||||||
"@types/throttle-debounce": "^5.0.2",
|
"@types/throttle-debounce": "^5.0.2",
|
||||||
"@types/tinycon": "^0.6.7",
|
"@types/tinycon": "^0.6.7",
|
||||||
"@vitejs/plugin-react": "^4.4.1",
|
"@vitejs/plugin-react": "^5.1.2",
|
||||||
"babel-plugin-macros": "^3.1.0",
|
"babel-plugin-react-compiler": "1.0.0",
|
||||||
"jsdom": "^26.1.0",
|
"jsdom": "^27.4.0",
|
||||||
"rollup-plugin-visualizer": "^5.14.0",
|
"typescript": "^5.9.3",
|
||||||
"typescript": "^5.8.3",
|
"vite": "^7.3.1",
|
||||||
"vite": "^6.3.5",
|
"vite-plugin-checker": "^0.12.0",
|
||||||
"vite-plugin-checker": "^0.9.2",
|
"vite-tsconfig-paths": "^6.0.3",
|
||||||
"vite-tsconfig-paths": "^5.1.4",
|
"vitest": "^4.0.16",
|
||||||
"vitest": "^3.1.3"
|
"yaml": "^2.8.2"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"react-infinite-scroller": {
|
"react-infinite-scroller": {
|
||||||
"react": "^19.1.0"
|
"react": "^19.2.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,16 +6,16 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.commafeed</groupId>
|
<groupId>com.commafeed</groupId>
|
||||||
<artifactId>commafeed</artifactId>
|
<artifactId>commafeed</artifactId>
|
||||||
<version>5.8.0</version>
|
<version>6.0.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>commafeed-client</artifactId>
|
<artifactId>commafeed-client</artifactId>
|
||||||
<name>CommaFeed Client</name>
|
<name>CommaFeed Client</name>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<!-- renovate: datasource=node-version depName=node -->
|
<!-- renovate: datasource=node-version depName=node -->
|
||||||
<node.version>v22.15.0</node.version>
|
<node.version>v24.12.0</node.version>
|
||||||
<!-- renovate: datasource=npm depName=npm -->
|
<!-- renovate: datasource=npm depName=npm -->
|
||||||
<npm.version>11.3.0</npm.version>
|
<npm.version>11.7.0</npm.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>com.github.eirslett</groupId>
|
<groupId>com.github.eirslett</groupId>
|
||||||
<artifactId>frontend-maven-plugin</artifactId>
|
<artifactId>frontend-maven-plugin</artifactId>
|
||||||
<version>1.15.1</version>
|
<version>2.0.0</version>
|
||||||
<?m2e ignore?>
|
<?m2e ignore?>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>3.3.1</version>
|
<version>3.4.0</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>copy web interface to resources</id>
|
<id>copy web interface to resources</id>
|
||||||
|
|||||||
62
commafeed-client/public/favicon.svg
Normal file
62
commafeed-client/public/favicon.svg
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
height="393.84613"
|
||||||
|
width="393.84613"
|
||||||
|
viewBox="0 0 5.0480766 5.0480766"
|
||||||
|
version="1.1"
|
||||||
|
id="svg3"
|
||||||
|
sodipodi:docname="favicon.svg"
|
||||||
|
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs3" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview3"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="1.21875"
|
||||||
|
inkscape:cx="207.17949"
|
||||||
|
inkscape:cy="187.07692"
|
||||||
|
inkscape:window-width="1440"
|
||||||
|
inkscape:window-height="855"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg3" />
|
||||||
|
<rect
|
||||||
|
fill="#f88a14"
|
||||||
|
rx="0.53846151"
|
||||||
|
ry="0.53846151"
|
||||||
|
height="5.0480766"
|
||||||
|
width="5.0480766"
|
||||||
|
id="rect1"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="stroke-width:0.769231" />
|
||||||
|
<path
|
||||||
|
d="m 1.3450904,0.64548657 c 2.9002,0 2.9002,2.91010003 2.9002,2.91010003"
|
||||||
|
fill="none"
|
||||||
|
stroke="#ffffff"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="0.78125"
|
||||||
|
id="path1" />
|
||||||
|
<path
|
||||||
|
d="m 1.3377904,1.9915866 c 1.5705,-0.00908 1.5705,1.5639 1.5705,1.5639"
|
||||||
|
fill="none"
|
||||||
|
stroke="#ffffff"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-width="0.78125"
|
||||||
|
id="path2" />
|
||||||
|
<path
|
||||||
|
d="m 2.0192904,3.5227866 c 0,0.23366 -0.10712,0.47418 -0.24663,0.6537 -0.1814,0.2333 -0.5705,0.5618 -0.6913,0.5653 0.0402,-0.0662 0.263,-0.5654 0.2563,-0.5654 -0.36423004,0 -0.65950004,-0.29265 -0.65950004,-0.65365 0,-0.361 0.29527,-0.65365 0.65950004,-0.65365 0.36423,0 0.68159,0.29265 0.68159,0.65365 z"
|
||||||
|
fill="#ffffff"
|
||||||
|
id="path3" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -3,40 +3,45 @@ import { I18nProvider } from "@lingui/react"
|
|||||||
import { MantineProvider } from "@mantine/core"
|
import { MantineProvider } from "@mantine/core"
|
||||||
import { ModalsProvider } from "@mantine/modals"
|
import { ModalsProvider } from "@mantine/modals"
|
||||||
import { Notifications } from "@mantine/notifications"
|
import { Notifications } from "@mantine/notifications"
|
||||||
import { Constants } from "app/constants"
|
import type React from "react"
|
||||||
import { redirectTo } from "app/redirect/slice"
|
import { useEffect, useState } from "react"
|
||||||
import { reloadServerInfos } from "app/server/thunks"
|
import { HashRouter, Navigate, Route, Routes, useNavigate } from "react-router-dom"
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import { categoryUnreadCount } from "app/utils"
|
|
||||||
import { DisablePullToRefresh } from "components/DisablePullToRefresh"
|
|
||||||
import { ErrorBoundary } from "components/ErrorBoundary"
|
|
||||||
import { Header } from "components/header/Header"
|
|
||||||
import { Tree } from "components/sidebar/Tree"
|
|
||||||
import { useAppLoading } from "hooks/useAppLoading"
|
|
||||||
import { useBrowserExtension } from "hooks/useBrowserExtension"
|
|
||||||
import { useI18n } from "i18n"
|
|
||||||
import { WelcomePage } from "pages/WelcomePage"
|
|
||||||
import { AdminUsersPage } from "pages/admin/AdminUsersPage"
|
|
||||||
import { MetricsPage } from "pages/admin/MetricsPage"
|
|
||||||
import { AboutPage } from "pages/app/AboutPage"
|
|
||||||
import { AddPage } from "pages/app/AddPage"
|
|
||||||
import { CategoryDetailsPage } from "pages/app/CategoryDetailsPage"
|
|
||||||
import { DonatePage } from "pages/app/DonatePage"
|
|
||||||
import { FeedDetailsPage } from "pages/app/FeedDetailsPage"
|
|
||||||
import { FeedEntriesPage } from "pages/app/FeedEntriesPage"
|
|
||||||
import Layout from "pages/app/Layout"
|
|
||||||
import { SettingsPage } from "pages/app/SettingsPage"
|
|
||||||
import { TagDetailsPage } from "pages/app/TagDetailsPage"
|
|
||||||
import { LoginPage } from "pages/auth/LoginPage"
|
|
||||||
import { PasswordRecoveryPage } from "pages/auth/PasswordRecoveryPage"
|
|
||||||
import { RegistrationPage } from "pages/auth/RegistrationPage"
|
|
||||||
import React, { useEffect, useState } from "react"
|
|
||||||
import { isSafari } from "react-device-detect"
|
|
||||||
import ReactGA from "react-ga4"
|
|
||||||
import { HashRouter, Navigate, Route, Routes, useLocation, useNavigate } from "react-router-dom"
|
|
||||||
import Tinycon from "tinycon"
|
import Tinycon from "tinycon"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import { redirectTo } from "@/app/redirect/slice"
|
||||||
|
import { redirectToInitialSetup } from "@/app/redirect/thunks"
|
||||||
|
import { reloadServerInfos } from "@/app/server/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import { categoryUnreadCount } from "@/app/utils"
|
||||||
|
import { DisablePullToRefresh } from "@/components/DisablePullToRefresh"
|
||||||
|
import { ErrorBoundary } from "@/components/ErrorBoundary"
|
||||||
|
import { Header } from "@/components/header/Header"
|
||||||
|
import { Tree } from "@/components/sidebar/Tree"
|
||||||
|
import { useAppLoading } from "@/hooks/useAppLoading"
|
||||||
|
import { useBrowserExtension } from "@/hooks/useBrowserExtension"
|
||||||
|
import { useI18n } from "@/i18n"
|
||||||
|
import { AdminUsersPage } from "@/pages/admin/AdminUsersPage"
|
||||||
|
import { MetricsPage } from "@/pages/admin/MetricsPage"
|
||||||
|
import { AboutPage } from "@/pages/app/AboutPage"
|
||||||
|
import { AddPage } from "@/pages/app/AddPage"
|
||||||
|
import { CategoryDetailsPage } from "@/pages/app/CategoryDetailsPage"
|
||||||
|
import { DonatePage } from "@/pages/app/DonatePage"
|
||||||
|
import { FeedDetailsPage } from "@/pages/app/FeedDetailsPage"
|
||||||
|
import { FeedEntriesPage } from "@/pages/app/FeedEntriesPage"
|
||||||
|
import Layout from "@/pages/app/Layout"
|
||||||
|
import { SettingsPage } from "@/pages/app/SettingsPage"
|
||||||
|
import { TagDetailsPage } from "@/pages/app/TagDetailsPage"
|
||||||
|
import { InitialSetupPage } from "@/pages/auth/InitialSetupPage"
|
||||||
|
import { LoginPage } from "@/pages/auth/LoginPage"
|
||||||
|
import { PasswordRecoveryPage } from "@/pages/auth/PasswordRecoveryPage"
|
||||||
|
import { RegistrationPage } from "@/pages/auth/RegistrationPage"
|
||||||
|
import { WelcomePage } from "@/pages/WelcomePage"
|
||||||
|
|
||||||
function Providers(props: { children: React.ReactNode }) {
|
function Providers(
|
||||||
|
props: Readonly<{
|
||||||
|
children: React.ReactNode
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const primaryColor = useAppSelector(state => state.user.settings?.primaryColor) || Constants.theme.defaultPrimaryColor
|
const primaryColor = useAppSelector(state => state.user.settings?.primaryColor) || Constants.theme.defaultPrimaryColor
|
||||||
return (
|
return (
|
||||||
<I18nProvider i18n={i18n}>
|
<I18nProvider i18n={i18n}>
|
||||||
@@ -72,9 +77,6 @@ function Providers(props: { children: React.ReactNode }) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// api documentation page is very large, load only on-demand
|
|
||||||
const ApiDocumentationPage = React.lazy(async () => await import("pages/app/ApiDocumentationPage"))
|
|
||||||
|
|
||||||
function AppRoutes() {
|
function AppRoutes() {
|
||||||
const sidebarVisible = useAppSelector(state => state.tree.sidebarVisible)
|
const sidebarVisible = useAppSelector(state => state.tree.sidebarVisible)
|
||||||
|
|
||||||
@@ -82,10 +84,10 @@ function AppRoutes() {
|
|||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Navigate to={`/app/category/${Constants.categories.all.id}`} replace />} />
|
<Route path="/" element={<Navigate to={`/app/category/${Constants.categories.all.id}`} replace />} />
|
||||||
<Route path="welcome" element={<WelcomePage />} />
|
<Route path="welcome" element={<WelcomePage />} />
|
||||||
|
<Route path="setup" element={<InitialSetupPage />} />
|
||||||
<Route path="login" element={<LoginPage />} />
|
<Route path="login" element={<LoginPage />} />
|
||||||
<Route path="register" element={<RegistrationPage />} />
|
<Route path="register" element={<RegistrationPage />} />
|
||||||
<Route path="passwordRecovery" element={<PasswordRecoveryPage />} />
|
<Route path="passwordRecovery" element={<PasswordRecoveryPage />} />
|
||||||
<Route path="api" element={<ApiDocumentationPage />} />
|
|
||||||
<Route path="app" element={<Layout header={<Header />} sidebar={<Tree />} sidebarVisible={sidebarVisible} />}>
|
<Route path="app" element={<Layout header={<Header />} sidebar={<Tree />} sidebarVisible={sidebarVisible} />}>
|
||||||
<Route path="category">
|
<Route path="category">
|
||||||
<Route path=":id" element={<FeedEntriesPage sourceType="category" />} />
|
<Route path=":id" element={<FeedEntriesPage sourceType="category" />} />
|
||||||
@@ -113,6 +115,18 @@ function AppRoutes() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function InitialSetupHandler() {
|
||||||
|
const serverInfos = useAppSelector(state => state.server.serverInfos)
|
||||||
|
const dispatch = useAppDispatch()
|
||||||
|
useEffect(() => {
|
||||||
|
if (serverInfos?.initialSetupRequired) {
|
||||||
|
dispatch(redirectToInitialSetup())
|
||||||
|
}
|
||||||
|
}, [serverInfos, dispatch])
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
function RedirectHandler() {
|
function RedirectHandler() {
|
||||||
const target = useAppSelector(state => state.redirect.to)
|
const target = useAppSelector(state => state.redirect.to)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
@@ -128,26 +142,19 @@ function RedirectHandler() {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
function GoogleAnalyticsHandler() {
|
function UnreadCountTitleHandler({
|
||||||
const location = useLocation()
|
enabled,
|
||||||
const googleAnalyticsCode = useAppSelector(state => state.server.serverInfos?.googleAnalyticsCode)
|
}: Readonly<{
|
||||||
|
enabled?: boolean
|
||||||
useEffect(() => {
|
}>) {
|
||||||
if (googleAnalyticsCode) ReactGA.initialize(googleAnalyticsCode)
|
const root = useAppSelector(state => state.tree.rootCategory)
|
||||||
}, [googleAnalyticsCode])
|
const unreadCount = categoryUnreadCount(root)
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (ReactGA.isInitialized) ReactGA.send({ hitType: "pageview", page: location.pathname })
|
|
||||||
}, [location])
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
function UnreadCountTitleHandler({ unreadCount, enabled }: { unreadCount: number; enabled?: boolean }) {
|
|
||||||
return <title>{enabled && unreadCount > 0 ? `(${unreadCount}) CommaFeed` : "CommaFeed"}</title>
|
return <title>{enabled && unreadCount > 0 ? `(${unreadCount}) CommaFeed` : "CommaFeed"}</title>
|
||||||
}
|
}
|
||||||
|
|
||||||
function UnreadCountFaviconHandler({ unreadCount, enabled }: { unreadCount: number; enabled?: boolean }) {
|
function UnreadCountFaviconHandler({ enabled }: { enabled?: boolean }) {
|
||||||
|
const root = useAppSelector(state => state.tree.rootCategory)
|
||||||
|
const unreadCount = categoryUnreadCount(root)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (enabled && unreadCount > 0) {
|
if (enabled && unreadCount > 0) {
|
||||||
Tinycon.setBubble(unreadCount)
|
Tinycon.setBubble(unreadCount)
|
||||||
@@ -205,38 +212,29 @@ function CustomCssHandler() {
|
|||||||
|
|
||||||
export function App() {
|
export function App() {
|
||||||
useI18n()
|
useI18n()
|
||||||
const root = useAppSelector(state => state.tree.rootCategory)
|
|
||||||
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
|
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
|
||||||
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
|
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
|
||||||
|
const disablePullToRefresh = useAppSelector(state => state.user.settings?.disablePullToRefresh)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
|
|
||||||
const unreadCount = categoryUnreadCount(root)
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch(reloadServerInfos())
|
dispatch(reloadServerInfos())
|
||||||
}, [dispatch])
|
}, [dispatch])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Providers>
|
<Providers>
|
||||||
<>
|
<UnreadCountTitleHandler enabled={unreadCountTitle} />
|
||||||
<UnreadCountTitleHandler unreadCount={unreadCount} enabled={unreadCountTitle} />
|
<UnreadCountFaviconHandler enabled={unreadCountFavicon} />
|
||||||
<UnreadCountFaviconHandler unreadCount={unreadCount} enabled={unreadCountFavicon} />
|
<BrowserExtensionBadgeUnreadCountHandler />
|
||||||
<BrowserExtensionBadgeUnreadCountHandler />
|
<CustomJsHandler />
|
||||||
<CustomJsHandler />
|
<CustomCssHandler />
|
||||||
<CustomCssHandler />
|
<DisablePullToRefresh enabled={disablePullToRefresh} />
|
||||||
|
|
||||||
{/* disable pull-to-refresh as it messes with vertical scrolling
|
<HashRouter>
|
||||||
safari behaves weirdly when overscroll-behavior is set to none so we disable it only for other browsers
|
<InitialSetupHandler />
|
||||||
https://github.com/Athou/commafeed/issues/1168
|
<RedirectHandler />
|
||||||
*/}
|
<AppRoutes />
|
||||||
{!isSafari && <DisablePullToRefresh />}
|
</HashRouter>
|
||||||
|
|
||||||
<HashRouter>
|
|
||||||
<GoogleAnalyticsHandler />
|
|
||||||
<RedirectHandler />
|
|
||||||
<AppRoutes />
|
|
||||||
</HashRouter>
|
|
||||||
</>
|
|
||||||
</Providers>
|
</Providers>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { createAsyncThunk } from "@reduxjs/toolkit"
|
import { createAsyncThunk } from "@reduxjs/toolkit"
|
||||||
import type { AppDispatch, RootState } from "app/store"
|
import type { AppDispatch, RootState } from "@/app/store"
|
||||||
|
|
||||||
export const createAppAsyncThunk = createAsyncThunk.withTypes<{
|
export const createAppAsyncThunk = createAsyncThunk.withTypes<{
|
||||||
state: RootState
|
state: RootState
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import type {
|
|||||||
FeedModificationRequest,
|
FeedModificationRequest,
|
||||||
GetEntriesPaginatedRequest,
|
GetEntriesPaginatedRequest,
|
||||||
IDRequest,
|
IDRequest,
|
||||||
|
InitialSetupRequest,
|
||||||
LoginRequest,
|
LoginRequest,
|
||||||
MarkRequest,
|
MarkRequest,
|
||||||
Metrics,
|
Metrics,
|
||||||
@@ -32,16 +33,17 @@ const axiosInstance = axios.create({ baseURL: "./rest", withCredentials: true })
|
|||||||
axiosInstance.interceptors.response.use(
|
axiosInstance.interceptors.response.use(
|
||||||
response => response,
|
response => response,
|
||||||
error => {
|
error => {
|
||||||
if (isAuthenticationError(error)) {
|
if (isAuthenticationError(error) && window.location.hash !== "#/login") {
|
||||||
const data = error.response?.data
|
const data = error.response?.data
|
||||||
window.location.hash = data?.allowRegistrations ? "/welcome" : "/login"
|
window.location.hash = data?.allowRegistrations ? "/welcome" : "/login"
|
||||||
|
window.location.reload()
|
||||||
}
|
}
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
function isAuthenticationError(error: unknown): error is AxiosError<AuthenticationError> {
|
function isAuthenticationError(error: unknown): error is AxiosError<AuthenticationError> {
|
||||||
return axios.isAxiosError(error) && !!error.response && [401, 403].includes(error.response.status)
|
return axios.isAxiosError(error) && error.response?.status === 401
|
||||||
}
|
}
|
||||||
|
|
||||||
export const client = {
|
export const client = {
|
||||||
@@ -93,6 +95,7 @@ export const client = {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req),
|
register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req),
|
||||||
|
initialSetup: async (req: InitialSetupRequest) => await axiosInstance.post("user/initialSetup", req),
|
||||||
passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req),
|
passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req),
|
||||||
getSettings: async () => await axiosInstance.get<Settings>("user/settings"),
|
getSettings: async () => await axiosInstance.get<Settings>("user/settings"),
|
||||||
saveSettings: async (settings: Settings) => await axiosInstance.post("user/settings", settings),
|
saveSettings: async (settings: Settings) => await axiosInstance.post("user/settings", settings),
|
||||||
@@ -105,7 +108,7 @@ export const client = {
|
|||||||
},
|
},
|
||||||
admin: {
|
admin: {
|
||||||
getAllUsers: async () => await axiosInstance.get<UserModel[]>("admin/user/getAll"),
|
getAllUsers: async () => await axiosInstance.get<UserModel[]>("admin/user/getAll"),
|
||||||
saveUser: async (req: AdminSaveUserRequest) => await axiosInstance.post("admin/user/save", req),
|
saveUser: async (req: AdminSaveUserRequest) => await axiosInstance.post<number>("admin/user/save", req),
|
||||||
deleteUser: async (req: IDRequest) => await axiosInstance.post("admin/user/delete", req),
|
deleteUser: async (req: IDRequest) => await axiosInstance.post("admin/user/delete", req),
|
||||||
getMetrics: async () => await axiosInstance.get<Metrics>("admin/metrics"),
|
getMetrics: async () => await axiosInstance.get<Metrics>("admin/metrics"),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -87,17 +87,15 @@ export const Constants = {
|
|||||||
headerHeight: 60,
|
headerHeight: 60,
|
||||||
entryMaxWidth: 650,
|
entryMaxWidth: 650,
|
||||||
isTopVisible: (div: HTMLElement) => {
|
isTopVisible: (div: HTMLElement) => {
|
||||||
const header = document.getElementById(Constants.dom.headerId)?.getBoundingClientRect()
|
const header = document.getElementsByTagName("header").item(0)?.getBoundingClientRect()
|
||||||
return div.getBoundingClientRect().top >= (header?.bottom ?? 0)
|
return div.getBoundingClientRect().top >= (header?.bottom ?? 0)
|
||||||
},
|
},
|
||||||
isBottomVisible: (div: HTMLElement) => {
|
isBottomVisible: (div: HTMLElement) => {
|
||||||
const footer = document.getElementById(Constants.dom.footerId)?.getBoundingClientRect()
|
const footer = document.getElementsByTagName("footer").item(0)?.getBoundingClientRect()
|
||||||
return div.getBoundingClientRect().bottom <= (footer?.top ?? window.innerHeight)
|
return div.getBoundingClientRect().bottom <= (footer?.top ?? window.innerHeight)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
dom: {
|
dom: {
|
||||||
headerId: "header",
|
|
||||||
footerId: "footer",
|
|
||||||
entryId: (entry: Entry) => `entry-id-${entry.id}`,
|
entryId: (entry: Entry) => `entry-id-${entry.id}`,
|
||||||
entryContextMenuId: (entry: Entry) => entry.id,
|
entryContextMenuId: (entry: Entry) => entry.id,
|
||||||
},
|
},
|
||||||
@@ -108,5 +106,6 @@ export const Constants = {
|
|||||||
delay: 500,
|
delay: 500,
|
||||||
},
|
},
|
||||||
browserExtensionUrl: "https://github.com/Athou/commafeed-browser-extension",
|
browserExtensionUrl: "https://github.com/Athou/commafeed-browser-extension",
|
||||||
|
customCssDocumentationUrl: "https://athou.github.io/commafeed/documentation/custom-css",
|
||||||
bitcoinWalletAddress: "1dymfUxqCWpyD7a6rQSqNy4rLVDBsAr5e",
|
bitcoinWalletAddress: "1dymfUxqCWpyD7a6rQSqNy4rLVDBsAr5e",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { configureStore } from "@reduxjs/toolkit"
|
import { configureStore } from "@reduxjs/toolkit"
|
||||||
import { client } from "app/client"
|
|
||||||
import { loadEntries, loadMoreEntries, markAllEntries, markEntry } from "app/entries/thunks"
|
|
||||||
import { type RootState, reducers } from "app/store"
|
|
||||||
import type { Entries, Entry } from "app/types"
|
|
||||||
import type { AxiosResponse } from "axios"
|
import type { AxiosResponse } from "axios"
|
||||||
import { beforeEach, describe, expect, it, vi } from "vitest"
|
import { beforeEach, describe, expect, it, vi } from "vitest"
|
||||||
|
import { client } from "@/app/client"
|
||||||
|
import { loadEntries, loadMoreEntries, markAllEntries, markEntry } from "@/app/entries/thunks"
|
||||||
|
import { type RootState, reducers } from "@/app/store"
|
||||||
|
import type { Entries, Entry } from "@/app/types"
|
||||||
|
|
||||||
vi.mock(import("app/client"))
|
vi.mock(import("@/app/client"))
|
||||||
|
|
||||||
describe("entries", () => {
|
describe("entries", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -27,7 +27,12 @@ describe("entries", () => {
|
|||||||
} as AxiosResponse<Entries>)
|
} as AxiosResponse<Entries>)
|
||||||
|
|
||||||
const store = configureStore({ reducer: reducers })
|
const store = configureStore({ reducer: reducers })
|
||||||
const promise = store.dispatch(loadEntries({ source: { type: "feed", id: "feed-id" }, clearSearch: true }))
|
const promise = store.dispatch(
|
||||||
|
loadEntries({
|
||||||
|
source: { type: "feed", id: "feed-id" },
|
||||||
|
clearSearch: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
expect(store.getState().entries.source.type).toBe("feed")
|
expect(store.getState().entries.source.type).toBe("feed")
|
||||||
expect(store.getState().entries.source.id).toBe("feed-id")
|
expect(store.getState().entries.source.id).toBe("feed-id")
|
||||||
@@ -130,11 +135,19 @@ describe("entries", () => {
|
|||||||
} as RootState,
|
} as RootState,
|
||||||
})
|
})
|
||||||
|
|
||||||
store.dispatch(markAllEntries({ sourceType: "category", req: { id: "all", read: true } }))
|
store.dispatch(
|
||||||
|
markAllEntries({
|
||||||
|
sourceType: "category",
|
||||||
|
req: { id: "all", read: true },
|
||||||
|
})
|
||||||
|
)
|
||||||
expect(store.getState().entries.entries).toStrictEqual([
|
expect(store.getState().entries.entries).toStrictEqual([
|
||||||
{ id: "3", read: true },
|
{ id: "3", read: true },
|
||||||
{ id: "4", read: true },
|
{ id: "4", read: true },
|
||||||
])
|
])
|
||||||
expect(client.category.markEntries).toHaveBeenCalledWith({ id: "all", read: true })
|
expect(client.category.markEntries).toHaveBeenCalledWith({
|
||||||
|
id: "all",
|
||||||
|
read: true,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { type PayloadAction, createSlice } from "@reduxjs/toolkit"
|
import { createSlice, type PayloadAction } from "@reduxjs/toolkit"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
import { loadEntries, loadMoreEntries, markAllEntries, markEntry, markMultipleEntries, starEntry, tagEntry } from "app/entries/thunks"
|
import { loadEntries, loadMoreEntries, markAllEntries, markEntry, markMultipleEntries, starEntry, tagEntry } from "@/app/entries/thunks"
|
||||||
import type { Entry } from "app/types"
|
import type { Entry } from "@/app/types"
|
||||||
|
|
||||||
export type EntrySourceType = "category" | "feed" | "tag"
|
export type EntrySourceType = "category" | "feed" | "tag"
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
import { createAppAsyncThunk } from "app/async-thunk"
|
|
||||||
import { client } from "app/client"
|
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { type EntrySource, type EntrySourceType, entriesSlice, setMarkAllAsReadConfirmationDialogOpen, setSearch } from "app/entries/slice"
|
|
||||||
import type { RootState } from "app/store"
|
|
||||||
import { reloadTree } from "app/tree/thunks"
|
|
||||||
import type { Entry, MarkRequest, TagRequest } from "app/types"
|
|
||||||
import { reloadTags } from "app/user/thunks"
|
|
||||||
import { scrollToWithCallback } from "app/utils"
|
|
||||||
import { flushSync } from "react-dom"
|
import { flushSync } from "react-dom"
|
||||||
|
import { createAppAsyncThunk } from "@/app/async-thunk"
|
||||||
|
import { client } from "@/app/client"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import {
|
||||||
|
type EntrySource,
|
||||||
|
type EntrySourceType,
|
||||||
|
entriesSlice,
|
||||||
|
setMarkAllAsReadConfirmationDialogOpen,
|
||||||
|
setSearch,
|
||||||
|
} from "@/app/entries/slice"
|
||||||
|
import type { RootState } from "@/app/store"
|
||||||
|
import { reloadTree, selectNextUnreadTreeItem } from "@/app/tree/thunks"
|
||||||
|
import type { Entry, MarkRequest, TagRequest } from "@/app/types"
|
||||||
|
import { reloadTags } from "@/app/user/thunks"
|
||||||
|
import { scrollToWithCallback } from "@/app/utils"
|
||||||
|
|
||||||
const getEndpoint = (sourceType: EntrySourceType) =>
|
const getEndpoint = (sourceType: EntrySourceType) =>
|
||||||
sourceType === "category" || sourceType === "tag" ? client.category.getEntries : client.feed.getEntries
|
sourceType === "category" || sourceType === "tag" ? client.category.getEntries : client.feed.getEntries
|
||||||
@@ -130,11 +136,12 @@ export const markAllAsReadWithConfirmationIfRequired = createAppAsyncThunk(
|
|||||||
const source = state.entries.source
|
const source = state.entries.source
|
||||||
const entriesTimestamp = state.entries.timestamp ?? Date.now()
|
const entriesTimestamp = state.entries.timestamp ?? Date.now()
|
||||||
const markAllAsReadConfirmation = state.user.settings?.markAllAsReadConfirmation
|
const markAllAsReadConfirmation = state.user.settings?.markAllAsReadConfirmation
|
||||||
|
const markAllAsReadNavigateToNextUnread = state.user.settings?.markAllAsReadNavigateToNextUnread
|
||||||
|
|
||||||
if (markAllAsReadConfirmation) {
|
if (markAllAsReadConfirmation) {
|
||||||
thunkApi.dispatch(setMarkAllAsReadConfirmationDialogOpen(true))
|
thunkApi.dispatch(setMarkAllAsReadConfirmationDialogOpen(true))
|
||||||
} else {
|
} else {
|
||||||
thunkApi.dispatch(
|
await thunkApi.dispatch(
|
||||||
markAllEntries({
|
markAllEntries({
|
||||||
sourceType: source.type,
|
sourceType: source.type,
|
||||||
req: {
|
req: {
|
||||||
@@ -145,6 +152,9 @@ export const markAllAsReadWithConfirmationIfRequired = createAppAsyncThunk(
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
const isAllCategorySelected = source.type === "category" && source.id === Constants.categories.all.id
|
||||||
|
if (markAllAsReadNavigateToNextUnread && !isAllCategorySelected)
|
||||||
|
await thunkApi.dispatch(selectNextUnreadTreeItem({ direction: "forward" }))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -230,7 +240,7 @@ export const selectEntry = createAppAsyncThunk(
|
|||||||
)
|
)
|
||||||
|
|
||||||
const scrollToEntry = (entryElement: HTMLElement, margin: number, scrollSpeed: number | undefined, onScrollEnded: () => void) => {
|
const scrollToEntry = (entryElement: HTMLElement, margin: number, scrollSpeed: number | undefined, onScrollEnded: () => void) => {
|
||||||
const header = document.getElementById(Constants.dom.headerId)?.getBoundingClientRect()
|
const header = document.getElementsByTagName("header").item(0)?.getBoundingClientRect()
|
||||||
const offset = (header?.bottom ?? 0) + margin
|
const offset = (header?.bottom ?? 0) + margin
|
||||||
scrollToWithCallback({
|
scrollToWithCallback({
|
||||||
options: {
|
options: {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { redirectToCategory } from "app/redirect/thunks"
|
|
||||||
import { store } from "app/store"
|
|
||||||
import { describe, expect, it } from "vitest"
|
import { describe, expect, it } from "vitest"
|
||||||
|
import { redirectToCategory } from "@/app/redirect/thunks"
|
||||||
|
import { store } from "@/app/store"
|
||||||
|
|
||||||
describe("redirects", () => {
|
describe("redirects", () => {
|
||||||
it("redirects to category", async () => {
|
it("redirects to category", async () => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { type PayloadAction, createSlice } from "@reduxjs/toolkit"
|
import { createSlice, type PayloadAction } from "@reduxjs/toolkit"
|
||||||
|
|
||||||
interface RedirectState {
|
interface RedirectState {
|
||||||
to?: string
|
to?: string
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
import { createAppAsyncThunk } from "app/async-thunk"
|
import { createAppAsyncThunk } from "@/app/async-thunk"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
import { redirectTo } from "app/redirect/slice"
|
import { redirectTo } from "@/app/redirect/slice"
|
||||||
|
|
||||||
export const redirectToLogin = createAppAsyncThunk("redirect/login", (_, thunkApi) => thunkApi.dispatch(redirectTo("/login")))
|
export const redirectToLogin = createAppAsyncThunk("redirect/login", (_, thunkApi) => thunkApi.dispatch(redirectTo("/login")))
|
||||||
|
|
||||||
export const redirectToRegistration = createAppAsyncThunk("redirect/register", (_, thunkApi) => thunkApi.dispatch(redirectTo("/register")))
|
export const redirectToRegistration = createAppAsyncThunk("redirect/register", (_, thunkApi) => thunkApi.dispatch(redirectTo("/register")))
|
||||||
|
|
||||||
export const redirectToApiDocumentation = createAppAsyncThunk("redirect/api", (_, thunkApi) => thunkApi.dispatch(redirectTo("/api")))
|
export const redirectToInitialSetup = createAppAsyncThunk("redirect/initialSetup", (_, thunkApi) => thunkApi.dispatch(redirectTo("/setup")))
|
||||||
|
|
||||||
|
export const redirectToApiDocumentation = createAppAsyncThunk("redirect/api", () => {
|
||||||
|
window.location.href = "api-documentation/"
|
||||||
|
})
|
||||||
|
|
||||||
export const redirectToSelectedSource = createAppAsyncThunk("redirect/selectedSource", (_, thunkApi) => {
|
export const redirectToSelectedSource = createAppAsyncThunk("redirect/selectedSource", (_, thunkApi) => {
|
||||||
const { source } = thunkApi.getState().entries
|
const { source } = thunkApi.getState().entries
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { type PayloadAction, createSlice } from "@reduxjs/toolkit"
|
import { createSlice, type PayloadAction } from "@reduxjs/toolkit"
|
||||||
import { reloadServerInfos } from "app/server/thunks"
|
import { reloadServerInfos } from "@/app/server/thunks"
|
||||||
import type { ServerInfo } from "app/types"
|
import type { ServerInfo } from "@/app/types"
|
||||||
|
|
||||||
interface ServerState {
|
interface ServerState {
|
||||||
serverInfos?: ServerInfo
|
serverInfos?: ServerInfo
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { createAppAsyncThunk } from "app/async-thunk"
|
import { createAppAsyncThunk } from "@/app/async-thunk"
|
||||||
import { client } from "app/client"
|
import { client } from "@/app/client"
|
||||||
|
|
||||||
export const reloadServerInfos = createAppAsyncThunk("server/infos", async () => await client.server.getServerInfos().then(r => r.data))
|
export const reloadServerInfos = createAppAsyncThunk("server/infos", async () => await client.server.getServerInfos().then(r => r.data))
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { configureStore } from "@reduxjs/toolkit"
|
import { configureStore } from "@reduxjs/toolkit"
|
||||||
import { entriesSlice } from "app/entries/slice"
|
|
||||||
import { redirectSlice } from "app/redirect/slice"
|
|
||||||
import { serverSlice } from "app/server/slice"
|
|
||||||
import { treeSlice } from "app/tree/slice"
|
|
||||||
import type { LocalSettings } from "app/types"
|
|
||||||
import { initialLocalSettings, userSlice } from "app/user/slice"
|
|
||||||
import { type TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"
|
import { type TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"
|
||||||
|
import { entriesSlice } from "@/app/entries/slice"
|
||||||
|
import { redirectSlice } from "@/app/redirect/slice"
|
||||||
|
import { serverSlice } from "@/app/server/slice"
|
||||||
|
import { treeSlice } from "@/app/tree/slice"
|
||||||
|
import type { LocalSettings } from "@/app/types"
|
||||||
|
import { initialLocalSettings, userSlice } from "@/app/user/slice"
|
||||||
|
|
||||||
export const reducers = {
|
export const reducers = {
|
||||||
entries: entriesSlice.reducer,
|
entries: entriesSlice.reducer,
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
import { type PayloadAction, createSlice } from "@reduxjs/toolkit"
|
import { createSlice, type PayloadAction } from "@reduxjs/toolkit"
|
||||||
import { markEntry } from "app/entries/thunks"
|
import { loadEntries, markEntry } from "@/app/entries/thunks"
|
||||||
import { redirectTo } from "app/redirect/slice"
|
import { redirectTo } from "@/app/redirect/slice"
|
||||||
import { collapseTreeCategory, reloadTree } from "app/tree/thunks"
|
import { collapseTreeCategory, reloadTree } from "@/app/tree/thunks"
|
||||||
import type { Category } from "app/types"
|
import type { Category, Subscription } from "@/app/types"
|
||||||
import { visitCategoryTree } from "app/utils"
|
import { flattenCategoryTree, visitCategoryTree } from "@/app/utils"
|
||||||
|
|
||||||
|
export interface TreeSubscription extends Subscription {
|
||||||
|
// client-side only flag
|
||||||
|
hasNewEntries?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TreeCategory extends Category {
|
||||||
|
feeds: TreeSubscription[]
|
||||||
|
children: TreeCategory[]
|
||||||
|
}
|
||||||
|
|
||||||
interface TreeState {
|
interface TreeState {
|
||||||
rootCategory?: Category
|
rootCategory?: TreeCategory
|
||||||
mobileMenuOpen: boolean
|
mobileMenuOpen: boolean
|
||||||
sidebarVisible: boolean
|
sidebarVisible: boolean
|
||||||
}
|
}
|
||||||
@@ -37,12 +47,27 @@ export const treeSlice = createSlice({
|
|||||||
visitCategoryTree(state.rootCategory, c => {
|
visitCategoryTree(state.rootCategory, c => {
|
||||||
for (const f of c.feeds.filter(f => f.id === action.payload.feedId)) {
|
for (const f of c.feeds.filter(f => f.id === action.payload.feedId)) {
|
||||||
f.unread += action.payload.amount
|
f.unread += action.payload.amount
|
||||||
|
f.hasNewEntries = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
extraReducers: builder => {
|
extraReducers: builder => {
|
||||||
builder.addCase(reloadTree.fulfilled, (state, action) => {
|
builder.addCase(reloadTree.fulfilled, (state, action) => {
|
||||||
|
// set hasNewEntries to true if new unread > previous unread
|
||||||
|
if (state.rootCategory) {
|
||||||
|
const oldFeeds = flattenCategoryTree(state.rootCategory).flatMap(c => c.feeds)
|
||||||
|
const oldFeedsById = new Map(oldFeeds.map(f => [f.id, f]))
|
||||||
|
|
||||||
|
const newFeeds = flattenCategoryTree(action.payload).flatMap(c => c.feeds)
|
||||||
|
for (const newFeed of newFeeds) {
|
||||||
|
const oldFeed = oldFeedsById.get(newFeed.id)
|
||||||
|
if (oldFeed && newFeed.unread > oldFeed.unread) {
|
||||||
|
newFeed.hasNewEntries = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
state.rootCategory = action.payload
|
state.rootCategory = action.payload
|
||||||
})
|
})
|
||||||
builder.addCase(collapseTreeCategory.pending, (state, action) => {
|
builder.addCase(collapseTreeCategory.pending, (state, action) => {
|
||||||
@@ -59,6 +84,25 @@ export const treeSlice = createSlice({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
builder.addCase(loadEntries.fulfilled, (state, action) => {
|
||||||
|
if (!state.rootCategory) return
|
||||||
|
|
||||||
|
const { source } = action.meta.arg
|
||||||
|
if (source.type === "category") {
|
||||||
|
visitCategoryTree(state.rootCategory, c => {
|
||||||
|
if (c.id === source.id) {
|
||||||
|
for (const f of flattenCategoryTree(c).flatMap(c => c.feeds)) {
|
||||||
|
f.hasNewEntries = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else if (source.type === "feed") {
|
||||||
|
const feeds = flattenCategoryTree(state.rootCategory).flatMap(c => c.feeds)
|
||||||
|
for (const f of feeds.filter(f => f.id === +source.id)) {
|
||||||
|
f.hasNewEntries = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
builder.addCase(redirectTo, state => {
|
builder.addCase(redirectTo, state => {
|
||||||
state.mobileMenuOpen = false
|
state.mobileMenuOpen = false
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { createAppAsyncThunk } from "app/async-thunk"
|
import { createAppAsyncThunk } from "@/app/async-thunk"
|
||||||
import { client } from "app/client"
|
import { client } from "@/app/client"
|
||||||
import { redirectToCategory, redirectToFeed } from "app/redirect/thunks"
|
import { Constants } from "@/app/constants"
|
||||||
import { incrementUnreadCount } from "app/tree/slice"
|
import { redirectToCategory, redirectToFeed } from "@/app/redirect/thunks"
|
||||||
import type { CollapseRequest, Subscription } from "app/types"
|
import { incrementUnreadCount } from "@/app/tree/slice"
|
||||||
import { flattenCategoryTree, visitCategoryTree } from "app/utils"
|
import type { CollapseRequest, Subscription } from "@/app/types"
|
||||||
|
import { flattenCategoryTree, visitCategoryTree } from "@/app/utils"
|
||||||
|
|
||||||
export const reloadTree = createAppAsyncThunk("tree/reload", async () => await client.category.getRoot().then(r => r.data))
|
export const reloadTree = createAppAsyncThunk("tree/reload", async () => await client.category.getRoot().then(r => r.data))
|
||||||
|
|
||||||
@@ -53,6 +54,9 @@ export const selectNextUnreadTreeItem = createAppAsyncThunk(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// redirect to 'all' if no unread categories or feeds found or if we reached the end of the list
|
||||||
|
thunkApi.dispatch(redirectToCategory(Constants.categories.all.id))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
import { configureStore } from "@reduxjs/toolkit"
|
import { configureStore } from "@reduxjs/toolkit"
|
||||||
import { type RootState, reducers } from "app/store"
|
import type { AxiosResponse } from "axios"
|
||||||
import { selectNextUnreadTreeItem } from "app/tree/thunks"
|
import { beforeEach, describe, expect, it, vi } from "vitest"
|
||||||
import type { Category, Subscription } from "app/types"
|
import { client } from "@/app/client"
|
||||||
import { describe, expect, it } from "vitest"
|
import { loadEntries } from "@/app/entries/thunks"
|
||||||
|
import { type RootState, reducers } from "@/app/store"
|
||||||
|
import { newFeedEntriesDiscovered, selectNextUnreadTreeItem } from "@/app/tree/thunks"
|
||||||
|
import type { Category, Entries, Entry, Subscription } from "@/app/types"
|
||||||
|
|
||||||
|
vi.mock(import("@/app/client"))
|
||||||
|
|
||||||
const createCategory = (id: string): Category => ({
|
const createCategory = (id: string): Category => ({
|
||||||
id,
|
id,
|
||||||
@@ -117,3 +122,51 @@ describe("selectNextUnreadTreeItem", () => {
|
|||||||
expect(store.getState().redirect.to).toBe("/app/feed/3")
|
expect(store.getState().redirect.to).toBe("/app/feed/3")
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("hasNewEntries", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.resetAllMocks()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("sets and clear flag for a feed", async () => {
|
||||||
|
vi.mocked(client.feed.getEntries).mockResolvedValue({
|
||||||
|
data: {
|
||||||
|
entries: [{ id: "3" } as Entry],
|
||||||
|
hasMore: false,
|
||||||
|
name: "my-feed",
|
||||||
|
errorCount: 3,
|
||||||
|
feedLink: "https://mysite.com/feed",
|
||||||
|
timestamp: 123,
|
||||||
|
ignoredReadStatus: false,
|
||||||
|
},
|
||||||
|
} as AxiosResponse<Entries>)
|
||||||
|
|
||||||
|
const store = configureStore({
|
||||||
|
reducer: reducers,
|
||||||
|
preloadedState: {
|
||||||
|
tree: {
|
||||||
|
rootCategory: root,
|
||||||
|
},
|
||||||
|
entries: {
|
||||||
|
source: {
|
||||||
|
type: "feed",
|
||||||
|
id: "1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as RootState,
|
||||||
|
})
|
||||||
|
|
||||||
|
// initial state
|
||||||
|
expect(store.getState().tree.rootCategory?.children[0].feeds[0].unread).toBe(0)
|
||||||
|
expect(store.getState().tree.rootCategory?.children[0].feeds[0].hasNewEntries).toBeFalsy()
|
||||||
|
|
||||||
|
// increments unread count and sets hasNewEntries to true
|
||||||
|
await store.dispatch(newFeedEntriesDiscovered({ feedId: 1, amount: 3 }))
|
||||||
|
expect(store.getState().tree.rootCategory?.children[0].feeds[0].unread).toBe(3)
|
||||||
|
expect(store.getState().tree.rootCategory?.children[0].feeds[0].hasNewEntries).toBe(true)
|
||||||
|
|
||||||
|
// reload entries and sets hasNewEntries to false
|
||||||
|
await store.dispatch(loadEntries({ source: { type: "feed", id: "1" }, clearSearch: true }))
|
||||||
|
expect(store.getState().tree.rootCategory?.children[0].feeds[0].hasNewEntries).toBe(false)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|||||||
@@ -209,18 +209,25 @@ export interface RegistrationRequest {
|
|||||||
email: string
|
email: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface InitialSetupRequest {
|
||||||
|
name: string
|
||||||
|
password: string
|
||||||
|
email?: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface ServerInfo {
|
export interface ServerInfo {
|
||||||
announcement?: string
|
announcement?: string
|
||||||
version: string
|
version: string
|
||||||
gitCommit: string
|
gitCommit: string
|
||||||
allowRegistrations: boolean
|
allowRegistrations: boolean
|
||||||
googleAnalyticsCode?: string
|
emailAddressRequired: boolean
|
||||||
smtpEnabled: boolean
|
smtpEnabled: boolean
|
||||||
demoAccountEnabled: boolean
|
demoAccountEnabled: boolean
|
||||||
websocketEnabled: boolean
|
websocketEnabled: boolean
|
||||||
websocketPingInterval: number
|
websocketPingInterval: number
|
||||||
treeReloadInterval: number
|
treeReloadInterval: number
|
||||||
forceRefreshCooldownDuration: number
|
forceRefreshCooldownDuration: number
|
||||||
|
initialSetupRequired: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SharingSettings {
|
export interface SharingSettings {
|
||||||
@@ -248,10 +255,12 @@ export interface Settings {
|
|||||||
starIconDisplayMode: IconDisplayMode
|
starIconDisplayMode: IconDisplayMode
|
||||||
externalLinkIconDisplayMode: IconDisplayMode
|
externalLinkIconDisplayMode: IconDisplayMode
|
||||||
markAllAsReadConfirmation: boolean
|
markAllAsReadConfirmation: boolean
|
||||||
|
markAllAsReadNavigateToNextUnread: boolean
|
||||||
customContextMenu: boolean
|
customContextMenu: boolean
|
||||||
mobileFooter: boolean
|
mobileFooter: boolean
|
||||||
unreadCountTitle: boolean
|
unreadCountTitle: boolean
|
||||||
unreadCountFavicon: boolean
|
unreadCountFavicon: boolean
|
||||||
|
disablePullToRefresh: boolean
|
||||||
primaryColor?: string
|
primaryColor?: string
|
||||||
sharingSettings: SharingSettings
|
sharingSettings: SharingSettings
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
import { t } from "@lingui/core/macro"
|
import { t } from "@lingui/core/macro"
|
||||||
import { showNotification } from "@mantine/notifications"
|
import { showNotification } from "@mantine/notifications"
|
||||||
import { type PayloadAction, createSlice, isAnyOf } from "@reduxjs/toolkit"
|
import { createSlice, isAnyOf, type PayloadAction } from "@reduxjs/toolkit"
|
||||||
import type { LocalSettings, Settings, UserModel, ViewMode } from "app/types"
|
import type { LocalSettings, Settings, UserModel, ViewMode } from "@/app/types"
|
||||||
import {
|
import {
|
||||||
changeCustomContextMenu,
|
changeCustomContextMenu,
|
||||||
|
changeDisablePullToRefresh,
|
||||||
changeEntriesToKeepOnTopWhenScrolling,
|
changeEntriesToKeepOnTopWhenScrolling,
|
||||||
changeExternalLinkIconDisplayMode,
|
changeExternalLinkIconDisplayMode,
|
||||||
changeLanguage,
|
changeLanguage,
|
||||||
changeMarkAllAsReadConfirmation,
|
changeMarkAllAsReadConfirmation,
|
||||||
|
changeMarkAllAsReadNavigateToUnread,
|
||||||
changeMobileFooter,
|
changeMobileFooter,
|
||||||
changePrimaryColor,
|
changePrimaryColor,
|
||||||
changeReadingMode,
|
changeReadingMode,
|
||||||
@@ -114,6 +116,10 @@ export const userSlice = createSlice({
|
|||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.markAllAsReadConfirmation = action.meta.arg
|
state.settings.markAllAsReadConfirmation = action.meta.arg
|
||||||
})
|
})
|
||||||
|
builder.addCase(changeMarkAllAsReadNavigateToUnread.pending, (state, action) => {
|
||||||
|
if (!state.settings) return
|
||||||
|
state.settings.markAllAsReadNavigateToNextUnread = action.meta.arg
|
||||||
|
})
|
||||||
builder.addCase(changeCustomContextMenu.pending, (state, action) => {
|
builder.addCase(changeCustomContextMenu.pending, (state, action) => {
|
||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.customContextMenu = action.meta.arg
|
state.settings.customContextMenu = action.meta.arg
|
||||||
@@ -130,6 +136,10 @@ export const userSlice = createSlice({
|
|||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.unreadCountFavicon = action.meta.arg
|
state.settings.unreadCountFavicon = action.meta.arg
|
||||||
})
|
})
|
||||||
|
builder.addCase(changeDisablePullToRefresh.pending, (state, action) => {
|
||||||
|
if (!state.settings) return
|
||||||
|
state.settings.disablePullToRefresh = action.meta.arg
|
||||||
|
})
|
||||||
builder.addCase(changePrimaryColor.pending, (state, action) => {
|
builder.addCase(changePrimaryColor.pending, (state, action) => {
|
||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.primaryColor = action.meta.arg
|
state.settings.primaryColor = action.meta.arg
|
||||||
@@ -138,6 +148,7 @@ export const userSlice = createSlice({
|
|||||||
if (!state.settings) return
|
if (!state.settings) return
|
||||||
state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value
|
state.settings.sharingSettings[action.meta.arg.site] = action.meta.arg.value
|
||||||
})
|
})
|
||||||
|
|
||||||
builder.addMatcher(
|
builder.addMatcher(
|
||||||
isAnyOf(
|
isAnyOf(
|
||||||
changeLanguage.fulfilled,
|
changeLanguage.fulfilled,
|
||||||
@@ -149,10 +160,12 @@ export const userSlice = createSlice({
|
|||||||
changeStarIconDisplayMode.fulfilled,
|
changeStarIconDisplayMode.fulfilled,
|
||||||
changeExternalLinkIconDisplayMode.fulfilled,
|
changeExternalLinkIconDisplayMode.fulfilled,
|
||||||
changeMarkAllAsReadConfirmation.fulfilled,
|
changeMarkAllAsReadConfirmation.fulfilled,
|
||||||
|
changeMarkAllAsReadNavigateToUnread.fulfilled,
|
||||||
changeCustomContextMenu.fulfilled,
|
changeCustomContextMenu.fulfilled,
|
||||||
changeMobileFooter.fulfilled,
|
changeMobileFooter.fulfilled,
|
||||||
changeUnreadCountTitle.fulfilled,
|
changeUnreadCountTitle.fulfilled,
|
||||||
changeUnreadCountFavicon.fulfilled,
|
changeUnreadCountFavicon.fulfilled,
|
||||||
|
changeDisablePullToRefresh.fulfilled,
|
||||||
changePrimaryColor.fulfilled,
|
changePrimaryColor.fulfilled,
|
||||||
changeSharingSetting.fulfilled
|
changeSharingSetting.fulfilled
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { createAppAsyncThunk } from "app/async-thunk"
|
import { createAppAsyncThunk } from "@/app/async-thunk"
|
||||||
import { client } from "app/client"
|
import { client } from "@/app/client"
|
||||||
import { reloadEntries } from "app/entries/thunks"
|
import { reloadEntries } from "@/app/entries/thunks"
|
||||||
import type { IconDisplayMode, ReadingMode, ReadingOrder, ScrollMode, SharingSettings } from "app/types"
|
import type { IconDisplayMode, ReadingMode, ReadingOrder, ScrollMode, SharingSettings } from "@/app/types"
|
||||||
|
|
||||||
export const reloadSettings = createAppAsyncThunk("settings/reload", async () => await client.user.getSettings().then(r => r.data))
|
export const reloadSettings = createAppAsyncThunk("settings/reload", async () => await client.user.getSettings().then(r => r.data))
|
||||||
|
|
||||||
@@ -89,6 +89,15 @@ export const changeMarkAllAsReadConfirmation = createAppAsyncThunk(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
export const changeMarkAllAsReadNavigateToUnread = createAppAsyncThunk(
|
||||||
|
"settings/markAllAsReadNavigateToUnread",
|
||||||
|
(markAllAsReadNavigateToNextUnread: boolean, thunkApi) => {
|
||||||
|
const { settings } = thunkApi.getState().user
|
||||||
|
if (!settings) return
|
||||||
|
client.user.saveSettings({ ...settings, markAllAsReadNavigateToNextUnread })
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
export const changeCustomContextMenu = createAppAsyncThunk("settings/customContextMenu", (customContextMenu: boolean, thunkApi) => {
|
export const changeCustomContextMenu = createAppAsyncThunk("settings/customContextMenu", (customContextMenu: boolean, thunkApi) => {
|
||||||
const { settings } = thunkApi.getState().user
|
const { settings } = thunkApi.getState().user
|
||||||
if (!settings) return
|
if (!settings) return
|
||||||
@@ -113,6 +122,15 @@ export const changeUnreadCountFavicon = createAppAsyncThunk("settings/unreadCoun
|
|||||||
client.user.saveSettings({ ...settings, unreadCountFavicon })
|
client.user.saveSettings({ ...settings, unreadCountFavicon })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
export const changeDisablePullToRefresh = createAppAsyncThunk(
|
||||||
|
"settings/disablePullToRefresh",
|
||||||
|
(disablePullToRefresh: boolean, thunkApi) => {
|
||||||
|
const { settings } = thunkApi.getState().user
|
||||||
|
if (!settings) return
|
||||||
|
client.user.saveSettings({ ...settings, disablePullToRefresh })
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
export const changePrimaryColor = createAppAsyncThunk("settings/primaryColor", (primaryColor: string, thunkApi) => {
|
export const changePrimaryColor = createAppAsyncThunk("settings/primaryColor", (primaryColor: string, thunkApi) => {
|
||||||
const { settings } = thunkApi.getState().user
|
const { settings } = thunkApi.getState().user
|
||||||
if (!settings) return
|
if (!settings) return
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { throttle } from "throttle-debounce"
|
import { throttle } from "throttle-debounce"
|
||||||
|
import type { TreeCategory } from "@/app/tree/slice"
|
||||||
import type { Category } from "./types"
|
import type { Category } from "./types"
|
||||||
|
|
||||||
export function visitCategoryTree(
|
export function visitCategoryTree(
|
||||||
category: Category,
|
category: TreeCategory,
|
||||||
visitor: (category: Category) => void,
|
visitor: (category: TreeCategory) => void,
|
||||||
options?: {
|
options?: {
|
||||||
childrenFirst?: boolean
|
childrenFirst?: boolean
|
||||||
}
|
}
|
||||||
@@ -19,13 +20,13 @@ export function visitCategoryTree(
|
|||||||
if (childrenFirst) visitor(category)
|
if (childrenFirst) visitor(category)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function flattenCategoryTree(category: Category): Category[] {
|
export function flattenCategoryTree(category: TreeCategory): TreeCategory[] {
|
||||||
const categories: Category[] = []
|
const categories: Category[] = []
|
||||||
visitCategoryTree(category, c => categories.push(c))
|
visitCategoryTree(category, c => categories.push(c))
|
||||||
return categories
|
return categories
|
||||||
}
|
}
|
||||||
|
|
||||||
export function categoryUnreadCount(category?: Category): number {
|
export function categoryUnreadCount(category?: TreeCategory): number {
|
||||||
if (!category) return 0
|
if (!category) return 0
|
||||||
|
|
||||||
return flattenCategoryTree(category)
|
return flattenCategoryTree(category)
|
||||||
@@ -34,6 +35,14 @@ export function categoryUnreadCount(category?: Category): number {
|
|||||||
.reduce((total, current) => total + current, 0)
|
.reduce((total, current) => total + current, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function categoryHasNewEntries(category?: TreeCategory): boolean {
|
||||||
|
if (!category) return false
|
||||||
|
|
||||||
|
return flattenCategoryTree(category)
|
||||||
|
.flatMap(c => c.feeds)
|
||||||
|
.some(f => f.hasNewEntries)
|
||||||
|
}
|
||||||
|
|
||||||
export const calculatePlaceholderSize = ({ width, height, maxWidth }: { width?: number; height?: number; maxWidth: number }) => {
|
export const calculatePlaceholderSize = ({ width, height, maxWidth }: { width?: number; height?: number; maxWidth: number }) => {
|
||||||
const placeholderWidth = width && Math.min(width, maxWidth)
|
const placeholderWidth = width && Math.min(width, maxWidth)
|
||||||
const placeholderHeight = height && width && width > maxWidth ? height * (maxWidth / width) : height
|
const placeholderHeight = height && width && width > maxWidth ? height * (maxWidth / width) : height
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import type { I18nContext } from "@lingui/react"
|
import type { I18nContext } from "@lingui/react"
|
||||||
import { MantineProvider } from "@mantine/core"
|
import { MantineProvider } from "@mantine/core"
|
||||||
import { fireEvent, render, screen, waitFor } from "@testing-library/react"
|
import { fireEvent, render, screen, waitFor } from "@testing-library/react"
|
||||||
import { useActionButton } from "hooks/useActionButton"
|
|
||||||
import { describe, expect, it, vi } from "vitest"
|
import { describe, expect, it, vi } from "vitest"
|
||||||
|
import { useActionButton } from "@/hooks/useActionButton"
|
||||||
import { ActionButton } from "./ActionButton"
|
import { ActionButton } from "./ActionButton"
|
||||||
|
|
||||||
vi.mock(import("@lingui/react"), () => ({
|
vi.mock(import("@lingui/react"), () => ({
|
||||||
@@ -10,7 +10,7 @@ vi.mock(import("@lingui/react"), () => ({
|
|||||||
_: msg => msg,
|
_: msg => msg,
|
||||||
} as I18nContext),
|
} as I18nContext),
|
||||||
}))
|
}))
|
||||||
vi.mock(import("hooks/useActionButton"))
|
vi.mock(import("@/hooks/useActionButton"))
|
||||||
|
|
||||||
const label = "Test Label"
|
const label = "Test Label"
|
||||||
const icon = "Test Icon"
|
const icon = "Test Icon"
|
||||||
@@ -18,7 +18,9 @@ describe("ActionButton", () => {
|
|||||||
it("renders Button with label on desktop", () => {
|
it("renders Button with label on desktop", () => {
|
||||||
vi.mocked(useActionButton).mockReturnValue({ mobile: false, spacing: 0 })
|
vi.mocked(useActionButton).mockReturnValue({ mobile: false, spacing: 0 })
|
||||||
|
|
||||||
render(<ActionButton label={label} icon={icon} />, { wrapper: MantineProvider })
|
render(<ActionButton label={label} icon={icon} />, {
|
||||||
|
wrapper: MantineProvider,
|
||||||
|
})
|
||||||
expect(screen.getByText(label)).toBeInTheDocument()
|
expect(screen.getByText(label)).toBeInTheDocument()
|
||||||
expect(screen.getByText(icon)).toBeInTheDocument()
|
expect(screen.getByText(icon)).toBeInTheDocument()
|
||||||
})
|
})
|
||||||
@@ -26,7 +28,9 @@ describe("ActionButton", () => {
|
|||||||
it("renders ActionIcon with tooltip on mobile", async () => {
|
it("renders ActionIcon with tooltip on mobile", async () => {
|
||||||
vi.mocked(useActionButton).mockReturnValue({ mobile: true, spacing: 0 })
|
vi.mocked(useActionButton).mockReturnValue({ mobile: true, spacing: 0 })
|
||||||
|
|
||||||
render(<ActionButton label={label} icon={icon} />, { wrapper: MantineProvider })
|
render(<ActionButton label={label} icon={icon} />, {
|
||||||
|
wrapper: MantineProvider,
|
||||||
|
})
|
||||||
expect(screen.queryByText(label)).not.toBeInTheDocument()
|
expect(screen.queryByText(label)).not.toBeInTheDocument()
|
||||||
expect(screen.getByText(icon)).toBeInTheDocument()
|
expect(screen.getByText(icon)).toBeInTheDocument()
|
||||||
|
|
||||||
@@ -39,7 +43,9 @@ describe("ActionButton", () => {
|
|||||||
vi.mocked(useActionButton).mockReturnValue({ mobile: false, spacing: 0 })
|
vi.mocked(useActionButton).mockReturnValue({ mobile: false, spacing: 0 })
|
||||||
const clickListener = vi.fn()
|
const clickListener = vi.fn()
|
||||||
|
|
||||||
render(<ActionButton label={label} icon={icon} onClick={clickListener} />, { wrapper: MantineProvider })
|
render(<ActionButton label={label} icon={icon} onClick={clickListener} />, {
|
||||||
|
wrapper: MantineProvider,
|
||||||
|
})
|
||||||
fireEvent.click(screen.getByRole("button"))
|
fireEvent.click(screen.getByRole("button"))
|
||||||
|
|
||||||
expect(clickListener).toHaveBeenCalled()
|
expect(clickListener).toHaveBeenCalled()
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import type { MessageDescriptor } from "@lingui/core"
|
|||||||
import { useLingui } from "@lingui/react"
|
import { useLingui } from "@lingui/react"
|
||||||
import { ActionIcon, Box, Button, type ButtonVariant, Tooltip, useMantineTheme } from "@mantine/core"
|
import { ActionIcon, Box, Button, type ButtonVariant, Tooltip, useMantineTheme } from "@mantine/core"
|
||||||
import type { ActionIconVariant } from "@mantine/core/lib/components/ActionIcon/ActionIcon"
|
import type { ActionIconVariant } from "@mantine/core/lib/components/ActionIcon/ActionIcon"
|
||||||
import { Constants } from "app/constants"
|
import { forwardRef, type MouseEventHandler, type ReactNode } from "react"
|
||||||
import { useActionButton } from "hooks/useActionButton"
|
import { Constants } from "@/app/constants"
|
||||||
import { type MouseEventHandler, type ReactNode, forwardRef } from "react"
|
import { useActionButton } from "@/hooks/useActionButton"
|
||||||
|
|
||||||
interface ActionButtonProps {
|
interface ActionButtonProps {
|
||||||
icon: ReactNode
|
icon: ReactNode
|
||||||
@@ -29,7 +29,7 @@ export const ActionButton = forwardRef<HTMLDivElement, ActionButtonProps>((props
|
|||||||
const iconOnly = (mobile && !props.showLabelOnMobile) || (!mobile && props.hideLabelOnDesktop)
|
const iconOnly = (mobile && !props.showLabelOnMobile) || (!mobile && props.hideLabelOnDesktop)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box ref={ref}>
|
<Box ref={ref} className="cf-action-button">
|
||||||
{iconOnly && (
|
{iconOnly && (
|
||||||
<Tooltip label={label} openDelay={Constants.tooltip.delay}>
|
<Tooltip label={label} openDelay={Constants.tooltip.delay}>
|
||||||
<ActionIcon
|
<ActionIcon
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export interface ErrorsAlertProps {
|
|||||||
messages: string[]
|
messages: string[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Alert(props: ErrorsAlertProps) {
|
export function Alert(props: Readonly<ErrorsAlertProps>) {
|
||||||
let title: React.ReactNode
|
let title: React.ReactNode
|
||||||
let color: string
|
let color: string
|
||||||
let icon: React.ReactNode
|
let icon: React.ReactNode
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Dialog, Text } from "@mantine/core"
|
import { Box, Dialog, Text } from "@mantine/core"
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import { setAnnouncementHash } from "app/user/slice"
|
|
||||||
import { Content } from "components/content/Content"
|
|
||||||
import { useAsync } from "react-async-hook"
|
import { useAsync } from "react-async-hook"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import { setAnnouncementHash } from "@/app/user/slice"
|
||||||
|
import { Content } from "@/components/content/Content"
|
||||||
|
|
||||||
const sha256Hex = async (input: string | undefined) => {
|
const sha256Hex = async (input: string | undefined) => {
|
||||||
const data = new TextEncoder().encode(input)
|
const data = new TextEncoder().encode(input)
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
html,
|
|
||||||
body {
|
|
||||||
overscroll-behavior: none;
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
export const DisablePullToRefresh = () => {
|
export const DisablePullToRefresh = ({ enabled }: { enabled: boolean | undefined }) => {
|
||||||
import("./DisablePullToRefresh.css")
|
return enabled ? <style>{`html, body { overscroll-behavior: none; }`}</style> : null
|
||||||
return <></>
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { ErrorPage } from "pages/ErrorPage"
|
|
||||||
import React, { type ReactNode } from "react"
|
import React, { type ReactNode } from "react"
|
||||||
|
import { ErrorPage } from "@/pages/ErrorPage"
|
||||||
|
|
||||||
interface ErrorBoundaryProps {
|
interface ErrorBoundaryProps {
|
||||||
children?: ReactNode
|
children?: ReactNode
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Box, Center } from "@mantine/core"
|
import { Box, Center } from "@mantine/core"
|
||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
import { TbPhoto } from "react-icons/tb"
|
import { TbPhoto } from "react-icons/tb"
|
||||||
import { tss } from "tss"
|
import { tss } from "@/tss"
|
||||||
|
|
||||||
interface ImageWithPlaceholderWhileLoadingProps {
|
interface ImageWithPlaceholderWhileLoadingProps {
|
||||||
src: string
|
src: string
|
||||||
@@ -44,7 +44,7 @@ export function ImageWithPlaceholderWhileLoading({
|
|||||||
title,
|
title,
|
||||||
width,
|
width,
|
||||||
style,
|
style,
|
||||||
}: ImageWithPlaceholderWhileLoadingProps) {
|
}: Readonly<ImageWithPlaceholderWhileLoadingProps>) {
|
||||||
const { classes } = useStyles({
|
const { classes } = useStyles({
|
||||||
placeholderWidth,
|
placeholderWidth,
|
||||||
placeholderHeight,
|
placeholderHeight,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Anchor, Box, Kbd, Stack, Table } from "@mantine/core"
|
import { Anchor, Box, Kbd, Stack, Table } from "@mantine/core"
|
||||||
import { useOs } from "@mantine/hooks"
|
import { useOs } from "@mantine/hooks"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
|
|
||||||
export function KeyboardShortcutsHelp() {
|
export function KeyboardShortcutsHelp() {
|
||||||
const isMacOS = useOs() === "macos"
|
const isMacOS = useOs() === "macos"
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { Image } from "@mantine/core"
|
import { Image } from "@mantine/core"
|
||||||
import logo from "assets/logo.svg"
|
import logo from "@/assets/logo.svg"
|
||||||
|
|
||||||
export interface LogoProps {
|
export interface LogoProps {
|
||||||
size: number
|
size: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Logo(props: LogoProps) {
|
export function Logo(props: Readonly<LogoProps>) {
|
||||||
return <Image src={logo} w={props.size} />
|
return <Image src={logo} w={props.size} />
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Button, Code, Group, Modal, Slider, Stack, Text } from "@mantine/core"
|
import { Button, Code, Group, Modal, Slider, Stack, Text } from "@mantine/core"
|
||||||
import { setMarkAllAsReadConfirmationDialogOpen } from "app/entries/slice"
|
|
||||||
import { markAllEntries } from "app/entries/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import { setMarkAllAsReadConfirmationDialogOpen } from "@/app/entries/slice"
|
||||||
|
import { markAllEntries } from "@/app/entries/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import { selectNextUnreadTreeItem } from "@/app/tree/thunks"
|
||||||
|
|
||||||
export function MarkAllAsReadConfirmationDialog() {
|
export function MarkAllAsReadConfirmationDialog() {
|
||||||
const [threshold, setThreshold] = useState(0)
|
const [threshold, setThreshold] = useState(0)
|
||||||
@@ -11,10 +13,12 @@ export function MarkAllAsReadConfirmationDialog() {
|
|||||||
const source = useAppSelector(state => state.entries.source)
|
const source = useAppSelector(state => state.entries.source)
|
||||||
const sourceLabel = useAppSelector(state => state.entries.sourceLabel)
|
const sourceLabel = useAppSelector(state => state.entries.sourceLabel)
|
||||||
const entriesTimestamp = useAppSelector(state => state.entries.timestamp) ?? Date.now()
|
const entriesTimestamp = useAppSelector(state => state.entries.timestamp) ?? Date.now()
|
||||||
|
const markAllAsReadNavigateToNextUnread = useAppSelector(state => state.user.settings?.markAllAsReadNavigateToNextUnread)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
|
|
||||||
const onConfirm = () => {
|
const onConfirm = async () => {
|
||||||
dispatch(
|
dispatch(setMarkAllAsReadConfirmationDialogOpen(false))
|
||||||
|
await dispatch(
|
||||||
markAllEntries({
|
markAllEntries({
|
||||||
sourceType: source.type,
|
sourceType: source.type,
|
||||||
req: {
|
req: {
|
||||||
@@ -25,7 +29,9 @@ export function MarkAllAsReadConfirmationDialog() {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
dispatch(setMarkAllAsReadConfirmationDialogOpen(false))
|
|
||||||
|
const isAllCategorySelected = source.type === "category" && source.id === Constants.categories.all.id
|
||||||
|
if (markAllAsReadNavigateToNextUnread && !isAllCategorySelected) await dispatch(selectNextUnreadTreeItem({ direction: "forward" }))
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Tooltip } from "@mantine/core"
|
import { Tooltip } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs"
|
||||||
import { useNow } from "hooks/useNow"
|
import { Constants } from "@/app/constants"
|
||||||
|
import { useNow } from "@/hooks/useNow"
|
||||||
|
|
||||||
export function RelativeDate(props: { date: Date | number | undefined }) {
|
export function RelativeDate(
|
||||||
|
props: Readonly<{
|
||||||
|
date: Date | number | undefined
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const now = useNow(60 * 1000)
|
const now = useNow(60 * 1000)
|
||||||
|
|
||||||
if (!props.date) return <Trans>N/A</Trans>
|
if (!props.date) return <Trans>N/A</Trans>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Button, Checkbox, Group, PasswordInput, Stack, TextInput } from "@mantine/core"
|
import { Box, Button, Checkbox, Group, PasswordInput, Stack, TextInput } from "@mantine/core"
|
||||||
import { useForm } from "@mantine/form"
|
import { useForm } from "@mantine/form"
|
||||||
import { client, errorToStrings } from "app/client"
|
|
||||||
import type { AdminSaveUserRequest, UserModel } from "app/types"
|
|
||||||
import { Alert } from "components/Alert"
|
|
||||||
import { useAsyncCallback } from "react-async-hook"
|
import { useAsyncCallback } from "react-async-hook"
|
||||||
import { TbDeviceFloppy } from "react-icons/tb"
|
import { TbDeviceFloppy } from "react-icons/tb"
|
||||||
|
import { client, errorToStrings } from "@/app/client"
|
||||||
|
import type { AdminSaveUserRequest, UserModel } from "@/app/types"
|
||||||
|
import { Alert } from "@/components/Alert"
|
||||||
|
|
||||||
interface UserEditProps {
|
interface UserEditProps {
|
||||||
user?: UserModel
|
user?: UserModel
|
||||||
@@ -13,7 +13,7 @@ interface UserEditProps {
|
|||||||
onSave: () => void
|
onSave: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export function UserEdit(props: UserEditProps) {
|
export function UserEdit(props: Readonly<UserEditProps>) {
|
||||||
const form = useForm<AdminSaveUserRequest>({
|
const form = useForm<AdminSaveUserRequest>({
|
||||||
initialValues: props.user ?? {
|
initialValues: props.user ?? {
|
||||||
name: "",
|
name: "",
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
import { Input, Textarea } from "@mantine/core"
|
import { Input, Textarea } from "@mantine/core"
|
||||||
import RichCodeEditor from "components/code/RichCodeEditor"
|
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import type { ReactNode } from "react"
|
import type { ReactNode } from "react"
|
||||||
|
import RichCodeEditor from "@/components/code/RichCodeEditor"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
|
|
||||||
interface CodeEditorProps {
|
interface CodeEditorProps {
|
||||||
|
label?: ReactNode
|
||||||
description?: ReactNode
|
description?: ReactNode
|
||||||
language: "css" | "javascript"
|
language: "css" | "javascript"
|
||||||
value?: string
|
value?: string
|
||||||
onChange: (value: string | undefined) => void
|
onChange: (value: string | undefined) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export function CodeEditor(props: CodeEditorProps) {
|
export function CodeEditor(props: Readonly<CodeEditorProps>) {
|
||||||
const mobile = useMobile()
|
const mobile = useMobile()
|
||||||
|
|
||||||
return mobile ? (
|
return mobile ? (
|
||||||
@@ -19,7 +20,8 @@ export function CodeEditor(props: CodeEditorProps) {
|
|||||||
autosize
|
autosize
|
||||||
minRows={4}
|
minRows={4}
|
||||||
maxRows={15}
|
maxRows={15}
|
||||||
label={props.description}
|
label={props.label}
|
||||||
|
description={props.description}
|
||||||
styles={{
|
styles={{
|
||||||
input: {
|
input: {
|
||||||
fontFamily: "monospace",
|
fontFamily: "monospace",
|
||||||
@@ -29,7 +31,7 @@ export function CodeEditor(props: CodeEditorProps) {
|
|||||||
onChange={e => props.onChange(e.currentTarget.value)}
|
onChange={e => props.onChange(e.currentTarget.value)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Input.Wrapper label={props.description}>
|
<Input.Wrapper label={props.label} description={props.description}>
|
||||||
<RichCodeEditor height="30vh" language={props.language} value={props.value} onChange={props.onChange} />
|
<RichCodeEditor height="30vh" language={props.language} value={props.value} onChange={props.onChange} />
|
||||||
</Input.Wrapper>
|
</Input.Wrapper>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Loader } from "components/Loader"
|
|
||||||
import { useColorScheme } from "hooks/useColorScheme"
|
|
||||||
import { useAsync } from "react-async-hook"
|
import { useAsync } from "react-async-hook"
|
||||||
|
import { Loader } from "@/components/Loader"
|
||||||
|
import { useColorScheme } from "@/hooks/useColorScheme"
|
||||||
|
|
||||||
const init = async () => {
|
const init = async () => {
|
||||||
window.MonacoEnvironment = {
|
window.MonacoEnvironment = {
|
||||||
@@ -30,7 +30,7 @@ interface RichCodeEditorProps {
|
|||||||
onChange: (value: string | undefined) => void
|
onChange: (value: string | undefined) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
function RichCodeEditor(props: RichCodeEditorProps) {
|
function RichCodeEditor(props: Readonly<RichCodeEditorProps>) {
|
||||||
const colorScheme = useColorScheme()
|
const colorScheme = useColorScheme()
|
||||||
const editorTheme = colorScheme === "dark" ? "vs-dark" : "light"
|
const editorTheme = colorScheme === "dark" ? "vs-dark" : "light"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { TypographyStylesProvider } from "@mantine/core"
|
import { Typography } from "@mantine/core"
|
||||||
import type { ReactNode } from "react"
|
import type { ReactNode } from "react"
|
||||||
import { tss } from "tss"
|
import { tss } from "@/tss"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This component is used to provide basic styles to html typography elements.
|
* This component is used to provide basic styles to html typography elements.
|
||||||
@@ -20,5 +20,5 @@ const useStyles = tss.create(() => ({
|
|||||||
|
|
||||||
export const BasicHtmlStyles = (props: { children: ReactNode }) => {
|
export const BasicHtmlStyles = (props: { children: ReactNode }) => {
|
||||||
const { classes } = useStyles()
|
const { classes } = useStyles()
|
||||||
return <TypographyStylesProvider className={classes.content}>{props.children}</TypographyStylesProvider>
|
return <Typography className={classes.content}>{props.children}</Typography>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { MantineProvider } from "@mantine/core"
|
import { MantineProvider } from "@mantine/core"
|
||||||
import { render } from "@testing-library/react"
|
import { render } from "@testing-library/react"
|
||||||
import { Content } from "components/content/Content"
|
|
||||||
import { describe, expect, it } from "vitest"
|
import { describe, expect, it } from "vitest"
|
||||||
|
import { Content } from "@/components/content/Content"
|
||||||
|
|
||||||
describe("Content component", () => {
|
describe("Content component", () => {
|
||||||
it("renders basic content", () => {
|
it("renders basic content", () => {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { Box, Mark } from "@mantine/core"
|
import { Box, Mark } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { calculatePlaceholderSize } from "app/utils"
|
|
||||||
import { ImageWithPlaceholderWhileLoading } from "components/ImageWithPlaceholderWhileLoading"
|
|
||||||
import { BasicHtmlStyles } from "components/content/BasicHtmlStyles"
|
|
||||||
import escapeStringRegexp from "escape-string-regexp"
|
import escapeStringRegexp from "escape-string-regexp"
|
||||||
import { ALLOWED_TAG_LIST, type ChildrenNode, Interweave, type MatchResponse, Matcher, type Node, type TransformCallback } from "interweave"
|
import { ALLOWED_TAG_LIST, type ChildrenNode, Interweave, Matcher, type MatchResponse, type Node, type TransformCallback } from "interweave"
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import styleToObject from "style-to-object"
|
import styleToObject from "style-to-object"
|
||||||
import { tss } from "tss"
|
import { Constants } from "@/app/constants"
|
||||||
|
import { calculatePlaceholderSize } from "@/app/utils"
|
||||||
|
import { BasicHtmlStyles } from "@/components/content/BasicHtmlStyles"
|
||||||
|
import { ImageWithPlaceholderWhileLoading } from "@/components/ImageWithPlaceholderWhileLoading"
|
||||||
|
import { tss } from "@/tss"
|
||||||
|
|
||||||
export interface ContentProps {
|
export interface ContentProps {
|
||||||
content: string
|
content: string
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import { ImageWithPlaceholderWhileLoading } from "components/ImageWithPlaceholderWhileLoading"
|
import { BasicHtmlStyles } from "@/components/content/BasicHtmlStyles"
|
||||||
import { BasicHtmlStyles } from "components/content/BasicHtmlStyles"
|
import { ImageWithPlaceholderWhileLoading } from "@/components/ImageWithPlaceholderWhileLoading"
|
||||||
|
|
||||||
export function Enclosure(props: {
|
export function Enclosure(
|
||||||
enclosureType: string
|
props: Readonly<{
|
||||||
enclosureUrl: string
|
enclosureType: string
|
||||||
}) {
|
enclosureUrl: string
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const hasVideo = props.enclosureType.startsWith("video")
|
const hasVideo = props.enclosureType.startsWith("video")
|
||||||
const hasAudio = props.enclosureType.startsWith("audio")
|
const hasAudio = props.enclosureType.startsWith("audio")
|
||||||
const hasImage = props.enclosureType.startsWith("image")
|
const hasImage = props.enclosureType.startsWith("image")
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import { openModal } from "@mantine/modals"
|
import { openModal } from "@mantine/modals"
|
||||||
import { Constants } from "app/constants"
|
import { useEffect } from "react"
|
||||||
import type { ExpendableEntry } from "app/entries/slice"
|
import { useContextMenu } from "react-contexify"
|
||||||
|
import InfiniteScroll from "react-infinite-scroller"
|
||||||
|
import { throttle } from "throttle-debounce"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import type { ExpendableEntry } from "@/app/entries/slice"
|
||||||
import {
|
import {
|
||||||
loadMoreEntries,
|
loadMoreEntries,
|
||||||
markAllAsReadWithConfirmationIfRequired,
|
markAllAsReadWithConfirmationIfRequired,
|
||||||
@@ -12,19 +16,15 @@ import {
|
|||||||
selectNextEntry,
|
selectNextEntry,
|
||||||
selectPreviousEntry,
|
selectPreviousEntry,
|
||||||
starEntry,
|
starEntry,
|
||||||
} from "app/entries/thunks"
|
} from "@/app/entries/thunks"
|
||||||
import { redirectToRootCategory } from "app/redirect/thunks"
|
import { redirectToRootCategory } from "@/app/redirect/thunks"
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
import { toggleSidebar } from "app/tree/slice"
|
import { toggleSidebar } from "@/app/tree/slice"
|
||||||
import { selectNextUnreadTreeItem } from "app/tree/thunks"
|
import { selectNextUnreadTreeItem } from "@/app/tree/thunks"
|
||||||
import { KeyboardShortcutsHelp } from "components/KeyboardShortcutsHelp"
|
import { KeyboardShortcutsHelp } from "@/components/KeyboardShortcutsHelp"
|
||||||
import { Loader } from "components/Loader"
|
import { Loader } from "@/components/Loader"
|
||||||
import { useBrowserExtension } from "hooks/useBrowserExtension"
|
import { useBrowserExtension } from "@/hooks/useBrowserExtension"
|
||||||
import { useMousetrap } from "hooks/useMousetrap"
|
import { useMousetrap } from "@/hooks/useMousetrap"
|
||||||
import { useEffect } from "react"
|
|
||||||
import { useContextMenu } from "react-contexify"
|
|
||||||
import InfiniteScroll from "react-infinite-scroller"
|
|
||||||
import { throttle } from "throttle-debounce"
|
|
||||||
import { FeedEntry } from "./FeedEntry"
|
import { FeedEntry } from "./FeedEntry"
|
||||||
|
|
||||||
export function FeedEntries() {
|
export function FeedEntries() {
|
||||||
@@ -287,8 +287,7 @@ export function FeedEntries() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<InfiniteScroll
|
<InfiniteScroll
|
||||||
id="entries"
|
className={`cf-entries cf-view-mode-${viewMode}`}
|
||||||
className={`view-mode-${viewMode}`}
|
|
||||||
initialLoad={false}
|
initialLoad={false}
|
||||||
loadMore={async () => await (!loading && dispatch(loadMoreEntries()))}
|
loadMore={async () => await (!loading && dispatch(loadMoreEntries()))}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { Box, Divider, type MantineRadius, type MantineSpacing, Paper } from "@mantine/core"
|
import { Box, Divider, type MantineRadius, type MantineSpacing, Paper } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { useAppSelector } from "app/store"
|
|
||||||
import type { Entry, ViewMode } from "app/types"
|
|
||||||
import { FeedEntryCompactHeader } from "components/content/header/FeedEntryCompactHeader"
|
|
||||||
import { FeedEntryHeader } from "components/content/header/FeedEntryHeader"
|
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import type React from "react"
|
import type React from "react"
|
||||||
import { useSwipeable } from "react-swipeable"
|
import { useSwipeable } from "react-swipeable"
|
||||||
import { tss } from "tss"
|
import { Constants } from "@/app/constants"
|
||||||
|
import { useAppSelector } from "@/app/store"
|
||||||
|
import type { Entry, ViewMode } from "@/app/types"
|
||||||
|
import { FeedEntryCompactHeader } from "@/components/content/header/FeedEntryCompactHeader"
|
||||||
|
import { FeedEntryHeader } from "@/components/content/header/FeedEntryHeader"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
|
import { tss } from "@/tss"
|
||||||
import { FeedEntryBody } from "./FeedEntryBody"
|
import { FeedEntryBody } from "./FeedEntryBody"
|
||||||
import { FeedEntryContextMenu } from "./FeedEntryContextMenu"
|
import { FeedEntryContextMenu } from "./FeedEntryContextMenu"
|
||||||
import { FeedEntryFooter } from "./FeedEntryFooter"
|
import { FeedEntryFooter } from "./FeedEntryFooter"
|
||||||
@@ -96,7 +96,7 @@ const useStyles = tss
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export function FeedEntry(props: FeedEntryProps) {
|
export function FeedEntry(props: Readonly<FeedEntryProps>) {
|
||||||
const viewMode = useAppSelector(state => state.user.localSettings.viewMode)
|
const viewMode = useAppSelector(state => state.user.localSettings.viewMode)
|
||||||
const fontSizePercentage = useAppSelector(state => state.user.localSettings.fontSizePercentage)
|
const fontSizePercentage = useAppSelector(state => state.user.localSettings.fontSizePercentage)
|
||||||
const { classes, cx } = useStyles({
|
const { classes, cx } = useStyles({
|
||||||
@@ -145,6 +145,7 @@ export function FeedEntry(props: FeedEntryProps) {
|
|||||||
component="article"
|
component="article"
|
||||||
id={Constants.dom.entryId(props.entry)}
|
id={Constants.dom.entryId(props.entry)}
|
||||||
data-id={props.entry.id}
|
data-id={props.entry.id}
|
||||||
|
data-feed-id={props.entry.feedId}
|
||||||
withBorder
|
withBorder
|
||||||
radius={borderRadius}
|
radius={borderRadius}
|
||||||
className={cx(classes.paper, {
|
className={cx(classes.paper, {
|
||||||
@@ -184,10 +185,10 @@ export function FeedEntry(props: FeedEntryProps) {
|
|||||||
</a>
|
</a>
|
||||||
{props.expanded && (
|
{props.expanded && (
|
||||||
<Box px={paddingX} pb={paddingY} onClick={props.onBodyClick}>
|
<Box px={paddingX} pb={paddingY} onClick={props.onBodyClick}>
|
||||||
<Box className={classes.body}>
|
<Box className={`${classes.body} cf-content`}>
|
||||||
<FeedEntryBody entry={props.entry} />
|
<FeedEntryBody entry={props.entry} />
|
||||||
</Box>
|
</Box>
|
||||||
<Divider variant="dashed" my={paddingY} />
|
<Divider variant="dashed" my={paddingY} className="cf-footer-divider" />
|
||||||
<FeedEntryFooter entry={props.entry} />
|
<FeedEntryFooter entry={props.entry} />
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import { useAppSelector } from "app/store"
|
import { useAppSelector } from "@/app/store"
|
||||||
import type { Entry } from "app/types"
|
import type { Entry } from "@/app/types"
|
||||||
import { Content } from "./Content"
|
import { Content } from "./Content"
|
||||||
import { Enclosure } from "./Enclosure"
|
import { Enclosure } from "./Enclosure"
|
||||||
import { Media } from "./Media"
|
import { Media } from "./Media"
|
||||||
@@ -9,7 +9,7 @@ export interface FeedEntryBodyProps {
|
|||||||
entry: Entry
|
entry: Entry
|
||||||
}
|
}
|
||||||
|
|
||||||
export function FeedEntryBody(props: FeedEntryBodyProps) {
|
export function FeedEntryBody(props: Readonly<FeedEntryBodyProps>) {
|
||||||
const search = useAppSelector(state => state.entries.search)
|
const search = useAppSelector(state => state.entries.search)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Group } from "@mantine/core"
|
import { Group } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { markEntriesUpToEntry, markEntry, starEntry } from "app/entries/thunks"
|
|
||||||
import { redirectToFeed } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import type { Entry } from "app/types"
|
|
||||||
import { truncate } from "app/utils"
|
|
||||||
import { useBrowserExtension } from "hooks/useBrowserExtension"
|
|
||||||
import { useColorScheme } from "hooks/useColorScheme"
|
|
||||||
import { Item, Menu, Separator } from "react-contexify"
|
import { Item, Menu, Separator } from "react-contexify"
|
||||||
import { TbArrowBarToDown, TbExternalLink, TbMail, TbMailOpened, TbRss, TbStar, TbStarOff } from "react-icons/tb"
|
import { TbArrowBarToDown, TbExternalLink, TbMail, TbMailOpened, TbRss, TbStar, TbStarOff } from "react-icons/tb"
|
||||||
import { tss } from "tss"
|
import { Constants } from "@/app/constants"
|
||||||
|
import { markEntriesUpToEntry, markEntry, starEntry } from "@/app/entries/thunks"
|
||||||
|
import { redirectToFeed } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import type { Entry } from "@/app/types"
|
||||||
|
import { truncate } from "@/app/utils"
|
||||||
|
import { useBrowserExtension } from "@/hooks/useBrowserExtension"
|
||||||
|
import { useColorScheme } from "@/hooks/useColorScheme"
|
||||||
|
import { tss } from "@/tss"
|
||||||
|
|
||||||
interface FeedEntryContextMenuProps {
|
interface FeedEntryContextMenuProps {
|
||||||
entry: Entry
|
entry: Entry
|
||||||
@@ -27,7 +27,7 @@ const useStyles = tss.create(({ theme, colorScheme }) => ({
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
export function FeedEntryContextMenu(props: FeedEntryContextMenuProps) {
|
export function FeedEntryContextMenu(props: Readonly<FeedEntryContextMenuProps>) {
|
||||||
const colorScheme = useColorScheme()
|
const colorScheme = useColorScheme()
|
||||||
const { classes } = useStyles()
|
const { classes } = useStyles()
|
||||||
const sourceType = useAppSelector(state => state.entries.source.type)
|
const sourceType = useAppSelector(state => state.entries.source.type)
|
||||||
@@ -61,19 +61,21 @@ export function FeedEntryContextMenu(props: FeedEntryContextMenuProps) {
|
|||||||
|
|
||||||
<Separator />
|
<Separator />
|
||||||
|
|
||||||
<Item onClick={async () => await dispatch(starEntry({ entry: props.entry, starred: !props.entry.starred }))}>
|
|
||||||
<Group>
|
|
||||||
{props.entry.starred ? <TbStarOff size={iconSize} /> : <TbStar size={iconSize} />}
|
|
||||||
{props.entry.starred ? <Trans>Unstar</Trans> : <Trans>Star</Trans>}
|
|
||||||
</Group>
|
|
||||||
</Item>
|
|
||||||
{props.entry.markable && (
|
{props.entry.markable && (
|
||||||
<Item onClick={async () => await dispatch(markEntry({ entry: props.entry, read: !props.entry.read }))}>
|
<>
|
||||||
<Group>
|
<Item onClick={async () => await dispatch(starEntry({ entry: props.entry, starred: !props.entry.starred }))}>
|
||||||
{props.entry.read ? <TbMail size={iconSize} /> : <TbMailOpened size={iconSize} />}
|
<Group>
|
||||||
{props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>}
|
{props.entry.starred ? <TbStarOff size={iconSize} /> : <TbStar size={iconSize} />}
|
||||||
</Group>
|
{props.entry.starred ? <Trans>Unstar</Trans> : <Trans>Star</Trans>}
|
||||||
</Item>
|
</Group>
|
||||||
|
</Item>
|
||||||
|
<Item onClick={async () => await dispatch(markEntry({ entry: props.entry, read: !props.entry.read }))}>
|
||||||
|
<Group>
|
||||||
|
{props.entry.read ? <TbMail size={iconSize} /> : <TbMailOpened size={iconSize} />}
|
||||||
|
{props.entry.read ? <Trans>Keep unread</Trans> : <Trans>Mark as read</Trans>}
|
||||||
|
</Group>
|
||||||
|
</Item>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
<Item onClick={async () => await dispatch(markEntriesUpToEntry(props.entry))}>
|
<Item onClick={async () => await dispatch(markEntriesUpToEntry(props.entry))}>
|
||||||
<Group>
|
<Group>
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
import { msg } from "@lingui/core/macro"
|
import { msg } from "@lingui/core/macro"
|
||||||
import { useLingui } from "@lingui/react"
|
import { useLingui } from "@lingui/react"
|
||||||
import { Group, Indicator, Popover, TagsInput } from "@mantine/core"
|
import { Group, Indicator, Popover, TagsInput } from "@mantine/core"
|
||||||
import { markEntriesUpToEntry, markEntry, starEntry, tagEntry } from "app/entries/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import type { Entry } from "app/types"
|
|
||||||
import { ActionButton } from "components/ActionButton"
|
|
||||||
import { useActionButton } from "hooks/useActionButton"
|
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import { TbArrowBarToDown, TbExternalLink, TbMail, TbMailOpened, TbShare, TbStar, TbStarOff, TbTag } from "react-icons/tb"
|
import { TbArrowBarToDown, TbExternalLink, TbMail, TbMailOpened, TbShare, TbStar, TbStarOff, TbTag } from "react-icons/tb"
|
||||||
|
import { markEntriesUpToEntry, markEntry, starEntry, tagEntry } from "@/app/entries/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import type { Entry } from "@/app/types"
|
||||||
|
import { ActionButton } from "@/components/ActionButton"
|
||||||
|
import { useActionButton } from "@/hooks/useActionButton"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
import { ShareButtons } from "./ShareButtons"
|
import { ShareButtons } from "./ShareButtons"
|
||||||
|
|
||||||
interface FeedEntryFooterProps {
|
interface FeedEntryFooterProps {
|
||||||
entry: Entry
|
entry: Entry
|
||||||
}
|
}
|
||||||
|
|
||||||
export function FeedEntryFooter(props: FeedEntryFooterProps) {
|
export function FeedEntryFooter(props: Readonly<FeedEntryFooterProps>) {
|
||||||
const tags = useAppSelector(state => state.user.tags)
|
const tags = useAppSelector(state => state.user.tags)
|
||||||
const mobile = useMobile()
|
const mobile = useMobile()
|
||||||
const { spacing } = useActionButton()
|
const { spacing } = useActionButton()
|
||||||
@@ -37,7 +37,7 @@ export function FeedEntryFooter(props: FeedEntryFooterProps) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Group justify="space-between">
|
<Group justify="space-between" className="cf-footer">
|
||||||
<Group gap={spacing}>
|
<Group gap={spacing}>
|
||||||
{props.entry.markable && (
|
{props.entry.markable && (
|
||||||
<ActionButton
|
<ActionButton
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { ImageWithPlaceholderWhileLoading } from "components/ImageWithPlaceholderWhileLoading"
|
import { ImageWithPlaceholderWhileLoading } from "@/components/ImageWithPlaceholderWhileLoading"
|
||||||
|
|
||||||
export interface FeedFaviconProps {
|
export interface FeedFaviconProps {
|
||||||
url: string
|
url: string
|
||||||
size?: number
|
size?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export function FeedFavicon({ url, size = 18 }: FeedFaviconProps) {
|
export function FeedFavicon({ url, size = 18 }: Readonly<FeedFaviconProps>) {
|
||||||
return (
|
return (
|
||||||
<ImageWithPlaceholderWhileLoading
|
<ImageWithPlaceholderWhileLoading
|
||||||
src={url}
|
src={url}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
import { calculatePlaceholderSize } from "app/utils"
|
import { calculatePlaceholderSize } from "@/app/utils"
|
||||||
import { ImageWithPlaceholderWhileLoading } from "components/ImageWithPlaceholderWhileLoading"
|
import { BasicHtmlStyles } from "@/components/content/BasicHtmlStyles"
|
||||||
import { BasicHtmlStyles } from "components/content/BasicHtmlStyles"
|
import { ImageWithPlaceholderWhileLoading } from "@/components/ImageWithPlaceholderWhileLoading"
|
||||||
import { Content } from "./Content"
|
import { Content } from "./Content"
|
||||||
|
|
||||||
export interface MediaProps {
|
export interface MediaProps {
|
||||||
@@ -12,7 +12,7 @@ export interface MediaProps {
|
|||||||
description?: string
|
description?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Media(props: MediaProps) {
|
export function Media(props: Readonly<MediaProps>) {
|
||||||
const width = props.thumbnailWidth
|
const width = props.thumbnailWidth
|
||||||
const height = props.thumbnailHeight
|
const height = props.thumbnailHeight
|
||||||
const placeholderSize = calculatePlaceholderSize({
|
const placeholderSize = calculatePlaceholderSize({
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { ActionIcon, Box, CopyButton, Divider, SimpleGrid } from "@mantine/core"
|
import { ActionIcon, Box, CopyButton, Divider, SimpleGrid } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { useAppSelector } from "app/store"
|
|
||||||
import type { SharingSettings } from "app/types"
|
|
||||||
import { useBrowserExtension } from "hooks/useBrowserExtension"
|
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import type { IconType } from "react-icons"
|
import type { IconType } from "react-icons"
|
||||||
import { TbCheck, TbCopy, TbDeviceDesktopShare, TbDeviceMobileShare } from "react-icons/tb"
|
import { TbCheck, TbCopy, TbDeviceDesktopShare, TbDeviceMobileShare } from "react-icons/tb"
|
||||||
import { tss } from "tss"
|
import { Constants } from "@/app/constants"
|
||||||
|
import { useAppSelector } from "@/app/store"
|
||||||
|
import type { SharingSettings } from "@/app/types"
|
||||||
|
import { useBrowserExtension } from "@/hooks/useBrowserExtension"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
|
import { tss } from "@/tss"
|
||||||
|
|
||||||
type Color = `#${string}`
|
type Color = `#${string}`
|
||||||
|
|
||||||
@@ -22,7 +22,15 @@ const useStyles = tss
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
function ShareButton({ icon, color, onClick }: { icon: IconType; color: Color; onClick: () => void }) {
|
function ShareButton({
|
||||||
|
icon,
|
||||||
|
color,
|
||||||
|
onClick,
|
||||||
|
}: Readonly<{
|
||||||
|
icon: IconType
|
||||||
|
color: Color
|
||||||
|
onClick: () => void
|
||||||
|
}>) {
|
||||||
const { classes } = useStyles({
|
const { classes } = useStyles({
|
||||||
color,
|
color,
|
||||||
})
|
})
|
||||||
@@ -36,7 +44,15 @@ function ShareButton({ icon, color, onClick }: { icon: IconType; color: Color; o
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function SiteShareButton({ url, icon, color }: { icon: IconType; color: Color; url: string }) {
|
function SiteShareButton({
|
||||||
|
url,
|
||||||
|
icon,
|
||||||
|
color,
|
||||||
|
}: Readonly<{
|
||||||
|
icon: IconType
|
||||||
|
color: Color
|
||||||
|
url: string
|
||||||
|
}>) {
|
||||||
const onClick = () => {
|
const onClick = () => {
|
||||||
window.open(url, "", "menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=800,height=600")
|
window.open(url, "", "menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=800,height=600")
|
||||||
}
|
}
|
||||||
@@ -44,7 +60,11 @@ function SiteShareButton({ url, icon, color }: { icon: IconType; color: Color; u
|
|||||||
return <ShareButton icon={icon} color={color} onClick={onClick} />
|
return <ShareButton icon={icon} color={color} onClick={onClick} />
|
||||||
}
|
}
|
||||||
|
|
||||||
function CopyUrlButton({ url }: { url: string }) {
|
function CopyUrlButton({
|
||||||
|
url,
|
||||||
|
}: Readonly<{
|
||||||
|
url: string
|
||||||
|
}>) {
|
||||||
return (
|
return (
|
||||||
<CopyButton value={url}>
|
<CopyButton value={url}>
|
||||||
{({ copied, copy }) => <ShareButton icon={copied ? TbCheck : TbCopy} color="#000" onClick={copy} />}
|
{({ copied, copy }) => <ShareButton icon={copied ? TbCheck : TbCopy} color="#000" onClick={copy} />}
|
||||||
@@ -52,7 +72,13 @@ function CopyUrlButton({ url }: { url: string }) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function BrowserNativeShareButton({ url, description }: { url: string; description: string }) {
|
function BrowserNativeShareButton({
|
||||||
|
url,
|
||||||
|
description,
|
||||||
|
}: Readonly<{
|
||||||
|
url: string
|
||||||
|
description: string
|
||||||
|
}>) {
|
||||||
const mobile = useMobile()
|
const mobile = useMobile()
|
||||||
const { isBrowserExtensionPopup } = useBrowserExtension()
|
const { isBrowserExtensionPopup } = useBrowserExtension()
|
||||||
const onClick = () => {
|
const onClick = () => {
|
||||||
@@ -71,7 +97,12 @@ function BrowserNativeShareButton({ url, description }: { url: string; descripti
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ShareButtons(props: { url: string; description: string }) {
|
export function ShareButtons(
|
||||||
|
props: Readonly<{
|
||||||
|
url: string
|
||||||
|
description: string
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
|
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
|
||||||
const enabledSharingSites = (Object.keys(Constants.sharing) as Array<keyof SharingSettings>).filter(site => sharingSettings?.[site])
|
const enabledSharingSites = (Object.keys(Constants.sharing) as Array<keyof SharingSettings>).filter(site => sharingSettings?.[site])
|
||||||
const url = encodeURIComponent(props.url)
|
const url = encodeURIComponent(props.url)
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ import { useLingui } from "@lingui/react"
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Button, Group, Stack, TextInput } from "@mantine/core"
|
import { Box, Button, Group, Stack, TextInput } from "@mantine/core"
|
||||||
import { useForm } from "@mantine/form"
|
import { useForm } from "@mantine/form"
|
||||||
import { client, errorToStrings } from "app/client"
|
|
||||||
import { redirectToSelectedSource } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch } from "app/store"
|
|
||||||
import { reloadTree } from "app/tree/thunks"
|
|
||||||
import type { AddCategoryRequest } from "app/types"
|
|
||||||
import { Alert } from "components/Alert"
|
|
||||||
import { useAsyncCallback } from "react-async-hook"
|
import { useAsyncCallback } from "react-async-hook"
|
||||||
import { TbFolderPlus } from "react-icons/tb"
|
import { TbFolderPlus } from "react-icons/tb"
|
||||||
|
import { client, errorToStrings } from "@/app/client"
|
||||||
|
import { redirectToSelectedSource } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch } from "@/app/store"
|
||||||
|
import { reloadTree } from "@/app/tree/thunks"
|
||||||
|
import type { AddCategoryRequest } from "@/app/types"
|
||||||
|
import { Alert } from "@/components/Alert"
|
||||||
import { CategorySelect } from "./CategorySelect"
|
import { CategorySelect } from "./CategorySelect"
|
||||||
|
|
||||||
export function AddCategory() {
|
export function AddCategory() {
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ import { msg } from "@lingui/core/macro"
|
|||||||
import { useLingui } from "@lingui/react"
|
import { useLingui } from "@lingui/react"
|
||||||
import { Select, type SelectProps } from "@mantine/core"
|
import { Select, type SelectProps } from "@mantine/core"
|
||||||
import type { ComboboxItem } from "@mantine/core/lib/components/Combobox/Combobox.types"
|
import type { ComboboxItem } from "@mantine/core/lib/components/Combobox/Combobox.types"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
import { useAppSelector } from "app/store"
|
import { useAppSelector } from "@/app/store"
|
||||||
import type { Category } from "app/types"
|
import type { Category } from "@/app/types"
|
||||||
import { flattenCategoryTree } from "app/utils"
|
import { flattenCategoryTree } from "@/app/utils"
|
||||||
|
|
||||||
type CategorySelectProps = Partial<SelectProps> & {
|
type CategorySelectProps = Partial<SelectProps> & {
|
||||||
withAll?: boolean
|
withAll?: boolean
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import { useLingui } from "@lingui/react"
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Button, FileInput, Group, Stack } from "@mantine/core"
|
import { Box, Button, FileInput, Group, Stack } from "@mantine/core"
|
||||||
import { isNotEmpty, useForm } from "@mantine/form"
|
import { isNotEmpty, useForm } from "@mantine/form"
|
||||||
import { client, errorToStrings } from "app/client"
|
|
||||||
import { redirectToSelectedSource } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch } from "app/store"
|
|
||||||
import { reloadTree } from "app/tree/thunks"
|
|
||||||
import { Alert } from "components/Alert"
|
|
||||||
import { useAsyncCallback } from "react-async-hook"
|
import { useAsyncCallback } from "react-async-hook"
|
||||||
import { TbFileImport } from "react-icons/tb"
|
import { TbFileImport } from "react-icons/tb"
|
||||||
|
import { client, errorToStrings } from "@/app/client"
|
||||||
|
import { redirectToSelectedSource } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch } from "@/app/store"
|
||||||
|
import { reloadTree } from "@/app/tree/thunks"
|
||||||
|
import { Alert } from "@/components/Alert"
|
||||||
|
|
||||||
export function ImportOpml() {
|
export function ImportOpml() {
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Button, Group, Stack, Stepper, TextInput } from "@mantine/core"
|
import { Box, Button, Group, Stack, Stepper, TextInput } from "@mantine/core"
|
||||||
import { useForm } from "@mantine/form"
|
import { useForm } from "@mantine/form"
|
||||||
import { client, errorToStrings } from "app/client"
|
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { redirectToFeed, redirectToSelectedSource } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch } from "app/store"
|
|
||||||
import { reloadTree } from "app/tree/thunks"
|
|
||||||
import type { FeedInfoRequest, SubscribeRequest } from "app/types"
|
|
||||||
import { Alert } from "components/Alert"
|
|
||||||
import { useState } from "react"
|
import { useState } from "react"
|
||||||
import { useAsyncCallback } from "react-async-hook"
|
import { useAsyncCallback } from "react-async-hook"
|
||||||
import { TbRss } from "react-icons/tb"
|
import { TbRss } from "react-icons/tb"
|
||||||
|
import { client, errorToStrings } from "@/app/client"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import { redirectToFeed, redirectToSelectedSource } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch } from "@/app/store"
|
||||||
|
import { reloadTree } from "@/app/tree/thunks"
|
||||||
|
import type { FeedInfoRequest, SubscribeRequest } from "@/app/types"
|
||||||
|
import { Alert } from "@/components/Alert"
|
||||||
import { CategorySelect } from "./CategorySelect"
|
import { CategorySelect } from "./CategorySelect"
|
||||||
|
|
||||||
export function Subscribe() {
|
export function Subscribe() {
|
||||||
@@ -39,9 +39,8 @@ export function Subscribe() {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
const subscribe = useAsyncCallback(client.feed.subscribe, {
|
const subscribe = useAsyncCallback(client.feed.subscribe, {
|
||||||
onSuccess: async sub => {
|
onSuccess: sub => {
|
||||||
await dispatch(reloadTree())
|
dispatch(reloadTree()).then(() => dispatch(redirectToFeed(sub.data)))
|
||||||
dispatch(redirectToFeed(sub.data))
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import type { Entry } from "app/types"
|
import type { Entry } from "@/app/types"
|
||||||
import { RelativeDate } from "components/RelativeDate"
|
import { FeedFavicon } from "@/components/content/FeedFavicon"
|
||||||
import { FeedFavicon } from "components/content/FeedFavicon"
|
import { OpenExternalLink } from "@/components/content/header/OpenExternalLink"
|
||||||
import { OpenExternalLink } from "components/content/header/OpenExternalLink"
|
import { Star } from "@/components/content/header/Star"
|
||||||
import { Star } from "components/content/header/Star"
|
import { RelativeDate } from "@/components/RelativeDate"
|
||||||
import { OnDesktop } from "components/responsive/OnDesktop"
|
import { OnDesktop } from "@/components/responsive/OnDesktop"
|
||||||
import { tss } from "tss"
|
import { tss } from "@/tss"
|
||||||
import { FeedEntryTitle } from "./FeedEntryTitle"
|
import { FeedEntryTitle } from "./FeedEntryTitle"
|
||||||
|
|
||||||
export interface FeedEntryHeaderProps {
|
export interface FeedEntryHeaderProps {
|
||||||
@@ -43,7 +43,7 @@ const useStyles = tss
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
export function FeedEntryCompactHeader(props: FeedEntryHeaderProps) {
|
export function FeedEntryCompactHeader(props: Readonly<FeedEntryHeaderProps>) {
|
||||||
const { classes } = useStyles({
|
const { classes } = useStyles({
|
||||||
read: props.entry.read,
|
read: props.entry.read,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { Box, Flex, Space } from "@mantine/core"
|
import { Box, Flex, Space } from "@mantine/core"
|
||||||
import type { Entry } from "app/types"
|
import type { Entry } from "@/app/types"
|
||||||
import { RelativeDate } from "components/RelativeDate"
|
import { FeedFavicon } from "@/components/content/FeedFavicon"
|
||||||
import { FeedFavicon } from "components/content/FeedFavicon"
|
import { OpenExternalLink } from "@/components/content/header/OpenExternalLink"
|
||||||
import { OpenExternalLink } from "components/content/header/OpenExternalLink"
|
import { Star } from "@/components/content/header/Star"
|
||||||
import { Star } from "components/content/header/Star"
|
import { RelativeDate } from "@/components/RelativeDate"
|
||||||
import { tss } from "tss"
|
import { tss } from "@/tss"
|
||||||
import { FeedEntryTitle } from "./FeedEntryTitle"
|
import { FeedEntryTitle } from "./FeedEntryTitle"
|
||||||
|
|
||||||
export interface FeedEntryHeaderProps {
|
export interface FeedEntryHeaderProps {
|
||||||
@@ -24,13 +24,13 @@ const useStyles = tss
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
export function FeedEntryHeader(props: FeedEntryHeaderProps) {
|
export function FeedEntryHeader(props: Readonly<FeedEntryHeaderProps>) {
|
||||||
const { classes } = useStyles({
|
const { classes } = useStyles({
|
||||||
read: props.entry.read,
|
read: props.entry.read,
|
||||||
})
|
})
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box className="cf-header">
|
||||||
<Flex align="flex-start" justify="space-between">
|
<Flex align="flex-start" justify="space-between" className="cf-header-title">
|
||||||
<Flex align="flex-start" className={classes.main}>
|
<Flex align="flex-start" className={classes.main}>
|
||||||
{props.showStarIcon && (
|
{props.showStarIcon && (
|
||||||
<Box ml={-5}>
|
<Box ml={-5}>
|
||||||
@@ -41,7 +41,7 @@ export function FeedEntryHeader(props: FeedEntryHeaderProps) {
|
|||||||
</Flex>
|
</Flex>
|
||||||
{props.showExternalLinkIcon && <OpenExternalLink entry={props.entry} />}
|
{props.showExternalLinkIcon && <OpenExternalLink entry={props.entry} />}
|
||||||
</Flex>
|
</Flex>
|
||||||
<Flex align="center">
|
<Flex align="center" className="cf-header-subtitle">
|
||||||
<FeedFavicon url={props.entry.iconUrl} />
|
<FeedFavicon url={props.entry.iconUrl} />
|
||||||
<Space w={6} />
|
<Space w={6} />
|
||||||
<Box c="dimmed">
|
<Box c="dimmed">
|
||||||
@@ -51,7 +51,7 @@ export function FeedEntryHeader(props: FeedEntryHeaderProps) {
|
|||||||
</Box>
|
</Box>
|
||||||
</Flex>
|
</Flex>
|
||||||
{props.expanded && (
|
{props.expanded && (
|
||||||
<Box c="dimmed">
|
<Box className="cf-header-details">
|
||||||
{props.entry.author && <span>by {props.entry.author}</span>}
|
{props.entry.author && <span>by {props.entry.author}</span>}
|
||||||
{props.entry.author && props.entry.categories && <span> · </span>}
|
{props.entry.author && props.entry.categories && <span> · </span>}
|
||||||
{props.entry.categories && <span>{props.entry.categories}</span>}
|
{props.entry.categories && <span>{props.entry.categories}</span>}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { Highlight } from "@mantine/core"
|
import { Highlight } from "@mantine/core"
|
||||||
import { useAppSelector } from "app/store"
|
import { useAppSelector } from "@/app/store"
|
||||||
import type { Entry } from "app/types"
|
import type { Entry } from "@/app/types"
|
||||||
|
|
||||||
export interface FeedEntryTitleProps {
|
export interface FeedEntryTitleProps {
|
||||||
entry: Entry
|
entry: Entry
|
||||||
}
|
}
|
||||||
|
|
||||||
export function FeedEntryTitle(props: FeedEntryTitleProps) {
|
export function FeedEntryTitle(props: Readonly<FeedEntryTitleProps>) {
|
||||||
const search = useAppSelector(state => state.entries.search)
|
const search = useAppSelector(state => state.entries.search)
|
||||||
const keywords = search?.split(" ")
|
const keywords = search?.split(" ")
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { ActionIcon, Anchor, Tooltip } from "@mantine/core"
|
import { ActionIcon, Anchor, Tooltip } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { markEntry } from "app/entries/thunks"
|
|
||||||
import { useAppDispatch } from "app/store"
|
|
||||||
import type { Entry } from "app/types"
|
|
||||||
import { TbExternalLink } from "react-icons/tb"
|
import { TbExternalLink } from "react-icons/tb"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import { markEntry } from "@/app/entries/thunks"
|
||||||
|
import { useAppDispatch } from "@/app/store"
|
||||||
|
import type { Entry } from "@/app/types"
|
||||||
|
|
||||||
export function OpenExternalLink(props: { entry: Entry }) {
|
export function OpenExternalLink(
|
||||||
|
props: Readonly<{
|
||||||
|
entry: Entry
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const onClick = (e: React.MouseEvent) => {
|
const onClick = (e: React.MouseEvent) => {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { ActionIcon, Tooltip } from "@mantine/core"
|
import { ActionIcon, Tooltip } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
|
||||||
import { starEntry } from "app/entries/thunks"
|
|
||||||
import { useAppDispatch } from "app/store"
|
|
||||||
import type { Entry } from "app/types"
|
|
||||||
import { TbStar, TbStarFilled } from "react-icons/tb"
|
import { TbStar, TbStarFilled } from "react-icons/tb"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import { starEntry } from "@/app/entries/thunks"
|
||||||
|
import { useAppDispatch } from "@/app/store"
|
||||||
|
import type { Entry } from "@/app/types"
|
||||||
|
|
||||||
export function Star(props: { entry: Entry }) {
|
export function Star(
|
||||||
|
props: Readonly<{
|
||||||
|
entry: Entry
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const onClick = (e: React.MouseEvent) => {
|
const onClick = (e: React.MouseEvent) => {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
|||||||
@@ -2,14 +2,6 @@ import { msg } from "@lingui/core/macro"
|
|||||||
import { useLingui } from "@lingui/react"
|
import { useLingui } from "@lingui/react"
|
||||||
import { Box, Center, CloseButton, Divider, Group, Indicator, Popover, TextInput } from "@mantine/core"
|
import { Box, Center, CloseButton, Divider, Group, Indicator, Popover, TextInput } from "@mantine/core"
|
||||||
import { useForm } from "@mantine/form"
|
import { useForm } from "@mantine/form"
|
||||||
import { markAllAsReadWithConfirmationIfRequired, reloadEntries, search, selectNextEntry, selectPreviousEntry } from "app/entries/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import { changeReadingMode, changeReadingOrder } from "app/user/thunks"
|
|
||||||
import { ActionButton } from "components/ActionButton"
|
|
||||||
import { Loader } from "components/Loader"
|
|
||||||
import { useActionButton } from "hooks/useActionButton"
|
|
||||||
import { useBrowserExtension } from "hooks/useBrowserExtension"
|
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
import {
|
import {
|
||||||
TbArrowDown,
|
TbArrowDown,
|
||||||
@@ -25,6 +17,14 @@ import {
|
|||||||
TbSortDescending,
|
TbSortDescending,
|
||||||
TbUser,
|
TbUser,
|
||||||
} from "react-icons/tb"
|
} from "react-icons/tb"
|
||||||
|
import { markAllAsReadWithConfirmationIfRequired, reloadEntries, search, selectNextEntry, selectPreviousEntry } from "@/app/entries/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import { changeReadingMode, changeReadingOrder } from "@/app/user/thunks"
|
||||||
|
import { ActionButton } from "@/components/ActionButton"
|
||||||
|
import { Loader } from "@/components/Loader"
|
||||||
|
import { useActionButton } from "@/hooks/useActionButton"
|
||||||
|
import { useBrowserExtension } from "@/hooks/useBrowserExtension"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
import { ProfileMenu } from "./ProfileMenu"
|
import { ProfileMenu } from "./ProfileMenu"
|
||||||
|
|
||||||
function HeaderDivider() {
|
function HeaderDivider() {
|
||||||
@@ -42,11 +42,14 @@ function HeaderToolbar(props: { children: React.ReactNode }) {
|
|||||||
display: "flex",
|
display: "flex",
|
||||||
justifyContent: "space-between",
|
justifyContent: "space-between",
|
||||||
}}
|
}}
|
||||||
|
className="cf-toolbar"
|
||||||
>
|
>
|
||||||
{props.children}
|
{props.children}
|
||||||
</Box>
|
</Box>
|
||||||
) : (
|
) : (
|
||||||
<Group gap={spacing}>{props.children}</Group>
|
<Group gap={spacing} className="cf-toolbar">
|
||||||
|
{props.children}
|
||||||
|
</Group>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,11 +63,7 @@ export function Header() {
|
|||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const { _ } = useLingui()
|
const { _ } = useLingui()
|
||||||
|
|
||||||
const searchForm = useForm<{ search: string }>({
|
const searchForm = useForm<{ search: string }>()
|
||||||
validate: {
|
|
||||||
search: value => (value.length > 0 && value.length < 3 ? _(msg`Search requires at least 3 characters`) : null),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
const { setValues } = searchForm
|
const { setValues } = searchForm
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -75,7 +74,7 @@ export function Header() {
|
|||||||
|
|
||||||
if (!settings) return <Loader />
|
if (!settings) return <Loader />
|
||||||
return (
|
return (
|
||||||
<Center>
|
<Center className="cf-toolbar-wrapper">
|
||||||
<HeaderToolbar>
|
<HeaderToolbar>
|
||||||
<ActionButton
|
<ActionButton
|
||||||
icon={<TbArrowUp size={iconSize} />}
|
icon={<TbArrowUp size={iconSize} />}
|
||||||
|
|||||||
@@ -11,14 +11,7 @@ import {
|
|||||||
useMantineColorScheme,
|
useMantineColorScheme,
|
||||||
} from "@mantine/core"
|
} from "@mantine/core"
|
||||||
import { showNotification } from "@mantine/notifications"
|
import { showNotification } from "@mantine/notifications"
|
||||||
import { client } from "app/client"
|
|
||||||
import { redirectToAbout, redirectToAdminUsers, redirectToDonate, redirectToMetrics, redirectToSettings } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import type { ViewMode } from "app/types"
|
|
||||||
import { setFontSizePercentage, setViewMode } from "app/user/slice"
|
|
||||||
import { reloadProfile } from "app/user/thunks"
|
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs"
|
||||||
import { useNow } from "hooks/useNow"
|
|
||||||
import { type ReactNode, useState } from "react"
|
import { type ReactNode, useState } from "react"
|
||||||
import {
|
import {
|
||||||
TbChartLine,
|
TbChartLine,
|
||||||
@@ -36,6 +29,13 @@ import {
|
|||||||
TbUsers,
|
TbUsers,
|
||||||
TbWorldDownload,
|
TbWorldDownload,
|
||||||
} from "react-icons/tb"
|
} from "react-icons/tb"
|
||||||
|
import { client } from "@/app/client"
|
||||||
|
import { redirectToAbout, redirectToAdminUsers, redirectToDonate, redirectToMetrics, redirectToSettings } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import type { ViewMode } from "@/app/types"
|
||||||
|
import { setFontSizePercentage, setViewMode } from "@/app/user/slice"
|
||||||
|
import { reloadProfile } from "@/app/user/thunks"
|
||||||
|
import { useNow } from "@/hooks/useNow"
|
||||||
|
|
||||||
interface ProfileMenuProps {
|
interface ProfileMenuProps {
|
||||||
control: React.ReactElement
|
control: React.ReactElement
|
||||||
@@ -94,7 +94,7 @@ const viewModeData: ViewModeControlItem[] = [
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
export function ProfileMenu(props: ProfileMenuProps) {
|
export function ProfileMenu(props: Readonly<ProfileMenuProps>) {
|
||||||
const [opened, setOpened] = useState(false)
|
const [opened, setOpened] = useState(false)
|
||||||
const now = useNow()
|
const now = useNow()
|
||||||
const profile = useAppSelector(state => state.user.profile)
|
const profile = useAppSelector(state => state.user.profile)
|
||||||
@@ -145,7 +145,7 @@ export function ProfileMenu(props: ProfileMenuProps) {
|
|||||||
color: "green",
|
color: "green",
|
||||||
autoClose: 1000,
|
autoClose: 1000,
|
||||||
})
|
})
|
||||||
} catch (_) {
|
} catch {
|
||||||
showNotification({
|
showNotification({
|
||||||
message: <Trans>Force fetching feeds is not yet available.</Trans>,
|
message: <Trans>Force fetching feeds is not yet available.</Trans>,
|
||||||
color: "red",
|
color: "red",
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { NumberFormatter } from "@mantine/core"
|
import { NumberFormatter } from "@mantine/core"
|
||||||
import type { MetricGauge } from "app/types"
|
import type { MetricGauge } from "@/app/types"
|
||||||
|
|
||||||
interface MeterProps {
|
interface GaugeProps {
|
||||||
gauge: MetricGauge
|
gauge: MetricGauge
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Gauge(props: MeterProps) {
|
export function Gauge(props: Readonly<GaugeProps>) {
|
||||||
return <NumberFormatter value={props.gauge.value} thousandSeparator />
|
return <NumberFormatter value={props.gauge.value} thousandSeparator />
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import type { MetricMeter } from "app/types"
|
import type { MetricMeter } from "@/app/types"
|
||||||
|
|
||||||
interface MeterProps {
|
interface MeterProps {
|
||||||
meter: MetricMeter
|
meter: MetricMeter
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Meter(props: MeterProps) {
|
export function Meter(props: Readonly<MeterProps>) {
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Box>Mean: {props.meter.mean_rate.toFixed(2)}</Box>
|
<Box>Mean: {props.meter.mean_rate.toFixed(2)}</Box>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ interface MetricAccordionItemProps {
|
|||||||
children: React.ReactNode
|
children: React.ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
export function MetricAccordionItem({ metricKey, name, headerValue, children }: MetricAccordionItemProps) {
|
export function MetricAccordionItem({ metricKey, name, headerValue, children }: Readonly<MetricAccordionItemProps>) {
|
||||||
return (
|
return (
|
||||||
<Accordion.Item value={metricKey} key={metricKey}>
|
<Accordion.Item value={metricKey} key={metricKey}>
|
||||||
<Accordion.Control>
|
<Accordion.Control>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import type { MetricTimer } from "app/types"
|
import type { MetricTimer } from "@/app/types"
|
||||||
|
|
||||||
interface MetricTimerProps {
|
interface MetricTimerProps {
|
||||||
timer: MetricTimer
|
timer: MetricTimer
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Timer(props: MetricTimerProps) {
|
export function Timer(props: Readonly<MetricTimerProps>) {
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Box>Mean: {props.timer.mean_rate.toFixed(2)}</Box>
|
<Box>Mean: {props.timer.mean_rate.toFixed(2)}</Box>
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import type React from "react"
|
import type React from "react"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
|
|
||||||
export function OnDesktop(props: { children: React.ReactNode }) {
|
export function OnDesktop(
|
||||||
|
props: Readonly<{
|
||||||
|
children: React.ReactNode
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const mobile = useMobile()
|
const mobile = useMobile()
|
||||||
return <Box>{!mobile && props.children}</Box>
|
return <Box>{!mobile && props.children}</Box>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
import { Box } from "@mantine/core"
|
import { Box } from "@mantine/core"
|
||||||
import { useMobile } from "hooks/useMobile"
|
|
||||||
import type React from "react"
|
import type React from "react"
|
||||||
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
|
|
||||||
export function OnMobile(props: { children: React.ReactNode }) {
|
export function OnMobile(
|
||||||
|
props: Readonly<{
|
||||||
|
children: React.ReactNode
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const mobile = useMobile()
|
const mobile = useMobile()
|
||||||
return <Box>{mobile && props.children}</Box>
|
return <Box>{mobile && props.children}</Box>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Button, Group, Stack } from "@mantine/core"
|
import { Anchor, Box, Button, Group, Stack } from "@mantine/core"
|
||||||
import { useForm } from "@mantine/form"
|
import { useForm } from "@mantine/form"
|
||||||
import { client, errorToStrings } from "app/client"
|
|
||||||
import { redirectToSelectedSource } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import { Alert } from "components/Alert"
|
|
||||||
import { CodeEditor } from "components/code/CodeEditor"
|
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
import { useAsyncCallback } from "react-async-hook"
|
import { useAsyncCallback } from "react-async-hook"
|
||||||
import { TbDeviceFloppy } from "react-icons/tb"
|
import { TbDeviceFloppy } from "react-icons/tb"
|
||||||
|
import { client, errorToStrings } from "@/app/client"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
|
import { redirectToSelectedSource } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import { Alert } from "@/components/Alert"
|
||||||
|
import { CodeEditor } from "@/components/code/CodeEditor"
|
||||||
|
|
||||||
interface FormData {
|
interface FormData {
|
||||||
customCss: string
|
customCss: string
|
||||||
@@ -57,13 +58,23 @@ export function CustomCodeSettings() {
|
|||||||
<form onSubmit={form.onSubmit(saveCustomCode.execute)}>
|
<form onSubmit={form.onSubmit(saveCustomCode.execute)}>
|
||||||
<Stack>
|
<Stack>
|
||||||
<CodeEditor
|
<CodeEditor
|
||||||
description={<Trans>Custom CSS rules that will be applied</Trans>}
|
label={<Trans>Custom CSS rules that will be applied</Trans>}
|
||||||
|
description={
|
||||||
|
<Anchor
|
||||||
|
href={Constants.customCssDocumentationUrl}
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
style={{ fontSize: "inherit" }}
|
||||||
|
>
|
||||||
|
<Trans>Link to the documentation</Trans>
|
||||||
|
</Anchor>
|
||||||
|
}
|
||||||
language="css"
|
language="css"
|
||||||
{...form.getInputProps("customCss")}
|
{...form.getInputProps("customCss")}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<CodeEditor
|
<CodeEditor
|
||||||
description={<Trans>Custom JS code that will be executed on page load</Trans>}
|
label={<Trans>Custom JS code that will be executed on page load</Trans>}
|
||||||
language="javascript"
|
language="javascript"
|
||||||
{...form.getInputProps("customJs")}
|
{...form.getInputProps("customJs")}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -3,15 +3,18 @@ import { useLingui } from "@lingui/react"
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Divider, Group, NumberInput, Radio, Select, type SelectProps, SimpleGrid, Stack, Switch } from "@mantine/core"
|
import { Box, Divider, Group, NumberInput, Radio, Select, type SelectProps, SimpleGrid, Stack, Switch } from "@mantine/core"
|
||||||
import type { ComboboxData } from "@mantine/core/lib/components/Combobox/Combobox.types"
|
import type { ComboboxData } from "@mantine/core/lib/components/Combobox/Combobox.types"
|
||||||
import { Constants } from "app/constants"
|
import type { ReactNode } from "react"
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
import { Constants } from "@/app/constants"
|
||||||
import type { IconDisplayMode, ScrollMode, SharingSettings } from "app/types"
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import type { IconDisplayMode, ScrollMode, SharingSettings } from "@/app/types"
|
||||||
import {
|
import {
|
||||||
changeCustomContextMenu,
|
changeCustomContextMenu,
|
||||||
|
changeDisablePullToRefresh,
|
||||||
changeEntriesToKeepOnTopWhenScrolling,
|
changeEntriesToKeepOnTopWhenScrolling,
|
||||||
changeExternalLinkIconDisplayMode,
|
changeExternalLinkIconDisplayMode,
|
||||||
changeLanguage,
|
changeLanguage,
|
||||||
changeMarkAllAsReadConfirmation,
|
changeMarkAllAsReadConfirmation,
|
||||||
|
changeMarkAllAsReadNavigateToUnread,
|
||||||
changeMobileFooter,
|
changeMobileFooter,
|
||||||
changePrimaryColor,
|
changePrimaryColor,
|
||||||
changeScrollMarks,
|
changeScrollMarks,
|
||||||
@@ -22,9 +25,8 @@ import {
|
|||||||
changeStarIconDisplayMode,
|
changeStarIconDisplayMode,
|
||||||
changeUnreadCountFavicon,
|
changeUnreadCountFavicon,
|
||||||
changeUnreadCountTitle,
|
changeUnreadCountTitle,
|
||||||
} from "app/user/thunks"
|
} from "@/app/user/thunks"
|
||||||
import { locales } from "i18n"
|
import { locales } from "@/i18n"
|
||||||
import type { ReactNode } from "react"
|
|
||||||
|
|
||||||
export function DisplaySettings() {
|
export function DisplaySettings() {
|
||||||
const language = useAppSelector(state => state.user.settings?.language)
|
const language = useAppSelector(state => state.user.settings?.language)
|
||||||
@@ -36,10 +38,12 @@ export function DisplaySettings() {
|
|||||||
const starIconDisplayMode = useAppSelector(state => state.user.settings?.starIconDisplayMode)
|
const starIconDisplayMode = useAppSelector(state => state.user.settings?.starIconDisplayMode)
|
||||||
const externalLinkIconDisplayMode = useAppSelector(state => state.user.settings?.externalLinkIconDisplayMode)
|
const externalLinkIconDisplayMode = useAppSelector(state => state.user.settings?.externalLinkIconDisplayMode)
|
||||||
const markAllAsReadConfirmation = useAppSelector(state => state.user.settings?.markAllAsReadConfirmation)
|
const markAllAsReadConfirmation = useAppSelector(state => state.user.settings?.markAllAsReadConfirmation)
|
||||||
|
const markAllAsReadNavigateToNextUnread = useAppSelector(state => state.user.settings?.markAllAsReadNavigateToNextUnread)
|
||||||
const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu)
|
const customContextMenu = useAppSelector(state => state.user.settings?.customContextMenu)
|
||||||
const mobileFooter = useAppSelector(state => state.user.settings?.mobileFooter)
|
const mobileFooter = useAppSelector(state => state.user.settings?.mobileFooter)
|
||||||
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
|
const unreadCountTitle = useAppSelector(state => state.user.settings?.unreadCountTitle)
|
||||||
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
|
const unreadCountFavicon = useAppSelector(state => state.user.settings?.unreadCountFavicon)
|
||||||
|
const disablePullToRefresh = useAppSelector(state => state.user.settings?.disablePullToRefresh)
|
||||||
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
|
const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings)
|
||||||
const primaryColor = useAppSelector(state => state.user.settings?.primaryColor) || Constants.theme.defaultPrimaryColor
|
const primaryColor = useAppSelector(state => state.user.settings?.primaryColor) || Constants.theme.defaultPrimaryColor
|
||||||
const { _ } = useLingui()
|
const { _ } = useLingui()
|
||||||
@@ -127,6 +131,12 @@ export function DisplaySettings() {
|
|||||||
onChange={async e => await dispatch(changeMarkAllAsReadConfirmation(e.currentTarget.checked))}
|
onChange={async e => await dispatch(changeMarkAllAsReadConfirmation(e.currentTarget.checked))}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
label={<Trans>Navigate to the next category/feed with unread entries when marking all entries as read</Trans>}
|
||||||
|
checked={markAllAsReadNavigateToNextUnread}
|
||||||
|
onChange={async e => await dispatch(changeMarkAllAsReadNavigateToUnread(e.currentTarget.checked))}
|
||||||
|
/>
|
||||||
|
|
||||||
<Switch
|
<Switch
|
||||||
label={<Trans>On mobile, show action buttons at the bottom of the screen</Trans>}
|
label={<Trans>On mobile, show action buttons at the bottom of the screen</Trans>}
|
||||||
checked={mobileFooter}
|
checked={mobileFooter}
|
||||||
@@ -203,6 +213,13 @@ export function DisplaySettings() {
|
|||||||
onChange={async e => await dispatch(changeScrollMarks(e.currentTarget.checked))}
|
onChange={async e => await dispatch(changeScrollMarks(e.currentTarget.checked))}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
label={<Trans>Disable "Pull to refresh" browser behavior</Trans>}
|
||||||
|
description={<Trans>This setting can cause scrolling issues on some browsers (e.g. Safari)</Trans>}
|
||||||
|
checked={disablePullToRefresh}
|
||||||
|
onChange={async e => await dispatch(changeDisablePullToRefresh(e.currentTarget.checked))}
|
||||||
|
/>
|
||||||
|
|
||||||
<Divider label={<Trans>Sharing sites</Trans>} labelPosition="center" />
|
<Divider label={<Trans>Sharing sites</Trans>} labelPosition="center" />
|
||||||
|
|
||||||
<SimpleGrid cols={2}>
|
<SimpleGrid cols={2}>
|
||||||
|
|||||||
@@ -4,15 +4,15 @@ import { Trans } from "@lingui/react/macro"
|
|||||||
import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core"
|
import { Anchor, Box, Button, Checkbox, Divider, Group, Input, PasswordInput, Stack, Text, TextInput } from "@mantine/core"
|
||||||
import { useForm } from "@mantine/form"
|
import { useForm } from "@mantine/form"
|
||||||
import { openConfirmModal } from "@mantine/modals"
|
import { openConfirmModal } from "@mantine/modals"
|
||||||
import { client, errorToStrings } from "app/client"
|
|
||||||
import { redirectToLogin, redirectToSelectedSource } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import type { ProfileModificationRequest } from "app/types"
|
|
||||||
import { reloadProfile } from "app/user/thunks"
|
|
||||||
import { Alert } from "components/Alert"
|
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
import { useAsyncCallback } from "react-async-hook"
|
import { useAsyncCallback } from "react-async-hook"
|
||||||
import { TbDeviceFloppy, TbTrash } from "react-icons/tb"
|
import { TbDeviceFloppy, TbTrash } from "react-icons/tb"
|
||||||
|
import { client, errorToStrings } from "@/app/client"
|
||||||
|
import { redirectToLogin, redirectToSelectedSource } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import type { ProfileModificationRequest } from "@/app/types"
|
||||||
|
import { reloadProfile } from "@/app/user/thunks"
|
||||||
|
import { Alert } from "@/components/Alert"
|
||||||
|
|
||||||
interface FormData extends ProfileModificationRequest {
|
interface FormData extends ProfileModificationRequest {
|
||||||
newPasswordConfirmation?: string
|
newPasswordConfirmation?: string
|
||||||
@@ -20,6 +20,7 @@ interface FormData extends ProfileModificationRequest {
|
|||||||
|
|
||||||
export function ProfileSettings() {
|
export function ProfileSettings() {
|
||||||
const profile = useAppSelector(state => state.user.profile)
|
const profile = useAppSelector(state => state.user.profile)
|
||||||
|
const serverInfos = useAppSelector(state => state.server.serverInfos)
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const { _ } = useLingui()
|
const { _ } = useLingui()
|
||||||
|
|
||||||
@@ -52,7 +53,9 @@ export function ProfileSettings() {
|
|||||||
),
|
),
|
||||||
labels: { confirm: <Trans>Confirm</Trans>, cancel: <Trans>Cancel</Trans> },
|
labels: { confirm: <Trans>Confirm</Trans>, cancel: <Trans>Cancel</Trans> },
|
||||||
confirmProps: { color: "red" },
|
confirmProps: { color: "red" },
|
||||||
onConfirm: async () => await deleteProfile.execute(),
|
onConfirm: () => {
|
||||||
|
deleteProfile.execute()
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -132,7 +135,12 @@ export function ProfileSettings() {
|
|||||||
required
|
required
|
||||||
{...form.getInputProps("currentPassword")}
|
{...form.getInputProps("currentPassword")}
|
||||||
/>
|
/>
|
||||||
<TextInput type="email" label={<Trans>E-mail</Trans>} {...form.getInputProps("email")} required />
|
<TextInput
|
||||||
|
type="email"
|
||||||
|
label={<Trans>E-mail</Trans>}
|
||||||
|
{...form.getInputProps("email")}
|
||||||
|
required={serverInfos?.emailAddressRequired}
|
||||||
|
/>
|
||||||
<PasswordInput
|
<PasswordInput
|
||||||
label={<Trans>New password</Trans>}
|
label={<Trans>New password</Trans>}
|
||||||
description={<Trans>Changing password will generate a new API key</Trans>}
|
description={<Trans>Changing password will generate a new API key</Trans>}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { Box, Stack } from "@mantine/core"
|
import { Box, Stack } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
import React from "react"
|
||||||
|
import { TbChevronDown, TbChevronRight, TbInbox, TbStar, TbTag } from "react-icons/tb"
|
||||||
|
import { Constants } from "@/app/constants"
|
||||||
import {
|
import {
|
||||||
redirectToCategory,
|
redirectToCategory,
|
||||||
redirectToCategoryDetails,
|
redirectToCategoryDetails,
|
||||||
@@ -8,15 +10,14 @@ import {
|
|||||||
redirectToFeedDetails,
|
redirectToFeedDetails,
|
||||||
redirectToTag,
|
redirectToTag,
|
||||||
redirectToTagDetails,
|
redirectToTagDetails,
|
||||||
} from "app/redirect/thunks"
|
} from "@/app/redirect/thunks"
|
||||||
import { useAppDispatch, useAppSelector } from "app/store"
|
import { useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
import { collapseTreeCategory } from "app/tree/thunks"
|
import type { TreeSubscription } from "@/app/tree/slice"
|
||||||
import type { Category, Subscription } from "app/types"
|
import { collapseTreeCategory } from "@/app/tree/thunks"
|
||||||
import { categoryUnreadCount, flattenCategoryTree } from "app/utils"
|
import type { Category, Subscription } from "@/app/types"
|
||||||
import { Loader } from "components/Loader"
|
import { categoryHasNewEntries, categoryUnreadCount, flattenCategoryTree } from "@/app/utils"
|
||||||
import { OnDesktop } from "components/responsive/OnDesktop"
|
import { Loader } from "@/components/Loader"
|
||||||
import React from "react"
|
import { OnDesktop } from "@/components/responsive/OnDesktop"
|
||||||
import { TbChevronDown, TbChevronRight, TbInbox, TbStar, TbTag } from "react-icons/tb"
|
|
||||||
import { TreeNode } from "./TreeNode"
|
import { TreeNode } from "./TreeNode"
|
||||||
import { TreeSearch } from "./TreeSearch"
|
import { TreeSearch } from "./TreeSearch"
|
||||||
|
|
||||||
@@ -89,6 +90,7 @@ export function Tree() {
|
|||||||
name={<Trans>All</Trans>}
|
name={<Trans>All</Trans>}
|
||||||
icon={allIcon}
|
icon={allIcon}
|
||||||
unread={categoryUnreadCount(root)}
|
unread={categoryUnreadCount(root)}
|
||||||
|
hasNewEntries={categoryHasNewEntries(root)}
|
||||||
selected={source.type === "category" && source.id === Constants.categories.all.id}
|
selected={source.type === "category" && source.id === Constants.categories.all.id}
|
||||||
expanded={false}
|
expanded={false}
|
||||||
level={0}
|
level={0}
|
||||||
@@ -103,6 +105,7 @@ export function Tree() {
|
|||||||
name={<Trans>Starred</Trans>}
|
name={<Trans>Starred</Trans>}
|
||||||
icon={starredIcon}
|
icon={starredIcon}
|
||||||
unread={0}
|
unread={0}
|
||||||
|
hasNewEntries={false}
|
||||||
selected={source.type === "category" && source.id === Constants.categories.starred.id}
|
selected={source.type === "category" && source.id === Constants.categories.starred.id}
|
||||||
expanded={false}
|
expanded={false}
|
||||||
level={0}
|
level={0}
|
||||||
@@ -122,6 +125,7 @@ export function Tree() {
|
|||||||
name={category.name}
|
name={category.name}
|
||||||
icon={category.expanded ? expandedIcon : collapsedIcon}
|
icon={category.expanded ? expandedIcon : collapsedIcon}
|
||||||
unread={categoryUnreadCount(category)}
|
unread={categoryUnreadCount(category)}
|
||||||
|
hasNewEntries={categoryHasNewEntries(category)}
|
||||||
selected={source.type === "category" && source.id === category.id}
|
selected={source.type === "category" && source.id === category.id}
|
||||||
expanded={category.expanded}
|
expanded={category.expanded}
|
||||||
level={level}
|
level={level}
|
||||||
@@ -133,7 +137,7 @@ export function Tree() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const feedNode = (feed: Subscription, level = 0) => {
|
const feedNode = (feed: TreeSubscription, level = 0) => {
|
||||||
if (!isFeedDisplayed(feed)) return null
|
if (!isFeedDisplayed(feed)) return null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -143,6 +147,7 @@ export function Tree() {
|
|||||||
name={feed.name}
|
name={feed.name}
|
||||||
icon={feed.iconUrl}
|
icon={feed.iconUrl}
|
||||||
unread={feed.unread}
|
unread={feed.unread}
|
||||||
|
hasNewEntries={!!feed.hasNewEntries}
|
||||||
selected={source.type === "feed" && source.id === String(feed.id)}
|
selected={source.type === "feed" && source.id === String(feed.id)}
|
||||||
level={level}
|
level={level}
|
||||||
hasError={feed.errorCount > errorThreshold}
|
hasError={feed.errorCount > errorThreshold}
|
||||||
@@ -159,6 +164,7 @@ export function Tree() {
|
|||||||
name={tag}
|
name={tag}
|
||||||
icon={tagIcon}
|
icon={tagIcon}
|
||||||
unread={0}
|
unread={0}
|
||||||
|
hasNewEntries={false}
|
||||||
selected={source.type === "tag" && source.id === tag}
|
selected={source.type === "tag" && source.id === tag}
|
||||||
level={0}
|
level={0}
|
||||||
hasError={false}
|
hasError={false}
|
||||||
@@ -182,7 +188,7 @@ export function Tree() {
|
|||||||
<OnDesktop>
|
<OnDesktop>
|
||||||
<TreeSearch feeds={feeds} />
|
<TreeSearch feeds={feeds} />
|
||||||
</OnDesktop>
|
</OnDesktop>
|
||||||
<Box>
|
<Box className="cf-tree">
|
||||||
{allCategoryNode()}
|
{allCategoryNode()}
|
||||||
{starredCategoryNode()}
|
{starredCategoryNode()}
|
||||||
{root.children.map(c => recursiveCategoryNode(c))}
|
{root.children.map(c => recursiveCategoryNode(c))}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Box, Center } from "@mantine/core"
|
import { Box, Center } from "@mantine/core"
|
||||||
import type { EntrySourceType } from "app/entries/slice"
|
|
||||||
import { FeedFavicon } from "components/content/FeedFavicon"
|
|
||||||
import type React from "react"
|
import type React from "react"
|
||||||
import { tss } from "tss"
|
import type { EntrySourceType } from "@/app/entries/slice"
|
||||||
|
import { FeedFavicon } from "@/components/content/FeedFavicon"
|
||||||
|
import { tss } from "@/tss"
|
||||||
import { UnreadCount } from "./UnreadCount"
|
import { UnreadCount } from "./UnreadCount"
|
||||||
|
|
||||||
interface TreeNodeProps {
|
interface TreeNodeProps {
|
||||||
@@ -15,6 +15,7 @@ interface TreeNodeProps {
|
|||||||
expanded?: boolean
|
expanded?: boolean
|
||||||
level: number
|
level: number
|
||||||
hasError: boolean
|
hasError: boolean
|
||||||
|
hasNewEntries: boolean
|
||||||
onClick: (e: React.MouseEvent, id: string) => void
|
onClick: (e: React.MouseEvent, id: string) => void
|
||||||
onIconClick?: (e: React.MouseEvent, id: string) => void
|
onIconClick?: (e: React.MouseEvent, id: string) => void
|
||||||
}
|
}
|
||||||
@@ -58,7 +59,7 @@ const useStyles = tss
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export function TreeNode(props: TreeNodeProps) {
|
export function TreeNode(props: Readonly<TreeNodeProps>) {
|
||||||
const { classes } = useStyles({
|
const { classes } = useStyles({
|
||||||
selected: props.selected,
|
selected: props.selected,
|
||||||
hasError: props.hasError,
|
hasError: props.hasError,
|
||||||
@@ -68,19 +69,19 @@ export function TreeNode(props: TreeNodeProps) {
|
|||||||
<Box
|
<Box
|
||||||
py={1}
|
py={1}
|
||||||
pl={props.level * 20}
|
pl={props.level * 20}
|
||||||
className={classes.node}
|
className={`${classes.node} cf-treenode cf-treenode-${props.type}`}
|
||||||
onClick={(e: React.MouseEvent) => props.onClick(e, props.id)}
|
onClick={(e: React.MouseEvent) => props.onClick(e, props.id)}
|
||||||
data-id={props.id}
|
data-id={props.id}
|
||||||
data-type={props.type}
|
data-type={props.type}
|
||||||
data-unread-count={props.unread}
|
data-unread-count={props.unread}
|
||||||
>
|
>
|
||||||
<Box mr={6} onClick={(e: React.MouseEvent) => props.onIconClick?.(e, props.id)}>
|
<Box mr={6} onClick={(e: React.MouseEvent) => props.onIconClick?.(e, props.id)} className="cf-treenode-icon">
|
||||||
<Center>{typeof props.icon === "string" ? <FeedFavicon url={props.icon} /> : props.icon}</Center>
|
<Center>{typeof props.icon === "string" ? <FeedFavicon url={props.icon} /> : props.icon}</Center>
|
||||||
</Box>
|
</Box>
|
||||||
<Box className={classes.nodeText}>{props.name}</Box>
|
<Box className={classes.nodeText}>{props.name}</Box>
|
||||||
{!props.expanded && (
|
{!props.expanded && (
|
||||||
<Box>
|
<Box className="cf-treenode-unread-count">
|
||||||
<UnreadCount unreadCount={props.unread} />
|
<UnreadCount unreadCount={props.unread} showIndicator={props.hasNewEntries} />
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
import { msg } from "@lingui/core/macro"
|
import { msg } from "@lingui/core/macro"
|
||||||
import { useLingui } from "@lingui/react"
|
import { useLingui } from "@lingui/react"
|
||||||
import { Trans } from "@lingui/react/macro"
|
import { Trans } from "@lingui/react/macro"
|
||||||
import { TextInput } from "@mantine/core"
|
import { Box, TextInput } from "@mantine/core"
|
||||||
import { Spotlight, type SpotlightActionData, spotlight } from "@mantine/spotlight"
|
import { Spotlight, type SpotlightActionData, spotlight } from "@mantine/spotlight"
|
||||||
import { redirectToFeed } from "app/redirect/thunks"
|
|
||||||
import { useAppDispatch } from "app/store"
|
|
||||||
import type { Subscription } from "app/types"
|
|
||||||
import { FeedFavicon } from "components/content/FeedFavicon"
|
|
||||||
import { useMousetrap } from "hooks/useMousetrap"
|
|
||||||
import { TbSearch } from "react-icons/tb"
|
import { TbSearch } from "react-icons/tb"
|
||||||
|
import { redirectToFeed } from "@/app/redirect/thunks"
|
||||||
|
import { useAppDispatch } from "@/app/store"
|
||||||
|
import type { Subscription } from "@/app/types"
|
||||||
|
import { FeedFavicon } from "@/components/content/FeedFavicon"
|
||||||
|
import { useMousetrap } from "@/hooks/useMousetrap"
|
||||||
|
|
||||||
export interface TreeSearchProps {
|
export interface TreeSearchProps {
|
||||||
feeds: Subscription[]
|
feeds: Subscription[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export function TreeSearch(props: TreeSearchProps) {
|
export function TreeSearch(props: Readonly<TreeSearchProps>) {
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
const { _ } = useLingui()
|
const { _ } = useLingui()
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ export function TreeSearch(props: TreeSearchProps) {
|
|||||||
useMousetrap("g u", () => spotlight.open())
|
useMousetrap("g u", () => spotlight.open())
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<Box className="cf-treesearch">
|
||||||
<TextInput
|
<TextInput
|
||||||
placeholder={_(msg`Search`)}
|
placeholder={_(msg`Search`)}
|
||||||
leftSection={searchIcon}
|
leftSection={searchIcon}
|
||||||
@@ -58,6 +58,6 @@ export function TreeSearch(props: TreeSearchProps) {
|
|||||||
}}
|
}}
|
||||||
nothingFound={<Trans>Nothing found</Trans>}
|
nothingFound={<Trans>Nothing found</Trans>}
|
||||||
/>
|
/>
|
||||||
</>
|
</Box>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Badge, Tooltip } from "@mantine/core"
|
import { Badge, Indicator, Tooltip } from "@mantine/core"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
import { tss } from "tss"
|
import { tss } from "@/tss"
|
||||||
|
|
||||||
const useStyles = tss.create(() => ({
|
const useStyles = tss.create(() => ({
|
||||||
badge: {
|
badge: {
|
||||||
@@ -10,7 +10,12 @@ const useStyles = tss.create(() => ({
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
export function UnreadCount(props: { unreadCount: number }) {
|
export function UnreadCount(
|
||||||
|
props: Readonly<{
|
||||||
|
unreadCount: number
|
||||||
|
showIndicator: boolean
|
||||||
|
}>
|
||||||
|
) {
|
||||||
const { classes } = useStyles()
|
const { classes } = useStyles()
|
||||||
|
|
||||||
if (props.unreadCount <= 0) return null
|
if (props.unreadCount <= 0) return null
|
||||||
@@ -18,9 +23,11 @@ export function UnreadCount(props: { unreadCount: number }) {
|
|||||||
const count = props.unreadCount >= 10000 ? "10k+" : props.unreadCount
|
const count = props.unreadCount >= 10000 ? "10k+" : props.unreadCount
|
||||||
return (
|
return (
|
||||||
<Tooltip label={props.unreadCount} disabled={props.unreadCount === count} openDelay={Constants.tooltip.delay}>
|
<Tooltip label={props.unreadCount} disabled={props.unreadCount === count} openDelay={Constants.tooltip.delay}>
|
||||||
<Badge className={classes.badge} variant="light" fullWidth>
|
<Indicator disabled={!props.showIndicator} size={4} offset={10} position="middle-start">
|
||||||
{count}
|
<Badge className={`${classes.badge} cf-badge`} variant="light" fullWidth>
|
||||||
</Badge>
|
{count}
|
||||||
|
</Badge>
|
||||||
|
</Indicator>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useMantineTheme } from "@mantine/core"
|
import { useMantineTheme } from "@mantine/core"
|
||||||
import { useMobile } from "hooks/useMobile"
|
import { useMobile } from "@/hooks/useMobile"
|
||||||
|
|
||||||
export const useActionButton = () => {
|
export const useActionButton = () => {
|
||||||
const theme = useMantineTheme()
|
const theme = useMantineTheme()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { msg } from "@lingui/core/macro"
|
import { msg } from "@lingui/core/macro"
|
||||||
import { useLingui } from "@lingui/react"
|
import { useLingui } from "@lingui/react"
|
||||||
import { useAppSelector } from "app/store"
|
import { useAppSelector } from "@/app/store"
|
||||||
|
|
||||||
interface Step {
|
interface Step {
|
||||||
label: string
|
label: string
|
||||||
@@ -8,28 +8,28 @@ interface Step {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const useAppLoading = () => {
|
export const useAppLoading = () => {
|
||||||
const profile = useAppSelector(state => state.user.profile)
|
const profileLoaded = useAppSelector(state => !!state.user.profile)
|
||||||
const settings = useAppSelector(state => state.user.settings)
|
const settingsLoaded = useAppSelector(state => !!state.user.settings)
|
||||||
const rootCategory = useAppSelector(state => state.tree.rootCategory)
|
const rootCategoryLoaded = useAppSelector(state => !!state.tree.rootCategory)
|
||||||
const tags = useAppSelector(state => state.user.tags)
|
const tagsLoaded = useAppSelector(state => !!state.user.tags)
|
||||||
const { _ } = useLingui()
|
const { _ } = useLingui()
|
||||||
|
|
||||||
const steps: Step[] = [
|
const steps: Step[] = [
|
||||||
{
|
{
|
||||||
label: _(msg`Loading settings...`),
|
label: _(msg`Loading settings...`),
|
||||||
done: !!settings,
|
done: settingsLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: _(msg`Loading profile...`),
|
label: _(msg`Loading profile...`),
|
||||||
done: !!profile,
|
done: profileLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: _(msg`Loading subscriptions...`),
|
label: _(msg`Loading subscriptions...`),
|
||||||
done: !!rootCategory,
|
done: rootCategoryLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: _(msg`Loading tags...`),
|
label: _(msg`Loading tags...`),
|
||||||
done: !!tags,
|
done: tagsLoaded,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useMediaQuery } from "@mantine/hooks"
|
import { useMediaQuery } from "@mantine/hooks"
|
||||||
import { Constants } from "app/constants"
|
import { Constants } from "@/app/constants"
|
||||||
|
|
||||||
export const useMobile = (breakpoint: string | number = Constants.layout.mobileBreakpoint) => {
|
export const useMobile = (breakpoint: string | number = Constants.layout.mobileBreakpoint) => {
|
||||||
const bp = typeof breakpoint === "number" ? `${breakpoint}px` : breakpoint
|
const bp = typeof breakpoint === "number" ? `${breakpoint}px` : breakpoint
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { setWebSocketConnected } from "app/server/slice"
|
|
||||||
import { type AppDispatch, useAppDispatch, useAppSelector } from "app/store"
|
|
||||||
import { newFeedEntriesDiscovered } from "app/tree/thunks"
|
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
import WebsocketHeartbeatJs from "websocket-heartbeat-js"
|
import WebsocketHeartbeatJs from "websocket-heartbeat-js"
|
||||||
|
import { setWebSocketConnected } from "@/app/server/slice"
|
||||||
|
import { type AppDispatch, useAppDispatch, useAppSelector } from "@/app/store"
|
||||||
|
import { newFeedEntriesDiscovered } from "@/app/tree/thunks"
|
||||||
|
|
||||||
const handleMessage = (dispatch: AppDispatch, message: string) => {
|
const handleMessage = (dispatch: AppDispatch, message: string) => {
|
||||||
const parts = message.split(":")
|
const parts = message.split(":")
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { type Messages, i18n } from "@lingui/core"
|
import { i18n, type Messages } from "@lingui/core"
|
||||||
import { useAppSelector } from "app/store"
|
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs"
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
|
import { useAppSelector } from "@/app/store"
|
||||||
|
|
||||||
interface Locale {
|
interface Locale {
|
||||||
key: string
|
key: string
|
||||||
@@ -12,34 +12,146 @@ interface Locale {
|
|||||||
// add an object to the array to add a new locale
|
// add an object to the array to add a new locale
|
||||||
// don't forget to also add it to the 'locales' array in lingui.config.ts
|
// don't forget to also add it to the 'locales' array in lingui.config.ts
|
||||||
export const locales: Locale[] = [
|
export const locales: Locale[] = [
|
||||||
{ key: "ar", label: "العربية", dayjsImportFn: async () => await import("dayjs/locale/ar") },
|
{
|
||||||
{ key: "ca", label: "Català", dayjsImportFn: async () => await import("dayjs/locale/ca") },
|
key: "ar",
|
||||||
{ key: "cs", label: "Čeština", dayjsImportFn: async () => await import("dayjs/locale/cs") },
|
label: "العربية",
|
||||||
{ key: "cy", label: "Cymraeg", dayjsImportFn: async () => await import("dayjs/locale/cy") },
|
dayjsImportFn: async () => await import("dayjs/locale/ar"),
|
||||||
{ key: "da", label: "Danish", dayjsImportFn: async () => await import("dayjs/locale/da") },
|
},
|
||||||
{ key: "de", label: "Deutsch", dayjsImportFn: async () => await import("dayjs/locale/de") },
|
{
|
||||||
{ key: "en", label: "English", dayjsImportFn: async () => await import("dayjs/locale/en") },
|
key: "ca",
|
||||||
{ key: "es", label: "Español", dayjsImportFn: async () => await import("dayjs/locale/es") },
|
label: "Català",
|
||||||
{ key: "fa", label: "فارسی", dayjsImportFn: async () => await import("dayjs/locale/fa") },
|
dayjsImportFn: async () => await import("dayjs/locale/ca"),
|
||||||
{ key: "fi", label: "Suomi", dayjsImportFn: async () => await import("dayjs/locale/fi") },
|
},
|
||||||
{ key: "fr", label: "Français", dayjsImportFn: async () => await import("dayjs/locale/fr") },
|
{
|
||||||
{ key: "gl", label: "Galician", dayjsImportFn: async () => await import("dayjs/locale/gl") },
|
key: "cs",
|
||||||
{ key: "hu", label: "Magyar", dayjsImportFn: async () => await import("dayjs/locale/hu") },
|
label: "Čeština",
|
||||||
{ key: "id", label: "Indonesian", dayjsImportFn: async () => await import("dayjs/locale/id") },
|
dayjsImportFn: async () => await import("dayjs/locale/cs"),
|
||||||
{ key: "it", label: "Italiano", dayjsImportFn: async () => await import("dayjs/locale/it") },
|
},
|
||||||
{ key: "ja", label: "日本語", dayjsImportFn: async () => await import("dayjs/locale/ja") },
|
{
|
||||||
{ key: "ko", label: "한국어", dayjsImportFn: async () => await import("dayjs/locale/ko") },
|
key: "cy",
|
||||||
{ key: "ms", label: "Bahasa Malaysian", dayjsImportFn: async () => await import("dayjs/locale/ms") },
|
label: "Cymraeg",
|
||||||
{ key: "nb", label: "Norsk (bokmål)", dayjsImportFn: async () => await import("dayjs/locale/nb") },
|
dayjsImportFn: async () => await import("dayjs/locale/cy"),
|
||||||
{ key: "nl", label: "Nederlands", dayjsImportFn: async () => await import("dayjs/locale/nl") },
|
},
|
||||||
{ key: "nn", label: "Norsk (nynorsk)", dayjsImportFn: async () => await import("dayjs/locale/nn") },
|
{
|
||||||
{ key: "pl", label: "Polski", dayjsImportFn: async () => await import("dayjs/locale/pl") },
|
key: "da",
|
||||||
{ key: "pt", label: "Português", dayjsImportFn: async () => await import("dayjs/locale/pt") },
|
label: "Danish",
|
||||||
{ key: "ru", label: "Русский", dayjsImportFn: async () => await import("dayjs/locale/ru") },
|
dayjsImportFn: async () => await import("dayjs/locale/da"),
|
||||||
{ key: "sk", label: "Slovenčina", dayjsImportFn: async () => await import("dayjs/locale/sk") },
|
},
|
||||||
{ key: "sv", label: "Svenska", dayjsImportFn: async () => await import("dayjs/locale/sv") },
|
{
|
||||||
{ key: "tr", label: "Türkçe", dayjsImportFn: async () => await import("dayjs/locale/tr") },
|
key: "de",
|
||||||
{ key: "zh", label: "简体中文", dayjsImportFn: async () => await import("dayjs/locale/zh") },
|
label: "Deutsch",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/de"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "en",
|
||||||
|
label: "English",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/en"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "es",
|
||||||
|
label: "Español",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/es"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "fa",
|
||||||
|
label: "فارسی",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/fa"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "fi",
|
||||||
|
label: "Suomi",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/fi"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "fr",
|
||||||
|
label: "Français",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/fr"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "gl",
|
||||||
|
label: "Galician",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/gl"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "hu",
|
||||||
|
label: "Magyar",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/hu"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "id",
|
||||||
|
label: "Indonesian",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/id"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "it",
|
||||||
|
label: "Italiano",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/it"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "ja",
|
||||||
|
label: "日本語",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/ja"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "ko",
|
||||||
|
label: "한국어",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/ko"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "ms",
|
||||||
|
label: "Bahasa Malaysian",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/ms"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "nb",
|
||||||
|
label: "Norsk (bokmål)",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/nb"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "nl",
|
||||||
|
label: "Nederlands",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/nl"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "nn",
|
||||||
|
label: "Norsk (nynorsk)",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/nn"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "pl",
|
||||||
|
label: "Polski",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/pl"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "pt",
|
||||||
|
label: "Português",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/pt"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "ru",
|
||||||
|
label: "Русский",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/ru"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "sk",
|
||||||
|
label: "Slovenčina",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/sk"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "sv",
|
||||||
|
label: "Svenska",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/sv"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "tr",
|
||||||
|
label: "Türkçe",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/tr"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "zh",
|
||||||
|
label: "简体中文",
|
||||||
|
dayjsImportFn: async () => await import("dayjs/locale/zh"),
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
function activateLocale(locale: string) {
|
function activateLocale(locale: string) {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
@@ -33,8 +33,8 @@ msgstr ""
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0> هل تحتاج إلى حساب؟ </0> <1> اشترك! </ 1>"
|
msgstr "<0> هل تحتاج إلى حساب؟ </0> <1> اشترك! </ 1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "حول"
|
msgstr "حول"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "إضافة فئة"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "إضافة مستخدم"
|
msgstr "إضافة مستخدم"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "إداري"
|
msgstr "إداري"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "الكل"
|
msgstr "الكل"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "العودة لتسجيل الدخول"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extention"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "إلغاء"
|
msgstr "إلغاء"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "الفئة"
|
msgstr "الفئة"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr ""
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "مضغوط"
|
msgstr "مضغوط"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "تأكيد"
|
msgstr "تأكيد"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "تأكيد كلمة المرور"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "دافئ"
|
msgstr "دافئ"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr "السيطرة"
|
msgstr "السيطرة"
|
||||||
@@ -249,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "تنازلي"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "عرض"
|
msgstr "عرض"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "تنزيل"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "اسحب الرابط إلى شريط الإشارات"
|
msgstr "اسحب الرابط إلى شريط الإشارات"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "البريد الإلكتروني"
|
msgstr "البريد الإلكتروني"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "عنوان البريد الإلكتروني"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "تحرير المستخدم"
|
msgstr "تحرير المستخدم"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "ممكن"
|
msgstr "ممكن"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "موسع"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "قم بتصدير اشتراكاتك وفئاتك كملف OPML يمكن استيراده في خدمات قراءة الأعلاف الأخرى"
|
msgstr "قم بتصدير اشتراكاتك وفئاتك كملف OPML يمكن استيراده في خدمات قراءة الأعلاف الأخرى"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr ""
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "اسم الخلاصة"
|
msgstr "اسم الخلاصة"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "موجز URL"
|
msgstr "موجز URL"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "هل نسيت كلمة المرور؟"
|
msgstr "هل نسيت كلمة المرور؟"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "قم بإنشاء مفتاح API في ملف التعريف الخاص بك أولاً."
|
msgstr "قم بإنشاء مفتاح API في ملف التعريف الخاص بك أولاً."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "قم بإنشاء مفتاح API في ملف التعريف الخاص
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "إنشاء مفتاح API جديد"
|
msgstr "إنشاء مفتاح API جديد"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "رابط الخلاصة المولدة"
|
msgstr "رابط الخلاصة المولدة"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "في العرض الموسع ، التمرير عبر الإدخالات
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "إبقاء غير مقروءة"
|
msgstr "إبقاء غير مقروءة"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "اختصارات لوحة المفاتيح"
|
msgstr "اختصارات لوحة المفاتيح"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr ""
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "رابط"
|
msgstr "رابط"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "تحميل ملف التعريف ..."
|
msgstr "تحميل ملف التعريف ..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "تحميل الاشتراكات ..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "تحميل العلامات ..."
|
msgstr "تحميل العلامات ..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "تسجيل الدخول"
|
msgstr "تسجيل الدخول"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "تسجيل الخروج"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "إدارة المستخدمين"
|
msgstr "إدارة المستخدمين"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "إدارة المستخدمين"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "تعليم الكل كمقروء"
|
msgstr "تعليم الكل كمقروء"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "تعليم كافة الإدخالات كمقروءة"
|
msgstr "تعليم كافة الإدخالات كمقروءة"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "وضع علامة كمقروء"
|
msgstr "وضع علامة كمقروء"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "وضع علامة كمقروءة حتى هنا"
|
msgstr "وضع علامة كمقروءة حتى هنا"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "تحريك الصفحة لأسفل"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "تحريك الصفحة لأعلى"
|
msgstr "تحريك الصفحة لأعلى"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr "لا"
|
msgstr "لا"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "الاسم"
|
msgstr "الاسم"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "الاسم"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "انتقل إلى اشتراك بإدخال اسمه"
|
msgstr "انتقل إلى اشتراك بإدخال اسمه"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "كلمة مرور جديدة"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "الأحدث أولاً"
|
msgstr "الأحدث أولاً"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "التالي"
|
msgstr "التالي"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "والد"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "الفئة الأصل"
|
msgstr "الفئة الأصل"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "كلمة المرور"
|
msgstr "كلمة المرور"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "كلمات المرور غير متطابقة"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "المنـصب"
|
msgstr "المنـصب"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "استعادة كلمة السر"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "تحديث"
|
msgstr "تحديث"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr ""
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "حفظ"
|
msgstr "حفظ"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "قم بالتمرير بسلاسة عند التنقل بين الإدخ
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "بحث"
|
msgstr "بحث"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "يتطلب البحث 3 أحرف على الأقل"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "قم بالتسجيل"
|
msgstr "قم بالتسجيل"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "شيء سيء حدث للتو ..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "فضاء"
|
msgstr "فضاء"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "النجم"
|
msgstr "النجم"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "مميز بنجمة"
|
msgstr "مميز بنجمة"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "اشتراك"
|
msgstr "اشتراك"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "الموضوع"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "تبديل قراءة حالة الإدخال الحالي"
|
msgstr "تبديل قراءة حالة الإدخال الحالي"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr ""
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "غير مقروءة"
|
msgstr "غير مقروءة"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "إلغاء النجم"
|
msgstr "إلغاء النجم"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "إلغاء النجم"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "إلغاء الاشتراك"
|
msgstr "إلغاء الاشتراك"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "اسم المستخدم"
|
msgstr "اسم المستخدم"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "تحذير"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "موقع الكتروني"
|
msgstr "موقع الكتروني"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr "<0>CommaFeed és un projecte de codi obert. El codi font està allotjat a </0><1>GitHub</1>."
|
msgstr "<0>CommaFeed és un projecte de codi obert. El codi font està allotjat a </0><1>GitHub</1>."
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr "<0>La sintaxi completa està disponible </0><1>aquí</1>."
|
msgstr "<0>La sintaxi completa està disponible </0><1>aquí</1><2>.</2>"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "<0>Have an account?</0><1>Log in!</1>"
|
msgid "<0>Have an account?</0><1>Log in!</1>"
|
||||||
@@ -33,8 +33,8 @@ msgstr "<0>Ei,</0><1> sóc la Jérémie de Bèlgica i fa més de 10 anys que tre
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Necessites un compte?</0><1>Registreu-vos!</1>"
|
msgstr "<0>Necessites un compte?</0><1>Registreu-vos!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Sobre"
|
msgstr "Sobre"
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ msgstr "Accions"
|
|||||||
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Afegir"
|
msgstr "Afegeix"
|
||||||
|
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
msgid "Add category"
|
msgid "Add category"
|
||||||
@@ -54,17 +54,22 @@ msgstr "Afegeix categoria"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Afegeix usuari"
|
msgstr "Afegeix usuari"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Administrador"
|
msgstr "Administrador"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tot"
|
msgstr "Tot"
|
||||||
|
|
||||||
@@ -83,7 +88,7 @@ msgstr "Un fitxer opml és un fitxer XML que conté URL i categories de canals.
|
|||||||
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
msgid "Analyze feed"
|
msgid "Analyze feed"
|
||||||
msgstr "Analitzar el feed"
|
msgstr "Analitza el canal"
|
||||||
|
|
||||||
#: src/components/AnnouncementDialog.tsx
|
#: src/components/AnnouncementDialog.tsx
|
||||||
msgid "Announcement"
|
msgid "Announcement"
|
||||||
@@ -91,11 +96,11 @@ msgstr "Anunci"
|
|||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "API key"
|
msgid "API key"
|
||||||
msgstr "clau API"
|
msgstr "Clau API"
|
||||||
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
|
msgid "Are you sure you want to delete category <0>{categoryName}</0>?"
|
||||||
msgstr "Estàs segur que vols suprimir la categoria <0>{categoryName}</0>?"
|
msgstr "Esteu segur que voleu suprimir la categoria <0>{categoryName}</0>?"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Are you sure you want to delete user <0>{userName}</0> ?"
|
msgid "Are you sure you want to delete user <0>{userName}</0> ?"
|
||||||
@@ -115,7 +120,7 @@ msgstr "Esteu segur que voleu marcar les entrades més antigues de {threshold} d
|
|||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?"
|
msgid "Are you sure you want to unsubscribe from <0>{feedName}</0>?"
|
||||||
msgstr "Estàs segur que vols cancel·lar la subscripció a <0>{feedName}</0>?"
|
msgstr "Esteu segur que voleu cancel·lar la subscripció a <0>{feedName}</0>?"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
msgid "Asc"
|
msgid "Asc"
|
||||||
@@ -131,45 +136,45 @@ msgstr "Enrere"
|
|||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "Back to log in"
|
msgid "Back to log in"
|
||||||
msgstr "Tornar a iniciar sessió"
|
msgstr "Torna a iniciar sessió"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr "Blau"
|
||||||
|
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
|
msgid "Browser extension"
|
||||||
|
msgstr "Extensió del navegador"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr "Extensió del navegador necessària per a Chrome"
|
msgstr "Extensió del navegador necessària per a Chrome"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
msgid "Browser extention"
|
|
||||||
msgstr "Extensió del navegador"
|
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr "Pestanya del navegador"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel·la"
|
msgstr "Cancel·la"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Categoria"
|
msgstr "Categoria"
|
||||||
|
|
||||||
@@ -187,7 +192,7 @@ msgstr "Tanca el menu"
|
|||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Cmd"
|
msgid "Cmd"
|
||||||
msgstr ""
|
msgstr "Cmd"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "CommaFeed browser extension version {browserExtensionVersion}."
|
msgid "CommaFeed browser extension version {browserExtensionVersion}."
|
||||||
@@ -209,11 +214,11 @@ msgstr "CommaFeed versió {version} ({version})."
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Compacte"
|
msgstr "Compacte"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Confirma"
|
msgstr "Confirma"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Confirmeu la contrasenya"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Acollidor"
|
msgstr "Acollidor"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr "Ctrl"
|
msgstr "Ctrl"
|
||||||
@@ -247,10 +256,10 @@ msgstr "Codi JS personalitzat que s'executarà en carregar la pàgina"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr "Cian"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Fosc"
|
msgstr "Fosc"
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "Desc"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr "Detallat"
|
msgstr "Detallat"
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr "Desactiva el comportament \"Arrossega per actualitzar\"\\ del navegador"
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Mostra"
|
msgstr "Mostra"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr "Donar"
|
msgstr "Donar"
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Descarrega"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Arrossegueu l'enllaç a la barra d'adreces d'interès"
|
msgstr "Arrossegueu l'enllaç a la barra d'adreces d'interès"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "Correu electrònic"
|
msgstr "Correu electrònic"
|
||||||
|
|
||||||
@@ -319,10 +334,10 @@ msgstr "Adreça de correu electrònic"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Edita l'usuari"
|
msgstr "Edita l'usuari"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "activat"
|
msgstr "Activat"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Enter"
|
msgid "Enter"
|
||||||
@@ -334,11 +349,11 @@ msgstr "introduïu la vostra contrasenya actual per canviar la configuració del
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Entries to keep above the selected entry when scrolling"
|
msgid "Entries to keep above the selected entry when scrolling"
|
||||||
msgstr ""
|
msgstr "Entrades que es mantindran a sobre de l'entrada seleccionada en desplaçar-se"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Entry headers"
|
msgid "Entry headers"
|
||||||
msgstr ""
|
msgstr "Encapçalaments d'entrada"
|
||||||
|
|
||||||
#: src/components/Alert.tsx
|
#: src/components/Alert.tsx
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
@@ -356,8 +371,8 @@ msgstr "Ampliat"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "exporteu les vostres subscripcions i categories com a fitxer OPML que es pot importar a altres serveis de lectura de feeds"
|
msgstr "exporteu les vostres subscripcions i categories com a fitxer OPML que es pot importar a altres serveis de lectura de feeds"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr "Opcions de l'extensió"
|
msgstr "Opcions de l'extensió"
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr "Opcions de l'extensió"
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Nom del canal"
|
msgstr "Nom del canal"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "URL del canal"
|
msgstr "URL del canal"
|
||||||
|
|
||||||
@@ -377,11 +392,11 @@ msgstr "Carrega tots els meus feeds ara"
|
|||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "Fever API"
|
msgid "Fever API"
|
||||||
msgstr ""
|
msgstr "Fever API"
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "Fever API URL"
|
msgid "Fever API URL"
|
||||||
msgstr ""
|
msgstr "URL de Fever API"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Filtering expression"
|
msgid "Filtering expression"
|
||||||
@@ -389,19 +404,19 @@ msgstr "Expressió de filtratge"
|
|||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
msgid "Font size"
|
msgid "Font size"
|
||||||
msgstr ""
|
msgstr "Mida de la lletra"
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
msgid "Force fetching feeds is not yet available."
|
msgid "Force fetching feeds is not yet available."
|
||||||
msgstr ""
|
msgstr "La recuperació forçada de feeds encara no està disponible."
|
||||||
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
#: src/pages/auth/LoginPage.tsx
|
||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Heu oblidat la contrasenya?"
|
msgstr "Heu oblidat la contrasenya?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "primer genereu una clau API al vostre perfil."
|
msgstr "primer genereu una clau API al vostre perfil."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "primer genereu una clau API al vostre perfil."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Genera una nova clau d'API"
|
msgstr "Genera una nova clau d'API"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "URL del feed generat"
|
msgstr "URL del feed generat"
|
||||||
|
|
||||||
@@ -430,19 +445,19 @@ msgstr "Vés a la documentació de l'API."
|
|||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Goodies"
|
msgid "Goodies"
|
||||||
msgstr "Bones"
|
msgstr "Extres"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Grape"
|
msgid "Grape"
|
||||||
msgstr ""
|
msgstr "Raïm"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Gray"
|
msgid "Gray"
|
||||||
msgstr ""
|
msgstr "Gris"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Green"
|
msgid "Green"
|
||||||
msgstr ""
|
msgstr "Verd"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Id"
|
msgid "Id"
|
||||||
@@ -466,19 +481,23 @@ msgstr "Importació"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "In expanded view, scrolling through entries mark them as read"
|
msgid "In expanded view, scrolling through entries mark them as read"
|
||||||
msgstr "a la vista ampliada, desplaçant-se per les entrades les marqueu com a llegides"
|
msgstr "En la vista ampliada, en desplaçar-se per les entrades, es marquen com a llegides"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
|
msgstr "Indi"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Mantenir sense llegir"
|
msgstr "Mantenir sense llegir"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Dreceres de teclat"
|
msgstr "Dreceres de teclat"
|
||||||
|
|
||||||
@@ -504,14 +523,18 @@ msgstr "Clar"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr "Llima"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Enllaç"
|
msgstr "Enllaç"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr "Enllaç a la documentació"
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Carregant el perfil..."
|
msgstr "Carregant el perfil..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "S'estan carregant les subscripcions..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Carregant les etiquetes..."
|
msgstr "Carregant les etiquetes..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Inicia sessió"
|
msgstr "Inicia sessió"
|
||||||
|
|
||||||
@@ -540,10 +563,10 @@ msgstr "Tanca sessió"
|
|||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr "Prem llargament la tecla"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Gestionar usuaris"
|
msgstr "Gestionar usuaris"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Gestionar usuaris"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Marca-ho tot com a llegit"
|
msgstr "Marca-ho tot com a llegit"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Marqueu totes les entrades com a llegides"
|
msgstr "Marqueu totes les entrades com a llegides"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Marca com a llegit"
|
msgstr "Marca com a llegit"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Marca com a llegit fins aquí"
|
msgstr "Marca com a llegit fins aquí"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Mou la pàgina cap avall"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Mou la pàgina cap amunt"
|
msgstr "Mou la pàgina cap amunt"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
msgid "N/A"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
msgid "N/A"
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
msgstr "No es coneix"
|
||||||
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Nom"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Navegueu a una subscripció introduint-ne el nom"
|
msgstr "Navegueu a una subscripció introduint-ne el nom"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr "Navega a la següent categoria/canal amb entrades no llegides quan es marquen totes les entrades com a llegides"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Contrasenya nova"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "El més nou primer"
|
msgstr "El més nou primer"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Següent"
|
msgstr "Següent"
|
||||||
|
|
||||||
@@ -630,7 +657,7 @@ msgstr "No hi ha més entrades"
|
|||||||
|
|
||||||
#: src/components/content/ShareButtons.tsx
|
#: src/components/content/ShareButtons.tsx
|
||||||
msgid "No sharing options available."
|
msgid "No sharing options available."
|
||||||
msgstr ""
|
msgstr "No hi ha opcions de compartició disponibles."
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Nothing found"
|
msgid "Nothing found"
|
||||||
@@ -642,11 +669,11 @@ msgstr "el més vell primer"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "On desktop"
|
msgid "On desktop"
|
||||||
msgstr ""
|
msgstr "A l'escriptori"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "On mobile"
|
msgid "On mobile"
|
||||||
msgstr ""
|
msgstr "Al mòbil"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "On mobile, show action buttons at the bottom of the screen"
|
msgid "On mobile, show action buttons at the bottom of the screen"
|
||||||
@@ -654,7 +681,7 @@ msgstr "Al mòbil, mostra els botons d'acció a la part inferior de la pantalla"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Only applies to compact, cozy and detailed modes"
|
msgid "Only applies to compact, cozy and detailed modes"
|
||||||
msgstr ""
|
msgstr "Només s'aplica als modes compacte, acollidor i detallat"
|
||||||
|
|
||||||
#: src/pages/ErrorPage.tsx
|
#: src/pages/ErrorPage.tsx
|
||||||
msgid "Oops!"
|
msgid "Oops!"
|
||||||
@@ -716,11 +743,11 @@ msgstr "Fitxer OPML"
|
|||||||
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
msgid "OPML file is required"
|
msgid "OPML file is required"
|
||||||
msgstr ""
|
msgstr "Cal un fitxer OPML"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Orange"
|
msgid "Orange"
|
||||||
msgstr ""
|
msgstr "Taronja"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Order"
|
msgid "Order"
|
||||||
@@ -734,11 +761,13 @@ msgstr "pares"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Categoria pare"
|
msgstr "Categoria pare"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Contrasenya"
|
msgstr "Contrasenya"
|
||||||
|
|
||||||
@@ -752,10 +781,10 @@ msgstr "Les contrasenyes no coincideixen"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr "Rosa"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Posició"
|
msgstr "Posició"
|
||||||
|
|
||||||
@@ -765,7 +794,7 @@ msgstr "Anterior"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Primary color"
|
msgid "Primary color"
|
||||||
msgstr ""
|
msgstr "Color primari"
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Profile"
|
msgid "Profile"
|
||||||
@@ -777,10 +806,10 @@ msgstr "Recuperar la contrasenya"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr "Vermell"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Actualitzar"
|
msgstr "Actualitzar"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr "API REST"
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr "Clic dret"
|
msgstr "Clic dret"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Desa"
|
msgstr "Desa"
|
||||||
|
|
||||||
@@ -817,28 +846,24 @@ msgstr "Desplaceu-vos suaument quan navegueu entre entrades"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr "Desplaçament"
|
msgstr "Desplaçament"
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Cerca"
|
msgstr "Cerca"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "la cerca requereix almenys 3 caràcters"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr "Selecciona el següent canal/categoria no llegit"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select previous unread feed/category"
|
msgid "Select previous unread feed/category"
|
||||||
msgstr ""
|
msgstr "Selecciona el canal/categoria anterior sense llegir"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Set focus on next entry without opening it"
|
msgid "Set focus on next entry without opening it"
|
||||||
msgstr "posa el focus a la següent entrada sense obrir-la"
|
msgstr "Posa el focus a la següent entrada sense obrir-la"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Set focus on previous entry without opening it"
|
msgid "Set focus on previous entry without opening it"
|
||||||
@@ -858,7 +883,7 @@ msgstr "Comparteix"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Sharing sites"
|
msgid "Sharing sites"
|
||||||
msgstr "Compartir llocs"
|
msgstr "Compartir a altres llocs web"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
@@ -884,7 +909,7 @@ msgstr "Mostra el menú d'entrada (mòbil)"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Show external link icon"
|
msgid "Show external link icon"
|
||||||
msgstr ""
|
msgstr "Mostra la icona d'enllaç extern"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Show feeds and categories with no unread entries"
|
msgid "Show feeds and categories with no unread entries"
|
||||||
@@ -900,19 +925,19 @@ msgstr "Mostra el menú natiu (escriptori)"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Show star icon"
|
msgid "Show star icon"
|
||||||
msgstr ""
|
msgstr "Mostra la icona d'estrella"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Show unread count in tab favicon"
|
msgid "Show unread count in tab favicon"
|
||||||
msgstr ""
|
msgstr "Mostra el recompte de no llegits a la icona de favorits de la pestanya"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr "Mostra el recompte de no llegits al títol de la pestanya"
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Registra't"
|
msgstr "Registra't"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Acaba de passar una cosa dolenta..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Espai"
|
msgstr "Espai"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Estrella"
|
msgstr "Estrella"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Estrellat"
|
msgstr "Estrellat"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Subscriu-te"
|
msgstr "Subscriu-te"
|
||||||
|
|
||||||
@@ -978,7 +1003,7 @@ msgstr "Etiquetes"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Teal"
|
msgid "Teal"
|
||||||
msgstr ""
|
msgstr "Blau verdós"
|
||||||
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
|
msgid "The URL for the feed you want to subscribe to. You can also use the website's url directly and CommaFeed will try to find the feed in the page."
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Tema"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr "Aquesta és la vostra clau de l'API. Es pot utilitzar per a algunes operacions de l'API de només lectura i permet accedir a l'API Fever. Utilitzeu el formulari de la part inferior de la pàgina per generar una nova clau d'API."
|
msgstr "Aquesta és la vostra clau de l'API. Es pot utilitzar per a algunes operacions de l'API de només lectura i permet accedir a l'API Fever. Utilitzeu el formulari de la part inferior de la pàgina per generar una nova clau d'API."
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr "Aquesta configuració pot causar problemes de desplaçament en alguns navegadors (per exemple, Safari)"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Canvia l'estat de lectura de l'entrada actual"
|
msgstr "Canvia l'estat de lectura de l'entrada actual"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr "Prova la demostració!"
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Sense llegir"
|
msgstr "Sense llegir"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Desestrellar"
|
msgstr "Desestrellar"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "Desestrellar"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Donar-se de baixa"
|
msgstr "Donar-se de baixa"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Nom d'usuari"
|
msgstr "Nom d'usuari"
|
||||||
@@ -1038,7 +1071,7 @@ msgstr "Nom d'usuari o correu electrònic"
|
|||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Violet"
|
msgid "Violet"
|
||||||
msgstr ""
|
msgstr "Violeta"
|
||||||
|
|
||||||
#: src/components/Alert.tsx
|
#: src/components/Alert.tsx
|
||||||
msgid "Warning"
|
msgid "Warning"
|
||||||
@@ -1048,9 +1081,13 @@ msgstr "Avís"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Lloc web"
|
msgstr "Lloc web"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr "Groc"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
|
msgid "You don't have any subscriptions yet. Why not try adding one by clicking on the + sign at the top of the page?"
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
@@ -33,8 +33,8 @@ msgstr ""
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Potřebujete účet?</0><1>Zaregistrujte se!</1>"
|
msgstr "<0>Potřebujete účet?</0><1>Zaregistrujte se!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Asi"
|
msgstr "Asi"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Přidat kategorii"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Přidat uživatele"
|
msgstr "Přidat uživatele"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Správce"
|
msgstr "Správce"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Všechny"
|
msgstr "Všechny"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Zpět k přihlášení"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extention"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Zrušit"
|
msgstr "Zrušit"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Kategorie"
|
msgstr "Kategorie"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr ""
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Kompaktní"
|
msgstr "Kompaktní"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Potvrdit"
|
msgstr "Potvrdit"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Potvrďte heslo"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Útulný"
|
msgstr "Útulný"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -249,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr ""
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Displej"
|
msgstr "Displej"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Stáhnout"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Přetáhněte odkaz na lištu záložek"
|
msgstr "Přetáhněte odkaz na lištu záložek"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "E-mailová adresa"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Upravit uživatele"
|
msgstr "Upravit uživatele"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Povoleno"
|
msgstr "Povoleno"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Rozbaleno"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Exportujte svá předplatná a kategorie jako soubor OPML, který lze importovat do jiných služeb čtení kanálů"
|
msgstr "Exportujte svá předplatná a kategorie jako soubor OPML, který lze importovat do jiných služeb čtení kanálů"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr ""
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Název zdroje"
|
msgstr "Název zdroje"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "URL zdroje"
|
msgstr "URL zdroje"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Zapomněli jste heslo?"
|
msgstr "Zapomněli jste heslo?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Nejprve ve svém profilu vygenerujte klíč API."
|
msgstr "Nejprve ve svém profilu vygenerujte klíč API."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Nejprve ve svém profilu vygenerujte klíč API."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Vygenerujte nový klíč API"
|
msgstr "Vygenerujte nový klíč API"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "Generovaná adresa URL zdroje"
|
msgstr "Generovaná adresa URL zdroje"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "V rozšířeném zobrazení je procházením označíte jako přečtené
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Ponechat nepřečtené"
|
msgstr "Ponechat nepřečtené"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Klávesové zkratky"
|
msgstr "Klávesové zkratky"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr ""
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Odkaz"
|
msgstr "Odkaz"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Načítání profilu..."
|
msgstr "Načítání profilu..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Načítání odběrů..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Načítání značek..."
|
msgstr "Načítání značek..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Přihlaste se"
|
msgstr "Přihlaste se"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Odhlášení"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Spravujte uživatele"
|
msgstr "Spravujte uživatele"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Spravujte uživatele"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Označit vše jako přečtené"
|
msgstr "Označit vše jako přečtené"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Označte všechny položky jako přečtené"
|
msgstr "Označte všechny položky jako přečtené"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Označit jako přečtené"
|
msgstr "Označit jako přečtené"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Označit jako přečtené až sem"
|
msgstr "Označit jako přečtené až sem"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Přesuňte stránku dolů"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Přesuňte stránku nahoru"
|
msgstr "Přesuňte stránku nahoru"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Jméno"
|
msgstr "Jméno"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Jméno"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Přejděte na předplatné zadáním jeho názvu"
|
msgstr "Přejděte na předplatné zadáním jeho názvu"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Nové heslo"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Nejnovější jako první"
|
msgstr "Nejnovější jako první"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Další"
|
msgstr "Další"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "Rodič"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Rodičovská kategorie"
|
msgstr "Rodičovská kategorie"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Heslo"
|
msgstr "Heslo"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Hesla se neshodují"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Pozice"
|
msgstr "Pozice"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Obnovte heslo"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Obnovit"
|
msgstr "Obnovit"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr ""
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Uložit"
|
msgstr "Uložit"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Posouvejte plynule při navigaci mezi položkami"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Hledej"
|
msgstr "Hledej"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "Hledání vyžaduje alespoň 3 znaky"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Zaregistrujte se"
|
msgstr "Zaregistrujte se"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Právě se stalo něco špatného..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Vesmír"
|
msgstr "Vesmír"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Hvězda"
|
msgstr "Hvězda"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "S hvězdičkou"
|
msgstr "S hvězdičkou"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Přihlaste se"
|
msgstr "Přihlaste se"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Téma"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Přepne stav čtení aktuálního záznamu"
|
msgstr "Přepne stav čtení aktuálního záznamu"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr ""
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Nepřečteno"
|
msgstr "Nepřečteno"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Odstranit hvězdu"
|
msgstr "Odstranit hvězdu"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "Odstranit hvězdu"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Odhlásit odběr"
|
msgstr "Odhlásit odběr"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Uživatelské jméno"
|
msgstr "Uživatelské jméno"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Varování"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Webové stránky"
|
msgstr "Webové stránky"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
@@ -33,8 +33,8 @@ msgstr ""
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Angen cyfrif?</0><1>Ymunwch!</1>"
|
msgstr "<0>Angen cyfrif?</0><1>Ymunwch!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Ynghylch"
|
msgstr "Ynghylch"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Ychwanegu categori"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Ychwanegu defnyddiwr"
|
msgstr "Ychwanegu defnyddiwr"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Gweinyddol"
|
msgstr "Gweinyddol"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Pawb"
|
msgstr "Pawb"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Yn ôl i fewngofnodi"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extention"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Diddymu"
|
msgstr "Diddymu"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "categori"
|
msgstr "categori"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr ""
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "cryno"
|
msgstr "cryno"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Cadarnhau"
|
msgstr "Cadarnhau"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Cadarnhau'r cyfrinair"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "clyd"
|
msgstr "clyd"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -249,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "Rhag"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Arddangos"
|
msgstr "Arddangos"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Lawrlwytho"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Llusgwch y ddolen i'r bar nod tudalen"
|
msgstr "Llusgwch y ddolen i'r bar nod tudalen"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-bost"
|
msgstr "E-bost"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "cyfeiriad e-bost"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Golygu defnyddiwr"
|
msgstr "Golygu defnyddiwr"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Wedi'i alluogi"
|
msgstr "Wedi'i alluogi"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Ehangu"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Allforio eich tanysgrifiadau a'ch categorïau fel ffeil OPML y gellir ei mewnforio i wasanaethau darllen porthiant eraill"
|
msgstr "Allforio eich tanysgrifiadau a'ch categorïau fel ffeil OPML y gellir ei mewnforio i wasanaethau darllen porthiant eraill"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr ""
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Enw porthiant"
|
msgstr "Enw porthiant"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "URL porthiant"
|
msgstr "URL porthiant"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Wedi anghofio cyfrinair?"
|
msgstr "Wedi anghofio cyfrinair?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Cynhyrchu allwedd API yn eich proffil yn gyntaf."
|
msgstr "Cynhyrchu allwedd API yn eich proffil yn gyntaf."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Cynhyrchu allwedd API yn eich proffil yn gyntaf."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Cynhyrchu allwedd API newydd"
|
msgstr "Cynhyrchu allwedd API newydd"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "url porthiant a gynhyrchir"
|
msgstr "url porthiant a gynhyrchir"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "Mewn gwedd estynedig, mae sgrolio trwy gofnodion yn nodi eu bod wedi'u d
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Cadwch heb ei ddarllen"
|
msgstr "Cadwch heb ei ddarllen"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "llwybrau byr bysellfwrdd"
|
msgstr "llwybrau byr bysellfwrdd"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr ""
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Cyswllt"
|
msgstr "Cyswllt"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Wrthi'n llwytho proffil..."
|
msgstr "Wrthi'n llwytho proffil..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Yn llwytho tanysgrifiadau..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Wrthi'n llwytho tagiau..."
|
msgstr "Wrthi'n llwytho tagiau..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Mewngofnodi"
|
msgstr "Mewngofnodi"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Allgofnodi"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Rheoli defnyddwyr"
|
msgstr "Rheoli defnyddwyr"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Rheoli defnyddwyr"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Marciwch y cyfan wedi'i ddarllen"
|
msgstr "Marciwch y cyfan wedi'i ddarllen"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Marciwch bob cofnod wedi'i ddarllen"
|
msgstr "Marciwch bob cofnod wedi'i ddarllen"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Marciwch ei fod wedi'i ddarllen"
|
msgstr "Marciwch ei fod wedi'i ddarllen"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Marciwch fel y darllenwyd hyd yma"
|
msgstr "Marciwch fel y darllenwyd hyd yma"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Symudwch y dudalen i lawr"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Symudwch y dudalen i fyny"
|
msgstr "Symudwch y dudalen i fyny"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr "Amh"
|
msgstr "Amh"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Enw"
|
msgstr "Enw"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Enw"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Llywiwch i danysgrifiad trwy nodi ei enw"
|
msgstr "Llywiwch i danysgrifiad trwy nodi ei enw"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Cyfrinair newydd"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Y diweddaraf yn gyntaf"
|
msgstr "Y diweddaraf yn gyntaf"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Nesaf"
|
msgstr "Nesaf"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "rhiant"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Categori Rhiant"
|
msgstr "Categori Rhiant"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "cyfrinair"
|
msgstr "cyfrinair"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Nid yw cyfrineiriau yn cyfateb"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Swydd"
|
msgstr "Swydd"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Adfer cyfrinair"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Adnewyddu"
|
msgstr "Adnewyddu"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr ""
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Arbed"
|
msgstr "Arbed"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Sgroliwch yn esmwyth wrth lywio rhwng cofnodion"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Chwilio"
|
msgstr "Chwilio"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "Mae angen o leiaf 3 nod ar gyfer chwilio"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Cofrestrwch"
|
msgstr "Cofrestrwch"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Mae rhywbeth drwg newydd ddigwydd ..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Gofod"
|
msgstr "Gofod"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "seren"
|
msgstr "seren"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "serennog"
|
msgstr "serennog"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Tanysgrifio"
|
msgstr "Tanysgrifio"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Thema"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Toglo statws darllen y cofnod cyfredol"
|
msgstr "Toglo statws darllen y cofnod cyfredol"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr ""
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Heb ei ddarllen"
|
msgstr "Heb ei ddarllen"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "dad-seren"
|
msgstr "dad-seren"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "dad-seren"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Dad-danysgrifio"
|
msgstr "Dad-danysgrifio"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Enw defnyddiwr"
|
msgstr "Enw defnyddiwr"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Rhybudd"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Gwefan"
|
msgstr "Gwefan"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
@@ -33,8 +33,8 @@ msgstr ""
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Har du brug for en konto?</0><1>Tilmeld dig!</1>"
|
msgstr "<0>Har du brug for en konto?</0><1>Tilmeld dig!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Omkring"
|
msgstr "Omkring"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Tilføj kategori"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Tilføj bruger"
|
msgstr "Tilføj bruger"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Tilbage for at logge ind"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extention"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuller"
|
msgstr "Annuller"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Kategori"
|
msgstr "Kategori"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr ""
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Kompakt"
|
msgstr "Kompakt"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bekræft"
|
msgstr "Bekræft"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Bekræft adgangskode"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Hyggeligt"
|
msgstr "Hyggeligt"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -249,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr ""
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Skærm"
|
msgstr "Skærm"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr ""
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Træk linket til bogmærkelinjen"
|
msgstr "Træk linket til bogmærkelinjen"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "E-mailadresse"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Rediger bruger"
|
msgstr "Rediger bruger"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Aktiveret"
|
msgstr "Aktiveret"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Udvidet"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Eksporter dine abonnementer og kategorier som en OPML-fil, der kan importeres i andre feed-læsningstjenester"
|
msgstr "Eksporter dine abonnementer og kategorier som en OPML-fil, der kan importeres i andre feed-læsningstjenester"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr ""
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Feednavn"
|
msgstr "Feednavn"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Glemt adgangskode?"
|
msgstr "Glemt adgangskode?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Generer først en API-nøgle i din profil."
|
msgstr "Generer først en API-nøgle i din profil."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Generer først en API-nøgle i din profil."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Generer ny API-nøgle"
|
msgstr "Generer ny API-nøgle"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "Genereret feed-url"
|
msgstr "Genereret feed-url"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "I udvidet visning markerer du dem som læst, når du ruller gennem poste
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Forbehold ulæst"
|
msgstr "Forbehold ulæst"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Tastaturgenveje"
|
msgstr "Tastaturgenveje"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr ""
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Indlæser profil..."
|
msgstr "Indlæser profil..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Indlæser abonnementer..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Indlæser tags..."
|
msgstr "Indlæser tags..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Log ind"
|
msgstr "Log ind"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Log ud"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Administrer brugere"
|
msgstr "Administrer brugere"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Administrer brugere"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Marker alle som læst"
|
msgstr "Marker alle som læst"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Marker alle poster som læst"
|
msgstr "Marker alle poster som læst"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Markér som læst"
|
msgstr "Markér som læst"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Markér som læst indtil her"
|
msgstr "Markér som læst indtil her"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Flyt siden ned"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Flyt siden op"
|
msgstr "Flyt siden op"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Navn"
|
msgstr "Navn"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Navn"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Naviger til et abonnement ved at indtaste dets navn"
|
msgstr "Naviger til et abonnement ved at indtaste dets navn"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Ny adgangskode"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Nyeste først"
|
msgstr "Nyeste først"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Næste"
|
msgstr "Næste"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "Forælder"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Forældrekategori"
|
msgstr "Forældrekategori"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Adgangskode"
|
msgstr "Adgangskode"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Adgangskoder stemmer ikke overens"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Gendan adgangskode"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Opdater"
|
msgstr "Opdater"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr ""
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Gem"
|
msgstr "Gem"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Rul jævnt, når du navigerer mellem poster"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Søg"
|
msgstr "Søg"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "Søgning kræver mindst 3 tegn"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Tilmeld dig"
|
msgstr "Tilmeld dig"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Der er lige sket noget slemt..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Rum"
|
msgstr "Rum"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Stjerne"
|
msgstr "Stjerne"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Medvirkende"
|
msgstr "Medvirkende"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Tilmeld"
|
msgstr "Tilmeld"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Tema"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Skift læsestatus for den aktuelle post"
|
msgstr "Skift læsestatus for den aktuelle post"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr ""
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Ulæst"
|
msgstr "Ulæst"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1027,6 +1056,10 @@ msgstr ""
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Afmeld"
|
msgstr "Afmeld"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Brugernavn"
|
msgstr "Brugernavn"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Advarsel"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Hjemmeside"
|
msgstr "Hjemmeside"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr "<0>CommaFeed ist ein Open Source Projekt. Der Quellcode wird auf auf </0><1>GitHub</1> gehostet."
|
msgstr "<0>CommaFeed ist ein Open Source Projekt. Der Quellcode wird auf auf </0><1>GitHub</1> gehostet."
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr "<0>Die vollständige Syntax ist </0><1>hier</1> verfügbar."
|
msgstr "<0>Die vollständige Syntax ist </0><1>hier</1> verfügbar<2>.</2>"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "<0>Have an account?</0><1>Log in!</1>"
|
msgid "<0>Have an account?</0><1>Log in!</1>"
|
||||||
@@ -33,8 +33,8 @@ msgstr "<0>Hey,</0><1>Ich bin Jérémie aus Belgien und arbeite seit über 10 Ja
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Benötigen Sie ein Konto?</0><1>Hier geht's zur Registrierung!</1>"
|
msgstr "<0>Benötigen Sie ein Konto?</0><1>Hier geht's zur Registrierung!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Über"
|
msgstr "Über"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Kategorie hinzufügen"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Benutzer hinzufügen"
|
msgstr "Benutzer hinzufügen"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Verwaltung"
|
msgstr "Verwaltung"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Zurück zum Login"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
|
msgid "Browser extension"
|
||||||
|
msgstr "Browser-Erweiterung"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr "Browser-Erweiterung für Chrome benötigt"
|
msgstr "Browser-Erweiterung für Chrome benötigt"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
msgid "Browser extention"
|
|
||||||
msgstr "Browser-Erweiterung"
|
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Kategorie"
|
msgstr "Kategorie"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr "CommaFeed version {version} ({revision})."
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Kompakt"
|
msgstr "Kompakt"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Bestätigen"
|
msgstr "Bestätigen"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Passwort bestätigen"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Gemütlich"
|
msgstr "Gemütlich"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr "Strg"
|
msgstr "Strg"
|
||||||
@@ -249,8 +258,8 @@ msgstr "Einer JS Code der beim Laden der Seite ausgeführt wird"
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Dunkel"
|
msgstr "Dunkel"
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "Beschr"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr "Detailliert"
|
msgstr "Detailliert"
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Anzeige"
|
msgstr "Anzeige"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr "Spenden"
|
msgstr "Spenden"
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Herunterladen"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Link in Lesezeichenleiste ziehen"
|
msgstr "Link in Lesezeichenleiste ziehen"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "E-Mail-Adresse"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Benutzer bearbeiten"
|
msgstr "Benutzer bearbeiten"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Aktiviert"
|
msgstr "Aktiviert"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Erweitert"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Exportieren Sie Ihre Abonnements und Kategorien als OPML-Datei, die in andere Feed-Lesedienste importiert werden kann"
|
msgstr "Exportieren Sie Ihre Abonnements und Kategorien als OPML-Datei, die in andere Feed-Lesedienste importiert werden kann"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr "Erweiterungsoptionen"
|
msgstr "Erweiterungsoptionen"
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr "Erweiterungsoptionen"
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Feedname"
|
msgstr "Feedname"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "Feed-URL"
|
msgstr "Feed-URL"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Passwort vergessen?"
|
msgstr "Passwort vergessen?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Generieren Sie zuerst einen API-Schlüssel in Ihrem Profil."
|
msgstr "Generieren Sie zuerst einen API-Schlüssel in Ihrem Profil."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Generieren Sie zuerst einen API-Schlüssel in Ihrem Profil."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Neuen API-Schlüssel generieren"
|
msgstr "Neuen API-Schlüssel generieren"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "Generierte Feed-URL"
|
msgstr "Generierte Feed-URL"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "In der erweiterten Ansicht werden Einträge beim Scrollen als gelesen ma
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Ungelesen lassen"
|
msgstr "Ungelesen lassen"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Tastaturkürzel"
|
msgstr "Tastaturkürzel"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr "Hell"
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Verbindung"
|
msgstr "Verbindung"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Lade Profil..."
|
msgstr "Lade Profil..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Abonnements werden geladen..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Tags werden geladen..."
|
msgstr "Tags werden geladen..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Einloggen"
|
msgstr "Einloggen"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Abmelden"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr "Langer Tastendruck"
|
msgstr "Langer Tastendruck"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Benutzer verwalten"
|
msgstr "Benutzer verwalten"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Benutzer verwalten"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Alle als gelesen markieren"
|
msgstr "Alle als gelesen markieren"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Alle Einträge als gelesen markieren"
|
msgstr "Alle Einträge als gelesen markieren"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Als gelesen markieren"
|
msgstr "Als gelesen markieren"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Bis hierhin als gelesen markieren"
|
msgstr "Bis hierhin als gelesen markieren"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Seite nach unten verschieben"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Bewege die Seite nach oben"
|
msgstr "Bewege die Seite nach oben"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr "n.v."
|
msgstr "n.v."
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr ""
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Navigieren Sie zu einem Abonnement, indem Sie seinen Namen eingeben"
|
msgstr "Navigieren Sie zu einem Abonnement, indem Sie seinen Namen eingeben"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Neues Passwort"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Neueste zuerst"
|
msgstr "Neueste zuerst"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Weiter"
|
msgstr "Weiter"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "Übergeordnet"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Übergeordnete Kategorie"
|
msgstr "Übergeordnete Kategorie"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Passwort"
|
msgstr "Passwort"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Passwörter stimmen nicht überein"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Position"
|
msgstr "Position"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Kennwort wiederherstellen"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Aktualisieren"
|
msgstr "Aktualisieren"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr "REST-API"
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr "Rechtsklick"
|
msgstr "Rechtsklick"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Speichern"
|
msgstr "Speichern"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Schnelles Scrollen beim Navigieren zwischen Einträgen"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr "Scrollen"
|
msgstr "Scrollen"
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Suche"
|
msgstr "Suche"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "Suche erfordert mindestens 3 Zeichen"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Melden Sie sich an"
|
msgstr "Melden Sie sich an"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Etwas Schlimmes ist gerade passiert..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Raum"
|
msgstr "Raum"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Stern"
|
msgstr "Stern"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Markiert"
|
msgstr "Markiert"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Abonnieren"
|
msgstr "Abonnieren"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Thema"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr "Dies ist Ihr API-Schlüssel. Er kann für einige schreibgeschützte API-Vorgänge verwendet werden und ermöglicht den Zugriff auf die Fever-API. Verwenden Sie das Formular unten auf der Seite, um einen neuen API-Schlüssel zu generieren"
|
msgstr "Dies ist Ihr API-Schlüssel. Er kann für einige schreibgeschützte API-Vorgänge verwendet werden und ermöglicht den Zugriff auf die Fever-API. Verwenden Sie das Formular unten auf der Seite, um einen neuen API-Schlüssel zu generieren"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Lesestatus des aktuellen Eintrags umschalten"
|
msgstr "Lesestatus des aktuellen Eintrags umschalten"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr "Testen Sie die Demo!"
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Ungelesen"
|
msgstr "Ungelesen"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Stern entfernen"
|
msgstr "Stern entfernen"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "Stern entfernen"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Abbestellen"
|
msgstr "Abbestellen"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Benutzername"
|
msgstr "Benutzername"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Warnung"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Webseite"
|
msgstr "Webseite"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
|
msgstr "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitHub</1>."
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr "<0>Complete syntax is available </0><1>here</1>."
|
msgstr "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "<0>Have an account?</0><1>Log in!</1>"
|
msgid "<0>Have an account?</0><1>Log in!</1>"
|
||||||
@@ -33,8 +33,8 @@ msgstr "<0>Hey,</0><1>I'm Jérémie from Belgium and I've been working on CommaF
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Need an account?</0><1>Sign up!</1>"
|
msgstr "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "About"
|
msgstr "About"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Add category"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Add user"
|
msgstr "Add user"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Admin"
|
msgstr "Admin"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr "Admin user name"
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "All"
|
msgstr "All"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Back to log in"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr "Blue"
|
msgstr "Blue"
|
||||||
|
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
|
msgid "Browser extension"
|
||||||
|
msgstr "Browser extension"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr "Browser extension required for Chrome"
|
msgstr "Browser extension required for Chrome"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
msgid "Browser extention"
|
|
||||||
msgstr "Browser extention"
|
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr "Browser tab"
|
msgstr "Browser tab"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel"
|
msgstr "Cancel"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Category"
|
msgstr "Category"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr "CommaFeed version {version} ({revision})."
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Compact"
|
msgstr "Compact"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Confirm"
|
msgstr "Confirm"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Confirm password"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Cozy"
|
msgstr "Cozy"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr "Create Admin Account"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr "Ctrl"
|
msgstr "Ctrl"
|
||||||
@@ -249,8 +258,8 @@ msgstr "Custom JS code that will be executed on page load"
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr "Cyan"
|
msgstr "Cyan"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Dark"
|
msgstr "Dark"
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "Desc"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr "Detailed"
|
msgstr "Detailed"
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Display"
|
msgstr "Display"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr "Donate"
|
msgstr "Donate"
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Download"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Drag link to bookmark bar"
|
msgstr "Drag link to bookmark bar"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "E-mail address"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Edit user"
|
msgstr "Edit user"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Enabled"
|
msgstr "Enabled"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Expanded"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgstr "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr "Extension options"
|
msgstr "Extension options"
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr "Extension options"
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Feed name"
|
msgstr "Feed name"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "Feed URL"
|
msgstr "Feed URL"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr "Force fetching feeds is not yet available."
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Forgot password?"
|
msgstr "Forgot password?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Generate an API key in your profile first."
|
msgstr "Generate an API key in your profile first."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Generate an API key in your profile first."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Generate new API key"
|
msgstr "Generate new API key"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "Generated feed url"
|
msgstr "Generated feed url"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "In expanded view, scrolling through entries mark them as read"
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr "Indigo"
|
msgstr "Indigo"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr "Initial Setup"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Keep unread"
|
msgstr "Keep unread"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Keyboard shortcuts"
|
msgstr "Keyboard shortcuts"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr "Light"
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr "Lime"
|
msgstr "Lime"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Link"
|
msgstr "Link"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr "Link to the documentation"
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Loading profile..."
|
msgstr "Loading profile..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Loading subscriptions..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Loading tags..."
|
msgstr "Loading tags..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Log in"
|
msgstr "Log in"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Logout"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr "Long press"
|
msgstr "Long press"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Manage users"
|
msgstr "Manage users"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Manage users"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Mark all as read"
|
msgstr "Mark all as read"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Mark all entries as read"
|
msgstr "Mark all entries as read"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Mark as read"
|
msgstr "Mark as read"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Mark as read up to here"
|
msgstr "Mark as read up to here"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Move the page down"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Move the page up"
|
msgstr "Move the page up"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr "N/A"
|
msgstr "N/A"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Name"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Navigate to a subscription by entering its name"
|
msgstr "Navigate to a subscription by entering its name"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "New password"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Newest first"
|
msgstr "Newest first"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Next"
|
msgstr "Next"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "Parent"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Parent Category"
|
msgstr "Parent Category"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Password"
|
msgstr "Password"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Passwords do not match"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr "Pink"
|
msgstr "Pink"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Position"
|
msgstr "Position"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Recover password"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr "Red"
|
msgstr "Red"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Refresh"
|
msgstr "Refresh"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr "REST API"
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr "Right click"
|
msgstr "Right click"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Save"
|
msgstr "Save"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Scroll smoothly when navigating between entries"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr "Scrolling"
|
msgstr "Scrolling"
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Search"
|
msgstr "Search"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "Search requires at least 3 characters"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr "Select next unread feed/category"
|
msgstr "Select next unread feed/category"
|
||||||
@@ -910,9 +935,9 @@ msgstr "Show unread count in tab favicon"
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr "Show unread count in tab title"
|
msgstr "Show unread count in tab title"
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Sign up"
|
msgstr "Sign up"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Something bad just happened..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Space"
|
msgstr "Space"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Star"
|
msgstr "Star"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Starred"
|
msgstr "Starred"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Subscribe"
|
msgstr "Subscribe"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Theme"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgstr "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Toggle read status of current entry"
|
msgstr "Toggle read status of current entry"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr "Try the demo!"
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Unread"
|
msgstr "Unread"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Unstar"
|
msgstr "Unstar"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "Unstar"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Unsubscribe"
|
msgstr "Unsubscribe"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr "User created."
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "User name"
|
msgstr "User name"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Warning"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Website"
|
msgstr "Website"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr "Yellow"
|
msgstr "Yellow"
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr "<0>CommaFeed es un proyecto de código abierto. El código fuente está hospedado en </0><1>GitHub</1>."
|
msgstr "<0>CommaFeed es un proyecto de código abierto. El código fuente está hospedado en </0><1>GitHub</1>."
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr "<0>La sintaxis completa está disponible </0><1>aquí</1>."
|
msgstr "<0>La sintaxis completa está disponible </0><1>aquí</1><2>.</2>"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "<0>Have an account?</0><1>Log in!</1>"
|
msgid "<0>Have an account?</0><1>Log in!</1>"
|
||||||
@@ -34,8 +34,8 @@ msgstr "<0>Hola,</0><1>Soy Jérémie de Bélgica y he estado trabajando en Comma
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>¿Necesitas una cuenta?</0><1>¡Regístrate!</1>"
|
msgstr "<0>¿Necesitas una cuenta?</0><1>¡Regístrate!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Acerca de"
|
msgstr "Acerca de"
|
||||||
|
|
||||||
@@ -55,17 +55,22 @@ msgstr "Añadir categoría"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Añadir usuario"
|
msgstr "Añadir usuario"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Administrador"
|
msgstr "Administrador"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todo"
|
msgstr "Todo"
|
||||||
|
|
||||||
@@ -138,39 +143,39 @@ msgstr "Volver a iniciar sesión"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
|
msgid "Browser extension"
|
||||||
|
msgstr "Extensión del navegador"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr "Se requiere extensión de navegador para Chrome"
|
msgstr "Se requiere extensión de navegador para Chrome"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
msgid "Browser extention"
|
|
||||||
msgstr "Extensión del navegador"
|
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr "Pestaña del navegador"
|
msgstr "Pestaña del navegador"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Categoría"
|
msgstr "Categoría"
|
||||||
|
|
||||||
@@ -210,11 +215,11 @@ msgstr "Versión de CommaFeed {version} ({revision})."
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Compacto"
|
msgstr "Compacto"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Confirmar"
|
msgstr "Confirmar"
|
||||||
|
|
||||||
@@ -226,6 +231,10 @@ msgstr "Confirmar contraseña"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Acogedor"
|
msgstr "Acogedor"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr "Ctrl"
|
msgstr "Ctrl"
|
||||||
@@ -250,8 +259,8 @@ msgstr "Código JS personalizado que se ejecutará al cargar la página"
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Oscuro"
|
msgstr "Oscuro"
|
||||||
|
|
||||||
@@ -284,14 +293,18 @@ msgstr "Desc"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr "Detallado"
|
msgstr "Detallado"
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Mostrar"
|
msgstr "Mostrar"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr "Donar"
|
msgstr "Donar"
|
||||||
|
|
||||||
@@ -303,11 +316,13 @@ msgstr "Descargar"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Arrastra el enlace a la barra de marcadores"
|
msgstr "Arrastra el enlace a la barra de marcadores"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "Correo electrónico"
|
msgstr "Correo electrónico"
|
||||||
|
|
||||||
@@ -320,8 +335,8 @@ msgstr "Dirección de correo electrónico"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Editar usuario"
|
msgstr "Editar usuario"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Habilitado"
|
msgstr "Habilitado"
|
||||||
|
|
||||||
@@ -357,8 +372,8 @@ msgstr "Expandido"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Exporta tus suscripciones y categorías como un archivo OPML que se puede importar en otros servicios de lectura de feeds"
|
msgstr "Exporta tus suscripciones y categorías como un archivo OPML que se puede importar en otros servicios de lectura de feeds"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr "Opciones de la extensión"
|
msgstr "Opciones de la extensión"
|
||||||
|
|
||||||
@@ -366,9 +381,9 @@ msgstr "Opciones de la extensión"
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Nombre del feed"
|
msgstr "Nombre del feed"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "URL del feed"
|
msgstr "URL del feed"
|
||||||
|
|
||||||
@@ -400,9 +415,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "¿Olvidaste la contraseña?"
|
msgstr "¿Olvidaste la contraseña?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Primero genere una clave API en su perfil."
|
msgstr "Primero genere una clave API en su perfil."
|
||||||
|
|
||||||
@@ -410,9 +425,9 @@ msgstr "Primero genere una clave API en su perfil."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Generar nueva clave API"
|
msgstr "Generar nueva clave API"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "URL del feed generado"
|
msgstr "URL del feed generado"
|
||||||
|
|
||||||
@@ -473,13 +488,17 @@ msgstr "En la vista ampliada, al desplazarse por las entradas marcarlas como le
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Mantener sin leer"
|
msgstr "Mantener sin leer"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Atajos de teclado"
|
msgstr "Atajos de teclado"
|
||||||
|
|
||||||
@@ -507,12 +526,16 @@ msgstr "Claro"
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Enlace"
|
msgstr "Enlace"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Cargando perfil..."
|
msgstr "Cargando perfil..."
|
||||||
@@ -529,9 +552,9 @@ msgstr "Cargando suscripciones..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Cargando etiquetas..."
|
msgstr "Cargando etiquetas..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Iniciar sesión"
|
msgstr "Iniciar sesión"
|
||||||
|
|
||||||
@@ -543,8 +566,8 @@ msgstr "Cerrar sesión"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr "Pulsación larga"
|
msgstr "Pulsación larga"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Administrar usuarios"
|
msgstr "Administrar usuarios"
|
||||||
|
|
||||||
@@ -552,18 +575,18 @@ msgstr "Administrar usuarios"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Marcar todo como leído"
|
msgstr "Marcar todo como leído"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Marcar todas las entradas como leídas"
|
msgstr "Marcar todas las entradas como leídas"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Marcar como leído"
|
msgstr "Marcar como leído"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Marcar como leído hasta aquí"
|
msgstr "Marcar como leído hasta aquí"
|
||||||
|
|
||||||
@@ -583,15 +606,15 @@ msgstr "Mover la página hacia abajo"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Mover la página hacia arriba"
|
msgstr "Mover la página hacia arriba"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr "N/D"
|
msgstr "N/D"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nombre"
|
msgstr "Nombre"
|
||||||
|
|
||||||
@@ -599,6 +622,10 @@ msgstr "Nombre"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Navegar a una suscripción introduciendo su nombre"
|
msgstr "Navegar a una suscripción introduciendo su nombre"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -612,8 +639,8 @@ msgstr "Nueva contraseña"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Las más recientes primero"
|
msgstr "Las más recientes primero"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Siguiente"
|
msgstr "Siguiente"
|
||||||
|
|
||||||
@@ -735,11 +762,13 @@ msgstr "Padre"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Categoría principal"
|
msgstr "Categoría principal"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Contraseña"
|
msgstr "Contraseña"
|
||||||
|
|
||||||
@@ -755,8 +784,8 @@ msgstr "Las contraseñas no coinciden"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Posición"
|
msgstr "Posición"
|
||||||
|
|
||||||
@@ -780,8 +809,8 @@ msgstr "Recuperar contraseña"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Actualizar"
|
msgstr "Actualizar"
|
||||||
|
|
||||||
@@ -798,11 +827,11 @@ msgstr "API REST"
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr "Clic derecho"
|
msgstr "Clic derecho"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Guardar"
|
msgstr "Guardar"
|
||||||
|
|
||||||
@@ -818,17 +847,13 @@ msgstr "Desplazarse suavemente al navegar entre entradas"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr "Desplazarse"
|
msgstr "Desplazarse"
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Buscar"
|
msgstr "Buscar"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "La búsqueda requiere al menos 3 caracteres"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -911,9 +936,9 @@ msgstr "Mostrar recuento de no leídos en la pestaña favicon"
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr "Mostrar recuento de no leídos en el título de la pestaña"
|
msgstr "Mostrar recuento de no leídos en el título de la pestaña"
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Registrarse"
|
msgstr "Registrarse"
|
||||||
|
|
||||||
@@ -926,21 +951,21 @@ msgstr "Algo malo acaba de pasar..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Espacio"
|
msgstr "Espacio"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Estrella"
|
msgstr "Estrella"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Destacado"
|
msgstr "Destacado"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Suscribirse"
|
msgstr "Suscribirse"
|
||||||
|
|
||||||
@@ -993,6 +1018,10 @@ msgstr "Tema"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr "Esta es su clave API. Se puede utilizar para algunas operaciones API de solo lectura y otorga acceso a Fever API. Utilice el formulario en la parte inferior de la página para generar una nueva clave API"
|
msgstr "Esta es su clave API. Se puede utilizar para algunas operaciones API de solo lectura y otorga acceso a Fever API. Utilice el formulario en la parte inferior de la página para generar una nueva clave API"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Alternar estado de lectura de la entrada actual"
|
msgstr "Alternar estado de lectura de la entrada actual"
|
||||||
@@ -1017,8 +1046,8 @@ msgstr "¡Prueba la demostración!"
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "No leído"
|
msgstr "No leído"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Desmarcar"
|
msgstr "Desmarcar"
|
||||||
@@ -1028,6 +1057,10 @@ msgstr "Desmarcar"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Cancelar suscripción"
|
msgstr "Cancelar suscripción"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Nombre de usuario"
|
msgstr "Nombre de usuario"
|
||||||
@@ -1049,6 +1082,10 @@ msgstr "Advertencia"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Sitio web"
|
msgstr "Sitio web"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
@@ -33,8 +33,8 @@ msgstr ""
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>به یک حساب نیاز دارید؟</0><1>ثبت نام کنید!</1>"
|
msgstr "<0>به یک حساب نیاز دارید؟</0><1>ثبت نام کنید!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "در مورد"
|
msgstr "در مورد"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "اضافه کردن دسته"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "افزودن کاربر"
|
msgstr "افزودن کاربر"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "مدیر"
|
msgstr "مدیر"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "همه"
|
msgstr "همه"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "بازگشت برای ورود به سیستم"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extention"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "لغو"
|
msgstr "لغو"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "مقوله"
|
msgstr "مقوله"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr ""
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "فشرده"
|
msgstr "فشرده"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "تأیید کنید"
|
msgstr "تأیید کنید"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "رمز عبور را تأیید کنید"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "دنج"
|
msgstr "دنج"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -249,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "توصیف"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "نمایش"
|
msgstr "نمایش"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "دانلود"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "پیوند را به نوار نشانک بکشید"
|
msgstr "پیوند را به نوار نشانک بکشید"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "ایمیل"
|
msgstr "ایمیل"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "آدرس ایمیل"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "ویرایش کاربر"
|
msgstr "ویرایش کاربر"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "فعال"
|
msgstr "فعال"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "گسترش یافت"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "اشتراک ها و دسته های خود را به عنوان یک فایل OPML صادر کنید که می تواند در سایر خدمات خواندن فید وارد شود"
|
msgstr "اشتراک ها و دسته های خود را به عنوان یک فایل OPML صادر کنید که می تواند در سایر خدمات خواندن فید وارد شود"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr ""
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "نام فید"
|
msgstr "نام فید"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "URL فید"
|
msgstr "URL فید"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "رمز عبور را فراموش کرده اید؟"
|
msgstr "رمز عبور را فراموش کرده اید؟"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "ابتدا یک کلید API در نمایه خود ایجاد کنید."
|
msgstr "ابتدا یک کلید API در نمایه خود ایجاد کنید."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "ابتدا یک کلید API در نمایه خود ایجاد کنید.
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "کلید API جدید ایجاد کنید"
|
msgstr "کلید API جدید ایجاد کنید"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "آدرس اینترنتی فید تولید شده"
|
msgstr "آدرس اینترنتی فید تولید شده"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "در نمای بازشده، پیمایش در ورودیها، آن
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "خوانده نشده نگه دارید"
|
msgstr "خوانده نشده نگه دارید"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "میانبرهای صفحه کلید"
|
msgstr "میانبرهای صفحه کلید"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr ""
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "پیوند"
|
msgstr "پیوند"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "بارگیری نمایه..."
|
msgstr "بارگیری نمایه..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "بارگیری اشتراک ها..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "بارگیری برچسب ها..."
|
msgstr "بارگیری برچسب ها..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "وارد شوید"
|
msgstr "وارد شوید"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "خروج"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "کاربران را مدیریت کنید"
|
msgstr "کاربران را مدیریت کنید"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "کاربران را مدیریت کنید"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "همه را به عنوان خوانده شده علامت گذاری کنید"
|
msgstr "همه را به عنوان خوانده شده علامت گذاری کنید"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "همه ورودی ها را به عنوان خوانده شده علامت گذاری کنید"
|
msgstr "همه ورودی ها را به عنوان خوانده شده علامت گذاری کنید"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "علامت گذاری به عنوان خوانده شده"
|
msgstr "علامت گذاری به عنوان خوانده شده"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "تا اینجا به عنوان خوانده شده علامت بزنید"
|
msgstr "تا اینجا به عنوان خوانده شده علامت بزنید"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "صفحه را به پایین ببرید"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "صفحه را به بالا ببرید"
|
msgstr "صفحه را به بالا ببرید"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "نام"
|
msgstr "نام"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "نام"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "با وارد کردن نام اشتراک، به آن بروید"
|
msgstr "با وارد کردن نام اشتراک، به آن بروید"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "رمز عبور جدید"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "ابتدا جدیدترین"
|
msgstr "ابتدا جدیدترین"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "بعد"
|
msgstr "بعد"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "پدر و مادر"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "دسته والد"
|
msgstr "دسته والد"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "رمز عبور"
|
msgstr "رمز عبور"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "گذرواژه ها مطابقت ندارند"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "موقعیت"
|
msgstr "موقعیت"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "بازیابی رمز عبور"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "تازه کردن"
|
msgstr "تازه کردن"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr ""
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "ذخیره کنید"
|
msgstr "ذخیره کنید"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "هنگام پیمایش بین ورودیها به آرامی حرک
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "جستجو"
|
msgstr "جستجو"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "جستجو به حداقل 3 کاراکتر نیاز دارد"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "ثبت نام کنید"
|
msgstr "ثبت نام کنید"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "اتفاق بدی افتاد..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "فضا"
|
msgstr "فضا"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "ستاره"
|
msgstr "ستاره"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "ستاره دار"
|
msgstr "ستاره دار"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "مشترک شوید"
|
msgstr "مشترک شوید"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "تم"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "وضعیت خواندن ورودی فعلی را تغییر دهید"
|
msgstr "وضعیت خواندن ورودی فعلی را تغییر دهید"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr ""
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "خوانده نشده"
|
msgstr "خوانده نشده"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1027,6 +1056,10 @@ msgstr ""
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "لغو اشتراک"
|
msgstr "لغو اشتراک"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "نام کاربری"
|
msgstr "نام کاربری"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "هشدار"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "وب سایت"
|
msgstr "وب سایت"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
@@ -33,8 +33,8 @@ msgstr ""
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Tarvitsetko tilin?</0><1>Rekisteröidy!</1>"
|
msgstr "<0>Tarvitsetko tilin?</0><1>Rekisteröidy!</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Noin"
|
msgstr "Noin"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Lisää luokka"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Lisää käyttäjä"
|
msgstr "Lisää käyttäjä"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Järjestelmänvalvoja"
|
msgstr "Järjestelmänvalvoja"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Kaikki"
|
msgstr "Kaikki"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Takaisin sisäänkirjautumiseen"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extention"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Peruuta"
|
msgstr "Peruuta"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Luokka"
|
msgstr "Luokka"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr ""
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Kompakti"
|
msgstr "Kompakti"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Vahvista"
|
msgstr "Vahvista"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Vahvista salasana"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Viihtyisä"
|
msgstr "Viihtyisä"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -249,8 +258,8 @@ msgstr ""
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr ""
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Näyttö"
|
msgstr "Näyttö"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Lataa"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Vedä linkki kirjanmerkkipalkkiin"
|
msgstr "Vedä linkki kirjanmerkkipalkkiin"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "Sähköposti"
|
msgstr "Sähköposti"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "Sähköpostiosoite"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Muokkaa käyttäjää"
|
msgstr "Muokkaa käyttäjää"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Käytössä"
|
msgstr "Käytössä"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Laajennettu"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Vie tilauksesi ja luokat OPML-tiedostona, joka voidaan tuoda muihin syötteiden lukupalveluihin"
|
msgstr "Vie tilauksesi ja luokat OPML-tiedostona, joka voidaan tuoda muihin syötteiden lukupalveluihin"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr ""
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Syötteen nimi"
|
msgstr "Syötteen nimi"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "Syötteen URL-osoite"
|
msgstr "Syötteen URL-osoite"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr ""
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Unohditko salasanan?"
|
msgstr "Unohditko salasanan?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Luo ensin API-avain profiiliisi."
|
msgstr "Luo ensin API-avain profiiliisi."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Luo ensin API-avain profiiliisi."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Luo uusi API-avain"
|
msgstr "Luo uusi API-avain"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "Luotu syötteen URL-osoite"
|
msgstr "Luotu syötteen URL-osoite"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "Merkitse ne luetuiksi laajennetussa näkymässä vierittämällä merkin
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Pidä lukematta"
|
msgstr "Pidä lukematta"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Pikanäppäimet"
|
msgstr "Pikanäppäimet"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr ""
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Linkki"
|
msgstr "Linkki"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Ladataan profiilia..."
|
msgstr "Ladataan profiilia..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Ladataan tilauksia..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Ladataan tunnisteita..."
|
msgstr "Ladataan tunnisteita..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Kirjaudu sisään"
|
msgstr "Kirjaudu sisään"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Uloskirjautuminen"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Hallitse käyttäjiä"
|
msgstr "Hallitse käyttäjiä"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Hallitse käyttäjiä"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Merkitse kaikki luetuiksi"
|
msgstr "Merkitse kaikki luetuiksi"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Merkitse kaikki merkinnät luetuiksi"
|
msgstr "Merkitse kaikki merkinnät luetuiksi"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Merkitse luetuksi"
|
msgstr "Merkitse luetuksi"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Merkitse luetuksi tähän asti"
|
msgstr "Merkitse luetuksi tähän asti"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Siirrä sivua alaspäin"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Siirrä sivua ylöspäin"
|
msgstr "Siirrä sivua ylöspäin"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nimi"
|
msgstr "Nimi"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Nimi"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Siirry tilaukseen kirjoittamalla sen nimi"
|
msgstr "Siirry tilaukseen kirjoittamalla sen nimi"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Uusi salasana"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Uusin ensin"
|
msgstr "Uusin ensin"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Seuraava"
|
msgstr "Seuraava"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "Vanhempi"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Pääluokka"
|
msgstr "Pääluokka"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Salasana"
|
msgstr "Salasana"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Salasanat eivät täsmää"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Sijainti"
|
msgstr "Sijainti"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Palauta salasana"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Päivitä"
|
msgstr "Päivitä"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr ""
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Tallenna"
|
msgstr "Tallenna"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Selaa sujuvasti navigoidessasi merkintöjen välillä"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Etsi"
|
msgstr "Etsi"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "Haku vaatii vähintään 3 merkkiä"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -910,9 +935,9 @@ msgstr ""
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Rekisteröidy"
|
msgstr "Rekisteröidy"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Jotain pahaa tapahtui juuri..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Avaruus"
|
msgstr "Avaruus"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Tähti"
|
msgstr "Tähti"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Tähdellä merkitty"
|
msgstr "Tähdellä merkitty"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "Tilaa"
|
msgstr "Tilaa"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Teema"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Vaihda nykyisen merkinnän lukutila"
|
msgstr "Vaihda nykyisen merkinnän lukutila"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr ""
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Lukematon"
|
msgstr "Lukematon"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Poista tähti"
|
msgstr "Poista tähti"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "Poista tähti"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Peruuta tilaus"
|
msgstr "Peruuta tilaus"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Käyttäjänimi"
|
msgstr "Käyttäjänimi"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Varoitus"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Verkkosivusto"
|
msgstr "Verkkosivusto"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ msgid "<0>CommaFeed is an open-source project. Sources are hosted on </0><1>GitH
|
|||||||
msgstr "<0>CommaFeed est un projet open-source. Les sources sont hébergées sur </0><1>GitHub</1>."
|
msgstr "<0>CommaFeed est un projet open-source. Les sources sont hébergées sur </0><1>GitHub</1>."
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "<0>Complete syntax is available </0><1>here</1>."
|
msgid "<0>Complete syntax is available </0><1>here</1><2>.</2>"
|
||||||
msgstr "<0>La syntaxe complète est disponible </0><1>ici</1>."
|
msgstr "<0>La syntaxe complète est disponible </0><1>ici</1><2>.</2>"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "<0>Have an account?</0><1>Log in!</1>"
|
msgid "<0>Have an account?</0><1>Log in!</1>"
|
||||||
@@ -33,8 +33,8 @@ msgstr "<0>Salut,</0><1>Je m'appelle Jérémie, je suis belge, et je développe
|
|||||||
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
msgid "<0>Need an account?</0><1>Sign up!</1>"
|
||||||
msgstr "<0>Besoin d'un compte ?</0><1>Enregistrez-vous !</1>"
|
msgstr "<0>Besoin d'un compte ?</0><1>Enregistrez-vous !</1>"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "À propos"
|
msgstr "À propos"
|
||||||
|
|
||||||
@@ -54,17 +54,22 @@ msgstr "Ajouter une catégorie"
|
|||||||
msgid "Add user"
|
msgid "Add user"
|
||||||
msgstr "Ajouter un utilisateur"
|
msgstr "Ajouter un utilisateur"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Administrateur"
|
msgstr "Administrateur"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
#: src/components/sidebar/Tree.tsx
|
msgid "Admin user name"
|
||||||
#: src/components/header/Header.tsx
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/add/CategorySelect.tsx
|
#: src/components/content/add/CategorySelect.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Tout"
|
msgstr "Tout"
|
||||||
|
|
||||||
@@ -137,39 +142,39 @@ msgstr "Retour à la connexion"
|
|||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr "Bleu"
|
msgstr "Bleu"
|
||||||
|
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
|
msgid "Browser extension"
|
||||||
|
msgstr "Extension navigateur"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Browser extension required for Chrome"
|
msgid "Browser extension required for Chrome"
|
||||||
msgstr "L'extension navigateur est nécessaire sur Chrome"
|
msgstr "L'extension navigateur est nécessaire sur Chrome"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
msgid "Browser extention"
|
|
||||||
msgstr "Extension navigateur"
|
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Browser tab"
|
msgid "Browser tab"
|
||||||
msgstr "Onglet navigateur"
|
msgstr "Onglet navigateur"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/content/add/ImportOpml.tsx
|
|
||||||
#: src/components/content/add/AddCategory.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/content/add/AddCategory.tsx
|
||||||
|
#: src/components/content/add/ImportOpml.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Annuler"
|
msgstr "Annuler"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/pages/app/AboutPage.tsx
|
#: src/components/content/add/AddCategory.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/AboutPage.tsx
|
||||||
#: src/components/content/add/AddCategory.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Catégorie"
|
msgstr "Catégorie"
|
||||||
|
|
||||||
@@ -209,11 +214,11 @@ msgstr "CommaFeed version {version} ({revision})."
|
|||||||
msgid "Compact"
|
msgid "Compact"
|
||||||
msgstr "Compact"
|
msgstr "Compact"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Confirm"
|
msgid "Confirm"
|
||||||
msgstr "Confirmer"
|
msgstr "Confirmer"
|
||||||
|
|
||||||
@@ -225,6 +230,10 @@ msgstr "Confirmer le mot de passe"
|
|||||||
msgid "Cozy"
|
msgid "Cozy"
|
||||||
msgstr "Cozy"
|
msgstr "Cozy"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Create Admin Account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Ctrl"
|
msgid "Ctrl"
|
||||||
msgstr "Ctrl"
|
msgstr "Ctrl"
|
||||||
@@ -249,8 +258,8 @@ msgstr "Code JS personnalisé qui sera appliqué au chargement des pages"
|
|||||||
msgid "Cyan"
|
msgid "Cyan"
|
||||||
msgstr "Cyan"
|
msgstr "Cyan"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Dark"
|
msgid "Dark"
|
||||||
msgstr "Foncé"
|
msgstr "Foncé"
|
||||||
|
|
||||||
@@ -283,14 +292,18 @@ msgstr "Descendant"
|
|||||||
msgid "Detailed"
|
msgid "Detailed"
|
||||||
msgstr "Vue détaillée"
|
msgstr "Vue détaillée"
|
||||||
|
|
||||||
#: src/pages/app/SettingsPage.tsx
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Disable \"Pull to refresh\" browser behavior"
|
||||||
|
msgstr "Désactiver la fonction \"tirer pour rafraîchir\" du navigateur"
|
||||||
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
#: src/pages/app/SettingsPage.tsx
|
||||||
msgid "Display"
|
msgid "Display"
|
||||||
msgstr "Affichage"
|
msgstr "Affichage"
|
||||||
|
|
||||||
#: src/pages/app/DonatePage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/app/DonatePage.tsx
|
||||||
msgid "Donate"
|
msgid "Donate"
|
||||||
msgstr "Faire un don"
|
msgstr "Faire un don"
|
||||||
|
|
||||||
@@ -302,11 +315,13 @@ msgstr "Télécharger"
|
|||||||
msgid "Drag link to bookmark bar"
|
msgid "Drag link to bookmark bar"
|
||||||
msgstr "Déplacez le lien vers la barre de favoris"
|
msgstr "Déplacez le lien vers la barre de favoris"
|
||||||
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/auth/PasswordRecoveryPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
|
#: src/pages/auth/PasswordRecoveryPage.tsx
|
||||||
msgid "E-mail"
|
msgid "E-mail"
|
||||||
msgstr "E-mail"
|
msgstr "E-mail"
|
||||||
|
|
||||||
@@ -319,8 +334,8 @@ msgstr "Adresse e-mail"
|
|||||||
msgid "Edit user"
|
msgid "Edit user"
|
||||||
msgstr "Modifier un utilisateur"
|
msgstr "Modifier un utilisateur"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "Actif"
|
msgstr "Actif"
|
||||||
|
|
||||||
@@ -356,8 +371,8 @@ msgstr "Vue étendue"
|
|||||||
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
msgid "Export your subscriptions and categories as an OPML file that can be imported in other feed reading services"
|
||||||
msgstr "Exporter vos abonnements et catégories en tant que fichier OPML qui peut être importé dans d'autres services de lecture de flux"
|
msgstr "Exporter vos abonnements et catégories en tant que fichier OPML qui peut être importé dans d'autres services de lecture de flux"
|
||||||
|
|
||||||
#: src/pages/WelcomePage.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/pages/WelcomePage.tsx
|
||||||
msgid "Extension options"
|
msgid "Extension options"
|
||||||
msgstr "Options de l'extension"
|
msgstr "Options de l'extension"
|
||||||
|
|
||||||
@@ -365,9 +380,9 @@ msgstr "Options de l'extension"
|
|||||||
msgid "Feed name"
|
msgid "Feed name"
|
||||||
msgstr "Nom du flux"
|
msgstr "Nom du flux"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Feed URL"
|
msgid "Feed URL"
|
||||||
msgstr "URL du flux"
|
msgstr "URL du flux"
|
||||||
|
|
||||||
@@ -399,9 +414,9 @@ msgstr "La récupération forcée des flux n'est pas encore disponible."
|
|||||||
msgid "Forgot password?"
|
msgid "Forgot password?"
|
||||||
msgstr "Mot de passe oublié ?"
|
msgstr "Mot de passe oublié ?"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generate an API key in your profile first."
|
msgid "Generate an API key in your profile first."
|
||||||
msgstr "Générez d'abord une clé API dans votre profil."
|
msgstr "Générez d'abord une clé API dans votre profil."
|
||||||
|
|
||||||
@@ -409,9 +424,9 @@ msgstr "Générez d'abord une clé API dans votre profil."
|
|||||||
msgid "Generate new API key"
|
msgid "Generate new API key"
|
||||||
msgstr "Générer une nouvelle clé API"
|
msgstr "Générer une nouvelle clé API"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Generated feed url"
|
msgid "Generated feed url"
|
||||||
msgstr "URL du flux généré"
|
msgstr "URL du flux généré"
|
||||||
|
|
||||||
@@ -472,13 +487,17 @@ msgstr "En mode de lecture étendu, marquer les éléments comme lus lorsque la
|
|||||||
msgid "Indigo"
|
msgid "Indigo"
|
||||||
msgstr "Indigo"
|
msgstr "Indigo"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Initial Setup"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Keep unread"
|
msgid "Keep unread"
|
||||||
msgstr "Garder non lu"
|
msgstr "Garder non lu"
|
||||||
|
|
||||||
#: src/pages/app/AboutPage.tsx
|
|
||||||
#: src/components/content/FeedEntries.tsx
|
#: src/components/content/FeedEntries.tsx
|
||||||
|
#: src/pages/app/AboutPage.tsx
|
||||||
msgid "Keyboard shortcuts"
|
msgid "Keyboard shortcuts"
|
||||||
msgstr "Raccourcis clavier"
|
msgstr "Raccourcis clavier"
|
||||||
|
|
||||||
@@ -506,12 +525,16 @@ msgstr "Clair"
|
|||||||
msgid "Lime"
|
msgid "Lime"
|
||||||
msgstr "Jaune-vert"
|
msgstr "Jaune-vert"
|
||||||
|
|
||||||
#: src/pages/app/TagDetailsPage.tsx
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
|
#: src/pages/app/TagDetailsPage.tsx
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Lien"
|
msgstr "Lien"
|
||||||
|
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
msgid "Link to the documentation"
|
||||||
|
msgstr "Lien vers la documentation"
|
||||||
|
|
||||||
#: src/hooks/useAppLoading.ts
|
#: src/hooks/useAppLoading.ts
|
||||||
msgid "Loading profile..."
|
msgid "Loading profile..."
|
||||||
msgstr "Chargement du profil..."
|
msgstr "Chargement du profil..."
|
||||||
@@ -528,9 +551,9 @@ msgstr "Chargement des abonnements..."
|
|||||||
msgid "Loading tags..."
|
msgid "Loading tags..."
|
||||||
msgstr "Chargement des marqueurs..."
|
msgstr "Chargement des marqueurs..."
|
||||||
|
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
msgid "Log in"
|
msgid "Log in"
|
||||||
msgstr "Connexion"
|
msgstr "Connexion"
|
||||||
|
|
||||||
@@ -542,8 +565,8 @@ msgstr "Déconnexion"
|
|||||||
msgid "Long press"
|
msgid "Long press"
|
||||||
msgstr "Appui long"
|
msgstr "Appui long"
|
||||||
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/header/ProfileMenu.tsx
|
#: src/components/header/ProfileMenu.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
msgid "Manage users"
|
msgid "Manage users"
|
||||||
msgstr "Gestion des utilisateurs"
|
msgstr "Gestion des utilisateurs"
|
||||||
|
|
||||||
@@ -551,18 +574,18 @@ msgstr "Gestion des utilisateurs"
|
|||||||
msgid "Mark all as read"
|
msgid "Mark all as read"
|
||||||
msgstr "Tout marquer comme lu"
|
msgstr "Tout marquer comme lu"
|
||||||
|
|
||||||
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
|
#: src/components/MarkAllAsReadConfirmationDialog.tsx
|
||||||
msgid "Mark all entries as read"
|
msgid "Mark all entries as read"
|
||||||
msgstr "Marquer toutes les entrées comme lues"
|
msgstr "Marquer toutes les entrées comme lues"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr "Marquer comme lu"
|
msgstr "Marquer comme lu"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
msgid "Mark as read up to here"
|
msgid "Mark as read up to here"
|
||||||
msgstr "Marquer comme lu jusqu'ici"
|
msgstr "Marquer comme lu jusqu'ici"
|
||||||
|
|
||||||
@@ -582,15 +605,15 @@ msgstr "Faites défiler la page vers le bas"
|
|||||||
msgid "Move the page up"
|
msgid "Move the page up"
|
||||||
msgstr "Faites défiler la page vers le haut"
|
msgstr "Faites défiler la page vers le haut"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/components/RelativeDate.tsx
|
#: src/components/RelativeDate.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "N/A"
|
msgid "N/A"
|
||||||
msgstr "N/A"
|
msgstr "N/A"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/pages/admin/AdminUsersPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/admin/AdminUsersPage.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
|
|
||||||
@@ -598,6 +621,10 @@ msgstr "Nom"
|
|||||||
msgid "Navigate to a subscription by entering its name"
|
msgid "Navigate to a subscription by entering its name"
|
||||||
msgstr "Naviguer vers un abonnement en entrant son nom"
|
msgstr "Naviguer vers un abonnement en entrant son nom"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "Navigate to the next category/feed with unread entries when marking all entries as read"
|
||||||
|
msgstr "Aller vers la catégorie/le flux comportant des entrées non lues suivant après avoir marqué toutes les entrées lues"
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Never"
|
msgid "Never"
|
||||||
@@ -611,8 +638,8 @@ msgstr "Nouveau mot de passe"
|
|||||||
msgid "Newest first"
|
msgid "Newest first"
|
||||||
msgstr "Plus récent en premier"
|
msgstr "Plus récent en premier"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/header/Header.tsx
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Suivant"
|
msgstr "Suivant"
|
||||||
|
|
||||||
@@ -734,11 +761,13 @@ msgstr "Parent"
|
|||||||
msgid "Parent Category"
|
msgid "Parent Category"
|
||||||
msgstr "Catégorie parente"
|
msgstr "Catégorie parente"
|
||||||
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/pages/auth/LoginPage.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/LoginPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Mot de passe"
|
msgstr "Mot de passe"
|
||||||
|
|
||||||
@@ -754,8 +783,8 @@ msgstr "Les mots de passe ne correspondent pas"
|
|||||||
msgid "Pink"
|
msgid "Pink"
|
||||||
msgstr "Rose"
|
msgstr "Rose"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Position"
|
msgstr "Position"
|
||||||
|
|
||||||
@@ -779,8 +808,8 @@ msgstr "Récupérer le mot de passe"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr "Rouge"
|
msgstr "Rouge"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Refresh"
|
msgid "Refresh"
|
||||||
msgstr "Rafraîchir"
|
msgstr "Rafraîchir"
|
||||||
|
|
||||||
@@ -797,11 +826,11 @@ msgstr "API REST"
|
|||||||
msgid "Right click"
|
msgid "Right click"
|
||||||
msgstr "Clic droit"
|
msgstr "Clic droit"
|
||||||
|
|
||||||
#: src/pages/app/FeedDetailsPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
|
||||||
#: src/components/settings/CustomCodeSettings.tsx
|
|
||||||
#: src/components/admin/UserEdit.tsx
|
#: src/components/admin/UserEdit.tsx
|
||||||
|
#: src/components/settings/CustomCodeSettings.tsx
|
||||||
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedDetailsPage.tsx
|
||||||
msgid "Save"
|
msgid "Save"
|
||||||
msgstr "Enregistrer"
|
msgstr "Enregistrer"
|
||||||
|
|
||||||
@@ -817,17 +846,13 @@ msgstr "Défilement animé lors de la navigation entre les entrées"
|
|||||||
msgid "Scrolling"
|
msgid "Scrolling"
|
||||||
msgstr "Défilement"
|
msgstr "Défilement"
|
||||||
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/sidebar/TreeSearch.tsx
|
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
#: src/components/header/Header.tsx
|
#: src/components/header/Header.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
|
#: src/components/sidebar/TreeSearch.tsx
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Rechercher"
|
msgstr "Rechercher"
|
||||||
|
|
||||||
#: src/components/header/Header.tsx
|
|
||||||
msgid "Search requires at least 3 characters"
|
|
||||||
msgstr "La recherche requiert au moins 3 caractères"
|
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Select next unread feed/category"
|
msgid "Select next unread feed/category"
|
||||||
msgstr "Sélectionner l'article non lu suivant/la catégorie non lue suivante"
|
msgstr "Sélectionner l'article non lu suivant/la catégorie non lue suivante"
|
||||||
@@ -910,9 +935,9 @@ msgstr "Afficher le nombre d'entrées non lues dans la favicône de l'onglet"
|
|||||||
msgid "Show unread count in tab title"
|
msgid "Show unread count in tab title"
|
||||||
msgstr "Afficher le nombre d'entrées non lues dans le titre de l'onglet"
|
msgstr "Afficher le nombre d'entrées non lues dans le titre de l'onglet"
|
||||||
|
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
|
#: src/pages/auth/RegistrationPage.tsx
|
||||||
#: src/pages/WelcomePage.tsx
|
#: src/pages/WelcomePage.tsx
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
#: src/pages/auth/RegistrationPage.tsx
|
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Créer un compte"
|
msgstr "Créer un compte"
|
||||||
|
|
||||||
@@ -925,21 +950,21 @@ msgstr "Quelque chose s'est mal passé..."
|
|||||||
msgid "Space"
|
msgid "Space"
|
||||||
msgstr "Espace"
|
msgstr "Espace"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Star"
|
msgid "Star"
|
||||||
msgstr "Ajouter aux favoris"
|
msgstr "Ajouter aux favoris"
|
||||||
|
|
||||||
#: src/pages/app/FeedEntriesPage.tsx
|
|
||||||
#: src/pages/app/CategoryDetailsPage.tsx
|
|
||||||
#: src/components/sidebar/Tree.tsx
|
#: src/components/sidebar/Tree.tsx
|
||||||
|
#: src/pages/app/CategoryDetailsPage.tsx
|
||||||
|
#: src/pages/app/FeedEntriesPage.tsx
|
||||||
msgid "Starred"
|
msgid "Starred"
|
||||||
msgstr "Favoris"
|
msgstr "Favoris"
|
||||||
|
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
|
#: src/components/content/add/Subscribe.tsx
|
||||||
#: src/pages/app/AddPage.tsx
|
#: src/pages/app/AddPage.tsx
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
#: src/components/content/add/Subscribe.tsx
|
|
||||||
msgid "Subscribe"
|
msgid "Subscribe"
|
||||||
msgstr "S'abonner"
|
msgstr "S'abonner"
|
||||||
|
|
||||||
@@ -992,6 +1017,10 @@ msgstr "Thème"
|
|||||||
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
msgid "This is your API key. It can be used for some read-only API operations and grants access to the Fever API. Use the form at the bottom of the page to generate a new API key"
|
||||||
msgstr "Ceci est votre clef API. Elle peut être utilisée pour certaines opérations en lecture seule et donne accès à l'API Fever. Utilisez le formulaire en bas de la page pour générer une nouvelle clef API"
|
msgstr "Ceci est votre clef API. Elle peut être utilisée pour certaines opérations en lecture seule et donne accès à l'API Fever. Utilisez le formulaire en bas de la page pour générer une nouvelle clef API"
|
||||||
|
|
||||||
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
|
msgid "This setting can cause scrolling issues on some browsers (e.g. Safari)"
|
||||||
|
msgstr "Cette fonctinnalité peut causer des problèmes de défilement sur certains navigateurs (Safari, par exemple)"
|
||||||
|
|
||||||
#: src/components/KeyboardShortcutsHelp.tsx
|
#: src/components/KeyboardShortcutsHelp.tsx
|
||||||
msgid "Toggle read status of current entry"
|
msgid "Toggle read status of current entry"
|
||||||
msgstr "Marquer l'entrée actuelle comme lue/non lue"
|
msgstr "Marquer l'entrée actuelle comme lue/non lue"
|
||||||
@@ -1016,8 +1045,8 @@ msgstr "Essayez la version de démonstration !"
|
|||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr "Non lu"
|
msgstr "Non lu"
|
||||||
|
|
||||||
#: src/components/content/FeedEntryFooter.tsx
|
|
||||||
#: src/components/content/FeedEntryContextMenu.tsx
|
#: src/components/content/FeedEntryContextMenu.tsx
|
||||||
|
#: src/components/content/FeedEntryFooter.tsx
|
||||||
#: src/components/content/header/Star.tsx
|
#: src/components/content/header/Star.tsx
|
||||||
msgid "Unstar"
|
msgid "Unstar"
|
||||||
msgstr "Retirer des favoris"
|
msgstr "Retirer des favoris"
|
||||||
@@ -1027,6 +1056,10 @@ msgstr "Retirer des favoris"
|
|||||||
msgid "Unsubscribe"
|
msgid "Unsubscribe"
|
||||||
msgstr "Se désabonner"
|
msgstr "Se désabonner"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "User created."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/ProfileSettings.tsx
|
#: src/components/settings/ProfileSettings.tsx
|
||||||
msgid "User name"
|
msgid "User name"
|
||||||
msgstr "Nom"
|
msgstr "Nom"
|
||||||
@@ -1048,6 +1081,10 @@ msgstr "Attention"
|
|||||||
msgid "Website"
|
msgid "Website"
|
||||||
msgstr "Site web"
|
msgstr "Site web"
|
||||||
|
|
||||||
|
#: src/pages/auth/InitialSetupPage.tsx
|
||||||
|
msgid "Welcome! This appears to be the first time you're running CommaFeed. Please create an administrator account to get started."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/settings/DisplaySettings.tsx
|
#: src/components/settings/DisplaySettings.tsx
|
||||||
msgid "Yellow"
|
msgid "Yellow"
|
||||||
msgstr "Jaune"
|
msgstr "Jaune"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user