Compare commits
515 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94a518f4a8 | ||
|
|
e56dccc7f1 | ||
|
|
adf601c572 | ||
|
|
00eb768cdf | ||
|
|
b8d00f24f7 | ||
|
|
031f11c5c1 | ||
|
|
1ffe7da9b7 | ||
|
|
292c6dd6b0 | ||
|
|
6f5a0ea6b8 | ||
|
|
f44b564bb5 | ||
|
|
b380fd2306 | ||
|
|
528ce1a5fe | ||
|
|
593d8a1cbc | ||
|
|
8f6ea7b49f | ||
|
|
01d005dbbe | ||
|
|
45fb059e71 | ||
|
|
40a11bd9ce | ||
|
|
935f97415f | ||
|
|
969dab9971 | ||
|
|
193b548d0b | ||
|
|
6dacd1bdd6 | ||
|
|
6a0a872790 | ||
|
|
fa71586a50 | ||
|
|
65c5828456 | ||
|
|
892c68856f | ||
|
|
ea96999377 | ||
|
|
a9fb458f19 | ||
|
|
88c774339d | ||
|
|
962e6e576c | ||
|
|
07a28c0841 | ||
|
|
1e7ef54c05 | ||
|
|
701270b020 | ||
|
|
84f142683f | ||
|
|
7033652508 | ||
|
|
6c3489aa3d | ||
|
|
82f18c7cff | ||
|
|
875eefe71f | ||
|
|
1972f2b6db | ||
|
|
dd080d9a04 | ||
|
|
933414934c | ||
|
|
dec25762f0 | ||
|
|
a2c9754560 | ||
|
|
0f107d8648 | ||
|
|
1b7b6af84d | ||
|
|
5e38e71229 | ||
|
|
83983d772d | ||
|
|
3e133c10d2 | ||
|
|
6a67873c10 | ||
|
|
588ea9b04e | ||
|
|
68b7fe2b35 | ||
|
|
5643af9845 | ||
|
|
ad3752650b | ||
|
|
8718b4bcee | ||
|
|
f29154cfa4 | ||
|
|
da948f83a1 | ||
|
|
84bb98b007 | ||
|
|
c3a623c329 | ||
|
|
1249724f8a | ||
|
|
4503612bf0 | ||
|
|
9c7a9eb326 | ||
|
|
07e99768e6 | ||
|
|
a63f71d3ee | ||
|
|
76f6b3a4a7 | ||
|
|
7052951a43 | ||
|
|
09b4de08e3 | ||
|
|
82b490c524 | ||
|
|
e0bc45f37e | ||
|
|
6e2197a254 | ||
|
|
de4ce73a9a | ||
|
|
f52c6f3b41 | ||
|
|
2271cc0044 | ||
|
|
931ffe4c84 | ||
|
|
45f39120da | ||
|
|
000e15640a | ||
|
|
d4ad11a63f | ||
|
|
c533966050 | ||
|
|
9b7d6b196f | ||
|
|
512a6cd4b9 | ||
|
|
6b0659af1f | ||
|
|
12279e9bda | ||
|
|
dadd501843 | ||
|
|
756f6310af | ||
|
|
7a19bedc25 | ||
|
|
a10a30a22c | ||
|
|
57e4ca355b | ||
|
|
fed3102492 | ||
|
|
64e0e256ce | ||
|
|
287581025e | ||
|
|
3184b9ea0d | ||
|
|
233eb7e785 | ||
|
|
a801f8f65f | ||
|
|
4afe654bcc | ||
|
|
926be245a9 | ||
|
|
f1615e6660 | ||
|
|
ac6ecf21a0 | ||
|
|
8629f0a26d | ||
|
|
7a6ef23adb | ||
|
|
dfa19c96b9 | ||
|
|
334c023b4f | ||
|
|
1f373e0b3e | ||
|
|
47fc4040d5 | ||
|
|
f5e47ab61a | ||
|
|
83cdb2ed2b | ||
|
|
d67eca8882 | ||
|
|
a0044dd3ad | ||
|
|
149ed8c266 | ||
|
|
65755a08aa | ||
|
|
1ea8e38372 | ||
|
|
69adb3fde2 | ||
|
|
28be9b5988 | ||
|
|
0590896453 | ||
|
|
8f59c4a236 | ||
|
|
550af91030 | ||
|
|
bb5721c473 | ||
|
|
68c93c65e6 | ||
|
|
d36efa5796 | ||
|
|
0a58f259ff | ||
|
|
649f0038bc | ||
|
|
9697e302d7 | ||
|
|
415d59eeb3 | ||
|
|
3cb06eb526 | ||
|
|
2087c775fc | ||
|
|
4dd4363e91 | ||
|
|
314050b568 | ||
|
|
1765a97f31 | ||
|
|
30ac8cb41c | ||
|
|
959b778cd7 | ||
|
|
ca87a5527d | ||
|
|
711c3d1b67 | ||
|
|
5210a68cc6 | ||
|
|
616e56e3f5 | ||
|
|
8e0075ff90 | ||
|
|
c980c70798 | ||
|
|
fa2763d8cd | ||
|
|
d18e472623 | ||
|
|
5f0c1ec70a | ||
|
|
4386999c38 | ||
|
|
9b07f3eb90 | ||
|
|
b280e18651 | ||
|
|
086bfa310f | ||
|
|
990ae8464e | ||
|
|
e4c82b5e8d | ||
|
|
4d790feaae | ||
|
|
b72dca0e2e | ||
|
|
e1a3a82f75 | ||
|
|
ec8700f3e9 | ||
|
|
d999bb3f09 | ||
|
|
a83d5132d9 | ||
|
|
1840e9a57a | ||
|
|
d876ba30d4 | ||
|
|
47bc073fb4 | ||
|
|
808e79e2ac | ||
|
|
371eacb354 | ||
|
|
f04f5921e1 | ||
|
|
035dd25ece | ||
|
|
03fa2f86d7 | ||
|
|
f999f4a467 | ||
|
|
5cfadaea7f | ||
|
|
562235f828 | ||
|
|
d6f6ea9dba | ||
|
|
8bc240b934 | ||
|
|
3ae4113043 | ||
|
|
1f52435bc1 | ||
|
|
4d0dfcca61 | ||
|
|
ea9076652a | ||
|
|
af1a464d87 | ||
|
|
50fe6041f0 | ||
|
|
555a4b6b05 | ||
|
|
7709be8118 | ||
|
|
130ac76e0c | ||
|
|
ae315f1789 | ||
|
|
4782e72d88 | ||
|
|
d69cafee01 | ||
|
|
e066ed58ca | ||
|
|
05a65cbf9d | ||
|
|
ea6a668a84 | ||
|
|
08615fe9f6 | ||
|
|
f8ef5ddf5a | ||
|
|
595d81dd2f | ||
|
|
00c654953d | ||
|
|
bf2f3a7d17 | ||
|
|
612f0fde2d | ||
|
|
a701e031a7 | ||
|
|
d51854e663 | ||
|
|
cb9a18fd40 | ||
|
|
ed28d69d76 | ||
|
|
5667cedafc | ||
|
|
42fe535df7 | ||
|
|
0e1e2bde22 | ||
|
|
1a5e2f3cda | ||
|
|
32cb113014 | ||
|
|
559af0cd56 | ||
|
|
0e5477eecf | ||
|
|
ab631fa26e | ||
|
|
5776544c20 | ||
|
|
666e2a42cf | ||
|
|
2fc1dda122 | ||
|
|
0115b594d6 | ||
|
|
c5828978b2 | ||
|
|
3ff756e057 | ||
|
|
1c405ff4ec | ||
|
|
5d1041d564 | ||
|
|
9e8942398c | ||
|
|
a5b7c8439d | ||
|
|
9131a8f118 | ||
|
|
8687fe6b26 | ||
|
|
1d38fd8dea | ||
|
|
4186bbb3c3 | ||
|
|
897c71f36e | ||
|
|
f9ce9b7716 | ||
|
|
ec230ba249 | ||
|
|
6bfa49689e | ||
|
|
177acf86d7 | ||
|
|
c89ed904cc | ||
|
|
6add7c3d82 | ||
|
|
c562035776 | ||
|
|
4757e25fdc | ||
|
|
077bc356b8 | ||
|
|
1dff880a93 | ||
|
|
122b987fa3 | ||
|
|
c024c4f01c | ||
|
|
a677fbefbf | ||
|
|
244a76de0b | ||
|
|
20ac15b18c | ||
|
|
75244cc40e | ||
|
|
3e731298a5 | ||
|
|
ed0bf027fc | ||
|
|
7a10131768 | ||
|
|
19522b8712 | ||
|
|
af79061a45 | ||
|
|
d56d9f7a50 | ||
|
|
45a1a9ed5a | ||
|
|
50954cf3d4 | ||
|
|
6beefbf39a | ||
|
|
8f21d1ae31 | ||
|
|
e4825531c4 | ||
|
|
6174f53f37 | ||
|
|
42baa4b188 | ||
|
|
52eaddae37 | ||
|
|
f43ce0db44 | ||
|
|
b46cb0a1f7 | ||
|
|
e4e5ad7eba | ||
|
|
0e6ea57023 | ||
|
|
280bb5fc81 | ||
|
|
077d21eb7e | ||
|
|
f281d86e8a | ||
|
|
f7000a280e | ||
|
|
586ded6b3f | ||
|
|
539e0f005a | ||
|
|
330575bab3 | ||
|
|
30ec4aed28 | ||
|
|
ee456fd8e5 | ||
|
|
ed25c8a84b | ||
|
|
b0a45fe09c | ||
|
|
50f0f46ad9 | ||
|
|
bd61d459ad | ||
|
|
4f73c60d37 | ||
|
|
7c536f0cb0 | ||
|
|
d5a489198a | ||
|
|
17f54da524 | ||
|
|
b5065673ab | ||
|
|
610b0f63e0 | ||
|
|
73317bda67 | ||
|
|
f690f3acba | ||
|
|
eea9f1f6cb | ||
|
|
d9089e8d1c | ||
|
|
bed5acc9d5 | ||
|
|
f46feff445 | ||
|
|
d46a98c7d5 | ||
|
|
05af60df4f | ||
|
|
5fc266ed81 | ||
|
|
38356c31b0 | ||
|
|
2703cfb81e | ||
|
|
8a226ca473 | ||
|
|
33e6d54fd2 | ||
|
|
d36f37a4ed | ||
|
|
f3ebbb6547 | ||
|
|
28b2f79e5b | ||
|
|
9a77115a30 | ||
|
|
2d899e364d | ||
|
|
32b881891c | ||
|
|
9eefc07c7c | ||
|
|
792accffb6 | ||
|
|
03af88aba5 | ||
|
|
f56b6b4ad0 | ||
|
|
4ce1681e79 | ||
|
|
7570fa71f0 | ||
|
|
8a61c76cd9 | ||
|
|
fbf5381699 | ||
|
|
ff77f0db4f | ||
|
|
2e30abedc9 | ||
|
|
c4cb4f7475 | ||
|
|
7432bb813e | ||
|
|
572a104779 | ||
|
|
f77dc23d92 | ||
|
|
e92fc74dd3 | ||
|
|
9479c3d5c3 | ||
|
|
cfc37a64e1 | ||
|
|
2d5294804c | ||
|
|
6c01a85077 | ||
|
|
cf41e988eb | ||
|
|
d7a161c088 | ||
|
|
379c4040fe | ||
|
|
3f17618ad5 | ||
|
|
d7be64c3d9 | ||
|
|
ef7737e9be | ||
|
|
51ad3184b6 | ||
|
|
efc8fd878a | ||
|
|
6da1e98c83 | ||
|
|
513a06740c | ||
|
|
743a070724 | ||
|
|
5fb0e76669 | ||
|
|
bedeab686e | ||
|
|
9d9fa352ce | ||
|
|
1bfa6ce862 | ||
|
|
755b29c859 | ||
|
|
aab5b0247a | ||
|
|
d7e4b0bd17 | ||
|
|
3bacdadb80 | ||
|
|
1d75ee44ed | ||
|
|
230cc343af | ||
|
|
b318ee165c | ||
|
|
f677646365 | ||
|
|
8db7d820d7 | ||
|
|
adb0632566 | ||
|
|
4d5c8db333 | ||
|
|
01d6a3d5f8 | ||
|
|
fbeadbc32f | ||
|
|
1289be888f | ||
|
|
aa7e3a955c | ||
|
|
2823f3b921 | ||
|
|
ddb2a74540 | ||
|
|
37d8d7a2f8 | ||
|
|
578b715a1f | ||
|
|
f14a811ce9 | ||
|
|
06dd6d2213 | ||
|
|
72471c47f4 | ||
|
|
aec5f7173c | ||
|
|
f7b68789ac | ||
|
|
0672da621e | ||
|
|
a7f9b78533 | ||
|
|
0075429e08 | ||
|
|
43f7ccd166 | ||
|
|
8c64e0f288 | ||
|
|
c91a387833 | ||
|
|
93d5dd88ba | ||
|
|
05427253b9 | ||
|
|
e2bc541089 | ||
|
|
9a959bab16 | ||
|
|
45ca4a15f7 | ||
|
|
ddd2ff53ff | ||
|
|
5c3266b48f | ||
|
|
0da6db9d9f | ||
|
|
adeffbcf71 | ||
|
|
f0ca7b753f | ||
|
|
1bbde65121 | ||
|
|
3acdf041e9 | ||
|
|
fce755f0c4 | ||
|
|
b1cdccc020 | ||
|
|
eee070f1cd | ||
|
|
e36dd56e3b | ||
|
|
aa7d08e93f | ||
|
|
df67896a55 | ||
|
|
3fb790c33c | ||
|
|
850a1a39fe | ||
|
|
942b575c18 | ||
|
|
6dc53052b6 | ||
|
|
7e99b3e505 | ||
|
|
0c474e6b74 | ||
|
|
d5b92478ba | ||
|
|
3b45699e58 | ||
|
|
587a317e91 | ||
|
|
62db38b0d1 | ||
|
|
34ccca6a91 | ||
|
|
bf94d6bf5b | ||
|
|
fc0658574c | ||
|
|
b9e8ee4d0e | ||
|
|
47dc1a3960 | ||
|
|
6796f5cb28 | ||
|
|
f5fb5b32e4 | ||
|
|
3941e7fb1c | ||
|
|
a28051fa16 | ||
|
|
ace1610dfc | ||
|
|
cf2f987fd4 | ||
|
|
1f2639fbb5 | ||
|
|
3c2880e4ba | ||
|
|
db18519c16 | ||
|
|
b520713dc3 | ||
|
|
15a8c4f0d7 | ||
|
|
a7d80fec89 | ||
|
|
d32ecc9080 | ||
|
|
370f156ae0 | ||
|
|
97736d4163 | ||
|
|
a0338beaae | ||
|
|
8bb850d96b | ||
|
|
999e55c7af | ||
|
|
c3533de7fa | ||
|
|
0543f28fd4 | ||
|
|
48f73eab06 | ||
|
|
14c572102e | ||
|
|
c58a52c797 | ||
|
|
8c0c0f1617 | ||
|
|
b154314b79 | ||
|
|
70010d09d6 | ||
|
|
0b24533a13 | ||
|
|
be78d063a4 | ||
|
|
4cee24bd96 | ||
|
|
0a5cdfc57a | ||
|
|
5009f9d3f2 | ||
|
|
f750876425 | ||
|
|
680d488647 | ||
|
|
81af23ecb5 | ||
|
|
d4b05b2612 | ||
|
|
5a284bff26 | ||
|
|
f1a9191e84 | ||
|
|
d876454638 | ||
|
|
06de8dd532 | ||
|
|
70592c2438 | ||
|
|
5acaa31a1f | ||
|
|
79e5ff2fea | ||
|
|
7f91fe59e2 | ||
|
|
b40dad3d3e | ||
|
|
f9f816845f | ||
|
|
193b58d0fc | ||
|
|
b7f490544a | ||
|
|
5d85e3c0e2 | ||
|
|
75214c345a | ||
|
|
6d55e74ae4 | ||
|
|
710f979f94 | ||
|
|
c2a036c526 | ||
|
|
a6c52df4cb | ||
|
|
4d1ad16ea2 | ||
|
|
94c093ea57 | ||
|
|
acd421c617 | ||
|
|
4d2004c8c9 | ||
|
|
6c5bfa466f | ||
|
|
794938c525 | ||
|
|
62188ffdc7 | ||
|
|
34f7bd4341 | ||
|
|
6b45825472 | ||
|
|
b81a5d1e51 | ||
|
|
5d9e90f033 | ||
|
|
55a3e6880b | ||
|
|
beee9ecd84 | ||
|
|
b94d7a4ae8 | ||
|
|
331999c1a4 | ||
|
|
e5db1ec848 | ||
|
|
17d7161374 | ||
|
|
06d4f2b9f3 | ||
|
|
4b69fdefef | ||
|
|
13db31ede0 | ||
|
|
22a073ba1a | ||
|
|
ce9c115f3d | ||
|
|
767aa9b3e1 | ||
|
|
16ddb2461b | ||
|
|
f75827c4c6 | ||
|
|
cf03e60186 | ||
|
|
8ee071769a | ||
|
|
b312183a7b | ||
|
|
5baaf5faec | ||
|
|
d685bfd11d | ||
|
|
cf4b230b7a | ||
|
|
d46f5f4613 | ||
|
|
945ed854a4 | ||
|
|
25f0672c18 | ||
|
|
6f6c8b2ae0 | ||
|
|
7e62410f98 | ||
|
|
f49e8486c7 | ||
|
|
844bc23f8c | ||
|
|
850226b260 | ||
|
|
c5100567d6 | ||
|
|
5344854199 | ||
|
|
d790b17507 | ||
|
|
667d3851ce | ||
|
|
ba4d345f4f | ||
|
|
52816426fc | ||
|
|
38a423cf2a | ||
|
|
75ad7eb7e4 | ||
|
|
533c3b7b1b | ||
|
|
1c98999994 | ||
|
|
b19b4f047e | ||
|
|
95b6ea0e23 | ||
|
|
b3db549a65 | ||
|
|
cd768000e9 | ||
|
|
da6099c29d | ||
|
|
d36e569ede | ||
|
|
eca3757af5 | ||
|
|
7d8634ce5e | ||
|
|
d4f6785946 | ||
|
|
b468045039 | ||
|
|
f3b4f21c2e | ||
|
|
a50ae64397 | ||
|
|
2a5c58e138 | ||
|
|
d21945a6e6 | ||
|
|
0c572cb029 | ||
|
|
9d30b952ee | ||
|
|
e32876d08d | ||
|
|
340b138962 | ||
|
|
7ae0ba31cb | ||
|
|
f566671975 | ||
|
|
b7ff123e44 | ||
|
|
e1c34bc489 | ||
|
|
dedd341e02 | ||
|
|
dc8fc04b57 | ||
|
|
6a85859a35 | ||
|
|
ff1e8d9e8c | ||
|
|
16da998452 | ||
|
|
2fc7c6ab99 | ||
|
|
834f33e5a5 | ||
|
|
90a13a4e83 | ||
|
|
e4343a4f2f | ||
|
|
7852797bab | ||
|
|
4a93d2ba1e | ||
|
|
9287d711dc | ||
|
|
b5538655e0 |
@@ -2,6 +2,12 @@
|
|||||||
"extends": ["airbnb", "next/core-web-vitals", "prettier"],
|
"extends": ["airbnb", "next/core-web-vitals", "prettier"],
|
||||||
"plugins": ["prettier"],
|
"plugins": ["prettier"],
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"import/no-cycle": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"maxDepth": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
"import/order": [
|
"import/order": [
|
||||||
"error",
|
"error",
|
||||||
{
|
{
|
||||||
|
|||||||
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
github: benphelps
|
||||||
|
ko_fi: benphelps
|
||||||
|
custom: ["https://paypal.me/phelpsben"]
|
||||||
30
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: "[Bug] "
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Configuration**
|
||||||
|
If applicable,
|
||||||
|
```yaml
|
||||||
|
# Please provide your service, widget or otherwise related configuration here
|
||||||
|
```
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here. This includes things like:
|
||||||
|
- Service version or API version
|
||||||
|
- Docker version
|
||||||
|
- Deployment method
|
||||||
|
- Sample YAML configurations
|
||||||
17
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: "[Feature Request] "
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a service? Please describe.**
|
||||||
|
A clear and concise description of what you would like to see from this service.
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I would like it if [...]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
6
.github/workflows/docker-publish.yml
vendored
@@ -94,9 +94,13 @@ jobs:
|
|||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
build-args: |
|
||||||
|
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
|
||||||
|
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
|
||||||
|
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||||
# https://github.com/docker/setup-qemu-action#about
|
# https://github.com/docker/setup-qemu-action#about
|
||||||
# platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
|
# platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
|
||||||
platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7
|
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6
|
||||||
cache-from: type=local,src=/tmp/.buildx-cache
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
|
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
|
||||||
|
|
||||||
|
|||||||
4
.gitignore
vendored
@@ -19,6 +19,10 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*.pem
|
*.pem
|
||||||
|
|
||||||
|
# log files
|
||||||
|
error.log
|
||||||
|
homepage.log
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
|
|||||||
19
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Next.js: debug full stack",
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/next",
|
||||||
|
"serverReadyAction": {
|
||||||
|
"pattern": "started server on .+, url: (https?://.+)",
|
||||||
|
"uriFormat": "%s",
|
||||||
|
"action": "debugWithChrome"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
128
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
ben@phelps.io.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
||||||
41
CONTRIBUTING.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Contributing to Homepage
|
||||||
|
We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
|
||||||
|
|
||||||
|
- Reporting a bug
|
||||||
|
- Discussing the current state of the project
|
||||||
|
- Submitting a fix
|
||||||
|
- Proposing new features
|
||||||
|
- Becoming a maintainer
|
||||||
|
|
||||||
|
## We Develop with Github
|
||||||
|
We use github to host code, to track issues and feature requests, as well as accept pull requests.
|
||||||
|
|
||||||
|
## Any contributions you make will be under the GNU General Public License v3.0
|
||||||
|
In short, when you submit code changes, your submissions are understood to be under the same [GNU General Public License v3.0](https://choosealicense.com/licenses/gpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern.
|
||||||
|
|
||||||
|
## Report bugs using Github's [issues](https://github.com/benphelps/homepage/issues)
|
||||||
|
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/benphelps/homepage/issues/new); it's that easy!
|
||||||
|
|
||||||
|
## Write bug reports with detail, background, and sample configurations
|
||||||
|
Homepage includes a lot of configuration options and is often deploying in larger systems. Please include as much information (configurations, deployment method, Docker & API versions, etc) as you can when reporting an issue.
|
||||||
|
|
||||||
|
**Great Bug Reports** tend to have:
|
||||||
|
|
||||||
|
- A quick summary and/or background
|
||||||
|
- Steps to reproduce
|
||||||
|
- Be specific!
|
||||||
|
- Give example configurations if you can.
|
||||||
|
- What you expected would happen
|
||||||
|
- What actually happens
|
||||||
|
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
|
||||||
|
|
||||||
|
People *love* thorough bug reports. I'm not even kidding.
|
||||||
|
|
||||||
|
## Use a Consistent Coding Style
|
||||||
|
This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests.
|
||||||
|
|
||||||
|
## License
|
||||||
|
By contributing, you agree that your contributions will be licensed under its GNU General Public License.
|
||||||
|
|
||||||
|
## References
|
||||||
|
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/main/CONTRIBUTING.md)
|
||||||
@@ -22,6 +22,10 @@ RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm i
|
|||||||
FROM node:current-alpine AS builder
|
FROM node:current-alpine AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
ARG BUILDTIME
|
||||||
|
ARG VERSION
|
||||||
|
ARG REVISION
|
||||||
|
|
||||||
COPY --link --from=deps /app/node_modules ./node_modules/
|
COPY --link --from=deps /app/node_modules ./node_modules/
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
@@ -29,7 +33,7 @@ RUN <<EOF
|
|||||||
set -xe
|
set -xe
|
||||||
yarn next telemetry disable
|
yarn next telemetry disable
|
||||||
mkdir config && echo '-' > config/settings.yaml
|
mkdir config && echo '-' > config/settings.yaml
|
||||||
npm run build
|
NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Production image, copy all the files and run next
|
# Production image, copy all the files and run next
|
||||||
|
|||||||
166
README.md
@@ -1,34 +1,63 @@
|
|||||||

|
<p align="center">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="images/banner_light@2x.png">
|
||||||
|
<img src="images/banner_dark@2x.png" width="65%">
|
||||||
|
</picture>
|
||||||
|
</p>
|
||||||
|
|
||||||
[](https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml)
|
<p align="center">
|
||||||
[](https://hosted.weblate.org/engage/homepage/)
|
A modern <em>(fully static, fast)</em>, secure <em>(fully proxied)</em>, highly customizable application dashboard with integrations for more than 25 services and translations for 15 languages. Easily configured via YAML files (or discovery via docker labels).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="images/1.png" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="images/2.png" width="19%" />
|
||||||
|
<img src="images/3.png" width="19%" />
|
||||||
|
<img src="images/4.png" width="19%" />
|
||||||
|
<img src="images/5.png" width="19%" />
|
||||||
|
<img src="images/6.png" width="19%" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://discord.gg/k4ruYNrudu"><img src="https://img.shields.io/badge/Discord - Chat-blue?logo=discord&logoColor=white" /></a>
|
||||||
|
<a href="https://paypal.me/phelpsben" title="Donate"><img src="https://img.shields.io/badge/PayPal - Donate-blue?logo=paypal&logoColor=white" alt="Linkedin - phelpsben"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
|
||||||
|
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
* Fast! The entire site is statically generated at build time, so you can expect instant load times
|
- **Fast!** The entire site is statically generated at build time, so you can expect instant load times
|
||||||
* Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
- **Secure!** Every API request to backend services goes through a proxy server, so your API keys are never exposed to the frontend client.
|
||||||
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
|
||||||
* Full i18n support with automatic language detection
|
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
|
||||||
- Translations for Chinese, Dutch, French, German, Norwegian Bokmål, Portuguese, Russian and Spanish
|
- Full i18n support with automatic language detection
|
||||||
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
- Translantions for Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
|
||||||
* Service & Web Bookmarks
|
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
|
||||||
* Docker Integration
|
- Service & Web Bookmarks
|
||||||
- Container status (Running / Stopped) & statistics (CPU, Memory, Network)
|
- Docker Integration
|
||||||
- Automatic service discovery (via labels)
|
- Container status (Running / Stopped) & statistics (CPU, Memory, Network)
|
||||||
* Service Integration
|
- Automatic service discovery (via labels)
|
||||||
- Sonarr, Radarr, Readarr, Emby, Jellyfin, Tautulli (Plex)
|
- Service Integration
|
||||||
- Ombi, Overseerr, Jellyseerr, NZBGet, SABnzbd, ruTorrent
|
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
|
||||||
- Portainer, Traefik, Speedtest Tracker, PiHole, Nginx Proxy Manager, Gotify
|
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
|
||||||
* Information Providers
|
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentic
|
||||||
- Coin Market Cap
|
- Information Providers
|
||||||
* Information & Utility Widgets
|
- Coin Market Cap, Mastodon
|
||||||
- System Stats (Disk, CPU, Memory)
|
- Information & Utility Widgets
|
||||||
- Weather via WeatherAPI.com or OpenWeatherMap
|
- System Stats (Disk, CPU, Memory)
|
||||||
- Automatic location detection (with HTTPS), or manual location selection
|
- Weather via WeatherAPI.com or OpenWeatherMap
|
||||||
- Search Bar
|
- Search Bar
|
||||||
* Customizable
|
- Customizable
|
||||||
- 21 theme colors with light and dark mode support
|
- 21 theme colors with light and dark mode support
|
||||||
- Background image support
|
- Background image support
|
||||||
|
- Column and Row layout options
|
||||||
|
|
||||||
## Support & Suggestions
|
## Support & Suggestions
|
||||||
|
|
||||||
@@ -45,16 +74,16 @@ For configuration options, examples and more, [please check out the Wiki](https:
|
|||||||
Using docker compose:
|
Using docker compose:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: '3.3'
|
version: "3.3"
|
||||||
services:
|
services:
|
||||||
homepage:
|
homepage:
|
||||||
image: ghcr.io/benphelps/homepage:latest
|
image: ghcr.io/benphelps/homepage:latest
|
||||||
container_name: homepage
|
container_name: homepage
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
volumes:
|
volumes:
|
||||||
- /path/to/config:/app/config
|
- /path/to/config:/app/config # Make sure your local config directory exists
|
||||||
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
|
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
|
||||||
```
|
```
|
||||||
|
|
||||||
or docker run:
|
or docker run:
|
||||||
@@ -78,6 +107,8 @@ pnpm install
|
|||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If this is your first time starting, copy the `src/skeleton` directory to `config/` to populate initial example config files.
|
||||||
|
|
||||||
Finally, run the server:
|
Finally, run the server:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -88,7 +119,7 @@ pnpm start
|
|||||||
|
|
||||||
Configuration files will be genereted and placed on the first request.
|
Configuration files will be genereted and placed on the first request.
|
||||||
|
|
||||||
Configuration is done in the /config directory using .yaml files. Refer to each config for
|
Configuration is done in the /config directory using .yaml files. Refer to each config for
|
||||||
the specific configuration options.
|
the specific configuration options.
|
||||||
|
|
||||||
You may also check [the wiki](https://github.com/benphelps/homepage/wiki) for detailed configuration instructions, examples and more.
|
You may also check [the wiki](https://github.com/benphelps/homepage/wiki) for detailed configuration instructions, examples and more.
|
||||||
@@ -113,22 +144,47 @@ This is a [Next.js](https://nextjs.org/) application, see their doucmentation fo
|
|||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
Huge thanks to the all the contributors who have helped make this project what it is today! In alphabetical order:
|
Huge thanks to the all the contributors who have helped make this project what it is today! In alphabetical order:
|
||||||
|
|
||||||
* [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
|
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
|
||||||
* [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
|
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
|
||||||
* [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish Translation
|
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
|
||||||
* [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German Translation
|
- [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
|
||||||
* [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål Translation
|
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
|
||||||
* [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch Translation
|
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
||||||
* [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian Translation
|
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission, qBittorrent Integrations & countless more improvements
|
||||||
* [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
|
- [josways](https://github.com/benphelps/homepage/commits?author=josways) - Baidu search provider
|
||||||
* [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
|
- [mauricio-kalil](https://github.com/benphelps/homepage/commits?author=mauricio-kalil) - Portuguese (Brazil)
|
||||||
* [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese Translation
|
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
|
||||||
* [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, SABnzbd Integrations
|
- [MountainGod2](https://github.com/benphelps/homepage/discussions/243) - Homepage Logo
|
||||||
* [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
|
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
||||||
* [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese Translation
|
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
||||||
* [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French Translation
|
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
|
||||||
* [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
|
|
||||||
* [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
|
### Translators
|
||||||
* [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify Integration
|
|
||||||
|
- [3vilson](https://github.com/benphelps/homepage/commits?author=3vilson) - German
|
||||||
|
- [4lenz1](https://github.com/benphelps/homepage/commits?author=4lenz1) - Chinese
|
||||||
|
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish
|
||||||
|
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German
|
||||||
|
- [brunoccr](https://github.com/benphelps/homepage/commits?author=brunoccr) - Portuguese (Brazil)
|
||||||
|
- [C8opmBM](https://github.com/benphelps/homepage/commits?author=C8opmBM) - Romainian
|
||||||
|
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål
|
||||||
|
- Daniel Varga - German & Hungarian
|
||||||
|
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch
|
||||||
|
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian
|
||||||
|
- [ericlokz](https://github.com/benphelps/homepage/commits?author=ericlokz) - Yue
|
||||||
|
- [FunsKiTo](https://github.com/benphelps/homepage/commits?author=FunsKiTo) - Spanish
|
||||||
|
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese
|
||||||
|
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan
|
||||||
|
- [ling0412](https://github.com/benphelps/homepage/commits?author=ling0412) - Chinese
|
||||||
|
- [milotype](https://github.com/benphelps/homepage/commits?author=milotype) - Croatian
|
||||||
|
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese
|
||||||
|
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French
|
||||||
|
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan
|
||||||
|
- [Prilann](https://github.com/benphelps/homepage/commits?author=Prilann) - German
|
||||||
|
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish
|
||||||
|
- Sascha Jelinek - German
|
||||||
|
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew
|
||||||
|
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish
|
||||||
|
- [kaihu](https://github.com/benphelps/homepage/commits?author=kaihu) - Finnish
|
||||||
|
|||||||
9
docker-entrypoint.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# This is in attempt to preserve the original behavior of the Dockerfile,
|
||||||
|
# while also supporting the lscr.io /config directory
|
||||||
|
[ ! -d "/app/config" ] && ln -s /config /app/config
|
||||||
|
|
||||||
|
node server.js
|
||||||
BIN
images/1.png
Normal file
|
After Width: | Height: | Size: 345 KiB |
BIN
images/2.png
Normal file
|
After Width: | Height: | Size: 237 KiB |
BIN
images/3.png
Normal file
|
After Width: | Height: | Size: 279 KiB |
BIN
images/4.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
images/5.png
Normal file
|
After Width: | Height: | Size: 423 KiB |
BIN
images/6.png
Normal file
|
After Width: | Height: | Size: 533 KiB |
BIN
images/banner_dark@2x.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
images/banner_light@2x.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 777 KiB |
124
next-i18next.config.js
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
// prettyBytes taken from https://github.com/sindresorhus/pretty-bytes
|
||||||
|
|
||||||
|
/* eslint-disable no-param-reassign */
|
||||||
|
const BYTE_UNITS = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||||
|
|
||||||
|
const BIBYTE_UNITS = ["B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
|
||||||
|
|
||||||
|
const BIT_UNITS = ["b", "kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"];
|
||||||
|
|
||||||
|
const BIBIT_UNITS = ["b", "kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"];
|
||||||
|
|
||||||
|
/*
|
||||||
|
Formats the given number using `Number#toLocaleString`.
|
||||||
|
- If locale is a string, the value is expected to be a locale-key (for example: `de`).
|
||||||
|
- If locale is true, the system default locale is used for translation.
|
||||||
|
- If no value for locale is specified, the number is returned unmodified.
|
||||||
|
*/
|
||||||
|
const toLocaleString = (number, locale, options) => {
|
||||||
|
let result = number;
|
||||||
|
if (typeof locale === "string" || Array.isArray(locale)) {
|
||||||
|
result = number.toLocaleString(locale, options);
|
||||||
|
} else if (locale === true || options !== undefined) {
|
||||||
|
result = number.toLocaleString(undefined, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
function prettyBytes(number, options) {
|
||||||
|
if (!Number.isFinite(number)) {
|
||||||
|
throw new TypeError(`Expected a finite number, got ${typeof number}: ${number}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
options = {
|
||||||
|
bits: false,
|
||||||
|
binary: false,
|
||||||
|
...options,
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-nested-ternary
|
||||||
|
const UNITS = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : options.binary ? BIBYTE_UNITS : BYTE_UNITS;
|
||||||
|
|
||||||
|
if (options.signed && number === 0) {
|
||||||
|
return ` 0 ${UNITS[0]}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const isNegative = number < 0;
|
||||||
|
// eslint-disable-next-line no-nested-ternary
|
||||||
|
const prefix = isNegative ? "-" : options.signed ? "+" : "";
|
||||||
|
|
||||||
|
if (isNegative) {
|
||||||
|
number = -number;
|
||||||
|
}
|
||||||
|
|
||||||
|
let localeOptions;
|
||||||
|
|
||||||
|
if (options.minimumFractionDigits !== undefined) {
|
||||||
|
localeOptions = { minimumFractionDigits: options.minimumFractionDigits };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.maximumFractionDigits !== undefined) {
|
||||||
|
localeOptions = { maximumFractionDigits: options.maximumFractionDigits, ...localeOptions };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (number < 1) {
|
||||||
|
const numberString = toLocaleString(number, options.locale, localeOptions);
|
||||||
|
return `${prefix + numberString} ${UNITS[0]}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const exponent = Math.min(
|
||||||
|
Math.floor(options.binary ? Math.log(number) / Math.log(1024) : Math.log10(number) / 3),
|
||||||
|
UNITS.length - 1
|
||||||
|
);
|
||||||
|
number /= (options.binary ? 1024 : 1000) ** exponent;
|
||||||
|
|
||||||
|
if (!localeOptions) {
|
||||||
|
number = number.toPrecision(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
const numberString = toLocaleString(Number(number), options.locale, localeOptions);
|
||||||
|
|
||||||
|
const unit = UNITS[exponent];
|
||||||
|
|
||||||
|
return `${prefix + numberString} ${unit}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
i18n: {
|
||||||
|
defaultLocale: "en",
|
||||||
|
locales: ["en"],
|
||||||
|
},
|
||||||
|
serializeConfig: false,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
init: (i18next) => {
|
||||||
|
i18next.services.formatter.add("bytes", (value, lng, options) =>
|
||||||
|
prettyBytes(parseFloat(value), { locale: lng, ...options })
|
||||||
|
);
|
||||||
|
|
||||||
|
i18next.services.formatter.add("rate", (value, lng, options) => {
|
||||||
|
if (value === 0) return "0 Bps";
|
||||||
|
|
||||||
|
const bits = options.bits ? value : value / 8;
|
||||||
|
const k = 1024;
|
||||||
|
const dm = options.decimals ? options.decimals : 0;
|
||||||
|
const sizes = ["Bps", "Kbps", "Mbps", "Gbps", "Tbps", "Pbps", "Ebps", "Zbps", "Ybps"];
|
||||||
|
|
||||||
|
const i = Math.floor(Math.log(bits) / Math.log(k));
|
||||||
|
|
||||||
|
const formatted = new Intl.NumberFormat(lng, { maximumFractionDigits: dm, minimumFractionDigits: dm }).format(
|
||||||
|
parseFloat(bits / k ** i)
|
||||||
|
);
|
||||||
|
|
||||||
|
return `${formatted} ${sizes[i]}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
i18next.services.formatter.add("percent", (value, lng, options) =>
|
||||||
|
new Intl.NumberFormat(lng, { style: "percent", ...options }).format(parseFloat(value) / 100.0)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
type: "3rdParty",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
const { i18n } = require("./next-i18next.config");
|
||||||
|
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
@@ -7,6 +9,7 @@ const nextConfig = {
|
|||||||
domains: ["cdn.jsdelivr.net"],
|
domains: ["cdn.jsdelivr.net"],
|
||||||
unoptimized: true,
|
unoptimized: true,
|
||||||
},
|
},
|
||||||
|
i18n,
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = nextConfig;
|
module.exports = nextConfig;
|
||||||
|
|||||||
30
package.json
@@ -6,21 +6,21 @@
|
|||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint"
|
"lint": "next lint",
|
||||||
|
"telemetry": "next telemetry disable"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/react": "^1.7.0",
|
"@headlessui/react": "^1.7.2",
|
||||||
"@tailwindcss/forms": "^0.5.3",
|
"classnames": "^2.3.2",
|
||||||
"classnames": "^2.3.1",
|
"compare-versions": "^5.0.1",
|
||||||
"currency-symbol-map": "^5.1.0",
|
|
||||||
"dockerode": "^3.3.4",
|
"dockerode": "^3.3.4",
|
||||||
"i18next": "^21.9.1",
|
"follow-redirects": "^1.15.2",
|
||||||
"i18next-browser-languagedetector": "^6.1.5",
|
"i18next": "^21.9.2",
|
||||||
"i18next-http-backend": "^1.4.1",
|
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"json-rpc-2.0": "^1.4.1",
|
"json-rpc-2.0": "^1.4.1",
|
||||||
"memory-cache": "^0.2.0",
|
"memory-cache": "^0.2.0",
|
||||||
"next": "^12.3.0",
|
"next": "^12.3.1",
|
||||||
|
"next-i18next": "^12.0.1",
|
||||||
"node-os-utils": "^1.3.7",
|
"node-os-utils": "^1.3.7",
|
||||||
"pretty-bytes": "^6.0.0",
|
"pretty-bytes": "^6.0.0",
|
||||||
"raw-body": "^2.5.1",
|
"raw-body": "^2.5.1",
|
||||||
@@ -30,13 +30,16 @@
|
|||||||
"react-icons": "^4.4.0",
|
"react-icons": "^4.4.0",
|
||||||
"rutorrent-promise": "^2.0.0",
|
"rutorrent-promise": "^2.0.0",
|
||||||
"shvl": "^3.0.0",
|
"shvl": "^3.0.0",
|
||||||
"swr": "^1.3.0"
|
"swr": "^1.3.0",
|
||||||
|
"tough-cookie": "^4.1.2",
|
||||||
|
"winston": "^3.8.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"autoprefixer": "^10.4.9",
|
"@tailwindcss/forms": "^0.5.3",
|
||||||
"eslint": "^8.23.1",
|
"autoprefixer": "^10.4.12",
|
||||||
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-airbnb": "^19.0.4",
|
"eslint-config-airbnb": "^19.0.4",
|
||||||
"eslint-config-next": "^12.3.0",
|
"eslint-config-next": "^12.3.1",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.6.1",
|
"eslint-plugin-jsx-a11y": "^6.6.1",
|
||||||
@@ -45,6 +48,7 @@
|
|||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
"postcss": "^8.4.16",
|
"postcss": "^8.4.16",
|
||||||
"prettier": "^2.7.1",
|
"prettier": "^2.7.1",
|
||||||
|
"tailwind-scrollbar": "^2.0.1",
|
||||||
"tailwindcss": "^3.1.8",
|
"tailwindcss": "^3.1.8",
|
||||||
"typescript": "^4.8.3"
|
"typescript": "^4.8.3"
|
||||||
}
|
}
|
||||||
|
|||||||
780
pnpm-lock.yaml
generated
BIN
public/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 465 B |
BIN
public/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 595 B |
|
Before Width: | Height: | Size: 15 KiB |
BIN
public/homepage.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
184
public/locales/ca/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Falta el tipus de widget: {{type}}",
|
||||||
|
"api_error": "Error d'API",
|
||||||
|
"status": "Estat"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"allow": "Feu clic per permetre",
|
||||||
|
"updating": "Actualitzant",
|
||||||
|
"wait": "Si us plau, espereu",
|
||||||
|
"current": "Localització actual"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Cercar…"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"seed": "Llavors",
|
||||||
|
"download": "Descàrrega",
|
||||||
|
"upload": "Càrrega",
|
||||||
|
"leech": "Companys"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Volgut",
|
||||||
|
"queued": "En cua",
|
||||||
|
"series": "Sèries"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"ping": "Ping",
|
||||||
|
"upload": "Càrrega",
|
||||||
|
"download": "Descàrrega"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Lliure",
|
||||||
|
"used": "Usat",
|
||||||
|
"load": "Càrrega",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "Rebut",
|
||||||
|
"tx": "Transmès",
|
||||||
|
"mem": "Memòria",
|
||||||
|
"cpu": "Processador",
|
||||||
|
"offline": "Fora de línia"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Reproduint",
|
||||||
|
"transcoding": "Transcodificant",
|
||||||
|
"bitrate": "Taxa de bits",
|
||||||
|
"no_active": "Sense transmissions actives"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Reproduint",
|
||||||
|
"transcoding": "Transcodificant",
|
||||||
|
"bitrate": "Taxa de bits",
|
||||||
|
"no_active": "Sense transmissions actives"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Taxa",
|
||||||
|
"remaining": "Restant",
|
||||||
|
"downloaded": "Descarregat"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Taxa",
|
||||||
|
"queue": "Cua",
|
||||||
|
"timeleft": "Temps restant"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Actiu",
|
||||||
|
"upload": "Càrrega",
|
||||||
|
"download": "Descàrrega"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Volgut",
|
||||||
|
"queued": "En cua",
|
||||||
|
"movies": "Pel·lícules"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Volgut",
|
||||||
|
"queued": "En cua",
|
||||||
|
"books": "Llibres"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Pendent",
|
||||||
|
"approved": "Aprovat",
|
||||||
|
"available": "Disponible"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Pendent",
|
||||||
|
"approved": "Aprovat",
|
||||||
|
"available": "Disponible"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Pendent",
|
||||||
|
"approved": "Aprovat",
|
||||||
|
"available": "Disponible"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Consultes",
|
||||||
|
"blocked": "Bloquejat",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Executant",
|
||||||
|
"stopped": "Aturat",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Encaminadors",
|
||||||
|
"services": "Serveis",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"total": "Total",
|
||||||
|
"enabled": "Activat",
|
||||||
|
"disabled": "Desactivat"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Configura una o més criptomonedes per fer el seguiment",
|
||||||
|
"1hour": "1 Hora",
|
||||||
|
"1day": "1 Dia",
|
||||||
|
"7days": "7 Dies",
|
||||||
|
"30days": "30 Dies"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Aplicacions",
|
||||||
|
"clients": "Clients",
|
||||||
|
"messages": "Missatges"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexadors",
|
||||||
|
"numberOfGrabs": "Captures",
|
||||||
|
"numberOfQueries": "Consultes",
|
||||||
|
"numberOfFailGrabs": "Captures fallides",
|
||||||
|
"numberOfFailQueries": "Consultes fallides"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configurat",
|
||||||
|
"errored": "Amb errors"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Episodis que falten",
|
||||||
|
"missingMovies": "Pel·lícules que falten"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Volgut",
|
||||||
|
"queued": "En cua",
|
||||||
|
"albums": "Àlbums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Consultes",
|
||||||
|
"blocked": "Bloquejat",
|
||||||
|
"filtered": "Filtrat",
|
||||||
|
"latency": "Latència"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Descàrrega",
|
||||||
|
"upload": "Càrrega",
|
||||||
|
"leech": "Companys",
|
||||||
|
"seed": "Llavors"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Usuaris",
|
||||||
|
"status_count": "Publicacions",
|
||||||
|
"domain_count": "Dominis"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connexions",
|
||||||
|
"dataRelayed": "Transmès",
|
||||||
|
"transferRate": "Velocitat"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Usuaris",
|
||||||
|
"loginsLast24H": "Inicis de sessió (24h)",
|
||||||
|
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"vms": "VMs",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Gesamt",
|
"total": "Gesamt",
|
||||||
"free": "Frei",
|
"free": "Frei",
|
||||||
"used": "Gebraucht"
|
"used": "Gebraucht",
|
||||||
|
"load": "Belastung",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@@ -23,13 +25,13 @@
|
|||||||
"playing": "Spielen",
|
"playing": "Spielen",
|
||||||
"transcoding": "Transcodierung",
|
"transcoding": "Transcodierung",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Keine aktive Streams"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Spielen",
|
"playing": "Spielen",
|
||||||
"transcoding": "Transcodierung",
|
"transcoding": "Transcodierung",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Keine aktiven streamen"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Aktiv",
|
"active": "Aktiv",
|
||||||
@@ -47,9 +49,9 @@
|
|||||||
"movies": "Filme"
|
"movies": "Filme"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Gesucht",
|
||||||
"queued": "Queued",
|
"queued": "In Warteschlange",
|
||||||
"books": "Books"
|
"books": "Bücher"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Ausstehend",
|
"pending": "Ausstehend",
|
||||||
@@ -78,8 +80,8 @@
|
|||||||
},
|
},
|
||||||
"traefik": {
|
"traefik": {
|
||||||
"routers": "Router",
|
"routers": "Router",
|
||||||
"services": "Services",
|
"services": "Dienste",
|
||||||
"middleware": "Middleware"
|
"middleware": "Zwischenanwendung"
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
"enabled": "Aktiviert",
|
"enabled": "Aktiviert",
|
||||||
@@ -93,26 +95,90 @@
|
|||||||
"wait": "Bitte warten"
|
"wait": "Bitte warten"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Ausstehend",
|
||||||
"approved": "Approved",
|
"approved": "Genehmigt",
|
||||||
"available": "Available"
|
"available": "Verfügbar"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Geschwindigkeit",
|
||||||
"queue": "Queue",
|
"queue": "Warteschlange",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Verbleibende Zeit"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Geschwindigkeit",
|
||||||
"remaining": "Remaining",
|
"remaining": "Verbleibend",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "Heruntergeladen"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Konfiguriere eine oder mehrere Kryptowährungen zur Verfolgung",
|
||||||
|
"1hour": "1 Stunde",
|
||||||
|
"1day": "1 Tag",
|
||||||
|
"7days": "7 Tage",
|
||||||
|
"30days": "30 Tage"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Programme",
|
||||||
"clients": "Clients",
|
"clients": "Benutzer",
|
||||||
"messages": "Messages"
|
"messages": "Nachrichten"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexer",
|
||||||
|
"numberOfGrabs": "Abrufungen",
|
||||||
|
"numberOfQueries": "Anfragen",
|
||||||
|
"numberOfFailGrabs": "Fehlgeschlagene Abrufungen",
|
||||||
|
"numberOfFailQueries": "Fehlgeschlagene Anfragen"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Herunterladen",
|
||||||
|
"upload": "Hochladen",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Konfiguriert",
|
||||||
|
"errored": "Fehlerhaft"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Fehlende Episoden",
|
||||||
|
"missingMovies": "Fehlende Filme"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Gesucht",
|
||||||
|
"queued": "In Warteschlange",
|
||||||
|
"albums": "Alben"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Anfragen",
|
||||||
|
"blocked": "Blockiert",
|
||||||
|
"filtered": "Gefiltert",
|
||||||
|
"latency": "Latenz"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Herunterladen",
|
||||||
|
"upload": "Hochladen",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Nutzer",
|
||||||
|
"status_count": "Beiträge",
|
||||||
|
"domain_count": "Domänen"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sitzungen",
|
||||||
|
"numConnections": "Verbindungen",
|
||||||
|
"dataRelayed": "Weitergeleitet",
|
||||||
|
"transferRate": "Bewerten"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Benutzer",
|
||||||
|
"loginsLast24H": "Anmeldungen (24h)",
|
||||||
|
"failedLoginsLast24H": "fehlerhafte Anmeldungen (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,11 @@
|
|||||||
"placeholder": "Search…"
|
"placeholder": "Search…"
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Free",
|
||||||
"used": "Used"
|
"used": "Used",
|
||||||
|
"load": "Load"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@@ -63,6 +65,18 @@
|
|||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"download": "Download"
|
"download": "Download"
|
||||||
},
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
@@ -73,11 +87,20 @@
|
|||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
"movies": "Movies"
|
"movies": "Movies"
|
||||||
},
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
"books": "Books"
|
"books": "Books"
|
||||||
},
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"approved": "Approved",
|
"approved": "Approved",
|
||||||
@@ -92,12 +115,18 @@
|
|||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"approved": "Approved",
|
"approved": "Approved",
|
||||||
"available": "Available"
|
"available": "Available"
|
||||||
},
|
},
|
||||||
"pihole": {
|
"pihole": {
|
||||||
"queries": "Queries",
|
"queries": "Queries",
|
||||||
"blocked": "Blocked",
|
"blocked": "Blocked",
|
||||||
"gravity": "Gravity"
|
"gravity": "Gravity"
|
||||||
},
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"download": "Download",
|
"download": "Download",
|
||||||
@@ -119,11 +148,48 @@
|
|||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Applications",
|
||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr":{
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"widget": {
|
"widget": {
|
||||||
"missing_type": "Tipo de widget faltante: {{type}}",
|
"missing_type": "Falta el tipo de widget: {{type}}",
|
||||||
"api_error": "Error de API",
|
"api_error": "Error de API",
|
||||||
"status": "Estado"
|
"status": "Estado"
|
||||||
},
|
},
|
||||||
@@ -10,7 +10,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Usado"
|
"used": "Usado",
|
||||||
|
"load": "Carga",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Recibido",
|
"rx": "Recibido",
|
||||||
@@ -20,36 +22,36 @@
|
|||||||
"offline": "Desconectado"
|
"offline": "Desconectado"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "En ejecución",
|
"playing": "Reproduciendo",
|
||||||
"transcoding": "Transcodificando",
|
"transcoding": "Transcodificando",
|
||||||
"bitrate": "Tasa de Bits",
|
"bitrate": "Tasa de bits",
|
||||||
"no_active": "No hay streams activos"
|
"no_active": "Sin transmisiones activas"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "En ejecución",
|
"playing": "Reproduciendo",
|
||||||
"transcoding": "Transcodificación",
|
"transcoding": "Transcodificando",
|
||||||
"bitrate": "Tasa de bits",
|
"bitrate": "Tasa de bits",
|
||||||
"no_active": "No hay streams activos"
|
"no_active": "Sin transmisiones activas"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Activo",
|
"active": "Activo",
|
||||||
"upload": "Subir",
|
"upload": "Subida",
|
||||||
"download": "Descargar"
|
"download": "Bajada"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Más deseado",
|
"wanted": "Buscando",
|
||||||
"queued": "Puesto en cola",
|
"queued": "En cola",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Más deseado",
|
"wanted": "Buscando",
|
||||||
"queued": "Puesto en cola",
|
"queued": "En cola",
|
||||||
"movies": "Películas"
|
"movies": "Películas"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Buscando",
|
||||||
"queued": "Queued",
|
"queued": "En cola",
|
||||||
"books": "Books"
|
"books": "Libros"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Pendiente",
|
"pending": "Pendiente",
|
||||||
@@ -67,8 +69,8 @@
|
|||||||
"gravity": "Gravedad"
|
"gravity": "Gravedad"
|
||||||
},
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Subir",
|
"upload": "Subida",
|
||||||
"download": "Descargar",
|
"download": "Bajada",
|
||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
@@ -87,8 +89,8 @@
|
|||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"current": "Ubicación Actual",
|
"current": "Ubicación actual",
|
||||||
"allow": "Haga clic para permitir",
|
"allow": "Clic para permitir",
|
||||||
"updating": "Actualizando",
|
"updating": "Actualizando",
|
||||||
"wait": "Espere, por favor"
|
"wait": "Espere, por favor"
|
||||||
},
|
},
|
||||||
@@ -98,21 +100,85 @@
|
|||||||
"available": "Disponible"
|
"available": "Disponible"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Tasa",
|
||||||
"queue": "Queue",
|
"queue": "En cola",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Tiempo restante"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Tasa",
|
||||||
"remaining": "Remaining",
|
"remaining": "Restante",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "Descargado"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configurar una o más criptomonedas para rastrear",
|
||||||
|
"1hour": "1 Hora",
|
||||||
|
"1day": "1 Día",
|
||||||
|
"7days": "7 Días",
|
||||||
|
"30days": "30 Días"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Aplicaciones",
|
||||||
"clients": "Clients",
|
"clients": "Clientes",
|
||||||
"messages": "Messages"
|
"messages": "Mensajes"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexadores",
|
||||||
|
"numberOfGrabs": "Capturas",
|
||||||
|
"numberOfQueries": "Consultas",
|
||||||
|
"numberOfFailGrabs": "Capturas fallidas",
|
||||||
|
"numberOfFailQueries": "Consultas fallidas"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Bajada",
|
||||||
|
"upload": "Subida",
|
||||||
|
"leech": "Compañeros",
|
||||||
|
"seed": "Semillas"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configurado",
|
||||||
|
"errored": "Con errores"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Episodios perdidos",
|
||||||
|
"missingMovies": "Películas perdidas"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"queued": "En cola",
|
||||||
|
"wanted": "Buscando",
|
||||||
|
"albums": "Álbumes"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Consultas",
|
||||||
|
"blocked": "Bloqueado",
|
||||||
|
"filtered": "Filtrado",
|
||||||
|
"latency": "Latencia"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Bajada",
|
||||||
|
"upload": "Subida",
|
||||||
|
"leech": "Compañeros",
|
||||||
|
"seed": "Semillas"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Usuarios",
|
||||||
|
"status_count": "Publicaciones",
|
||||||
|
"domain_count": "Dominios"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sesiones",
|
||||||
|
"numConnections": "Conexiones",
|
||||||
|
"dataRelayed": "Retransmitido",
|
||||||
|
"transferRate": "Velocidad"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Usuarios",
|
||||||
|
"loginsLast24H": "Inicios de sesión (24h)",
|
||||||
|
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/fi/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Puuttuva härpäkkeen tyyppi: {{type}}",
|
||||||
|
"api_error": "API-virhe",
|
||||||
|
"status": "Tila"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Nykyinen sijainti",
|
||||||
|
"allow": "Klikkaa salliaksesi",
|
||||||
|
"updating": "Päivitetään",
|
||||||
|
"wait": "Odota, ole hyvä"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Hae…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"cpu": "CPU",
|
||||||
|
"total": "Yhteensä",
|
||||||
|
"free": "Vapaana",
|
||||||
|
"used": "Käytetty",
|
||||||
|
"load": "Kuorma"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "RAM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Toistaa",
|
||||||
|
"transcoding": "Transkoodaa",
|
||||||
|
"bitrate": "Bittinopeus",
|
||||||
|
"no_active": "Ei aktiivisia striimejä"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Toistaa",
|
||||||
|
"transcoding": "Transkoodaa",
|
||||||
|
"bitrate": "Bittinopeus",
|
||||||
|
"no_active": "Ei aktiivisia striimejä"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Nopeus",
|
||||||
|
"remaining": "Jäljellä",
|
||||||
|
"downloaded": "Ladattu"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Nopeus",
|
||||||
|
"queue": "Jono",
|
||||||
|
"timeleft": "Aikaa jäljellä"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Aktiivinen",
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"download": "Lataus"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Lataus",
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"leech": "Lataajia",
|
||||||
|
"seed": "Lähettäjiä"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Lataus",
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"leech": "Lataajia",
|
||||||
|
"seed": "Lähettäjiä"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"series": "Sarja"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"movies": "Elokuvia"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"albums": "Albumeja"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Haluttu",
|
||||||
|
"queued": "Jonossa",
|
||||||
|
"books": "Kirjoja"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Puuttuvia jaksoja",
|
||||||
|
"missingMovies": "Puuttuvia elokuvia"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Vireillä",
|
||||||
|
"approved": "Hyväksytty",
|
||||||
|
"available": "Saatavilla"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Vireillä",
|
||||||
|
"approved": "Hyväksytty",
|
||||||
|
"available": "Saatavilla"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Vireillä",
|
||||||
|
"approved": "Hyväksytty",
|
||||||
|
"available": "Saatavilla"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Kyselyjä",
|
||||||
|
"blocked": "Estetty",
|
||||||
|
"gravity": "Vakavuus"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Kyselyjä",
|
||||||
|
"blocked": "Estetty",
|
||||||
|
"filtered": "Suodatettu",
|
||||||
|
"latency": "Viive"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Lähetys",
|
||||||
|
"download": "Lataus",
|
||||||
|
"ping": "Viive"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Käynnissä",
|
||||||
|
"stopped": "Pysäytetty",
|
||||||
|
"total": "Yhteensä"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Reitittimiä",
|
||||||
|
"services": "Palveluja",
|
||||||
|
"middleware": "Middlewareja"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Käytössä",
|
||||||
|
"disabled": "Poissa käytöstä",
|
||||||
|
"total": "Yhteensä"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Määritä yksi tai useampi kryptovaluutta seurattavaksi",
|
||||||
|
"1hour": "1 tunti",
|
||||||
|
"1day": "1 päivä",
|
||||||
|
"7days": "7 päivää",
|
||||||
|
"30days": "30 päivää"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Sovelluksia",
|
||||||
|
"clients": "Asiakasohjelmia",
|
||||||
|
"messages": "Viestejä"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indeksoijia",
|
||||||
|
"numberOfGrabs": "Nappauksia",
|
||||||
|
"numberOfQueries": "Hakuja",
|
||||||
|
"numberOfFailGrabs": "Epäonnistuneita nappauksia",
|
||||||
|
"numberOfFailQueries": "Epäonnistuneita kyselyjä"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Määritettyjä",
|
||||||
|
"errored": "Virheellisiä"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Istuntoja",
|
||||||
|
"numConnections": "Yhteyksiä",
|
||||||
|
"dataRelayed": "Välitetty",
|
||||||
|
"transferRate": "Nopeus"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Käyttäjiä",
|
||||||
|
"status_count": "Kirjoituksia",
|
||||||
|
"domain_count": "Verkkotunnuksia"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Käyttäjiä",
|
||||||
|
"loginsLast24H": "Kirjautumisia (24h)",
|
||||||
|
"failedLoginsLast24H": "Epäonnistuneita kirjautumisia (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Libre",
|
"free": "Libre",
|
||||||
"used": "Utilisée"
|
"used": "Utilisé",
|
||||||
|
"load": "Charge",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@@ -32,53 +34,53 @@
|
|||||||
"no_active": "Aucun flux actif"
|
"no_active": "Aucun flux actif"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Active",
|
"active": "Actif",
|
||||||
"upload": "Téléverser",
|
"upload": "Envoi",
|
||||||
"download": "Télécharger"
|
"download": "Réception"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Recherchée",
|
"wanted": "Demande",
|
||||||
"queued": "En queue",
|
"queued": "En attente",
|
||||||
"series": "Séries"
|
"series": "Séries"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Recherchée",
|
"wanted": "Demande",
|
||||||
"queued": "En queue",
|
"queued": "En attente",
|
||||||
"movies": "Films"
|
"movies": "Films"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Demande",
|
||||||
"queued": "Queued",
|
"queued": "Attente",
|
||||||
"books": "Books"
|
"books": "Livres"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "En attente",
|
"pending": "En attente",
|
||||||
"approved": "Approuvée",
|
"approved": "Validé",
|
||||||
"available": "Disponible"
|
"available": "Disponible"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
"pending": "En attente",
|
"pending": "En attente",
|
||||||
"approved": "Approuvée",
|
"approved": "Validé",
|
||||||
"available": "Disponible"
|
"available": "Disponible"
|
||||||
},
|
},
|
||||||
"pihole": {
|
"pihole": {
|
||||||
"queries": "Requêtes",
|
"queries": "Requêtes",
|
||||||
"blocked": "Bloquée",
|
"blocked": "Bloqué",
|
||||||
"gravity": "La gravité"
|
"gravity": "Listes dom. bloqués"
|
||||||
},
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Téléversement",
|
"upload": "Envoi",
|
||||||
"download": "Téléchargement",
|
"download": "Récep.",
|
||||||
"ping": "Ping-ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "Fonctionnement",
|
"running": "Démarré",
|
||||||
"stopped": "Arrêté",
|
"stopped": "Arrêté",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"traefik": {
|
"traefik": {
|
||||||
"routers": "Routeurs",
|
"routers": "Routeurs",
|
||||||
"services": "Prestations de service",
|
"services": "Services",
|
||||||
"middleware": "Middleware"
|
"middleware": "Middleware"
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
@@ -86,17 +88,6 @@
|
|||||||
"disabled": "Désactivé",
|
"disabled": "Désactivé",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"common": {
|
|
||||||
"bbytes": "{{value, bytes(binary: true)}}",
|
|
||||||
"bytes": "{{value, bytes}}",
|
|
||||||
"bits": "{{value, bytes(bits: true)}}",
|
|
||||||
"bbits": "{{value, bytes(bits: true, binary: true)}}",
|
|
||||||
"number": "{{value, number}}",
|
|
||||||
"byterate": "{{value, bytes}}",
|
|
||||||
"bitrate": "{{value, bytes(bits: true)}}",
|
|
||||||
"percent": "{{value, percent}}",
|
|
||||||
"ms": "{{value, number}}"
|
|
||||||
},
|
|
||||||
"weather": {
|
"weather": {
|
||||||
"current": "Localisation actuelle",
|
"current": "Localisation actuelle",
|
||||||
"allow": "Cliquez pour autoriser",
|
"allow": "Cliquez pour autoriser",
|
||||||
@@ -105,25 +96,89 @@
|
|||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "En attente",
|
"pending": "En attente",
|
||||||
"approved": "Approuvée",
|
"approved": "Demande",
|
||||||
"available": "Disponible"
|
"available": "Disponible"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Débit",
|
||||||
"queue": "Queue",
|
"queue": "Queue",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Temps restant"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"remaining": "Remaining",
|
"remaining": "Restant",
|
||||||
"downloaded": "Downloaded",
|
"downloaded": "Téléchargé",
|
||||||
"rate": "Rate"
|
"rate": "Débit"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configurer une ou plusieurs crypto-monnaies à suivre",
|
||||||
|
"1hour": "1 Heure",
|
||||||
|
"1day": "1 Jour",
|
||||||
|
"7days": "7 Jours",
|
||||||
|
"30days": "30 Jours"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Applis",
|
||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Msg"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexeur",
|
||||||
|
"numberOfGrabs": "Capture",
|
||||||
|
"numberOfQueries": "Demande",
|
||||||
|
"numberOfFailGrabs": "Capt. échouée",
|
||||||
|
"numberOfFailQueries": "Dem. échouée"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Réception",
|
||||||
|
"upload": "Envoi",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configuré",
|
||||||
|
"errored": "En erreur"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Épisodes manquants",
|
||||||
|
"missingMovies": "Films manquants"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Demandé",
|
||||||
|
"queued": "En queue",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Requêtes",
|
||||||
|
"blocked": "Bloquées",
|
||||||
|
"filtered": "Filtrées",
|
||||||
|
"latency": "Latence"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Récep.",
|
||||||
|
"upload": "Envoi",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Utilisateurs",
|
||||||
|
"status_count": "Messages",
|
||||||
|
"domain_count": "Domaines"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Cnx",
|
||||||
|
"dataRelayed": "Relayé",
|
||||||
|
"transferRate": "Débit"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Utilisateurs",
|
||||||
|
"loginsLast24H": "Cnx. (24h)",
|
||||||
|
"failedLoginsLast24H": "Cnx. échouées (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/he/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "סוג ווידג'ט חסר: {{type}}",
|
||||||
|
"api_error": "שגיאת API",
|
||||||
|
"status": "סטטוס"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "מיקום נוכחי",
|
||||||
|
"allow": "יש ללחוץ כדי לאשר",
|
||||||
|
"updating": "מעדכן",
|
||||||
|
"wait": "המתן בבקשה"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "חיפוש…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"total": "סה\"כ",
|
||||||
|
"free": "פנוי",
|
||||||
|
"used": "בשימוש",
|
||||||
|
"load": "עומס",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "זיכרון",
|
||||||
|
"cpu": "מעבד",
|
||||||
|
"offline": "כבוי"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "מנגן",
|
||||||
|
"transcoding": "מקודד",
|
||||||
|
"bitrate": "סיביות",
|
||||||
|
"no_active": "אין הזרמות פעילות"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "מנגן",
|
||||||
|
"transcoding": "מקודד",
|
||||||
|
"bitrate": "סיביות",
|
||||||
|
"no_active": "אין הזרמות פעילות"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "יחס",
|
||||||
|
"remaining": "נותר",
|
||||||
|
"downloaded": "הורד"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "יחס",
|
||||||
|
"queue": "תור",
|
||||||
|
"timeleft": "זמן שנותר"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "פעיל",
|
||||||
|
"upload": "העלאה",
|
||||||
|
"download": "הורדה"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "הורדה",
|
||||||
|
"upload": "העלאה",
|
||||||
|
"leech": "בהורדה",
|
||||||
|
"seed": "בשיתוף"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "הורדה",
|
||||||
|
"upload": "העלאה",
|
||||||
|
"leech": "בהורדה",
|
||||||
|
"seed": "בשיתוף"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "מבוקש",
|
||||||
|
"queued": "בתור",
|
||||||
|
"series": "סדרות"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "מבוקש",
|
||||||
|
"queued": "בתור",
|
||||||
|
"movies": "סרטים"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "מבוקש",
|
||||||
|
"queued": "בתור",
|
||||||
|
"albums": "אלבומים"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "מבוקש",
|
||||||
|
"queued": "בתור",
|
||||||
|
"books": "ספרים"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "פרקים חסרים",
|
||||||
|
"missingMovies": "סרטים חסרים"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "ממתין",
|
||||||
|
"approved": "מאושר",
|
||||||
|
"available": "זמין"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "ממתין",
|
||||||
|
"approved": "מאושר",
|
||||||
|
"available": "זמין"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "ממתין",
|
||||||
|
"approved": "מאושר",
|
||||||
|
"available": "זמין"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "שאילתות",
|
||||||
|
"blocked": "נחסם",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "שאילתות",
|
||||||
|
"blocked": "נחסם",
|
||||||
|
"filtered": "מסונן",
|
||||||
|
"latency": "השהיה"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "העלאה",
|
||||||
|
"download": "הורדה",
|
||||||
|
"ping": "פינג"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "פעיל",
|
||||||
|
"stopped": "נעצר",
|
||||||
|
"total": "סה\"כ"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "ניתובים",
|
||||||
|
"services": "שירותים",
|
||||||
|
"middleware": "מתווך"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "מופעל",
|
||||||
|
"disabled": "מבוטל",
|
||||||
|
"total": "סה\"כ"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "קבע את התצורה של מטבע קריפטו אחד או יותר למעקב",
|
||||||
|
"1hour": "שעה אחת",
|
||||||
|
"1day": "יום 1",
|
||||||
|
"7days": "7 יום",
|
||||||
|
"30days": "30 יום"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "אפליקציות",
|
||||||
|
"clients": "לקוחות",
|
||||||
|
"messages": "הודעות"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "אינדקסים",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "שאילתות",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "מוגדר",
|
||||||
|
"errored": "שגיאה"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
184
public/locales/hr/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"current": "Tranutačna lokacija",
|
||||||
|
"allow": "Pritisni za dozvoljavanje",
|
||||||
|
"updating": "Aktualiziranje",
|
||||||
|
"wait": "Pričekaj"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Traži …"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"total": "Ukupno",
|
||||||
|
"free": "Slobodno",
|
||||||
|
"used": "Korišteno",
|
||||||
|
"load": "Opterećenje",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Stopa",
|
||||||
|
"queue": "Red",
|
||||||
|
"timeleft": "Preostalo vrijeme"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"available": "Dostupno",
|
||||||
|
"pending": "Predstoji",
|
||||||
|
"approved": "Odobreno"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Upiti",
|
||||||
|
"blocked": "Blokirano",
|
||||||
|
"gravity": "Ozbiljnost"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"latency": "Kašnjenje",
|
||||||
|
"queries": "Upiti",
|
||||||
|
"blocked": "Blokirano",
|
||||||
|
"filtered": "Filtrirano"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"total": "Ukupno",
|
||||||
|
"enabled": "Aktivirano",
|
||||||
|
"disabled": "Deaktivirano"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Konfiguriraj jednu ili više kripto valuta za praćenje",
|
||||||
|
"1hour": "1 sat",
|
||||||
|
"1day": "1 dan",
|
||||||
|
"7days": "7 dana",
|
||||||
|
"30days": "30 dana"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indeksatori",
|
||||||
|
"numberOfGrabs": "Dohvaćanja",
|
||||||
|
"numberOfQueries": "Upiti",
|
||||||
|
"numberOfFailGrabs": "Neuspjela dohvaćanja",
|
||||||
|
"numberOfFailQueries": "Neuspjeli upiti"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Nedostajuća vrsta widgeta: {{type}}",
|
||||||
|
"api_error": "API greška",
|
||||||
|
"status": "Stanje"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Odspojen"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Reprodukcija",
|
||||||
|
"transcoding": "Prekodiranje",
|
||||||
|
"bitrate": "Brzina prijenosa",
|
||||||
|
"no_active": "Nema aktivnih prijenosa"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Reprodukcija",
|
||||||
|
"transcoding": "Prekodiranje",
|
||||||
|
"bitrate": "Brzina prijenosa",
|
||||||
|
"no_active": "Nema aktivnih prijenosa"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Stopa",
|
||||||
|
"remaining": "Preostalo",
|
||||||
|
"downloaded": "Preuzeto"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"upload": "Prijenos",
|
||||||
|
"download": "Preuzimanje",
|
||||||
|
"active": "Aktivno"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Preuzimanje",
|
||||||
|
"upload": "Prijenos",
|
||||||
|
"leech": "Krvopija",
|
||||||
|
"seed": "Prijenos preuzetog sadržaja"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Željeno",
|
||||||
|
"queued": "U redu čekanja",
|
||||||
|
"series": "Serije"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Željeno",
|
||||||
|
"queued": "U redu čekanja",
|
||||||
|
"movies": "Filmovi"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Željeno",
|
||||||
|
"queued": "U redu čekanja",
|
||||||
|
"albums": "Albumi"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Željeno",
|
||||||
|
"queued": "U redu čekanja",
|
||||||
|
"books": "Knjige"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Nedostajuće epizode",
|
||||||
|
"missingMovies": "Nedostajući filmovi"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Predstoji",
|
||||||
|
"approved": "Odobreno",
|
||||||
|
"available": "Dostupno"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Predstoji",
|
||||||
|
"approved": "Odobreno",
|
||||||
|
"available": "Dostupno"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Prijenos",
|
||||||
|
"download": "Preuzimanje",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Pokrenuto",
|
||||||
|
"stopped": "Prekinuto",
|
||||||
|
"total": "Ukupno"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Ruteri",
|
||||||
|
"services": "Usluge",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"clients": "Klijenti",
|
||||||
|
"messages": "Poruke",
|
||||||
|
"apps": "Programi"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Konfigurirano",
|
||||||
|
"errored": "S greškom"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Preuzimanje",
|
||||||
|
"upload": "Prijenos",
|
||||||
|
"leech": "Krvopija",
|
||||||
|
"seed": "Prijenos preuzetog sadržaja"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Korisnici",
|
||||||
|
"status_count": "Objave",
|
||||||
|
"domain_count": "Domene"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sesije",
|
||||||
|
"numConnections": "Veze",
|
||||||
|
"dataRelayed": "Proslijeđeno",
|
||||||
|
"transferRate": "Stopa"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
184
public/locales/hu/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"resources": {
|
||||||
|
"total": "Összes",
|
||||||
|
"free": "Szabad",
|
||||||
|
"used": "Használt",
|
||||||
|
"load": "Terhelés",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"albums": "Albumok",
|
||||||
|
"wanted": "Keresett",
|
||||||
|
"queued": "Sorban áll"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Keresett",
|
||||||
|
"queued": "Sorban áll",
|
||||||
|
"books": "Könyvek"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Hiányzó epizódok",
|
||||||
|
"missingMovies": "Hiányzó filmek"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Hiányzó Widget Típus: {{type}}",
|
||||||
|
"api_error": "API Hiba",
|
||||||
|
"status": "Státusz"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Aktuális hely",
|
||||||
|
"allow": "Kattints az engedélyezéshez",
|
||||||
|
"updating": "Frissítés",
|
||||||
|
"wait": "Kérlek várj"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Keresés…"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Lejátszás",
|
||||||
|
"transcoding": "Átkódolás",
|
||||||
|
"bitrate": "Bitráta",
|
||||||
|
"no_active": "Nincs aktív lejátszás"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Lejátszás folyamatban",
|
||||||
|
"transcoding": "Átkódolás",
|
||||||
|
"bitrate": "Bitráta",
|
||||||
|
"no_active": "Nincs aktív lejátszás"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Ráta",
|
||||||
|
"remaining": "Hátralévő",
|
||||||
|
"downloaded": "Letöltött"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Ráta",
|
||||||
|
"queue": "Sor",
|
||||||
|
"timeleft": "Hátralévő idő"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Aktív",
|
||||||
|
"upload": "Feltöltés",
|
||||||
|
"download": "Letöltés"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"leech": "Leechelés",
|
||||||
|
"seed": "Seedelés",
|
||||||
|
"download": "Letöltés",
|
||||||
|
"upload": "Feltöltés"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Letöltés",
|
||||||
|
"upload": "Feltöltés",
|
||||||
|
"leech": "Leechelés",
|
||||||
|
"seed": "Seedelés"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Keresett",
|
||||||
|
"queued": "Sorban áll",
|
||||||
|
"series": "Sorozat"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Keresett",
|
||||||
|
"queued": "Sorban áll",
|
||||||
|
"movies": "Filmek"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Függőben",
|
||||||
|
"approved": "Engedélyezett",
|
||||||
|
"available": "Elérhető"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Függőben",
|
||||||
|
"approved": "Engedélyezett",
|
||||||
|
"available": "Elérhető"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Függőben",
|
||||||
|
"approved": "Engedélyezett",
|
||||||
|
"available": "Elérhető"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Lekérdezések",
|
||||||
|
"blocked": "Blokkolt",
|
||||||
|
"gravity": "Gravitáció"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Lekérdezések",
|
||||||
|
"blocked": "Blokkolt",
|
||||||
|
"filtered": "Szűrt",
|
||||||
|
"latency": "Késleltetés"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Feltöltés",
|
||||||
|
"download": "Letöltés",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Futó",
|
||||||
|
"stopped": "Megállított",
|
||||||
|
"total": "Összes"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routerek",
|
||||||
|
"services": "Folyamatok",
|
||||||
|
"middleware": "Közvetítő"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Bekapcsolva",
|
||||||
|
"disabled": "Kikapcsolva",
|
||||||
|
"total": "Összes"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Állíts be egy vagy több Cryptovalutát a követéshez",
|
||||||
|
"1hour": "1 Óra",
|
||||||
|
"1day": "1 Nap",
|
||||||
|
"7days": "7 Nap",
|
||||||
|
"30days": "30 Nap"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Applikációk",
|
||||||
|
"clients": "Kliensek",
|
||||||
|
"messages": "Üzenetek"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexerek",
|
||||||
|
"numberOfGrabs": "Fogott",
|
||||||
|
"numberOfFailGrabs": "Hibás fogások",
|
||||||
|
"numberOfQueries": "Lekérdezések",
|
||||||
|
"numberOfFailQueries": "Hibás lekérdezések"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Beállított",
|
||||||
|
"errored": "Hibás"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,7 +44,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Totale",
|
"total": "Totale",
|
||||||
"free": "Libero",
|
"free": "Libero",
|
||||||
"used": "In utilizzo"
|
"used": "In utilizzo",
|
||||||
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Attivo",
|
"active": "Attivo",
|
||||||
@@ -98,21 +100,85 @@
|
|||||||
"available": "Disponibili"
|
"available": "Disponibili"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Rapporto",
|
||||||
"queue": "Queue",
|
"queue": "Coda",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Tempo Rimanente"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Rapporto",
|
||||||
"remaining": "Remaining",
|
"remaining": "Rimanente",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "Scaricato"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"30days": "30 Days"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Applicazioni",
|
||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Messaggi"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"leech": "Leech",
|
||||||
|
"upload": "Upload",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Totalt",
|
"total": "Totalt",
|
||||||
"free": "Ledig",
|
"free": "Ledig",
|
||||||
"used": "Brukt"
|
"used": "Brukt",
|
||||||
|
"load": "Last inn",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Mottatt",
|
"rx": "Mottatt",
|
||||||
@@ -23,13 +25,13 @@
|
|||||||
"playing": "Spiller",
|
"playing": "Spiller",
|
||||||
"transcoding": "Transkoding",
|
"transcoding": "Transkoding",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Ingen aktive strømmer"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Spiller",
|
"playing": "Spiller",
|
||||||
"transcoding": "Transkoding",
|
"transcoding": "Transkoding",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Ingen aktive strømmer"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Aktiv",
|
"active": "Aktiv",
|
||||||
@@ -93,26 +95,90 @@
|
|||||||
"current": "Nåværende posisjon"
|
"current": "Nåværende posisjon"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Venter",
|
||||||
"approved": "Approved",
|
"approved": "Godkjent",
|
||||||
"available": "Available"
|
"available": "Tilgjengelig"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Takt",
|
||||||
"queue": "Queue",
|
"queue": "Kø",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Gjenstående tid"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Takt",
|
||||||
"downloaded": "Downloaded",
|
"downloaded": "Nedlastet",
|
||||||
"remaining": "Remaining"
|
"remaining": "Gjenstående"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Sett opp én eller flere kryptovalutaer å holde øye med",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Programmer",
|
||||||
"clients": "Clients",
|
"clients": "Klienter",
|
||||||
"messages": "Messages"
|
"messages": "Meldinger"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indekserere",
|
||||||
|
"numberOfGrabs": "Hentninger",
|
||||||
|
"numberOfQueries": "Spørringer",
|
||||||
|
"numberOfFailGrabs": "Mislykkede hentinger",
|
||||||
|
"numberOfFailQueries": "Mislykkede spørringer"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Totaal",
|
"total": "Totaal",
|
||||||
"free": "Vrij",
|
"free": "Vrij",
|
||||||
"used": "Gebruikt"
|
"used": "Gebruikt",
|
||||||
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@@ -39,7 +41,7 @@
|
|||||||
"playing": "Afspelen",
|
"playing": "Afspelen",
|
||||||
"transcoding": "Transcodering",
|
"transcoding": "Transcodering",
|
||||||
"bitrate": "Bitsnelheid",
|
"bitrate": "Bitsnelheid",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Geen Actieve Steams"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Afspelen",
|
"playing": "Afspelen",
|
||||||
@@ -108,11 +110,75 @@
|
|||||||
"downloaded": "Downloaded"
|
"downloaded": "Downloaded"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"30days": "30 Days"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Applications",
|
||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/pl/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"allow": "Kliknij, aby zezwolić",
|
||||||
|
"updating": "Aktualizacja",
|
||||||
|
"wait": "Proszę czekać",
|
||||||
|
"current": "Aktualna lokalizacja"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Szukaj…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"used": "Użyte",
|
||||||
|
"load": "Obciążenie",
|
||||||
|
"total": "Całkowite",
|
||||||
|
"free": "Wolne",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"no_active": "Brak aktywnych strumieni",
|
||||||
|
"playing": "Odtwarzanie",
|
||||||
|
"transcoding": "Transkodowanie",
|
||||||
|
"bitrate": "Bitrate"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Odtwarzanie",
|
||||||
|
"transcoding": "Transkodowanie",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "Brak aktywnych strumieni"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"download": "Pobieranie",
|
||||||
|
"ping": "Ping",
|
||||||
|
"upload": "Wysyłanie"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Działające",
|
||||||
|
"stopped": "Zatrzymane",
|
||||||
|
"total": "Ogólnie"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"1day": "1 dzień",
|
||||||
|
"7days": "7 dni",
|
||||||
|
"30days": "30 dni",
|
||||||
|
"1hour": "1 godzina",
|
||||||
|
"configure": "Wybierz jedną lub więcej kryptowalut do śledzenia"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Aplikacje",
|
||||||
|
"clients": "Klienci",
|
||||||
|
"messages": "Wiadomości"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Brakujący typ widżetu: {{type}}",
|
||||||
|
"api_error": "Błąd API",
|
||||||
|
"status": "Stan"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Szybkość",
|
||||||
|
"remaining": "Pozostało",
|
||||||
|
"downloaded": "Pobrano"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Szybkość",
|
||||||
|
"queue": "Kolejka",
|
||||||
|
"timeleft": "Pozostało"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Aktywny",
|
||||||
|
"upload": "Wysyłanie",
|
||||||
|
"download": "Pobieranie"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Pobieranie",
|
||||||
|
"upload": "Wysyłanie",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Poszukiwane",
|
||||||
|
"queued": "W kolejce",
|
||||||
|
"series": "Seriale"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Poszukiwane",
|
||||||
|
"queued": "W kolejce",
|
||||||
|
"movies": "Filmy"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Poszukiwane",
|
||||||
|
"queued": "W kolejce",
|
||||||
|
"albums": "Albumy"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Poszukiwane",
|
||||||
|
"queued": "W kolejce",
|
||||||
|
"books": "Książki"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Brakujące odcinki",
|
||||||
|
"missingMovies": "Brakujące filmy"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Oczekiwane",
|
||||||
|
"approved": "Zaakceptowane",
|
||||||
|
"available": "Dostępne"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Oczekiwane",
|
||||||
|
"approved": "Zaakceptowane",
|
||||||
|
"available": "Dostępne"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Oczekiwane",
|
||||||
|
"approved": "Zaakceptowane",
|
||||||
|
"available": "Dostępne"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Zapytania",
|
||||||
|
"blocked": "Zablokowane",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routery",
|
||||||
|
"services": "Serwisy",
|
||||||
|
"middleware": "Pośrednicy"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Włączone",
|
||||||
|
"disabled": "Wyłączone",
|
||||||
|
"total": "Ogólnie"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indeksery",
|
||||||
|
"numberOfGrabs": "Pochwycenia",
|
||||||
|
"numberOfQueries": "Zapytania",
|
||||||
|
"numberOfFailGrabs": "Nieudane pochwycenia",
|
||||||
|
"numberOfFailQueries": "Nieudane zapytania"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Skonfigurowane",
|
||||||
|
"errored": "Błędne"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
184
public/locales/pt-BR/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"sabnzbd": {
|
||||||
|
"timeleft": "Tempo restante",
|
||||||
|
"rate": "Taxa",
|
||||||
|
"queue": "Fila"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Ativo",
|
||||||
|
"upload": "Envio",
|
||||||
|
"download": "Download"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"total": "Total",
|
||||||
|
"running": "Funcionando",
|
||||||
|
"stopped": "Parado"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"7days": "7 Dias",
|
||||||
|
"configure": "Configure uma ou mais criptomoedas para rastrear",
|
||||||
|
"1hour": "1 Hora",
|
||||||
|
"1day": "1 Dia",
|
||||||
|
"30days": "30 Dias"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numConnections": "Conexões",
|
||||||
|
"numActiveSessions": "Sessões",
|
||||||
|
"dataRelayed": "Retransmitido",
|
||||||
|
"transferRate": "Taxa"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Tipo de Widget ausente: {{type}}",
|
||||||
|
"api_error": "Erro da API",
|
||||||
|
"status": "Status"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Localização atual",
|
||||||
|
"allow": "Clique para permitir",
|
||||||
|
"updating": "Atualizando",
|
||||||
|
"wait": "Aguarde, por favor"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Buscar…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Livre",
|
||||||
|
"used": "Usado",
|
||||||
|
"load": "Carregamento",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "Rx",
|
||||||
|
"tx": "Tx",
|
||||||
|
"mem": "Mem",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Desligado"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Reproduzindo",
|
||||||
|
"transcoding": "Transcodificando",
|
||||||
|
"bitrate": "Taxa de bits",
|
||||||
|
"no_active": "Sem transmissões ativas"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Reproduzindo",
|
||||||
|
"transcoding": "Transcodificando",
|
||||||
|
"bitrate": "Taxa de bits",
|
||||||
|
"no_active": "Sem transmissões ativas"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Taxa",
|
||||||
|
"remaining": "Restando",
|
||||||
|
"downloaded": "Baixado"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Desejado",
|
||||||
|
"queued": "Na fila",
|
||||||
|
"series": "Séries"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Desejado",
|
||||||
|
"queued": "Na fila",
|
||||||
|
"movies": "Filmes"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Desejado",
|
||||||
|
"queued": "Na fila",
|
||||||
|
"albums": "Álbuns"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Desejado",
|
||||||
|
"queued": "Na fila",
|
||||||
|
"books": "Livros"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Episódios Ausentes",
|
||||||
|
"missingMovies": "Filmes Ausentes"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Pendente",
|
||||||
|
"approved": "Aprovado",
|
||||||
|
"available": "Disponível"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Pendente",
|
||||||
|
"approved": "Aprovado",
|
||||||
|
"available": "Disponível"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Pendente",
|
||||||
|
"approved": "Aprovado",
|
||||||
|
"available": "Disponível"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Consultas",
|
||||||
|
"blocked": "Bloquado",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Consultas",
|
||||||
|
"blocked": "Bloqueado",
|
||||||
|
"filtered": "Filtrado",
|
||||||
|
"latency": "Latência"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Envio",
|
||||||
|
"download": "Receber",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Rotas",
|
||||||
|
"services": "Serviços",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Habilitado",
|
||||||
|
"disabled": "Desabilitado",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Aplicações",
|
||||||
|
"clients": "Clientes",
|
||||||
|
"messages": "Mensagens"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexadores",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configurado",
|
||||||
|
"errored": "Erro"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Usuários",
|
||||||
|
"status_count": "Postagens",
|
||||||
|
"domain_count": "Domínios"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"widget": {
|
"widget": {
|
||||||
"missing_type": "Tipo de widget ausente: {{type}}",
|
"missing_type": "Widget ausente: {{type}}",
|
||||||
"api_error": "Erro da API",
|
"api_error": "Erro da API",
|
||||||
"status": "Status"
|
"status": "Status"
|
||||||
},
|
},
|
||||||
@@ -10,31 +10,33 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Livre",
|
"free": "Livre",
|
||||||
"used": "Usada"
|
"used": "Usado",
|
||||||
|
"load": "Carregar",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
"tx": "Tx",
|
"tx": "Tx",
|
||||||
"mem": "Mem",
|
"mem": "Mem",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"offline": "Desligada"
|
"offline": "Desligado"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "A reproduzir",
|
"playing": "A reproduzir",
|
||||||
"transcoding": "Transcodificação",
|
"transcoding": "Transcodificação",
|
||||||
"bitrate": "Taxa de bits",
|
"bitrate": "Taxa de bits",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Sem streams ativas"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Reproduzindo",
|
"playing": "Reproduzindo",
|
||||||
"transcoding": "Transcodificação",
|
"transcoding": "Transcodificação",
|
||||||
"bitrate": "Taxa de bits",
|
"bitrate": "Taxa de bits",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "Sem streams ativas"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Ativa",
|
"active": "Ativo",
|
||||||
"upload": "Envio",
|
"upload": "Enviando",
|
||||||
"download": "ReceçãoDownload"
|
"download": "Baixando"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Desejada",
|
"wanted": "Desejada",
|
||||||
@@ -43,13 +45,13 @@
|
|||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Desejado",
|
"wanted": "Desejado",
|
||||||
"queued": "Enfileiradas",
|
"queued": "Fila",
|
||||||
"movies": "Filmes"
|
"movies": "Filmes"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Desejados",
|
||||||
"queued": "Queued",
|
"queued": "Em fila",
|
||||||
"books": "Books"
|
"books": "Livros"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Pendente",
|
"pending": "Pendente",
|
||||||
@@ -72,8 +74,8 @@
|
|||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "Corrida",
|
"running": "A correr",
|
||||||
"stopped": "Parou",
|
"stopped": "Parado",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"traefik": {
|
"traefik": {
|
||||||
@@ -82,8 +84,8 @@
|
|||||||
"middleware": "Middleware"
|
"middleware": "Middleware"
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
"enabled": "Habilitada",
|
"enabled": "Ativo",
|
||||||
"disabled": "Desabilitada",
|
"disabled": "Desabilitado",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
@@ -104,26 +106,90 @@
|
|||||||
"wait": "Por favor aguarde"
|
"wait": "Por favor aguarde"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Pendente",
|
||||||
"approved": "Approved",
|
"approved": "Aprovado",
|
||||||
"available": "Available"
|
"available": "Disponível"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Taxa",
|
||||||
"queue": "Queue",
|
"queue": "Fila",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Tempo restante"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Taxa",
|
||||||
"remaining": "Remaining",
|
"remaining": "Restante",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "Baixado"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configurar uma ou mais moedas",
|
||||||
|
"1hour": "1 Hora",
|
||||||
|
"1day": "1 Dia",
|
||||||
|
"7days": "7 Dias",
|
||||||
|
"30days": "30 Dias"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Aplicações",
|
"apps": "Aplicações",
|
||||||
"clients": "Clientes",
|
"clients": "Clientes",
|
||||||
"messages": "Mensagens"
|
"messages": "Mensagens"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexadores",
|
||||||
|
"numberOfGrabs": "Agarrados",
|
||||||
|
"numberOfQueries": "Consultas",
|
||||||
|
"numberOfFailGrabs": "Falhados",
|
||||||
|
"numberOfFailQueries": "Pesquisas falhadas"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Baixando",
|
||||||
|
"upload": "Enviando",
|
||||||
|
"leech": "Sanguessugas",
|
||||||
|
"seed": "Semeadores"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configurado",
|
||||||
|
"errored": "Errado"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Episódios Faltantes",
|
||||||
|
"missingMovies": "Filmes Faltantes"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"queued": "Enfileirado",
|
||||||
|
"wanted": "Desejado",
|
||||||
|
"albums": "Álbuns"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Consultas",
|
||||||
|
"blocked": "Bloqueado",
|
||||||
|
"filtered": "Filtrado",
|
||||||
|
"latency": "Latência"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Baixando",
|
||||||
|
"upload": "Enviando",
|
||||||
|
"leech": "Sanguessugas",
|
||||||
|
"seed": "Semeadores"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Usuários",
|
||||||
|
"status_count": "Postagens",
|
||||||
|
"domain_count": "Domínios"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessões",
|
||||||
|
"numConnections": "Conexões",
|
||||||
|
"dataRelayed": "Retransmitido",
|
||||||
|
"transferRate": "Taxa"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)",
|
||||||
|
"users": "Users"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/ro/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"resources": {
|
||||||
|
"used": "Utilizați",
|
||||||
|
"load": "Sarcină",
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Disponibili",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"approved": "Aprobate",
|
||||||
|
"available": "Disponibile",
|
||||||
|
"pending": "În așteptare"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "În așteptare",
|
||||||
|
"approved": "Aprobate",
|
||||||
|
"available": "Disponibile"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Cereri",
|
||||||
|
"blocked": "Blocate",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"blocked": "Blocate",
|
||||||
|
"filtered": "Filtrate",
|
||||||
|
"queries": "Cereri",
|
||||||
|
"latency": "Latentă"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"services": "Servicii",
|
||||||
|
"middleware": "Middleware",
|
||||||
|
"routers": "Routere"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Activat",
|
||||||
|
"disabled": "Dezactivat",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Configurați una sau mai multe criptomonede pe care să le urmăriți",
|
||||||
|
"1hour": "1 Oră",
|
||||||
|
"1day": "1 Zi",
|
||||||
|
"7days": "7 Zile",
|
||||||
|
"30days": "30 Zile"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"allow": "Click pentru a permite",
|
||||||
|
"updating": "Se actualizează",
|
||||||
|
"current": "Locația Curentă",
|
||||||
|
"wait": "Va rugăm așteptați"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Lipsește Tipul de Widget: {{type}}",
|
||||||
|
"api_error": "Eroare API",
|
||||||
|
"status": "Status"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Caută…"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"no_active": "Niciun stream activ",
|
||||||
|
"playing": "Activ",
|
||||||
|
"transcoding": "Transcodare",
|
||||||
|
"bitrate": "Bitrate"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Rată",
|
||||||
|
"remaining": "Rămas",
|
||||||
|
"downloaded": "Descărcat"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Activ",
|
||||||
|
"transcoding": "Transcodare",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "Niciun stream activ"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Rată",
|
||||||
|
"queue": "Coadă",
|
||||||
|
"timeleft": "Timp rămas"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed",
|
||||||
|
"download": "Descarcă",
|
||||||
|
"upload": "Încarcă"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Activ",
|
||||||
|
"upload": "Încarcă",
|
||||||
|
"download": "Descarcă"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Descarcă",
|
||||||
|
"upload": "Încarcă",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Dorite",
|
||||||
|
"queued": "În coadă",
|
||||||
|
"series": "Seriale"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"queued": "În coadă",
|
||||||
|
"wanted": "Dorite",
|
||||||
|
"movies": "Filme"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Dorite",
|
||||||
|
"queued": "În coadă",
|
||||||
|
"albums": "Albume"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Dorite",
|
||||||
|
"queued": "În coadă",
|
||||||
|
"books": "Cărți"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Episoade lipsă",
|
||||||
|
"missingMovies": "Filme lipsă"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "În așteptare",
|
||||||
|
"approved": "Aprobate",
|
||||||
|
"available": "Disponibile"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Încarcă",
|
||||||
|
"download": "Descarcă",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Activ",
|
||||||
|
"stopped": "Oprit",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Aplicații",
|
||||||
|
"clients": "Clienți",
|
||||||
|
"messages": "Mesaje"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"numberOfFailGrabs": "Descărcări eșuate",
|
||||||
|
"numberOfFailQueries": "Cereri eșuate",
|
||||||
|
"enableIndexers": "Indexatori",
|
||||||
|
"numberOfGrabs": "Descărcate",
|
||||||
|
"numberOfQueries": "Cereri"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configurat",
|
||||||
|
"errored": "Cu erori"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sesiuni",
|
||||||
|
"numConnections": "Conexiuni",
|
||||||
|
"dataRelayed": "Retransmise",
|
||||||
|
"transferRate": "Rată"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Utilizatori",
|
||||||
|
"status_count": "Postări",
|
||||||
|
"domain_count": "Domenii"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Utilizatori",
|
||||||
|
"loginsLast24H": "Autentificări (24h)",
|
||||||
|
"failedLoginsLast24H": "Conectări eșuate (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"vms": "VMs",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,9 +8,11 @@
|
|||||||
"placeholder": "Поиск…"
|
"placeholder": "Поиск…"
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
"total": "Общий",
|
"total": "Всего",
|
||||||
"free": "Свободно",
|
"free": "Свободно",
|
||||||
"used": "Использовано"
|
"used": "Использовано",
|
||||||
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
@@ -88,8 +90,8 @@
|
|||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"wait": "Пожалуйста подождите",
|
"wait": "Пожалуйста подождите",
|
||||||
"current": "Текущее местоположение",
|
"current": "Текущая локация",
|
||||||
"allow": "Click to allow",
|
"allow": "Нажмите, чтобы разрешить",
|
||||||
"updating": "Обновление"
|
"updating": "Обновление"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
@@ -108,11 +110,75 @@
|
|||||||
"downloaded": "Downloaded"
|
"downloaded": "Downloaded"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Дней"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Applications",
|
||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate",
|
||||||
|
"numActiveSessions": "Sessions"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/sv/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Saknar Widget-typ: {{type}}",
|
||||||
|
"api_error": "API-fel",
|
||||||
|
"status": "Status"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Nuvarande plats",
|
||||||
|
"allow": "Klicka för att tillåta",
|
||||||
|
"updating": "Uppdaterar",
|
||||||
|
"wait": "Vänligen vänta"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"load": "Laddar",
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Ledigt",
|
||||||
|
"used": "Använt",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"offline": "Offline"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Sök…"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Spelar",
|
||||||
|
"transcoding": "Omkodning",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "Inga aktiva strömmar"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Spelar",
|
||||||
|
"transcoding": "Omkodning",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "Inga aktiva strömmar"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Hastighet",
|
||||||
|
"remaining": "Återstående",
|
||||||
|
"downloaded": "Nedladdat"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Hastighet",
|
||||||
|
"queue": "Kö",
|
||||||
|
"timeleft": "Tid kvar"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Aktiva",
|
||||||
|
"upload": "Uppladdning",
|
||||||
|
"download": "Nedladdning"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Nedladdning",
|
||||||
|
"upload": "Uppladdning",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Eftersöker",
|
||||||
|
"queued": "I kö",
|
||||||
|
"series": "Serier"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "Eftersöker",
|
||||||
|
"queued": "I kö",
|
||||||
|
"movies": "Filmer"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Eftersöker",
|
||||||
|
"queued": "I kö",
|
||||||
|
"albums": "Album"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Eftersökt",
|
||||||
|
"queued": "I kö",
|
||||||
|
"books": "Böcker"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Saknade program",
|
||||||
|
"missingMovies": "Saknade filmer"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Avvaktar",
|
||||||
|
"approved": "Godkända",
|
||||||
|
"available": "Tillgänglig"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Avvaktar",
|
||||||
|
"approved": "Godkända",
|
||||||
|
"available": "Tillgänglig"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Avvaktar",
|
||||||
|
"approved": "Godkända",
|
||||||
|
"available": "Tillgänglig"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"blocked": "Blockerad",
|
||||||
|
"queries": "Förfrågningar",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Uppladdning",
|
||||||
|
"download": "Nedladdning",
|
||||||
|
"ping": "Svarstid"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Körs",
|
||||||
|
"stopped": "Stoppade",
|
||||||
|
"total": "Totalt"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routers",
|
||||||
|
"services": "Tjänster",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Aktiverad",
|
||||||
|
"disabled": "Inaktiverad",
|
||||||
|
"total": "Totalt"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Konfigurera en eller flera kryptovalutor att följa",
|
||||||
|
"1hour": "1 timme",
|
||||||
|
"1day": "1 dag",
|
||||||
|
"7days": "7 dagar",
|
||||||
|
"30days": "30 dagar"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "Program",
|
||||||
|
"clients": "Klienter",
|
||||||
|
"messages": "Meddelande"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexerare",
|
||||||
|
"numberOfGrabs": "Hämtningar",
|
||||||
|
"numberOfQueries": "Hämtningar",
|
||||||
|
"numberOfFailGrabs": "Misslyckade hämtningar",
|
||||||
|
"numberOfFailQueries": "Misslyckade hämtningar"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Konfigurerade",
|
||||||
|
"errored": "Felaktiga"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Förfrågningar",
|
||||||
|
"blocked": "Blockerad",
|
||||||
|
"filtered": "Filtrerad",
|
||||||
|
"latency": "Svarstid"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Nedladdning",
|
||||||
|
"upload": "Uppladdning",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Användare",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessioner",
|
||||||
|
"numConnections": "Anslutningar",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,9 @@
|
|||||||
"resources": {
|
"resources": {
|
||||||
"total": "Tổng",
|
"total": "Tổng",
|
||||||
"free": "Dư",
|
"free": "Dư",
|
||||||
"used": "Đã dùng"
|
"used": "Đã dùng",
|
||||||
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
@@ -44,16 +46,16 @@
|
|||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Wanted",
|
||||||
"queued": "Queued",
|
"queued": "Queued",
|
||||||
"movies": "Movies"
|
"movies": "Phim"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Đang tìm",
|
||||||
"queued": "Queued",
|
"queued": "Đang chờ",
|
||||||
"books": "Books"
|
"books": "Sách"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "Pending",
|
"pending": "Đang xử lý",
|
||||||
"approved": "Approved",
|
"approved": "Đã duyệt",
|
||||||
"available": "Available"
|
"available": "Available"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
@@ -87,32 +89,96 @@
|
|||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"current": "Current Location",
|
"current": "Vị trí hiện tại",
|
||||||
"allow": "Click to allow",
|
"allow": "Bấm để đồng ý",
|
||||||
"updating": "Updating",
|
"updating": "Đang cập nhật",
|
||||||
"wait": "Please wait"
|
"wait": "Vui lòng chờ"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"approved": "Approved",
|
"approved": "Đã duyệt",
|
||||||
"available": "Available"
|
"available": "Available"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Rate",
|
||||||
"queue": "Queue",
|
"queue": "Hàng chờ",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Thời gian còn lại"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "Rate",
|
||||||
"remaining": "Remaining",
|
"remaining": "Remaining",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "Đã tải"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "Applications",
|
||||||
"clients": "Clients",
|
"clients": "Clients",
|
||||||
"messages": "Messages"
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/yue/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"emby": {
|
||||||
|
"transcoding": "轉碼緊",
|
||||||
|
"bitrate": "比特率",
|
||||||
|
"playing": "播放緊",
|
||||||
|
"no_active": "無任何活動"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "播放緊",
|
||||||
|
"no_active": "無任何活動",
|
||||||
|
"transcoding": "轉碼緊",
|
||||||
|
"bitrate": "比特率"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "下載速度",
|
||||||
|
"upload": "上傳速度",
|
||||||
|
"leech": "下載緊",
|
||||||
|
"seed": "做種緊"
|
||||||
|
},
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "缺少小部件類型:{{type}}",
|
||||||
|
"api_error": "API 錯誤",
|
||||||
|
"status": "狀況"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "依家位置",
|
||||||
|
"allow": "點擊允許",
|
||||||
|
"updating": "更新緊",
|
||||||
|
"wait": "請稍後"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "搜索緊…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"total": "全部",
|
||||||
|
"free": "剩餘",
|
||||||
|
"used": "用咗",
|
||||||
|
"load": "負荷",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "接收",
|
||||||
|
"tx": "發送",
|
||||||
|
"mem": "內存",
|
||||||
|
"cpu": "處理器",
|
||||||
|
"offline": "離線"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "速度",
|
||||||
|
"remaining": "剩餘",
|
||||||
|
"downloaded": "下載咗"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "速度",
|
||||||
|
"queue": "隊列",
|
||||||
|
"timeleft": "用時"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "激活",
|
||||||
|
"upload": "上傳",
|
||||||
|
"download": "下載"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "下載速度",
|
||||||
|
"upload": "上傳速度",
|
||||||
|
"leech": "下載緊",
|
||||||
|
"seed": "做種緊"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "想睇",
|
||||||
|
"queued": "排緊隊",
|
||||||
|
"series": "電視劇"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"wanted": "想睇",
|
||||||
|
"queued": "排緊隊",
|
||||||
|
"movies": "電影"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "想睇",
|
||||||
|
"queued": "排緊隊",
|
||||||
|
"albums": "專輯"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "想睇",
|
||||||
|
"queued": "排緊隊",
|
||||||
|
"books": "書"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "缺少嘅劇集",
|
||||||
|
"missingMovies": "缺少電影"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "待定",
|
||||||
|
"approved": "批准",
|
||||||
|
"available": "可用"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "提交咗",
|
||||||
|
"approved": "批准咗",
|
||||||
|
"available": "可睇嘅總量"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "待定",
|
||||||
|
"approved": "批准",
|
||||||
|
"available": "可用"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "查詢",
|
||||||
|
"blocked": "封鎖",
|
||||||
|
"gravity": "重力"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "查詢",
|
||||||
|
"blocked": "封鎖",
|
||||||
|
"filtered": "過濾",
|
||||||
|
"latency": "延遲"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "上傳速率",
|
||||||
|
"download": "下載速率",
|
||||||
|
"ping": "Ping值"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "運行緊",
|
||||||
|
"stopped": "暫停",
|
||||||
|
"total": "全部"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "路由器",
|
||||||
|
"services": "服務項",
|
||||||
|
"middleware": "中間件"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"1day": "1 日",
|
||||||
|
"configure": "配置一個或多個加密貨幣以進行跟蹤",
|
||||||
|
"1hour": "1 個鐘",
|
||||||
|
"7days": "7 日",
|
||||||
|
"30days": "30日"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "啟用",
|
||||||
|
"disabled": "停用咗",
|
||||||
|
"total": "全部"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"apps": "應用",
|
||||||
|
"clients": "客戶端",
|
||||||
|
"messages": "消息"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "索引",
|
||||||
|
"numberOfGrabs": "抓住",
|
||||||
|
"numberOfQueries": "查詢",
|
||||||
|
"numberOfFailGrabs": "失敗抓取",
|
||||||
|
"numberOfFailQueries": "查詢失敗"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "配置",
|
||||||
|
"errored": "已錯誤"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "會話",
|
||||||
|
"numConnections": "連接",
|
||||||
|
"dataRelayed": "傳遞",
|
||||||
|
"transferRate": "速度"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "用戶",
|
||||||
|
"status_count": "職位",
|
||||||
|
"domain_count": "域"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "用戶",
|
||||||
|
"loginsLast24H": "登錄( 24小时)",
|
||||||
|
"failedLoginsLast24H": "登錄失敗( 24鐘頭)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,58 +2,60 @@
|
|||||||
"widget": {
|
"widget": {
|
||||||
"missing_type": "缺少小部件类型:{{type}}",
|
"missing_type": "缺少小部件类型:{{type}}",
|
||||||
"api_error": "API错误",
|
"api_error": "API错误",
|
||||||
"status": "地位"
|
"status": "状态"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"placeholder": "搜索…"
|
"placeholder": "搜索…"
|
||||||
},
|
},
|
||||||
"resources": {
|
"resources": {
|
||||||
"total": "全部的",
|
"total": "共",
|
||||||
"free": "自由的",
|
"free": "空闲",
|
||||||
"used": "用过的"
|
"used": "已用",
|
||||||
|
"load": "负载",
|
||||||
|
"cpu": "CPU"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "rx",
|
"rx": "接收",
|
||||||
"tx": "TX",
|
"tx": "发送",
|
||||||
"mem": "mem",
|
"mem": "内存",
|
||||||
"cpu": "中央处理器",
|
"cpu": "处理器",
|
||||||
"offline": "离线"
|
"offline": "离线"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "玩",
|
"playing": "播放中",
|
||||||
"transcoding": "转码",
|
"transcoding": "转码",
|
||||||
"bitrate": "比特率",
|
"bitrate": "比特率",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "暂无播放"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "玩",
|
"playing": "播放中",
|
||||||
"transcoding": "转码",
|
"transcoding": "转码",
|
||||||
"bitrate": "比特率",
|
"bitrate": "比特率",
|
||||||
"no_active": "No Active Streams"
|
"no_active": "暂无播放"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "积极的",
|
"active": "活动中",
|
||||||
"upload": "上传",
|
"upload": "上传",
|
||||||
"download": "下载"
|
"download": "下载"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "通缉",
|
"wanted": "想看",
|
||||||
"queued": "排队",
|
"queued": "排队",
|
||||||
"series": "系列"
|
"series": "系列"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "通缉",
|
"wanted": "想看",
|
||||||
"queued": "排队",
|
"queued": "队列",
|
||||||
"movies": "电影"
|
"movies": "电影"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "订阅",
|
||||||
"queued": "Queued",
|
"queued": "队列",
|
||||||
"books": "Books"
|
"books": "书籍"
|
||||||
},
|
},
|
||||||
"ombi": {
|
"ombi": {
|
||||||
"pending": "待办的",
|
"pending": "待办的",
|
||||||
"approved": "得到正式认可的",
|
"approved": "已批准",
|
||||||
"available": "可用的"
|
"available": "可用的"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
@@ -72,9 +74,9 @@
|
|||||||
"ping": "ping"
|
"ping": "ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "跑步",
|
"running": "运行中",
|
||||||
"stopped": "停了下来",
|
"stopped": "停止",
|
||||||
"total": "全部的"
|
"total": "总计"
|
||||||
},
|
},
|
||||||
"traefik": {
|
"traefik": {
|
||||||
"routers": "路由器",
|
"routers": "路由器",
|
||||||
@@ -87,32 +89,96 @@
|
|||||||
"total": "全部的"
|
"total": "全部的"
|
||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"current": "Current Location",
|
"current": "当前定位",
|
||||||
"allow": "Click to allow",
|
"allow": "点击并允许",
|
||||||
"updating": "Updating",
|
"updating": "更新中",
|
||||||
"wait": "Please wait"
|
"wait": "请稍后"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "待办",
|
||||||
"approved": "Approved",
|
"approved": "已批准",
|
||||||
"available": "Available"
|
"available": "可用"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "速率",
|
||||||
"queue": "Queue",
|
"queue": "队列",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "剩余时间"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Rate",
|
"rate": "速率",
|
||||||
"remaining": "Remaining",
|
"remaining": "剩余",
|
||||||
"downloaded": "Downloaded"
|
"downloaded": "下载"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Configure one or more crypto currencies to track"
|
"configure": "配置一个或多个需要追踪的加密",
|
||||||
|
"1hour": "1小时",
|
||||||
|
"1day": "1天",
|
||||||
|
"7days": "7天",
|
||||||
|
"30days": "30天"
|
||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applications",
|
"apps": "应用",
|
||||||
"clients": "Clients",
|
"clients": "客户端",
|
||||||
"messages": "Messages"
|
"messages": "信息"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "索引器",
|
||||||
|
"numberOfGrabs": "抓取",
|
||||||
|
"numberOfQueries": "查询",
|
||||||
|
"numberOfFailGrabs": "抓取失败",
|
||||||
|
"numberOfFailQueries": "查询失败"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "下载",
|
||||||
|
"upload": "上传",
|
||||||
|
"leech": "下载中",
|
||||||
|
"seed": "做种"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "已配置",
|
||||||
|
"errored": "出错了"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "缺少的剧集",
|
||||||
|
"missingMovies": "缺少的电影"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "订阅",
|
||||||
|
"queued": "队列",
|
||||||
|
"albums": "相册"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "查询",
|
||||||
|
"blocked": "阻止",
|
||||||
|
"filtered": "过滤",
|
||||||
|
"latency": "延迟"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "下载",
|
||||||
|
"upload": "上传",
|
||||||
|
"leech": "下载中",
|
||||||
|
"seed": "做种"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "用户",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
184
public/locales/zh-Hant/common.json
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
{
|
||||||
|
"widget": {
|
||||||
|
"missing_type": "Missing Widget Type: {{type}}",
|
||||||
|
"api_error": "API Error",
|
||||||
|
"status": "Status"
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"current": "Current Location",
|
||||||
|
"allow": "Click to allow",
|
||||||
|
"updating": "Updating",
|
||||||
|
"wait": "Please wait"
|
||||||
|
},
|
||||||
|
"docker": {
|
||||||
|
"rx": "RX",
|
||||||
|
"offline": "Offline",
|
||||||
|
"tx": "TX",
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"emby": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams"
|
||||||
|
},
|
||||||
|
"tautulli": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams"
|
||||||
|
},
|
||||||
|
"jellyseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Search…"
|
||||||
|
},
|
||||||
|
"resources": {
|
||||||
|
"total": "Total",
|
||||||
|
"free": "Free",
|
||||||
|
"used": "Used",
|
||||||
|
"load": "Load",
|
||||||
|
"cpu": "CPU"
|
||||||
|
},
|
||||||
|
"nzbget": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"remaining": "Remaining",
|
||||||
|
"downloaded": "Downloaded"
|
||||||
|
},
|
||||||
|
"sabnzbd": {
|
||||||
|
"rate": "Rate",
|
||||||
|
"queue": "Queue",
|
||||||
|
"timeleft": "Time Left"
|
||||||
|
},
|
||||||
|
"rutorrent": {
|
||||||
|
"active": "Active",
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download"
|
||||||
|
},
|
||||||
|
"radarr": {
|
||||||
|
"movies": "Movies",
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued"
|
||||||
|
},
|
||||||
|
"sonarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"series": "Series"
|
||||||
|
},
|
||||||
|
"readarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"books": "Books"
|
||||||
|
},
|
||||||
|
"ombi": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"overseerr": {
|
||||||
|
"pending": "Pending",
|
||||||
|
"approved": "Approved",
|
||||||
|
"available": "Available"
|
||||||
|
},
|
||||||
|
"pihole": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"gravity": "Gravity"
|
||||||
|
},
|
||||||
|
"speedtest": {
|
||||||
|
"upload": "Upload",
|
||||||
|
"download": "Download",
|
||||||
|
"ping": "Ping"
|
||||||
|
},
|
||||||
|
"portainer": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"traefik": {
|
||||||
|
"routers": "Routers",
|
||||||
|
"services": "Services",
|
||||||
|
"middleware": "Middleware"
|
||||||
|
},
|
||||||
|
"gotify": {
|
||||||
|
"clients": "Clients",
|
||||||
|
"apps": "Applications",
|
||||||
|
"messages": "Messages"
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"total": "Total"
|
||||||
|
},
|
||||||
|
"coinmarketcap": {
|
||||||
|
"configure": "Configure one or more crypto currencies to track",
|
||||||
|
"1hour": "1 Hour",
|
||||||
|
"1day": "1 Day",
|
||||||
|
"7days": "7 Days",
|
||||||
|
"30days": "30 Days"
|
||||||
|
},
|
||||||
|
"prowlarr": {
|
||||||
|
"enableIndexers": "Indexers",
|
||||||
|
"numberOfGrabs": "Grabs",
|
||||||
|
"numberOfQueries": "Queries",
|
||||||
|
"numberOfFailGrabs": "Fail Grabs",
|
||||||
|
"numberOfFailQueries": "Fail Queries"
|
||||||
|
},
|
||||||
|
"transmission": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"jackett": {
|
||||||
|
"configured": "Configured",
|
||||||
|
"errored": "Errored"
|
||||||
|
},
|
||||||
|
"bazarr": {
|
||||||
|
"missingEpisodes": "Missing Episodes",
|
||||||
|
"missingMovies": "Missing Movies"
|
||||||
|
},
|
||||||
|
"lidarr": {
|
||||||
|
"wanted": "Wanted",
|
||||||
|
"queued": "Queued",
|
||||||
|
"albums": "Albums"
|
||||||
|
},
|
||||||
|
"adguard": {
|
||||||
|
"queries": "Queries",
|
||||||
|
"blocked": "Blocked",
|
||||||
|
"filtered": "Filtered",
|
||||||
|
"latency": "Latency"
|
||||||
|
},
|
||||||
|
"qbittorrent": {
|
||||||
|
"download": "Download",
|
||||||
|
"upload": "Upload",
|
||||||
|
"leech": "Leech",
|
||||||
|
"seed": "Seed"
|
||||||
|
},
|
||||||
|
"mastodon": {
|
||||||
|
"user_count": "Users",
|
||||||
|
"status_count": "Posts",
|
||||||
|
"domain_count": "Domains"
|
||||||
|
},
|
||||||
|
"strelaysrv": {
|
||||||
|
"numActiveSessions": "Sessions",
|
||||||
|
"numConnections": "Connections",
|
||||||
|
"dataRelayed": "Relayed",
|
||||||
|
"transferRate": "Rate"
|
||||||
|
},
|
||||||
|
"authentik": {
|
||||||
|
"users": "Users",
|
||||||
|
"loginsLast24H": "Logins (24h)",
|
||||||
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"mem": "MEM",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"lxc": "LXC",
|
||||||
|
"vms": "VMs"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
public/mstile-144x144.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/mstile-150x150.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/mstile-310x150.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/mstile-310x310.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
public/mstile-70x70.png
Normal file
|
After Width: | Height: | Size: 958 B |
23
public/safari-pinned-tab.svg
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||||
|
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||||
|
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
|
||||||
|
preserveAspectRatio="xMidYMid meet">
|
||||||
|
<metadata>
|
||||||
|
Created by potrace 1.14, written by Peter Selinger 2001-2017
|
||||||
|
</metadata>
|
||||||
|
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
|
||||||
|
fill="#000000" stroke="none">
|
||||||
|
<path d="M1682 5688 c-141 -24 -253 -147 -287 -316 -5 -24 -10 -3658 -5 -4029
|
||||||
|
0 -33 0 -33 168 108 92 77 178 151 192 162 14 12 75 64 136 114 62 51 114 99
|
||||||
|
116 105 2 7 4 209 3 449 l-1 436 276 0 c151 0 277 -4 280 -8 3 -4 5 -98 4
|
||||||
|
-208 0 -111 2 -201 4 -201 3 0 117 95 132 110 3 3 73 61 155 130 168 140 167
|
||||||
|
139 250 209 51 43 62 48 75 37 13 -12 524 -441 654 -550 28 -22 68 -57 91 -76
|
||||||
|
23 -19 66 -55 95 -80 30 -25 86 -72 125 -105 38 -33 140 -118 225 -190 85 -71
|
||||||
|
166 -139 180 -151 14 -13 70 -60 124 -106 55 -46 133 -111 174 -145 41 -35 77
|
||||||
|
-61 80 -59 4 2 7 607 7 1344 -1 1197 1 1341 15 1344 8 2 163 3 343 3 l328 0
|
||||||
|
-4 685 c-1 377 -6 695 -9 706 -26 90 -93 186 -161 233 -86 58 30 55 -1924 55
|
||||||
|
-991 1 -1819 -2 -1841 -6z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -1,15 +1,13 @@
|
|||||||
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import List from "components/bookmarks/list";
|
import List from "components/bookmarks/list";
|
||||||
|
|
||||||
export default function BookmarksGroup({ group }) {
|
export default function BookmarksGroup({ group }) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1">
|
||||||
key={group.name}
|
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
|
||||||
className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1"
|
<ErrorBoundary>
|
||||||
>
|
<List bookmarks={group.bookmarks} />
|
||||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">
|
</ErrorBoundary>
|
||||||
{group.name}
|
|
||||||
</h2>
|
|
||||||
<List bookmarks={group.bookmarks} />
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
|
import { useContext } from "react";
|
||||||
|
|
||||||
|
import { SettingsContext } from "utils/contexts/settings";
|
||||||
|
|
||||||
export default function Item({ bookmark }) {
|
export default function Item({ bookmark }) {
|
||||||
const { hostname } = new URL(bookmark.href);
|
const { hostname } = new URL(bookmark.href);
|
||||||
|
const { settings } = useContext(SettingsContext);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={bookmark.name}>
|
<li key={bookmark.name}>
|
||||||
<button
|
<a
|
||||||
type="button"
|
href={bookmark.href}
|
||||||
onClick={() => window.open(bookmark.href, "_blank").focus()}
|
title={bookmark.name}
|
||||||
className="w-full text-left mb-3 cursor-pointer rounded-md font-medium text-theme-700 hover:text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-black/10 dark:shadow-black/20 bg-white/50 hover:bg-theme-300/10 dark:bg-white/10 dark:hover:bg-white/20 backdrop-blur-md"
|
target={settings.target ?? "_blank"}
|
||||||
|
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10"
|
||||||
>
|
>
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md">
|
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md">
|
||||||
@@ -14,10 +20,10 @@ export default function Item({ bookmark }) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
||||||
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
|
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
|
||||||
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-400 opacity-50 text-xs">{hostname}</div>
|
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-300 text-xs">{hostname}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
40
src/components/errorboundry.jsx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export default class ErrorBoundary extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = { error: null, errorInfo: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidCatch(error, errorInfo) {
|
||||||
|
// Catch errors in any components below and re-render with error message
|
||||||
|
this.setState({
|
||||||
|
error,
|
||||||
|
errorInfo,
|
||||||
|
});
|
||||||
|
|
||||||
|
// You can also log error messages to an error reporting service here
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(error, errorInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { error, errorInfo } = this.state;
|
||||||
|
if (errorInfo) {
|
||||||
|
// Error path
|
||||||
|
return (
|
||||||
|
<div className="inline-block text-sm bg-rose-100 text-rose-900 dark:bg-rose-900 dark:text-rose-100 rounded-md p-2 m-1">
|
||||||
|
<div className="font-medium mb-1">Something went wrong.</div>
|
||||||
|
<details className="text-xs font-mono whitespace-pre">
|
||||||
|
<summary>{error && error.toString()}</summary>
|
||||||
|
{errorInfo.componentStack}
|
||||||
|
</details>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normally, just render children
|
||||||
|
const { children } = this.props;
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
}
|
||||||
114
src/components/favicon.jsx
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/* eslint-disable @next/next/no-img-element */
|
||||||
|
/* eslint-disable jsx-a11y/alt-text */
|
||||||
|
import { useRef, useEffect, useContext } from "react";
|
||||||
|
|
||||||
|
import themes from "utils/styles/themes";
|
||||||
|
import { ColorContext } from "utils/contexts/color";
|
||||||
|
|
||||||
|
export function Svg({ svgRef = null }) {
|
||||||
|
const { color } = useContext(ColorContext);
|
||||||
|
|
||||||
|
const { iconStart, iconEnd } = themes[color];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
ref={svgRef}
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 1024 1024"
|
||||||
|
style={{
|
||||||
|
enableBackground: "new 0 0 1024 1024",
|
||||||
|
}}
|
||||||
|
xmlSpace="preserve"
|
||||||
|
className="w-full h-full"
|
||||||
|
>
|
||||||
|
<style>
|
||||||
|
{
|
||||||
|
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<g id="Icon">
|
||||||
|
<path
|
||||||
|
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
|
||||||
|
style={{
|
||||||
|
fill: iconStart,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="homepage_favicon_gradient"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1={200.746}
|
||||||
|
y1={225.015}
|
||||||
|
x2={764.986}
|
||||||
|
y2={789.255}
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
offset={0}
|
||||||
|
style={{
|
||||||
|
stopColor: iconStart,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset={1}
|
||||||
|
style={{
|
||||||
|
stopColor: iconEnd,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
|
||||||
|
style={{
|
||||||
|
fill: "url(#homepage_favicon_gradient})",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Favicon() {
|
||||||
|
const svgRef = useRef();
|
||||||
|
const imgRef = useRef();
|
||||||
|
const canvasRef = useRef();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const svg = svgRef.current;
|
||||||
|
const img = imgRef.current;
|
||||||
|
const canvas = canvasRef.current;
|
||||||
|
|
||||||
|
if (!svg || !img || !canvas) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const xml = new XMLSerializer().serializeToString(svg);
|
||||||
|
|
||||||
|
const svg64 = Buffer.from(xml).toString("base64");
|
||||||
|
const b64Start = "data:image/svg+xml;base64,";
|
||||||
|
|
||||||
|
// prepend a "header"
|
||||||
|
const image64 = b64Start + svg64;
|
||||||
|
|
||||||
|
// set it as the source of the img element
|
||||||
|
img.onload = () => {
|
||||||
|
// draw the image onto the canvas
|
||||||
|
canvas.getContext("2d").drawImage(img, 0, 0);
|
||||||
|
// canvas.width = 256;
|
||||||
|
// canvas.height = 256;
|
||||||
|
|
||||||
|
const link = window.document.createElement("link");
|
||||||
|
link.type = "image/x-icon";
|
||||||
|
link.rel = "shortcut icon";
|
||||||
|
link.href = canvas.toDataURL("image/x-icon");
|
||||||
|
document.getElementsByTagName("head")[0].appendChild(link);
|
||||||
|
};
|
||||||
|
|
||||||
|
img.src = image64;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="hidden">
|
||||||
|
<Svg svgRef={svgRef} />
|
||||||
|
<img width={64} height={64} ref={imgRef} />
|
||||||
|
<canvas width={64} height={64} ref={canvasRef} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
48
src/components/services/dropdown.jsx
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import { Fragment } from "react";
|
||||||
|
import { Menu, Transition } from "@headlessui/react";
|
||||||
|
import { BiCog } from "react-icons/bi";
|
||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
export default function Dropdown({ options, value, setValue }) {
|
||||||
|
return (
|
||||||
|
<Menu as="div" className="relative inline-block text-left">
|
||||||
|
<div>
|
||||||
|
<Menu.Button className="text-xs inline-flex w-full items-center rounded bg-theme-200/50 dark:bg-theme-900/20 px-3 py-1.5">
|
||||||
|
{options.find((option) => option.value === value).label}
|
||||||
|
<BiCog className="-mr-1 ml-2 h-4 w-4" aria-hidden="true" />
|
||||||
|
</Menu.Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Transition
|
||||||
|
as={Fragment}
|
||||||
|
enter="transition ease-out duration-100"
|
||||||
|
enterFrom="transform opacity-0 scale-95"
|
||||||
|
enterTo="transform opacity-100 scale-100"
|
||||||
|
leave="transition ease-in duration-75"
|
||||||
|
leaveFrom="transform opacity-100 scale-100"
|
||||||
|
leaveTo="transform opacity-0 scale-95"
|
||||||
|
>
|
||||||
|
<Menu.Items className="absolute right-0 z-10 mt-2 w-56 origin-top-right rounded-md bg-theme-200/50 dark:bg-theme-900/50 backdrop-blur shadow-md focus:outline-none text-theme-700 dark:text-theme-200">
|
||||||
|
<div className="py-1">
|
||||||
|
{options.map((option) => (
|
||||||
|
<Menu.Item key={option.value} as={Fragment}>
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
setValue(option.value);
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
className={classNames(
|
||||||
|
value === option.value ? "bg-theme-300/40 dark:bg-theme-900/40" : "",
|
||||||
|
"w-full block px-3 py-1.5 text-sm hover:bg-theme-300/70 hover:dark:bg-theme-900/70 text-left"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{option.label}
|
||||||
|
</button>
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Menu.Items>
|
||||||
|
</Transition>
|
||||||
|
</Menu>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,15 +1,18 @@
|
|||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
import List from "components/services/list";
|
import List from "components/services/list";
|
||||||
|
|
||||||
export default function ServicesGroup({ services }) {
|
export default function ServicesGroup({ services, layout }) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
key={services.name}
|
key={services.name}
|
||||||
className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1"
|
className={classNames(
|
||||||
|
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
|
||||||
|
"flex-1 p-1"
|
||||||
|
)}
|
||||||
>
|
>
|
||||||
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">
|
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
|
||||||
{services.name}
|
<List services={services.services} layout={layout} />
|
||||||
</h2>
|
|
||||||
<List services={services.services} />
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
import Image from "next/future/image";
|
import Image from "next/future/image";
|
||||||
import { Disclosure } from "@headlessui/react";
|
import classNames from "classnames";
|
||||||
|
import { useContext, useState } from "react";
|
||||||
|
|
||||||
import Status from "./status";
|
import Status from "./status";
|
||||||
import Widget from "./widget";
|
import Widget from "./widget";
|
||||||
import Docker from "./widgets/service/docker";
|
|
||||||
|
import Docker from "widgets/docker/component";
|
||||||
|
import { SettingsContext } from "utils/contexts/settings";
|
||||||
|
|
||||||
function resolveIcon(icon) {
|
function resolveIcon(icon) {
|
||||||
if (icon.startsWith("http")) {
|
if (icon.startsWith("http")) {
|
||||||
return `/api/proxy?url=${encodeURIComponent(icon)}`;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (icon.startsWith("/")) {
|
if (icon.startsWith("/")) {
|
||||||
@@ -22,77 +25,92 @@ function resolveIcon(icon) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function Item({ service }) {
|
export default function Item({ service }) {
|
||||||
const handleOnClick = () => {
|
const hasLink = service.href && service.href !== "#";
|
||||||
if (service.href && service.href !== "#") {
|
const { settings } = useContext(SettingsContext);
|
||||||
window.open(service.href, "_blank").focus();
|
const [statsOpen, setStatsOpen] = useState(false);
|
||||||
|
const [statsClosing, setStatsClosing] = useState(false);
|
||||||
|
|
||||||
|
// set stats to closed after 300ms
|
||||||
|
const closeStats = () => {
|
||||||
|
if (statsOpen) {
|
||||||
|
setStatsClosing(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
setStatsOpen(false);
|
||||||
|
setStatsClosing(false);
|
||||||
|
}, 300);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const hasLink = service.href && service.href !== "#";
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={service.name}>
|
<li key={service.name}>
|
||||||
<Disclosure>
|
<div
|
||||||
<div
|
className={`${
|
||||||
className={`${
|
hasLink ? "cursor-pointer " : " "
|
||||||
hasLink ? "cursor-pointer " : " "
|
}transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10`}
|
||||||
}transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 hover:text-theme-700/70 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-black/10 dark:shadow-black/20 bg-white/50 hover:bg-theme-300/20 dark:bg-white/10 dark:hover:bg-white/20 backdrop-blur-md`}
|
>
|
||||||
>
|
<div className="flex select-none">
|
||||||
<div className="flex select-none">
|
{service.icon &&
|
||||||
{service.icon &&
|
(hasLink ? (
|
||||||
(hasLink ? (
|
<a
|
||||||
<button
|
href={service.href}
|
||||||
type="button"
|
target={settings.target ?? "_blank"}
|
||||||
onClick={handleOnClick}
|
rel="noreferrer"
|
||||||
className="flex-shrink-0 flex items-center justify-center w-12 "
|
className="flex-shrink-0 flex items-center justify-center w-12 "
|
||||||
>
|
|
||||||
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
|
|
||||||
</button>
|
|
||||||
) : (
|
|
||||||
<div className="flex-shrink-0 flex items-center justify-center w-12 ">
|
|
||||||
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
|
|
||||||
{hasLink ? (
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={handleOnClick}
|
|
||||||
className="flex-1 flex items-center justify-between rounded-r-md "
|
|
||||||
>
|
>
|
||||||
<div className="flex-1 px-2 py-2 text-sm text-left">
|
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
|
||||||
{service.name}
|
</a>
|
||||||
<p className="text-theme-500 dark:text-theme-400 text-xs font-extralight">{service.description}</p>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
) : (
|
) : (
|
||||||
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
<div className="flex-shrink-0 flex items-center justify-center w-12 ">
|
||||||
<div className="flex-1 px-2 py-2 text-sm text-left">
|
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
|
||||||
{service.name}
|
|
||||||
<p className="text-theme-500 dark:text-theme-400 text-xs font-extralight">{service.description}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
))}
|
||||||
|
|
||||||
{service.container && (
|
{hasLink ? (
|
||||||
<Disclosure.Button
|
<a
|
||||||
as="div"
|
href={service.href}
|
||||||
className="flex-shrink-0 flex items-center justify-center w-12 cursor-pointer"
|
target={settings.target ?? "_blank"}
|
||||||
>
|
rel="noreferrer"
|
||||||
<Status service={service} />
|
className="flex-1 flex items-center justify-between rounded-r-md "
|
||||||
</Disclosure.Button>
|
>
|
||||||
)}
|
<div className="flex-1 px-2 py-2 text-sm text-left">
|
||||||
</div>
|
{service.name}
|
||||||
|
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
|
||||||
<Disclosure.Panel>
|
</div>
|
||||||
<div className="w-full">
|
</a>
|
||||||
<Docker service={{ widget: { container: service.container, server: service.server } }} />
|
) : (
|
||||||
|
<div className="flex-1 flex items-center justify-between rounded-r-md ">
|
||||||
|
<div className="flex-1 px-2 py-2 text-sm text-left">
|
||||||
|
{service.name}
|
||||||
|
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Disclosure.Panel>
|
)}
|
||||||
|
|
||||||
{service.widget && <Widget service={service} />}
|
{service.container && (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
|
||||||
|
className="flex-shrink-0 flex items-center justify-center w-12 cursor-pointer"
|
||||||
|
>
|
||||||
|
<Status service={service} />
|
||||||
|
<span className="sr-only">View container stats</span>
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Disclosure>
|
|
||||||
|
{service.container && service.server && (
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
statsOpen && !statsClosing ? "max-h-[55px] opacity-100" : " max-h-[0] opacity-0",
|
||||||
|
"w-full overflow-hidden transition-all duration-300 ease-in-out"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{statsOpen && <Docker service={{ widget: { container: service.container, server: service.server } }} />}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{service.widget && <Widget service={service} />}
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,27 @@
|
|||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
import Item from "components/services/item";
|
import Item from "components/services/item";
|
||||||
|
|
||||||
export default function List({ services }) {
|
const columnMap = [
|
||||||
|
"grid-cols-1 md:grid-cols-1 lg:grid-cols-1",
|
||||||
|
"grid-cols-1 md:grid-cols-1 lg:grid-cols-1",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-2",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-5",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-6",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-7",
|
||||||
|
"grid-cols-1 md:grid-cols-2 lg:grid-cols-8",
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function List({ services, layout }) {
|
||||||
return (
|
return (
|
||||||
<ul className="mt-3 flex flex-col">
|
<ul
|
||||||
|
className={classNames(
|
||||||
|
layout?.style === "row" ? `grid ${columnMap[layout?.columns]} gap-x-2` : "flex flex-col",
|
||||||
|
"mt-3"
|
||||||
|
)}
|
||||||
|
>
|
||||||
{services.map((service) => (
|
{services.map((service) => (
|
||||||
<Item key={service.name} service={service} />
|
<Item key={service.name} service={service} />
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -1,56 +1,19 @@
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
import Sonarr from "./widgets/service/sonarr";
|
import ErrorBoundary from "components/errorboundry";
|
||||||
import Radarr from "./widgets/service/radarr";
|
import components from "widgets/components";
|
||||||
import Readarr from "./widgets/service/readarr";
|
|
||||||
import Ombi from "./widgets/service/ombi";
|
|
||||||
import Portainer from "./widgets/service/portainer";
|
|
||||||
import Emby from "./widgets/service/emby";
|
|
||||||
import Nzbget from "./widgets/service/nzbget";
|
|
||||||
import SABnzbd from "./widgets/service/sabnzbd";
|
|
||||||
import Docker from "./widgets/service/docker";
|
|
||||||
import Pihole from "./widgets/service/pihole";
|
|
||||||
import Rutorrent from "./widgets/service/rutorrent";
|
|
||||||
import Jellyfin from "./widgets/service/jellyfin";
|
|
||||||
import Speedtest from "./widgets/service/speedtest";
|
|
||||||
import Traefik from "./widgets/service/traefik";
|
|
||||||
import Jellyseerr from "./widgets/service/jellyseerr";
|
|
||||||
import Overseerr from "./widgets/service/overseerr";
|
|
||||||
import Npm from "./widgets/service/npm";
|
|
||||||
import Tautulli from "./widgets/service/tautulli";
|
|
||||||
import CoinMarketCap from "./widgets/service/coinmarketcap";
|
|
||||||
import Gotify from "./widgets/service/gotify";
|
|
||||||
|
|
||||||
const widgetMappings = {
|
|
||||||
docker: Docker,
|
|
||||||
sonarr: Sonarr,
|
|
||||||
radarr: Radarr,
|
|
||||||
readarr: Readarr,
|
|
||||||
ombi: Ombi,
|
|
||||||
portainer: Portainer,
|
|
||||||
emby: Emby,
|
|
||||||
jellyfin: Jellyfin,
|
|
||||||
nzbget: Nzbget,
|
|
||||||
pihole: Pihole,
|
|
||||||
rutorrent: Rutorrent,
|
|
||||||
speedtest: Speedtest,
|
|
||||||
traefik: Traefik,
|
|
||||||
jellyseerr: Jellyseerr,
|
|
||||||
overseerr: Overseerr,
|
|
||||||
coinmarketcap: CoinMarketCap,
|
|
||||||
npm: Npm,
|
|
||||||
tautulli: Tautulli,
|
|
||||||
gotify: Gotify,
|
|
||||||
sabnzbd: SABnzbd
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Widget({ service }) {
|
export default function Widget({ service }) {
|
||||||
const { t } = useTranslation("common");
|
const { t } = useTranslation("common");
|
||||||
|
|
||||||
const ServiceWidget = widgetMappings[service.widget.type];
|
const ServiceWidget = components[service.widget.type];
|
||||||
|
|
||||||
if (ServiceWidget) {
|
if (ServiceWidget) {
|
||||||
return <ServiceWidget service={service} />;
|
return (
|
||||||
|
<ErrorBoundary>
|
||||||
|
<ServiceWidget service={service} />
|
||||||
|
</ErrorBoundary>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
18
src/components/services/widget/block.jsx
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
export default function Block({ value, label }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
"bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1",
|
||||||
|
value === undefined ? "animate-pulse" : ""
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
||||||
|
<div className="font-bold text-xs uppercase">{t(label)}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
18
src/components/services/widget/container.jsx
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
export default function Container({ error = false, children, service }) {
|
||||||
|
if (error) {
|
||||||
|
return (
|
||||||
|
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
|
||||||
|
<div className="font-thin text-sm">{error}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let visibleChildren = children;
|
||||||
|
const fields = service?.widget?.fields;
|
||||||
|
const type = service?.widget?.type;
|
||||||
|
if (fields && type) {
|
||||||
|
visibleChildren = children.filter(child => fields.some(field => `${type}.${field}` === child.props?.label));
|
||||||
|
}
|
||||||
|
|
||||||
|
return <div className="relative flex flex-row w-full">{visibleChildren}</div>;
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
export default function Block({ value, label }) {
|
|
||||||
return (
|
|
||||||
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
|
|
||||||
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
|
||||||
<div className="font-bold text-xs uppercase">{label}</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import getSymbolFromCurrency from "currency-symbol-map";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function CoinMarketCap({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
const currencyCode = config.currency ?? "USD";
|
|
||||||
const { symbols } = config;
|
|
||||||
|
|
||||||
const { data: statsData, error: statsError } = useSWR(
|
|
||||||
formatApiUrl(config, `v1/cryptocurrency/quotes/latest?symbol=${symbols.join(",")}&convert=${currencyCode}`)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!symbols || symbols.length === 0) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block value={t("coinmarketcap.configure")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (statsError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statsData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block value={t("coinmarketcap.configure")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const { data } = statsData;
|
|
||||||
const currencySymbol = getSymbolFromCurrency(currencyCode);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<div className="flex flex-col w-full">
|
|
||||||
{symbols.map((key) => (
|
|
||||||
<div
|
|
||||||
key={data[key].symbol}
|
|
||||||
className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-row items-center justify-between p-1 text-xs"
|
|
||||||
>
|
|
||||||
<div className="font-thin pl-2">{data[key].name}</div>
|
|
||||||
<div className="flex flex-row text-right">
|
|
||||||
<div className="font-bold mr-2">
|
|
||||||
{currencySymbol}
|
|
||||||
{data[key].quote[currencyCode].price.toFixed(2)}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className={`font-bold w-10 mr-2 ${
|
|
||||||
data[key].quote[currencyCode].percent_change_1h > 0 ? "text-emerald-300" : "text-rose-300"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{data[key].quote[currencyCode].percent_change_1h.toFixed(2)}%
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import calculateCPUPercent from "utils/stats-helpers";
|
|
||||||
|
|
||||||
export default function Docker({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: statusData, error: statusError } = useSWR(
|
|
||||||
`/api/docker/status/${config.container}/${config.server || ""}`,
|
|
||||||
{
|
|
||||||
refreshInterval: 5000,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const { data: statsData, error: statsError } = useSWR(
|
|
||||||
`/api/docker/stats/${config.container}/${config.server || ""}`,
|
|
||||||
{
|
|
||||||
refreshInterval: 5000,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (statsError || statusError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (statusData && statusData.status !== "running") {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("widget.status")} value={t("docker.offline")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statsData || !statusData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("docker.cpu")} />
|
|
||||||
<Block label={t("docker.mem")} />
|
|
||||||
<Block label={t("docker.rx")} />
|
|
||||||
<Block label={t("docker.tx")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("docker.cpu")} value={t("common.percent", { value: calculateCPUPercent(statsData.stats) })} />
|
|
||||||
<Block label={t("docker.mem")} value={t("common.bytes", { value: statsData.stats.memory_stats.usage })} />
|
|
||||||
{statsData.stats.networks && (
|
|
||||||
<>
|
|
||||||
<Block label={t("docker.rx")} value={t("common.bytes", { value: statsData.stats.networks.eth0.rx_bytes })} />
|
|
||||||
<Block label={t("docker.tx")} value={t("common.bytes", { value: statsData.stats.networks.eth0.tx_bytes })} />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Gotify({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: appsData, error: appsError } = useSWR(formatApiUrl(config, `application`));
|
|
||||||
const { data: messagesData, error: messagesError } = useSWR(formatApiUrl(config, `message`));
|
|
||||||
const { data: clientsData, error: clientsError } = useSWR(formatApiUrl(config, `client`));
|
|
||||||
|
|
||||||
if (appsError || messagesError || clientsError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("gotify.apps")} value={appsData?.length} />
|
|
||||||
<Block label={t("gotify.clients")} value={clientsData?.length} />
|
|
||||||
<Block label={t("gotify.messages")} value={messagesData?.messages?.length} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
import Emby from "./emby";
|
|
||||||
|
|
||||||
export default function Jellyfin({ service }) {
|
|
||||||
return <Emby service={service} />;
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Jellyseerr({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: statsData, error: statsError } = useSWR(formatApiUrl(config, `request/count`));
|
|
||||||
|
|
||||||
if (statsError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statsData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("jellyseerr.pending")} />
|
|
||||||
<Block label={t("jellyseerr.approved")} />
|
|
||||||
<Block label={t("jellyseerr.available")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("jellyseerr.pending")} value={statsData.pending} />
|
|
||||||
<Block label={t("jellyseerr.approved")} value={statsData.approved} />
|
|
||||||
<Block label={t("jellyseerr.available")} value={statsData.available} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Npm({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: infoData, error: infoError } = useSWR(formatApiUrl(config, "nginx/proxy-hosts"));
|
|
||||||
|
|
||||||
if (infoError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!infoData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("npm.enabled")} />
|
|
||||||
<Block label={t("npm.disabled")} />
|
|
||||||
<Block label={t("npm.total")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const enabled = infoData.filter((c) => c.enabled === 1).length;
|
|
||||||
const disabled = infoData.filter((c) => c.enabled === 0).length;
|
|
||||||
const total = infoData.length;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("npm.enabled")} value={enabled} />
|
|
||||||
<Block label={t("npm.disabled")} value={disabled} />
|
|
||||||
<Block label={t("npm.total")} value={total} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Nzbget({ service }) {
|
|
||||||
const { t } = useTranslation("common");
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: statusData, error: statusError } = useSWR(formatApiUrl(config, "status"));
|
|
||||||
|
|
||||||
if (statusError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statusData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("nzbget.rate")} />
|
|
||||||
<Block label={t("nzbget.remaining")} />
|
|
||||||
<Block label={t("nzbget.downloaded")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("nzbget.rate")} value={t("common.bitrate", { value: statusData.DownloadRate })} />
|
|
||||||
<Block
|
|
||||||
label={t("nzbget.remaining")}
|
|
||||||
value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })}
|
|
||||||
/>
|
|
||||||
<Block
|
|
||||||
label={t("nzbget.downloaded")}
|
|
||||||
value={t("common.bytes", { value: statusData.DownloadedSizeMB * 1024 * 1024 })}
|
|
||||||
/>
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Ombi({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: statsData, error: statsError } = useSWR(formatApiUrl(config, `Request/count`));
|
|
||||||
|
|
||||||
if (statsError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statsData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("ombi.pending")} />
|
|
||||||
<Block label={t("ombi.approved")} />
|
|
||||||
<Block label={t("ombi.available")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("ombi.pending")} value={statsData.pending} />
|
|
||||||
<Block label={t("ombi.approved")} value={statsData.approved} />
|
|
||||||
<Block label={t("ombi.available")} value={statsData.available} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Overseerr({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: statsData, error: statsError } = useSWR(formatApiUrl(config, `request/count`));
|
|
||||||
|
|
||||||
if (statsError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statsData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("overseerr.pending")} />
|
|
||||||
<Block label={t("overseerr.approved")} />
|
|
||||||
<Block label={t("overseerr.available")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("overseerr.pending")} value={statsData.pending} />
|
|
||||||
<Block label={t("overseerr.approved")} value={statsData.approved} />
|
|
||||||
<Block label={t("overseerr.available")} value={statsData.available} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Pihole({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: piholeData, error: piholeError } = useSWR(formatApiUrl(config, "api.php"));
|
|
||||||
|
|
||||||
if (piholeError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!piholeData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("pihole.queries")} />
|
|
||||||
<Block label={t("pihole.blocked")} />
|
|
||||||
<Block label={t("pihole.gravity")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("pihole.queries")} value={t("common.number", { value: piholeData.dns_queries_today })} />
|
|
||||||
<Block label={t("pihole.blocked")} value={t("common.number", { value: piholeData.ads_blocked_today })} />
|
|
||||||
<Block label={t("pihole.gravity")} value={t("common.number", { value: piholeData.domains_being_blocked })} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Portainer({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: containersData, error: containersError } = useSWR(formatApiUrl(config, `docker/containers/json?all=1`));
|
|
||||||
|
|
||||||
if (containersError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!containersData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("portainer.running")} />
|
|
||||||
<Block label={t("portainer.stopped")} />
|
|
||||||
<Block label={t("portainer.total")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (containersData.error) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
const running = containersData.filter((c) => c.State === "running").length;
|
|
||||||
const stopped = containersData.filter((c) => c.State === "exited").length;
|
|
||||||
const total = containersData.length;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("portainer.running")} value={running} />
|
|
||||||
<Block label={t("portainer.stopped")} value={stopped} />
|
|
||||||
<Block label={t("portainer.total")} value={total} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Radarr({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: moviesData, error: moviesError } = useSWR(formatApiUrl(config, "movie"));
|
|
||||||
const { data: queuedData, error: queuedError } = useSWR(formatApiUrl(config, "queue/status"));
|
|
||||||
|
|
||||||
if (moviesError || queuedError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!moviesData || !queuedData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("radarr.wanted")} />
|
|
||||||
<Block label={t("radarr.queued")} />
|
|
||||||
<Block label={t("radarr.movies")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const wanted = moviesData.filter((movie) => movie.isAvailable === false);
|
|
||||||
const have = moviesData.filter((movie) => movie.isAvailable === true);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("radarr.wanted")} value={wanted.length} />
|
|
||||||
<Block label={t("radarr.queued")} value={queuedData.totalCount} />
|
|
||||||
<Block label={t("radarr.movies")} value={have.length} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Readarr({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: booksData, error: booksError } = useSWR(formatApiUrl(config, "book"));
|
|
||||||
const { data: wantedData, error: wantedError } = useSWR(formatApiUrl(config, "wanted/missing"));
|
|
||||||
const { data: queueData, error: queueError } = useSWR(formatApiUrl(config, "queue/status"));
|
|
||||||
|
|
||||||
if (booksError || wantedError || queueError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!booksData || !wantedData || !queueData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("readarr.wanted")} />
|
|
||||||
<Block label={t("readarr.queued")} />
|
|
||||||
<Block label={t("readarr.books")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const have = booksData.filter((book) => book.statistics.bookFileCount > 0);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("readarr.wanted")} value={wantedData.totalRecords} />
|
|
||||||
<Block label={t("readarr.queued")} value={queueData.totalCount} />
|
|
||||||
<Block label={t("readarr.books")} value={have.length} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Rutorrent({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: statusData, error: statusError } = useSWR(formatApiUrl(config));
|
|
||||||
|
|
||||||
if (statusError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!statusData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("rutorrent.active")} />
|
|
||||||
<Block label={t("rutorrent.upload")} />
|
|
||||||
<Block label={t("rutorrent.download")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const upload = statusData.reduce((acc, torrent) => acc + parseInt(torrent["d.get_up_rate"], 10), 0);
|
|
||||||
|
|
||||||
const download = statusData.reduce((acc, torrent) => acc + parseInt(torrent["d.get_down_rate"], 10), 0);
|
|
||||||
|
|
||||||
const active = statusData.filter((torrent) => torrent["d.get_state"] === "1");
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("rutorrent.active")} value={active.length} />
|
|
||||||
<Block label={t("rutorrent.upload")} value={t("common.bitrate", { value: upload })} />
|
|
||||||
<Block label={t("rutorrent.download")} value={t("common.bitrate", { value: download })} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function SABnzbd({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: queueData, error: queueError } = useSWR(formatApiUrl(config, "queue"));
|
|
||||||
|
|
||||||
if (queueError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!queueData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("sabnzbd.rate")} />
|
|
||||||
<Block label={t("sabnzbd.queue")} />
|
|
||||||
<Block label={t("sabnzbd.timeleft")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("sabnzbd.rate")} value={`${queueData.queue.speed}bps`} />
|
|
||||||
<Block label={t("sabnzbd.queue")} value={queueData.queue.noofslots} />
|
|
||||||
<Block label={t("sabnzbd.timeleft")} value={queueData.queue.timeleft} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Sonarr({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: wantedData, error: wantedError } = useSWR(formatApiUrl(config, "wanted/missing"));
|
|
||||||
const { data: queuedData, error: queuedError } = useSWR(formatApiUrl(config, "queue"));
|
|
||||||
const { data: seriesData, error: seriesError } = useSWR(formatApiUrl(config, "series"));
|
|
||||||
|
|
||||||
if (wantedError || queuedError || seriesError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wantedData || !queuedData || !seriesData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("sonarr.wanted")} />
|
|
||||||
<Block label={t("sonarr.queued")} />
|
|
||||||
<Block label={t("sonarr.series")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("sonarr.wanted")} value={wantedData.totalRecords} />
|
|
||||||
<Block label={t("sonarr.queued")} value={queuedData.totalRecords} />
|
|
||||||
<Block label={t("sonarr.series")} value={seriesData.length} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Speedtest({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: speedtestData, error: speedtestError } = useSWR(formatApiUrl(config, "speedtest/latest"));
|
|
||||||
|
|
||||||
if (speedtestError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!speedtestData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("speedtest.download")} />
|
|
||||||
<Block label={t("speedtest.upload")} />
|
|
||||||
<Block label={t("speedtest.ping")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block
|
|
||||||
label={t("speedtest.download")}
|
|
||||||
value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
|
|
||||||
/>
|
|
||||||
<Block
|
|
||||||
label={t("speedtest.upload")}
|
|
||||||
value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })}
|
|
||||||
/>
|
|
||||||
<Block
|
|
||||||
label={t("speedtest.ping")}
|
|
||||||
value={t("common.ms", { value: speedtestData.data.ping, style: "unit", unit: "millisecond" })}
|
|
||||||
/>
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
import useSWR from "swr";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
import Widget from "../widget";
|
|
||||||
import Block from "../block";
|
|
||||||
|
|
||||||
import { formatApiUrl } from "utils/api-helpers";
|
|
||||||
|
|
||||||
export default function Traefik({ service }) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const config = service.widget;
|
|
||||||
|
|
||||||
const { data: traefikData, error: traefikError } = useSWR(formatApiUrl(config, "overview"));
|
|
||||||
|
|
||||||
if (traefikError) {
|
|
||||||
return <Widget error={t("widget.api_error")} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!traefikData) {
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("traefik.routers")} />
|
|
||||||
<Block label={t("traefik.services")} />
|
|
||||||
<Block label={t("traefik.middleware")} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Widget>
|
|
||||||
<Block label={t("traefik.routers")} value={traefikData.http.routers.total} />
|
|
||||||
<Block label={t("traefik.services")} value={traefikData.http.services.total} />
|
|
||||||
<Block label={t("traefik.middleware")} value={traefikData.http.middlewares.total} />
|
|
||||||
</Widget>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
export default function Widget({ error = false, children }) {
|
|
||||||
if (error) {
|
|
||||||
return (
|
|
||||||
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
|
|
||||||
<div className="font-thin text-sm">{error}</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return <div className="flex flex-row w-full">{children}</div>;
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,7 @@ import { IoColorPalette } from "react-icons/io5";
|
|||||||
import { Popover, Transition } from "@headlessui/react";
|
import { Popover, Transition } from "@headlessui/react";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
|
|
||||||
import { ColorContext } from "utils/color-context";
|
import { ColorContext } from "utils/contexts/color";
|
||||||
|
|
||||||
const colors = [
|
const colors = [
|
||||||
"slate",
|
"slate",
|
||||||
@@ -45,6 +45,7 @@ export default function ColorToggle() {
|
|||||||
className="h-5 w-5 text-theme-800 dark:text-theme-200 transition duration-150 ease-in-out"
|
className="h-5 w-5 text-theme-800 dark:text-theme-200 transition duration-150 ease-in-out"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
|
<span className="sr-only">Change color</span>
|
||||||
</Popover.Button>
|
</Popover.Button>
|
||||||
<Transition
|
<Transition
|
||||||
as={Fragment}
|
as={Fragment}
|
||||||
@@ -61,11 +62,13 @@ export default function ColorToggle() {
|
|||||||
{colors.map((color) => (
|
{colors.map((color) => (
|
||||||
<button type="button" onClick={() => setColor(color)} key={color}>
|
<button type="button" onClick={() => setColor(color)} key={color}>
|
||||||
<div
|
<div
|
||||||
|
title={color}
|
||||||
className={classNames(
|
className={classNames(
|
||||||
active === color ? "border-2" : "border-0",
|
active === color ? "border-2" : "border-0",
|
||||||
`rounded-md w-5 h-5 border-black/50 dark:border-white/50 theme-${color} bg-theme-400`
|
`rounded-md w-5 h-5 border-black/50 dark:border-white/50 theme-${color} bg-theme-400`
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
<span className="sr-only">{color}</span>
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useContext } from "react";
|
import { useContext } from "react";
|
||||||
import { MdDarkMode, MdLightMode, MdToggleOff, MdToggleOn } from "react-icons/md";
|
import { MdDarkMode, MdLightMode, MdToggleOff, MdToggleOn } from "react-icons/md";
|
||||||
|
|
||||||
import { ThemeContext } from "utils/theme-context";
|
import { ThemeContext } from "utils/contexts/theme";
|
||||||
|
|
||||||
export default function ThemeToggle() {
|
export default function ThemeToggle() {
|
||||||
const { theme, setTheme } = useContext(ThemeContext);
|
const { theme, setTheme } = useContext(ThemeContext);
|
||||||
51
src/components/version.jsx
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
import useSWR from "swr";
|
||||||
|
import { compareVersions } from "compare-versions";
|
||||||
|
import { MdNewReleases } from "react-icons/md";
|
||||||
|
|
||||||
|
import cachedFetch from "utils/proxy/cached-fetch";
|
||||||
|
|
||||||
|
export default function Version() {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
|
const buildTime = process.env.NEXT_PUBLIC_BUILDTIME ?? new Date().toISOString();
|
||||||
|
const revision = process.env.NEXT_PUBLIC_REVISION ?? "dev";
|
||||||
|
const version = process.env.NEXT_PUBLIC_VERSION ?? "dev";
|
||||||
|
|
||||||
|
const cachedFetcher = (resource) => cachedFetch(resource, 5).then((res) => res.json());
|
||||||
|
|
||||||
|
const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases", cachedFetcher);
|
||||||
|
|
||||||
|
// use Intl.DateTimeFormat to format the date
|
||||||
|
const formatDate = (date) => {
|
||||||
|
const options = {
|
||||||
|
year: "numeric",
|
||||||
|
month: "short",
|
||||||
|
day: "numeric",
|
||||||
|
};
|
||||||
|
return new Intl.DateTimeFormat(i18n.language, options).format(new Date(date));
|
||||||
|
};
|
||||||
|
|
||||||
|
const latestRelease = releaseData?.[0];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-row items-center">
|
||||||
|
<span className="text-xs text-theme-500 dark:text-theme-400">
|
||||||
|
{version} ({revision.substring(0, 7)}, {formatDate(buildTime)})
|
||||||
|
</span>
|
||||||
|
{version === "main" || version === "dev" || version === "nightly"
|
||||||
|
? null
|
||||||
|
: releaseData &&
|
||||||
|
compareVersions(latestRelease.tag_name, version) > 0 && (
|
||||||
|
<a
|
||||||
|
href={latestRelease.html_url}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center"
|
||||||
|
>
|
||||||
|
<MdNewReleases className="mr-1" /> {t("Update Available")}
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import WeatherApi from "components/widgets/weather/weather";
|
|
||||||
import OpenWeatherMap from "components/widgets/openweathermap/weather";
|
|
||||||
import Resources from "components/widgets/resources/resources";
|
|
||||||
import Search from "components/widgets/search/search";
|
|
||||||
|
|
||||||
const widgetMappings = {
|
|
||||||
weather: WeatherApi, // This key will be deprecated in the future
|
|
||||||
weatherapi: WeatherApi,
|
|
||||||
openweathermap: OpenWeatherMap,
|
|
||||||
resources: Resources,
|
|
||||||
search: Search,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Widget({ widget }) {
|
|
||||||
const ServiceWidget = widgetMappings[widget.type];
|
|
||||||
|
|
||||||
if (ServiceWidget) {
|
|
||||||
return <ServiceWidget options={widget.options} />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="flex-none flex flex-row items-center justify-center">
|
|
||||||
Missing <strong>{widget.type}</strong>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
36
src/components/widgets/datetime/datetime.jsx
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
|
||||||
|
const textSizes = {
|
||||||
|
"4xl": "text-4xl",
|
||||||
|
"3xl": "text-3xl",
|
||||||
|
"2xl": "text-2xl",
|
||||||
|
xl: "text-xl",
|
||||||
|
lg: "text-lg",
|
||||||
|
md: "text-md",
|
||||||
|
sm: "text-sm",
|
||||||
|
xs: "text-xs",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function DateTime({ options }) {
|
||||||
|
const { text_size: textSize, format } = options;
|
||||||
|
const { i18n } = useTranslation();
|
||||||
|
const [date, setDate] = useState(new Date());
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
setDate(new Date());
|
||||||
|
}, 1000);
|
||||||
|
return () => clearInterval(interval);
|
||||||
|
}, [setDate]);
|
||||||
|
|
||||||
|
const dateFormat = new Intl.DateTimeFormat(i18n.language, { ...format });
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-row items-center grow justify-end">
|
||||||
|
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[textSize || "lg"]}`}>
|
||||||
|
{dateFormat.format(date)}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
22
src/components/widgets/greeting/greeting.jsx
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
const textSizes = {
|
||||||
|
"4xl": "text-4xl",
|
||||||
|
"3xl": "text-3xl",
|
||||||
|
"2xl": "text-2xl",
|
||||||
|
xl: "text-xl",
|
||||||
|
lg: "text-lg",
|
||||||
|
md: "text-md",
|
||||||
|
sm: "text-sm",
|
||||||
|
xs: "text-xs",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Greeting({ options }) {
|
||||||
|
if (options.text) {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-row items-center justify-start">
|
||||||
|
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[options.text_size || "xl"]}`}>
|
||||||
|
{options.text}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
56
src/components/widgets/logo/logo.jsx
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
export default function Logo() {
|
||||||
|
return (
|
||||||
|
<div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 1024 1024"
|
||||||
|
style={{
|
||||||
|
enableBackground: "new 0 0 1024 1024",
|
||||||
|
}}
|
||||||
|
xmlSpace="preserve"
|
||||||
|
className="w-full h-full"
|
||||||
|
>
|
||||||
|
<style>
|
||||||
|
{
|
||||||
|
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<g id="Icon">
|
||||||
|
<path
|
||||||
|
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
|
||||||
|
style={{
|
||||||
|
fill: "rgba(var(--color-logo-start))",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<linearGradient
|
||||||
|
id="homepage_logo_gradient"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1={200.746}
|
||||||
|
y1={225.015}
|
||||||
|
x2={764.986}
|
||||||
|
y2={789.255}
|
||||||
|
>
|
||||||
|
<stop
|
||||||
|
offset={0}
|
||||||
|
style={{
|
||||||
|
stopColor: "rgba(var(--color-logo-start))",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<stop
|
||||||
|
offset={1}
|
||||||
|
style={{
|
||||||
|
stopColor: "rgba(var(--color-logo-stop))",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</linearGradient>
|
||||||
|
<path
|
||||||
|
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
|
||||||
|
style={{
|
||||||
|
fill: "url(#homepage_logo_gradient)",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import mapIcon from "utils/owm-condition-map";
|
import mapIcon from "utils/weather/owm-condition-map";
|
||||||
|
|
||||||
export default function Icon({ condition, timeOfDay }) {
|
export default function Icon({ condition, timeOfDay }) {
|
||||||
const IconComponent = mapIcon(condition, timeOfDay);
|
const IconComponent = mapIcon(condition, timeOfDay);
|
||||||
|
|||||||