Compare commits

..
469 Commits
Author SHA1 Message Date
shamoon c5ac34a6b5 Merge pull request #916 from benphelps/uptimekuma
Feature: Uptime kuma widget
2023-02-02 01:43:20 -08:00
shamoon 015d7dac52 Rework uptime kuma remove proxy display more info 2023-02-02 01:11:27 -08:00
chain710 c3d15a61c3 Implement uptime-kuma widget 2023-02-02 00:49:56 -08:00
shamoon f517d704b8 Merge pull request #904 from lholota/feat/custom-css
feat: Custom CSS
2023-02-01 21:15:58 -08:00
hymbz 167f3a4f84 Translated using Weblate (Chinese (Simplified))
Currently translated at 62.3% (194 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-02-02 05:27:59 +01:00
shamoon e411e2ac0d Merge pull request #912 from eanmclaughlin/patch-1
Fix: Show container status if health is an empty string
2023-02-01 15:40:00 -08:00
Ean McLaughlin ff27b1ef51 Show container status if health is an empty string
If data.health is an empty string, ?? will accept it and not use the right side value; instead, we should use || which treats empty string as false and returns the right side value. This will show "RUNNING" in the status box if health is "".
2023-02-01 15:32:10 -07:00
Mateus 41a2e5932f Translated using Weblate (Portuguese (Brazil))
Currently translated at 55.6% (173 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-02-01 18:01:16 +01:00
Dan fb1e11b6cb Translated using Weblate (Ukrainian)
Currently translated at 100.0% (311 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-02-01 04:02:57 +01:00
Nonoss117 dfc787b004 Translated using Weblate (French)
Currently translated at 100.0% (311 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-02-01 04:02:57 +01:00
gallegonovato 224d5da982 Translated using Weblate (Spanish)
Currently translated at 100.0% (311 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-02-01 04:02:57 +01:00
shamoon 713344132a Merge pull request #905 from benphelps/dependabot/github_actions/docker/build-push-action-4
Bump docker/build-push-action from 3 to 4
2023-01-31 09:30:22 -08:00
dependabot[bot] 49d2dabe53 Bump docker/build-push-action from 3 to 4
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3 to 4.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-31 16:09:16 +00:00
Lukas Holota 147a165bbc Allow Custom CSS 2023-01-31 07:25:36 -08:00
shamoon 046f2986a8 lint support custom search provider in quicklaunch 2023-01-31 00:58:29 -08:00
shamoon ad299e9c94 Merge pull request #899 from chain710/main
Support multi search providers
2023-01-31 00:41:04 -08:00
shamoon 7a5a3a6608 Compatible with quicklaunch internet search 2023-01-31 00:36:11 -08:00
shamoon 87dbbcb1e0 Refactor multi & single providers & retain provider key only 2023-01-31 00:34:29 -08:00
chain710 3bc0522812 Support multi search providers
- add `providers` option in search widget, value is array of provider name, like: `[google, bing]`
2023-01-31 00:34:29 -08:00
Anonymous adea9da881 Translated using Weblate (Latvian)
Currently translated at 38.2% (119 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-31 09:34:17 +01:00
Anonymous 1ccf0b3c7a Translated using Weblate (Japanese)
Currently translated at 4.8% (15 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-31 09:34:17 +01:00
Anonymous 3c44e49b76 Translated using Weblate (Ukrainian)
Currently translated at 96.7% (301 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-31 09:34:17 +01:00
Anonymous 711eedfc84 Translated using Weblate (Esperanto)
Currently translated at 33.1% (103 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-31 09:34:17 +01:00
Anonymous 348833e682 Translated using Weblate (Hindi)
Currently translated at 2.8% (9 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-31 09:34:17 +01:00
Anonymous fe128a976f Translated using Weblate (Malay)
Currently translated at 81.3% (253 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-31 09:34:16 +01:00
Anonymous 7ca1839287 Translated using Weblate (Danish)
Currently translated at 63.6% (198 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-31 09:34:16 +01:00
Anonymous 7ac98d010c Translated using Weblate (Czech)
Currently translated at 72.3% (225 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-31 09:34:16 +01:00
Anonymous 4af1f1bb7d Translated using Weblate (Arabic)
Currently translated at 84.2% (262 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-31 09:34:16 +01:00
Anonymous 69a86bc5dc Translated using Weblate (Serbian)
Currently translated at 2.8% (9 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-31 09:34:15 +01:00
Anonymous 98ca15c962 Translated using Weblate (Turkish)
Currently translated at 74.2% (231 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-31 09:34:15 +01:00
Anonymous 4837f26aa1 Translated using Weblate (Bulgarian)
Currently translated at 14.7% (46 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-31 09:34:15 +01:00
Anonymous 3c06637dd7 Translated using Weblate (Telugu)
Currently translated at 69.7% (217 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-31 09:34:15 +01:00
Anonymous 076c2fbb0d Translated using Weblate (Finnish)
Currently translated at 57.2% (178 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-31 09:34:15 +01:00
Anonymous 3034b78772 Translated using Weblate (Yue)
Currently translated at 37.9% (118 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-31 09:34:14 +01:00
Anonymous bddbe890f8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 37.6% (117 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-31 09:34:14 +01:00
Anonymous f7520f2fdf Translated using Weblate (Romanian)
Currently translated at 44.0% (137 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-31 09:34:14 +01:00
Anonymous 158dcf0098 Translated using Weblate (Hebrew)
Currently translated at 32.4% (101 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-31 09:34:14 +01:00
Anonymous 6e5efc6804 Translated using Weblate (Hungarian)
Currently translated at 34.7% (108 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-31 09:34:14 +01:00
Anonymous 329985927b Translated using Weblate (Croatian)
Currently translated at 91.9% (286 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-31 09:34:13 +01:00
Anonymous c648e106db Translated using Weblate (Swedish)
Currently translated at 42.4% (132 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-31 09:34:13 +01:00
Anonymous 2356745e15 Translated using Weblate (Polish)
Currently translated at 91.6% (285 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-31 09:34:13 +01:00
Anonymous c52bc57190 Translated using Weblate (Catalan)
Currently translated at 82.9% (258 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-31 09:34:13 +01:00
Anonymous 2e43b93eb6 Translated using Weblate (Chinese (Traditional))
Currently translated at 92.6% (288 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-31 09:34:13 +01:00
Anonymous 6d779355b3 Translated using Weblate (Dutch)
Currently translated at 28.2% (88 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-31 09:34:12 +01:00
Anonymous 10fb1be641 Translated using Weblate (Vietnamese)
Currently translated at 14.1% (44 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-31 09:34:12 +01:00
Anonymous 10a4cb8552 Translated using Weblate (Norwegian Bokmål)
Currently translated at 25.4% (79 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-31 09:34:12 +01:00
Anonymous 2951574caa Translated using Weblate (Italian)
Currently translated at 92.6% (288 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-31 09:34:12 +01:00
Anonymous 4e0a1fdcdd Translated using Weblate (Chinese (Simplified))
Currently translated at 62.3% (194 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-31 09:34:12 +01:00
Anonymous d38948bb6a Translated using Weblate (Russian)
Currently translated at 15.4% (48 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-31 09:34:12 +01:00
Anonymous 53743119b8 Translated using Weblate (Portuguese)
Currently translated at 82.3% (256 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-31 09:34:11 +01:00
Anonymous 38d1ecc7c0 Translated using Weblate (French)
Currently translated at 99.3% (309 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-31 09:34:11 +01:00
Anonymous b31e64d1dc Translated using Weblate (Spanish)
Currently translated at 98.0% (305 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-31 09:34:11 +01:00
Anonymous 8f5dcd5175 Translated using Weblate (German)
Currently translated at 73.3% (228 of 311 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-31 09:34:11 +01:00
shamoon 1f5912c232 Support custom search in quicklaunch web search 2023-01-31 00:33:30 -08:00
Anonymous 9b8e01971f Translated using Weblate (Latvian)
Currently translated at 38.3% (119 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-31 08:54:40 +01:00
Anonymous 7b12c9e24a Translated using Weblate (Japanese)
Currently translated at 4.8% (15 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-31 08:54:40 +01:00
Anonymous e079587d89 Translated using Weblate (Ukrainian)
Currently translated at 97.0% (301 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-31 08:54:40 +01:00
Anonymous 6a0a5ff1f7 Translated using Weblate (Esperanto)
Currently translated at 33.2% (103 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-31 08:54:40 +01:00
Anonymous e3e5c0274b Translated using Weblate (Hindi)
Currently translated at 2.9% (9 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-31 08:54:39 +01:00
Anonymous de70ce620e Translated using Weblate (Malay)
Currently translated at 81.6% (253 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-31 08:54:39 +01:00
Anonymous 56d9ec64fd Translated using Weblate (Danish)
Currently translated at 63.8% (198 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-31 08:54:39 +01:00
Anonymous bca597febe Translated using Weblate (Czech)
Currently translated at 72.5% (225 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-31 08:54:39 +01:00
Anonymous 579cac73e0 Translated using Weblate (Arabic)
Currently translated at 84.5% (262 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-31 08:54:39 +01:00
Anonymous c29b174dcf Translated using Weblate (Serbian)
Currently translated at 2.9% (9 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-31 08:54:38 +01:00
Anonymous c693a5e690 Translated using Weblate (Turkish)
Currently translated at 74.5% (231 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-31 08:54:38 +01:00
Anonymous e4724690b2 Translated using Weblate (Bulgarian)
Currently translated at 14.8% (46 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-31 08:54:38 +01:00
Anonymous eb679d615b Translated using Weblate (Telugu)
Currently translated at 70.0% (217 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-31 08:54:38 +01:00
Anonymous a9e70b815d Translated using Weblate (Finnish)
Currently translated at 57.4% (178 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-31 08:54:38 +01:00
Anonymous 96b00f9207 Translated using Weblate (Yue)
Currently translated at 38.0% (118 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-31 08:54:37 +01:00
Anonymous fb5ebb0ca0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 37.7% (117 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-31 08:54:37 +01:00
Anonymous 9550071dab Translated using Weblate (Romanian)
Currently translated at 44.1% (137 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-31 08:54:37 +01:00
Anonymous 4581833ed4 Translated using Weblate (Hebrew)
Currently translated at 32.5% (101 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-31 08:54:37 +01:00
Anonymous fe148d4cd0 Translated using Weblate (Hungarian)
Currently translated at 34.8% (108 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-31 08:54:37 +01:00
Anonymous 9076de919b Translated using Weblate (Croatian)
Currently translated at 92.2% (286 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-31 08:54:36 +01:00
Anonymous 5cf95eb383 Translated using Weblate (Swedish)
Currently translated at 42.5% (132 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-31 08:54:36 +01:00
Anonymous 1785206df0 Translated using Weblate (Polish)
Currently translated at 91.9% (285 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-31 08:54:36 +01:00
Anonymous 1805b43816 Translated using Weblate (Catalan)
Currently translated at 83.2% (258 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-31 08:54:36 +01:00
Anonymous f406af59bc Translated using Weblate (Chinese (Traditional))
Currently translated at 92.9% (288 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-31 08:54:36 +01:00
Anonymous 98b4280a02 Translated using Weblate (Dutch)
Currently translated at 28.3% (88 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-31 08:54:35 +01:00
Anonymous 9699481b9a Translated using Weblate (Vietnamese)
Currently translated at 14.1% (44 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-31 08:54:35 +01:00
Anonymous ab436152dd Translated using Weblate (Norwegian Bokmål)
Currently translated at 25.4% (79 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-31 08:54:35 +01:00
Anonymous cacbe6d17b Translated using Weblate (Italian)
Currently translated at 92.9% (288 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-31 08:54:35 +01:00
Anonymous 50b435b7e3 Translated using Weblate (Chinese (Simplified))
Currently translated at 62.5% (194 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-31 08:54:35 +01:00
Anonymous 4e47b19fb9 Translated using Weblate (Russian)
Currently translated at 15.4% (48 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-31 08:54:35 +01:00
Anonymous 66620c5d42 Translated using Weblate (Portuguese)
Currently translated at 82.5% (256 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-31 08:54:34 +01:00
Anonymous f1aa9444c1 Translated using Weblate (French)
Currently translated at 99.6% (309 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-31 08:54:34 +01:00
Anonymous 908ee43375 Translated using Weblate (Spanish)
Currently translated at 98.3% (305 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-31 08:54:34 +01:00
Anonymous c2e52f8821 Translated using Weblate (German)
Currently translated at 73.5% (228 of 310 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-31 08:54:34 +01:00
achao1m5 3194e5af85 Translated using Weblate (Chinese (Simplified))
Currently translated at 62.7% (194 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-31 08:54:09 +01:00
Nonoss117 2fae3243a7 Translated using Weblate (French)
Currently translated at 100.0% (309 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-31 08:54:09 +01:00
shamoon adce18d023 Merge pull request #897 from avdept/add_search_to_quicklaunch
Add internet search to quicklaunch
2023-01-30 23:54:04 -08:00
shamoon 11d03be4de Use configured search provider, allow disable internet search 2023-01-30 23:38:37 -08:00
Alex Sinelnikov 4e17628f97 Added search to quicklaunch 2023-01-30 10:16:45 +02:00
Anonymous cf072933a1 Translated using Weblate (Latvian)
Currently translated at 38.5% (119 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-29 18:53:29 +01:00
Anonymous f8a57b1a5f Translated using Weblate (Japanese)
Currently translated at 4.8% (15 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-29 18:53:28 +01:00
Anonymous 385e935533 Translated using Weblate (Ukrainian)
Currently translated at 97.4% (301 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-29 18:53:28 +01:00
Anonymous eaa7f1bf6d Translated using Weblate (Esperanto)
Currently translated at 33.3% (103 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-29 18:53:28 +01:00
Anonymous fb7ad30dfc Translated using Weblate (Hindi)
Currently translated at 2.9% (9 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-29 18:53:28 +01:00
Anonymous 95fcd821be Translated using Weblate (Malay)
Currently translated at 81.8% (253 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-29 18:53:27 +01:00
Anonymous a4e1083d02 Translated using Weblate (Danish)
Currently translated at 64.0% (198 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-29 18:53:27 +01:00
Anonymous 7e9ed86441 Translated using Weblate (Czech)
Currently translated at 72.8% (225 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-29 18:53:27 +01:00
Anonymous c76d750e18 Translated using Weblate (Arabic)
Currently translated at 84.7% (262 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-29 18:53:27 +01:00
Anonymous b75617e2f2 Translated using Weblate (Serbian)
Currently translated at 2.9% (9 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-29 18:53:27 +01:00
Anonymous cf7ba59f0f Translated using Weblate (Turkish)
Currently translated at 74.7% (231 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-29 18:53:26 +01:00
Anonymous 14377962f2 Translated using Weblate (Bulgarian)
Currently translated at 14.8% (46 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-29 18:53:26 +01:00
Anonymous aab38e1b5f Translated using Weblate (Telugu)
Currently translated at 70.2% (217 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-29 18:53:26 +01:00
Anonymous 1449c5a0a3 Translated using Weblate (Finnish)
Currently translated at 57.6% (178 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-29 18:53:26 +01:00
Anonymous 72481876f8 Translated using Weblate (Yue)
Currently translated at 38.1% (118 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-29 18:53:25 +01:00
Anonymous 7f207692ce Translated using Weblate (Portuguese (Brazil))
Currently translated at 37.8% (117 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-29 18:53:25 +01:00
Anonymous dab31b2feb Translated using Weblate (Romanian)
Currently translated at 44.3% (137 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-29 18:53:25 +01:00
Anonymous 13d2213ceb Translated using Weblate (Hebrew)
Currently translated at 32.6% (101 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-29 18:53:25 +01:00
Anonymous 2a77bb11c5 Translated using Weblate (Hungarian)
Currently translated at 34.9% (108 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-29 18:53:24 +01:00
Anonymous fcf9c6417b Translated using Weblate (Croatian)
Currently translated at 92.5% (286 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-29 18:53:24 +01:00
Anonymous e08ce475f5 Translated using Weblate (Swedish)
Currently translated at 42.7% (132 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-29 18:53:24 +01:00
Anonymous ba96ab8b50 Translated using Weblate (Polish)
Currently translated at 92.2% (285 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-29 18:53:23 +01:00
Anonymous 0743095093 Translated using Weblate (Catalan)
Currently translated at 83.4% (258 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-29 18:53:23 +01:00
Anonymous 0bb40d7ad1 Translated using Weblate (Chinese (Traditional))
Currently translated at 93.2% (288 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-29 18:53:23 +01:00
Anonymous 33467a5c63 Translated using Weblate (Dutch)
Currently translated at 28.4% (88 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-29 18:53:23 +01:00
Anonymous f88de790a9 Translated using Weblate (Vietnamese)
Currently translated at 14.2% (44 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-29 18:53:22 +01:00
Anonymous 85afbcb86c Translated using Weblate (Norwegian Bokmål)
Currently translated at 25.5% (79 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-29 18:53:22 +01:00
Anonymous c502f65d07 Translated using Weblate (Italian)
Currently translated at 93.2% (288 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-29 18:53:22 +01:00
Anonymous 6baf028d6d Translated using Weblate (Chinese (Simplified))
Currently translated at 54.3% (168 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-29 18:53:21 +01:00
Anonymous 8441838065 Translated using Weblate (Russian)
Currently translated at 15.5% (48 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-29 18:53:21 +01:00
Anonymous 901be4ff60 Translated using Weblate (Portuguese)
Currently translated at 82.8% (256 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-29 18:53:21 +01:00
Anonymous c9e8b13c37 Translated using Weblate (French)
Currently translated at 98.7% (305 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-29 18:53:21 +01:00
Anonymous ac1a3e95ca Translated using Weblate (Spanish)
Currently translated at 98.7% (305 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-29 18:53:20 +01:00
Anonymous 9978bf6fdc Translated using Weblate (German)
Currently translated at 73.7% (228 of 309 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-29 18:53:20 +01:00
Nonoss117 7f5996cb58 Translated using Weblate (French)
Currently translated at 100.0% (305 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-29 18:52:52 +01:00
gallegonovato 8468ffb243 Translated using Weblate (Spanish)
Currently translated at 100.0% (305 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-29 18:52:52 +01:00
shamoon a7927b4873 Merge pull request #895 from benphelps/fix-864
Don't show QEMU templates in VMs field for Proxmox widget
2023-01-29 09:52:46 -08:00
Jason Fischer c9439eafa2 Don't show QEMU templates in VMs field for Proxmox widget
fixes #864
2023-01-29 09:44:15 -08:00
shamoon 5af01d2436 Merge pull request #887 from Zlendy/immich
Add Immich Widget
2023-01-28 21:50:55 -08:00
shamoon 19cf9969b9 Fix immich widget error catching & awaiting data 2023-01-28 21:49:31 -08:00
Zlendy dbcd6f5df7 Fix: Immich API no longer has an "error" property 2023-01-28 21:49:31 -08:00
Zlendy 6b5e8ab0c7 Add Immich Widget 2023-01-28 21:49:31 -08:00
shamoon e5d65f410c Merge pull request #893 from benphelps/fix-892
Fix nzbget download rate units
2023-01-28 21:18:37 -08:00
shamoon f2b3a12569 Fix nzbget download rate units 2023-01-28 21:17:39 -08:00
Anonymous 3df03ecaab Translated using Weblate (Latvian)
Currently translated at 39.0% (119 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-29 01:46:40 +01:00
Anonymous 0fdab8cffc Translated using Weblate (Japanese)
Currently translated at 4.9% (15 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-29 01:46:39 +01:00
Anonymous 7d23b0199c Translated using Weblate (Ukrainian)
Currently translated at 98.6% (301 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-29 01:46:39 +01:00
Anonymous 0ae6d7e182 Translated using Weblate (Esperanto)
Currently translated at 33.7% (103 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-29 01:46:39 +01:00
Anonymous 2b8af9546f Translated using Weblate (Hindi)
Currently translated at 2.9% (9 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-29 01:46:39 +01:00
Anonymous 8713ef4d6a Translated using Weblate (Malay)
Currently translated at 82.9% (253 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-29 01:46:38 +01:00
Anonymous 0d5c878c29 Translated using Weblate (Danish)
Currently translated at 64.9% (198 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-29 01:46:38 +01:00
Anonymous bb823140e1 Translated using Weblate (Czech)
Currently translated at 73.7% (225 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-29 01:46:38 +01:00
Anonymous 749e78864e Translated using Weblate (Arabic)
Currently translated at 85.2% (260 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-29 01:46:37 +01:00
Anonymous 6199c2e3b0 Translated using Weblate (Serbian)
Currently translated at 2.9% (9 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-29 01:46:37 +01:00
Anonymous 935681bd70 Translated using Weblate (Turkish)
Currently translated at 75.7% (231 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-29 01:46:37 +01:00
Anonymous dc7f563fff Translated using Weblate (Bulgarian)
Currently translated at 15.0% (46 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-29 01:46:36 +01:00
Anonymous 8c3b8e2cbc Translated using Weblate (Telugu)
Currently translated at 71.1% (217 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-29 01:46:36 +01:00
Anonymous 60df0ab4ff Translated using Weblate (Finnish)
Currently translated at 58.3% (178 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-29 01:46:36 +01:00
Anonymous 436650d8ef Translated using Weblate (Yue)
Currently translated at 38.6% (118 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-29 01:46:35 +01:00
Anonymous 6e6fcb33ce Translated using Weblate (Portuguese (Brazil))
Currently translated at 38.3% (117 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-29 01:46:35 +01:00
Anonymous ba25e74add Translated using Weblate (Romanian)
Currently translated at 44.9% (137 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-29 01:46:35 +01:00
Anonymous 59c524726a Translated using Weblate (Hebrew)
Currently translated at 33.1% (101 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-29 01:46:34 +01:00
Anonymous 7e3620f86f Translated using Weblate (Hungarian)
Currently translated at 35.4% (108 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-29 01:46:34 +01:00
Anonymous b11fa21d4a Translated using Weblate (Croatian)
Currently translated at 93.7% (286 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-29 01:46:33 +01:00
Anonymous 3fdae79c88 Translated using Weblate (Swedish)
Currently translated at 43.2% (132 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-29 01:46:33 +01:00
Anonymous 933619aa8e Translated using Weblate (Polish)
Currently translated at 93.4% (285 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-29 01:46:33 +01:00
Anonymous 63616e0a79 Translated using Weblate (Catalan)
Currently translated at 84.5% (258 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-29 01:46:33 +01:00
Anonymous c933e40e92 Translated using Weblate (Chinese (Traditional))
Currently translated at 94.4% (288 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-29 01:46:32 +01:00
Anonymous 347e28ea3f Translated using Weblate (Dutch)
Currently translated at 28.8% (88 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-29 01:46:32 +01:00
Anonymous f6fdbd0426 Translated using Weblate (Vietnamese)
Currently translated at 14.4% (44 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-29 01:46:31 +01:00
Anonymous 5d82f5f7d8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 25.9% (79 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-29 01:46:31 +01:00
Anonymous 4c9f1041ef Translated using Weblate (Italian)
Currently translated at 94.4% (288 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-29 01:46:31 +01:00
Anonymous 6d133b3889 Translated using Weblate (Chinese (Simplified))
Currently translated at 55.0% (168 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-29 01:46:31 +01:00
Anonymous d94f1ce3e7 Translated using Weblate (Russian)
Currently translated at 15.7% (48 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-29 01:46:30 +01:00
Anonymous 1e8b257dbe Translated using Weblate (Portuguese)
Currently translated at 83.9% (256 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-29 01:46:30 +01:00
Anonymous 0190c18a6b Translated using Weblate (French)
Currently translated at 98.6% (301 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-29 01:46:29 +01:00
Anonymous 56331b3efd Translated using Weblate (Spanish)
Currently translated at 98.6% (301 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-29 01:46:29 +01:00
Anonymous c3561e8fce Translated using Weblate (German)
Currently translated at 74.7% (228 of 305 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-29 01:46:29 +01:00
azzam 910582fbc0 Translated using Weblate (Arabic)
Currently translated at 86.3% (260 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-29 01:45:53 +01:00
2a42d89d08 Add Proxmox Backup Server Widget (#879)
* Add Proxmox Backup Server Widget

* Clarification added to Failed Tasks

* Refactor pbs to proxmoxbackupserver

* Removing property instead of recreating object

* minor code styling of proxmoxbackupserver widget

---------

Co-authored-by: Eizock <>
Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
2023-01-28 16:32:47 -08:00
Jason Fischer b0f16f6612 Merge pull request #889 from benphelps/fix-864
Don't include LXC templates in LXC count
2023-01-28 13:09:48 -08:00
Jason Fischer 0d5f8f6e7c Don't include LXC templates in LXC count
fixes #864
2023-01-28 12:59:20 -08:00
Kai Huuhko e368717c70 Translated using Weblate (Finnish)
Currently translated at 59.1% (178 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-27 13:45:04 +01:00
Dan 1e5a6f8eff Translated using Weblate (Ukrainian)
Currently translated at 100.0% (301 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-26 11:54:36 +01:00
Chun Chi Hsieh 945d13ee3c Translated using Weblate (Chinese (Traditional))
Currently translated at 95.6% (288 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-26 11:54:36 +01:00
Nonoss117 cc09e44890 Translated using Weblate (French)
Currently translated at 100.0% (301 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-26 11:54:36 +01:00
gallegonovato 29b6fefdff Translated using Weblate (Spanish)
Currently translated at 100.0% (301 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-26 11:54:36 +01:00
Jason Fischer e96036e076 Merge pull request #873 from jameswynn/sort-services-by-weight
Services are now sorted by a new 'weight' field
2023-01-24 17:52:08 -08:00
James Wynn 8d016629d3 Services are now sorted by the 'weight' field.
* Default for discovered services is 0
* Default weight for configured services is their index within their
  group scaled by 100, i.e. (index + 1) * 100
* Should be backwards compatible with current loose ordering
2023-01-24 12:48:49 -06:00
shamoon 555f9f7b14 Merge pull request #871 from jameswynn/fix-discovered-widget-fields-parsing
Discovered services need widget field list parsed
2023-01-24 08:36:20 -08:00
James Wynn 02e9df8f28 Parse widget field list if is a string 2023-01-24 09:31:20 -06:00
Anonymous 5ecb9466ae Translated using Weblate (Latvian)
Currently translated at 39.5% (119 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-24 04:55:03 +01:00
Anonymous 9c9c0e2b64 Translated using Weblate (Japanese)
Currently translated at 4.9% (15 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-24 04:55:02 +01:00
Anonymous 2d87c7c1d2 Translated using Weblate (Ukrainian)
Currently translated at 98.0% (295 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-24 04:55:02 +01:00
Anonymous cdbf02edae Translated using Weblate (Esperanto)
Currently translated at 34.2% (103 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-24 04:55:02 +01:00
Anonymous b630b14504 Translated using Weblate (Hindi)
Currently translated at 2.9% (9 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-24 04:55:02 +01:00
Anonymous e0bf277741 Translated using Weblate (Malay)
Currently translated at 84.0% (253 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-24 04:55:02 +01:00
Anonymous 351993234e Translated using Weblate (Danish)
Currently translated at 65.7% (198 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-24 04:55:01 +01:00
Anonymous 192a4f4d14 Translated using Weblate (Czech)
Currently translated at 74.7% (225 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-24 04:55:01 +01:00
Anonymous bfb882d03d Translated using Weblate (Arabic)
Currently translated at 14.6% (44 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-24 04:55:01 +01:00
Anonymous 9ee86f1c5a Translated using Weblate (Serbian)
Currently translated at 2.9% (9 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-24 04:55:01 +01:00
Anonymous 6d3c71a72e Translated using Weblate (Turkish)
Currently translated at 76.7% (231 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-24 04:55:01 +01:00
Anonymous ad273ce5ad Translated using Weblate (Bulgarian)
Currently translated at 15.2% (46 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-24 04:55:00 +01:00
Anonymous 799c9ecb17 Translated using Weblate (Telugu)
Currently translated at 72.0% (217 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-24 04:55:00 +01:00
Anonymous a5c8f08f4b Translated using Weblate (Finnish)
Currently translated at 57.8% (174 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-24 04:55:00 +01:00
Anonymous 9f2476f419 Translated using Weblate (Yue)
Currently translated at 39.2% (118 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-24 04:55:00 +01:00
Anonymous 942a61aa4b Translated using Weblate (Portuguese (Brazil))
Currently translated at 38.8% (117 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-24 04:54:59 +01:00
Anonymous 099f3726e8 Translated using Weblate (Romanian)
Currently translated at 45.5% (137 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-24 04:54:59 +01:00
Anonymous 14310bf2ed Translated using Weblate (Hebrew)
Currently translated at 33.5% (101 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-24 04:54:59 +01:00
Anonymous 176811da9b Translated using Weblate (Hungarian)
Currently translated at 35.8% (108 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-24 04:54:59 +01:00
Anonymous f8d35e7f5d Translated using Weblate (Croatian)
Currently translated at 95.0% (286 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-24 04:54:59 +01:00
Anonymous ce94636a54 Translated using Weblate (Swedish)
Currently translated at 43.8% (132 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-24 04:54:58 +01:00
Anonymous 7e659b2dbc Translated using Weblate (Polish)
Currently translated at 94.6% (285 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-24 04:54:58 +01:00
Anonymous cb92e82fd0 Translated using Weblate (Catalan)
Currently translated at 85.7% (258 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-24 04:54:58 +01:00
Anonymous d7d5f46820 Translated using Weblate (Chinese (Traditional))
Currently translated at 95.6% (288 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-24 04:54:58 +01:00
Anonymous 23b8f25f07 Translated using Weblate (Dutch)
Currently translated at 29.2% (88 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-24 04:54:57 +01:00
Anonymous dc55da38c6 Translated using Weblate (Vietnamese)
Currently translated at 14.6% (44 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-24 04:54:57 +01:00
Anonymous aa35eb5c5e Translated using Weblate (Norwegian Bokmål)
Currently translated at 26.2% (79 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-24 04:54:57 +01:00
Anonymous 8c800eb032 Translated using Weblate (Italian)
Currently translated at 95.6% (288 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-24 04:54:57 +01:00
Anonymous cdfb7e7d73 Translated using Weblate (Chinese (Simplified))
Currently translated at 55.8% (168 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-24 04:54:56 +01:00
Anonymous 48298cc4e8 Translated using Weblate (Russian)
Currently translated at 15.9% (48 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-24 04:54:56 +01:00
Anonymous ce786fb765 Translated using Weblate (Portuguese)
Currently translated at 85.0% (256 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-24 04:54:56 +01:00
Anonymous 50939069af Translated using Weblate (French)
Currently translated at 99.3% (299 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-24 04:54:56 +01:00
Anonymous ec8a73751c Translated using Weblate (Spanish)
Currently translated at 99.3% (299 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-24 04:54:55 +01:00
Anonymous a994d5379e Translated using Weblate (German)
Currently translated at 75.7% (228 of 301 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-24 04:54:55 +01:00
shamoon f9e27a6bb5 Merge pull request #868 from KillahB33/main
Cloudflared Widget
2023-01-23 19:54:34 -08:00
Pacux 6d61cb5aaa Translated using Weblate (Catalan)
Currently translated at 86.2% (258 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-23 23:52:33 +01:00
Michael Shamoon 89c6528f24 cloudflare widget validation, handle multiple connections, fix translation file error, capitalize status 2023-01-23 10:31:08 -08:00
KillahBee 2836ee1f3b cloudflared widget working locally 2023-01-23 12:06:35 -05:00
shamoon d71a1f9345 Merge pull request #861 from benphelps/fix-opnsense-no-wan
Fix: Handle opnsense no wan interface
2023-01-22 14:29:49 -08:00
Michael Shamoon c8116fc9e8 Better error output for docker integration 2023-01-22 14:23:14 -08:00
Michael Shamoon ca4b5b131d Allow specifying wan interface on opnsense widget 2023-01-22 11:02:52 -08:00
Hosted Weblate c74b46712b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-01-22 18:30:38 +01:00
Michael Shamoon 794f22d373 Re-merge "use unprivileged user in a container"
This reverts commit 67e72fb96a.
2023-01-22 09:30:29 -08:00
KillahBee fa1792cd5f adding cloudflare widget 2023-01-20 11:43:19 -05:00
Anonymous cdbdb86c9e Translated using Weblate (Latvian)
Currently translated at 39.7% (119 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-20 17:09:01 +01:00
Anonymous 71669b295d Translated using Weblate (Japanese)
Currently translated at 5.0% (15 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-20 17:09:01 +01:00
Anonymous 9f68f3b3f4 Translated using Weblate (Ukrainian)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-20 17:09:01 +01:00
Anonymous 0b41c1d686 Translated using Weblate (Esperanto)
Currently translated at 34.4% (103 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-20 17:09:01 +01:00
Anonymous 85073629ad Translated using Weblate (Hindi)
Currently translated at 3.0% (9 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-20 17:09:00 +01:00
Anonymous 680d889228 Translated using Weblate (Malay)
Currently translated at 84.6% (253 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-20 17:09:00 +01:00
Anonymous e4c2eec7ee Translated using Weblate (Danish)
Currently translated at 66.2% (198 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-20 17:09:00 +01:00
Anonymous 0642999826 Translated using Weblate (Czech)
Currently translated at 75.2% (225 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-20 17:09:00 +01:00
Anonymous 1a1194acf8 Translated using Weblate (Arabic)
Currently translated at 14.7% (44 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-20 17:08:59 +01:00
Anonymous e6f9d6fd1d Translated using Weblate (Serbian)
Currently translated at 3.0% (9 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-20 17:08:59 +01:00
Anonymous ec4dcd0663 Translated using Weblate (Turkish)
Currently translated at 77.2% (231 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-20 17:08:59 +01:00
Anonymous 1993a1660a Translated using Weblate (Bulgarian)
Currently translated at 15.3% (46 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-20 17:08:59 +01:00
Anonymous 530495d804 Translated using Weblate (Telugu)
Currently translated at 72.5% (217 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-20 17:08:58 +01:00
Anonymous c490d2467f Translated using Weblate (Finnish)
Currently translated at 41.1% (123 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-20 17:08:58 +01:00
Anonymous c7771033c6 Translated using Weblate (Yue)
Currently translated at 39.4% (118 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-20 17:08:58 +01:00
Anonymous ccb227366d Translated using Weblate (Portuguese (Brazil))
Currently translated at 39.1% (117 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-20 17:08:58 +01:00
Anonymous 0d4b4ef65c Translated using Weblate (Romanian)
Currently translated at 45.8% (137 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-20 17:08:58 +01:00
Anonymous 45b59cd336 Translated using Weblate (Hebrew)
Currently translated at 33.7% (101 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-20 17:08:57 +01:00
Anonymous 8dcc25f68f Translated using Weblate (Hungarian)
Currently translated at 36.1% (108 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-20 17:08:57 +01:00
Anonymous f0557d0a9c Translated using Weblate (Croatian)
Currently translated at 95.6% (286 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-20 17:08:56 +01:00
Anonymous f1baafe9a1 Translated using Weblate (Swedish)
Currently translated at 44.1% (132 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-20 17:08:56 +01:00
Anonymous 940b6098d4 Translated using Weblate (Polish)
Currently translated at 95.3% (285 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-20 17:08:56 +01:00
Anonymous 580c6adfb1 Translated using Weblate (Catalan)
Currently translated at 86.2% (258 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-20 17:08:56 +01:00
Anonymous c9cb975265 Translated using Weblate (Chinese (Traditional))
Currently translated at 94.9% (284 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-20 17:08:56 +01:00
Anonymous 3f887a7e26 Translated using Weblate (Dutch)
Currently translated at 29.4% (88 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-20 17:08:55 +01:00
Anonymous 3d5bb9d9eb Translated using Weblate (Vietnamese)
Currently translated at 14.7% (44 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-20 17:08:55 +01:00
Anonymous 6cd9d76892 Translated using Weblate (Norwegian Bokmål)
Currently translated at 26.4% (79 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-20 17:08:55 +01:00
Anonymous cc073ea23c Translated using Weblate (Italian)
Currently translated at 96.3% (288 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-20 17:08:54 +01:00
Anonymous b6a2421a64 Translated using Weblate (Chinese (Simplified))
Currently translated at 56.1% (168 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-20 17:08:54 +01:00
Anonymous 300fce5f17 Translated using Weblate (Russian)
Currently translated at 16.0% (48 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-20 17:08:54 +01:00
Anonymous 19e654656f Translated using Weblate (Portuguese)
Currently translated at 85.6% (256 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-20 17:08:54 +01:00
Anonymous 3add3a57d2 Translated using Weblate (French)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-20 17:08:54 +01:00
Anonymous e850abbaec Translated using Weblate (Spanish)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-20 17:08:53 +01:00
Anonymous d4b3885139 Translated using Weblate (German)
Currently translated at 76.2% (228 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-20 17:08:53 +01:00
Hosted Weblate 3737ce704e Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-01-20 17:08:30 +01:00
Dan 43d781f1f9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (299 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-20 17:08:28 +01:00
retmas-gh fc01c6b428 Translated using Weblate (Polish)
Currently translated at 95.9% (287 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-20 17:08:28 +01:00
Chun Chi Hsieh 592848f42f Translated using Weblate (Chinese (Traditional))
Currently translated at 96.3% (288 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-20 17:08:27 +01:00
Nonoss117 6634909f5b Translated using Weblate (French)
Currently translated at 100.0% (299 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-20 17:08:27 +01:00
gallegonovato 6c5f27cd87 Translated using Weblate (Spanish)
Currently translated at 100.0% (299 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-20 17:08:27 +01:00
shamoon 995ebb1941 Merge pull request #851 from benphelps/rename-octoprint
Remove capital from octoprint widget
2023-01-20 08:08:20 -08:00
Michael Shamoon d27b795d81 Remove capital from octoprint widget
remove

add
2023-01-20 07:09:00 -08:00
shamoon 01eea51555 Merge pull request #850 from benphelps/revert-644-feat/unprivileged-container
Revert "use unprivileged user in a container"
2023-01-19 19:09:42 -08:00
shamoon 67e72fb96a Revert "use unprivileged user in a container" 2023-01-19 19:09:00 -08:00
shamoon c7e4a52b99 Merge pull request #841 from JacksonBarker/main
Added Brave search provider
2023-01-18 18:52:11 -08:00
Jason Fischer 627ce179ef Merge pull request #448 from jameswynn/kubernetes
Support for Kubernetes and Longhorn
2023-01-18 14:54:38 -08:00
Anonymous 1ee2356028 Translated using Weblate (Latvian)
Currently translated at 39.7% (119 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-18 21:51:21 +01:00
Anonymous 335e2fcb1f Translated using Weblate (Japanese)
Currently translated at 5.0% (15 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-18 21:51:21 +01:00
Anonymous a71fe3796f Translated using Weblate (Ukrainian)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-18 21:51:21 +01:00
Anonymous ab8114ee4f Translated using Weblate (Esperanto)
Currently translated at 34.4% (103 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-18 21:51:20 +01:00
Anonymous be4ed7481a Translated using Weblate (Hindi)
Currently translated at 3.0% (9 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-18 21:51:20 +01:00
Anonymous 4ee85bc108 Translated using Weblate (Malay)
Currently translated at 84.6% (253 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-18 21:51:20 +01:00
Anonymous a88a5aa922 Translated using Weblate (Danish)
Currently translated at 66.2% (198 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-18 21:51:20 +01:00
Anonymous 87e82f5339 Translated using Weblate (Czech)
Currently translated at 75.2% (225 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-18 21:51:19 +01:00
Anonymous c741fee788 Translated using Weblate (Arabic)
Currently translated at 14.7% (44 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-18 21:51:19 +01:00
Anonymous 98ecb192fd Translated using Weblate (Serbian)
Currently translated at 3.0% (9 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-18 21:51:19 +01:00
Anonymous ba34bb5aba Translated using Weblate (Turkish)
Currently translated at 77.2% (231 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-18 21:51:18 +01:00
Anonymous 1f9f9070a9 Translated using Weblate (Bulgarian)
Currently translated at 15.3% (46 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-18 21:51:18 +01:00
Anonymous a86fa90a58 Translated using Weblate (Telugu)
Currently translated at 72.5% (217 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-18 21:51:18 +01:00
Anonymous 388bc74464 Translated using Weblate (Finnish)
Currently translated at 41.1% (123 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-18 21:51:18 +01:00
Anonymous dd66f51105 Translated using Weblate (Yue)
Currently translated at 39.4% (118 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-18 21:51:18 +01:00
Anonymous e126a04a35 Translated using Weblate (Portuguese (Brazil))
Currently translated at 39.1% (117 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-18 21:51:17 +01:00
Anonymous 83ec439513 Translated using Weblate (Romanian)
Currently translated at 45.8% (137 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-18 21:51:17 +01:00
Anonymous 8afcb4e427 Translated using Weblate (Hebrew)
Currently translated at 33.7% (101 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-18 21:51:17 +01:00
Anonymous e84ea3a89d Translated using Weblate (Hungarian)
Currently translated at 36.1% (108 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-18 21:51:17 +01:00
Anonymous b80bda077d Translated using Weblate (Croatian)
Currently translated at 95.6% (286 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-18 21:51:16 +01:00
Anonymous e1247a40a7 Translated using Weblate (Swedish)
Currently translated at 44.1% (132 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-18 21:51:16 +01:00
Anonymous 238835c625 Translated using Weblate (Polish)
Currently translated at 91.9% (275 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-18 21:51:16 +01:00
Anonymous 8b229c0096 Translated using Weblate (Catalan)
Currently translated at 86.2% (258 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-18 21:51:16 +01:00
Anonymous 41290cf909 Translated using Weblate (Chinese (Traditional))
Currently translated at 87.6% (262 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-18 21:51:15 +01:00
Anonymous 96ec29efd9 Translated using Weblate (Dutch)
Currently translated at 29.4% (88 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-18 21:51:15 +01:00
Anonymous 9c6a71c463 Translated using Weblate (Vietnamese)
Currently translated at 14.7% (44 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-18 21:51:15 +01:00
Anonymous f7f4033e21 Translated using Weblate (Norwegian Bokmål)
Currently translated at 26.4% (79 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-18 21:51:15 +01:00
Anonymous af3f65a648 Translated using Weblate (Italian)
Currently translated at 96.3% (288 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-18 21:51:14 +01:00
Anonymous b73d36fbd4 Translated using Weblate (Chinese (Simplified))
Currently translated at 56.1% (168 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-18 21:51:14 +01:00
Anonymous 23a2c43e50 Translated using Weblate (Russian)
Currently translated at 16.0% (48 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-18 21:51:14 +01:00
Anonymous fe7d7a9feb Translated using Weblate (Portuguese)
Currently translated at 85.6% (256 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-18 21:51:13 +01:00
Anonymous ce8cef99e8 Translated using Weblate (French)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-18 21:51:13 +01:00
Anonymous 60958cad5f Translated using Weblate (Spanish)
Currently translated at 98.6% (295 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-18 21:51:13 +01:00
Anonymous 76701c245c Translated using Weblate (German)
Currently translated at 76.2% (228 of 299 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-18 21:51:13 +01:00
Armīns Jeltajevs 2053ce7361 Translated using Weblate (Latvian)
Currently translated at 40.3% (119 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-18 21:50:51 +01:00
Jason Fischer 1935965095 Merge pull request #834 from williamwoldum/octoPrint
OctoPrint Widget
2023-01-18 12:50:45 -08:00
williamwoldum 006fb80533 Added celcius labels 2023-01-18 21:04:49 +01:00
Jackson Barker ab2c3c6412 Added Brave search provider 2023-01-18 14:10:01 -05:00
williamwoldum 2c3947ea3f Removed refresh intervals 2023-01-18 19:33:55 +01:00
James Wynn 725189a7b0 Issue with dotnext PVC preventing normal deployments
* fixed k3d-deploy.sh directory reference
2023-01-18 10:05:12 -06:00
Armīns Jeltajevs 7b61ca81bc Translated using Weblate (Latvian)
Currently translated at 29.8% (88 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-18 14:49:45 +01:00
Graphix Media f2d737b156 Translated using Weblate (Dutch)
Currently translated at 29.8% (88 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-18 14:49:45 +01:00
gallegonovato b6bee279d4 Translated using Weblate (Spanish)
Currently translated at 100.0% (295 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-18 14:49:44 +01:00
williamwoldum 365783204a realized that 'pausing' and 'resuming' are also states while printing 2023-01-18 00:47:51 +01:00
williamwoldum 047f7af99a removed silencing feature 2023-01-17 23:36:48 +01:00
williamwoldum a880cdbc68 silenced more request errors + small fix in display logic 2023-01-17 12:50:08 +01:00
williamwoldum 9f008fc04e initial 2023-01-17 03:54:24 +01:00
Anonymous aa8c41e715 Translated using Weblate (Latvian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-01-17 01:09:40 +01:00
Dan 2a5442940f Translated using Weblate (Ukrainian)
Currently translated at 100.0% (295 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-17 01:09:38 +01:00
Nonoss117 3317cd8b5b Translated using Weblate (French)
Currently translated at 100.0% (295 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-17 01:09:38 +01:00
Armīns Jeltajevs d9241e03bb Added translation using Weblate (Latvian) 2023-01-17 01:09:19 +01:00
Anonymous 8e191d4103 Translated using Weblate (Japanese)
Currently translated at 5.0% (15 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-17 00:31:08 +01:00
Anonymous d882e43603 Translated using Weblate (Ukrainian)
Currently translated at 98.9% (292 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-17 00:31:08 +01:00
Anonymous 4edd0edc3d Translated using Weblate (Esperanto)
Currently translated at 34.9% (103 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-17 00:31:07 +01:00
Anonymous 9043e4d648 Translated using Weblate (Hindi)
Currently translated at 3.0% (9 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-17 00:31:07 +01:00
Anonymous fb3f1d61cc Translated using Weblate (Malay)
Currently translated at 85.7% (253 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-17 00:31:07 +01:00
Anonymous 4b21740e64 Translated using Weblate (Danish)
Currently translated at 67.1% (198 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-17 00:31:07 +01:00
Anonymous ef5a063af3 Translated using Weblate (Czech)
Currently translated at 76.2% (225 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-17 00:31:06 +01:00
Anonymous 5aa29aafb7 Translated using Weblate (Arabic)
Currently translated at 14.9% (44 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-17 00:31:06 +01:00
Anonymous d7be68e040 Translated using Weblate (Serbian)
Currently translated at 3.0% (9 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-17 00:31:06 +01:00
Anonymous 3d96b508d5 Translated using Weblate (Turkish)
Currently translated at 78.3% (231 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-17 00:31:06 +01:00
Anonymous 6c13e65802 Translated using Weblate (Bulgarian)
Currently translated at 15.5% (46 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-17 00:31:05 +01:00
Anonymous fe9c355af5 Translated using Weblate (Telugu)
Currently translated at 73.5% (217 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-17 00:31:05 +01:00
Anonymous ef7afb2589 Translated using Weblate (Finnish)
Currently translated at 41.6% (123 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-17 00:31:05 +01:00
Anonymous 0e19765e8b Translated using Weblate (Yue)
Currently translated at 40.0% (118 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-17 00:31:05 +01:00
Anonymous 857fec1d47 Translated using Weblate (Portuguese (Brazil))
Currently translated at 39.6% (117 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-17 00:31:04 +01:00
Anonymous a8287cb20f Translated using Weblate (Romanian)
Currently translated at 46.4% (137 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-17 00:31:04 +01:00
Anonymous 2507848575 Translated using Weblate (Hebrew)
Currently translated at 34.2% (101 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-17 00:31:04 +01:00
Anonymous fdd66c1435 Translated using Weblate (Hungarian)
Currently translated at 36.6% (108 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-17 00:31:04 +01:00
Anonymous 827679ced6 Translated using Weblate (Croatian)
Currently translated at 96.9% (286 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-17 00:31:03 +01:00
Anonymous e112b3f737 Translated using Weblate (Swedish)
Currently translated at 44.7% (132 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-17 00:31:03 +01:00
Anonymous 8598f4c315 Translated using Weblate (Polish)
Currently translated at 93.2% (275 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-17 00:31:03 +01:00
Anonymous 8329aabe74 Translated using Weblate (Catalan)
Currently translated at 87.4% (258 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-17 00:31:03 +01:00
Anonymous 667519f81e Translated using Weblate (Chinese (Traditional))
Currently translated at 88.8% (262 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-17 00:31:03 +01:00
Anonymous ea9fa2b9c2 Translated using Weblate (Dutch)
Currently translated at 21.3% (63 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-17 00:31:02 +01:00
Anonymous df3bac842e Translated using Weblate (Vietnamese)
Currently translated at 14.9% (44 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-17 00:31:02 +01:00
Anonymous 32e7323b45 Translated using Weblate (Norwegian Bokmål)
Currently translated at 26.7% (79 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-17 00:31:02 +01:00
Anonymous 62e1cfea59 Translated using Weblate (Italian)
Currently translated at 97.6% (288 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-17 00:31:01 +01:00
Anonymous 92b3433e1d Translated using Weblate (Chinese (Simplified))
Currently translated at 56.9% (168 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-17 00:31:01 +01:00
Anonymous 8723b1f101 Translated using Weblate (Russian)
Currently translated at 16.2% (48 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-17 00:31:01 +01:00
Anonymous 88d2ce7d6f Translated using Weblate (Portuguese)
Currently translated at 86.7% (256 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-17 00:31:01 +01:00
Anonymous f65884183d Translated using Weblate (French)
Currently translated at 98.9% (292 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-17 00:31:01 +01:00
Anonymous fa1f51d42c Translated using Weblate (Spanish)
Currently translated at 98.9% (292 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-17 00:31:00 +01:00
Anonymous 578de2c52e Translated using Weblate (German)
Currently translated at 77.2% (228 of 295 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-17 00:31:00 +01:00
Jason Fischer 12e111b76c Merge pull request #832 from umens/main
Add Medusa widget
2023-01-16 15:29:40 -08:00
Ulysse Mensa 82a6553c58 Merge branch 'benphelps:main' into main 2023-01-16 22:39:51 +01:00
Ulysse Mensa 2a24277757 Add Medusa widget 2023-01-16 22:39:01 +01:00
Luis Miguel Soto Sánchez e20a0e90b2 Translated using Weblate (Spanish)
Currently translated at 100.0% (292 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-16 17:48:14 +01:00
Dan b3e976860a Translated using Weblate (Ukrainian)
Currently translated at 100.0% (292 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-15 02:57:28 +01:00
Nonoss117 1a9acd753c Translated using Weblate (French)
Currently translated at 100.0% (292 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-15 02:57:28 +01:00
gallegonovato 7f7e083a41 Translated using Weblate (Spanish)
Currently translated at 100.0% (292 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-15 02:57:27 +01:00
Antonio Sanchez Castellón 3aec4e6da4 Translated using Weblate (Spanish)
Currently translated at 100.0% (292 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-15 02:57:27 +01:00
shamoon 59bec6e65e Merge pull request #817 from Jose134/bookmark-fix-814 2023-01-14 07:53:54 -08:00
José Manuel Jurado Bujalance 93dda99aaa use abbr as icon fallback 2023-01-13 22:45:08 +01:00
Jason Fischer 16c419f816 Merge pull request #644 from ajgon/feat/unprivileged-container
use unprivileged user in a container
2023-01-13 09:41:37 -08:00
Anonymous a8e506504a Translated using Weblate (Japanese)
Currently translated at 5.1% (15 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-12 22:55:42 +01:00
Anonymous bf5b82445f Translated using Weblate (Ukrainian)
Currently translated at 98.6% (288 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-12 22:55:41 +01:00
Anonymous a58eebb448 Translated using Weblate (Esperanto)
Currently translated at 35.2% (103 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-01-12 22:55:41 +01:00
Anonymous 233391fc4a Translated using Weblate (Hindi)
Currently translated at 3.0% (9 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-01-12 22:55:41 +01:00
Anonymous 7a4ac9ddd9 Translated using Weblate (Malay)
Currently translated at 86.6% (253 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-01-12 22:55:41 +01:00
Anonymous 9de4bfc6fe Translated using Weblate (Danish)
Currently translated at 67.8% (198 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-01-12 22:55:40 +01:00
Anonymous c981a737a6 Translated using Weblate (Czech)
Currently translated at 77.0% (225 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-01-12 22:55:40 +01:00
Anonymous 5a6b65aeb0 Translated using Weblate (Arabic)
Currently translated at 15.0% (44 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-01-12 22:55:40 +01:00
Anonymous fa325b2497 Translated using Weblate (Serbian)
Currently translated at 3.0% (9 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-01-12 22:55:39 +01:00
Anonymous f355464aae Translated using Weblate (Turkish)
Currently translated at 79.1% (231 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-01-12 22:55:39 +01:00
Anonymous 893b709f8b Translated using Weblate (Bulgarian)
Currently translated at 15.7% (46 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-01-12 22:55:39 +01:00
Anonymous a4d1589493 Translated using Weblate (Telugu)
Currently translated at 74.3% (217 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-01-12 22:55:39 +01:00
Anonymous 4060fdc902 Translated using Weblate (Finnish)
Currently translated at 42.1% (123 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-01-12 22:55:38 +01:00
Anonymous 54f263da15 Translated using Weblate (Yue)
Currently translated at 40.4% (118 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-01-12 22:55:38 +01:00
Anonymous 2a777e55d9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 40.0% (117 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-01-12 22:55:38 +01:00
Anonymous e1d6d46420 Translated using Weblate (Romanian)
Currently translated at 46.9% (137 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-01-12 22:55:38 +01:00
Anonymous ed8e7aa01d Translated using Weblate (Hebrew)
Currently translated at 34.5% (101 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-01-12 22:55:37 +01:00
Anonymous 56618ead39 Translated using Weblate (Hungarian)
Currently translated at 36.9% (108 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-01-12 22:55:37 +01:00
Anonymous 1549bc67be Translated using Weblate (Croatian)
Currently translated at 97.9% (286 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-12 22:55:37 +01:00
Anonymous a7f9dad6df Translated using Weblate (Swedish)
Currently translated at 45.2% (132 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-01-12 22:55:37 +01:00
Anonymous 5d6e078c87 Translated using Weblate (Polish)
Currently translated at 94.1% (275 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-01-12 22:55:36 +01:00
Anonymous 6100cdba93 Translated using Weblate (Catalan)
Currently translated at 88.3% (258 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-01-12 22:55:36 +01:00
Anonymous e04594defb Translated using Weblate (Chinese (Traditional))
Currently translated at 89.7% (262 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-12 22:55:36 +01:00
Anonymous 5bc475b9df Translated using Weblate (Dutch)
Currently translated at 21.5% (63 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-01-12 22:55:36 +01:00
Anonymous d27262c934 Translated using Weblate (Vietnamese)
Currently translated at 15.0% (44 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-01-12 22:55:35 +01:00
Anonymous 20e4449fd5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 27.0% (79 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-01-12 22:55:35 +01:00
Anonymous f3698aaeb5 Translated using Weblate (Italian)
Currently translated at 98.6% (288 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-12 22:55:35 +01:00
Anonymous 7fec2af8e3 Translated using Weblate (Chinese (Simplified))
Currently translated at 57.5% (168 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-01-12 22:55:35 +01:00
Anonymous dc01dbd649 Translated using Weblate (Russian)
Currently translated at 16.4% (48 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-01-12 22:55:34 +01:00
Anonymous 5e44ac2448 Translated using Weblate (Portuguese)
Currently translated at 87.6% (256 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-12 22:55:34 +01:00
Anonymous 113bbc3ef1 Translated using Weblate (French)
Currently translated at 98.6% (288 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-01-12 22:55:34 +01:00
Anonymous 294b27ab71 Translated using Weblate (Spanish)
Currently translated at 98.6% (288 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-01-12 22:55:34 +01:00
Anonymous a444945faa Translated using Weblate (German)
Currently translated at 78.0% (228 of 292 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-01-12 22:55:33 +01:00
0febf05d8d Add Moonraker (Klipper) widget (#798)
* Add Moonraker (Klipper) widget

* Fix linting

* Removed filename, to adhere to standards

* Removed unused translation

* fix conditional in moonraker component

Co-authored-by: Eizock <>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-01-12 13:55:07 -08:00
Igor Rzegocki 03294b5a2f use unprivileged user in a container 2023-01-12 21:17:01 +01:00
Dan a04c7677e4 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-01-11 23:50:52 +01:00
Milo Ivir 67f63219f4 Translated using Weblate (Croatian)
Currently translated at 99.3% (286 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-11 23:50:51 +01:00
Chun Chi Hsieh 9634a89c81 Translated using Weblate (Chinese (Traditional))
Currently translated at 90.9% (262 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-11 23:50:51 +01:00
nightly_brew f36c0710d8 Translated using Weblate (Italian)
Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-01-11 23:50:50 +01:00
James Wynn b724f520cd added k3d test scripts 2023-01-11 09:47:34 -06:00
Jason Fischer a7f290dfdd Merge pull request #609 from benphelps/fix-576
Fix: settings not picked up after first container creation
2023-01-09 16:53:24 -08:00
James Wynn 98ce0e8c2e Updated package lock with kubernetes deps to resolve offline builds 2023-01-09 10:41:06 -06:00
James Wynn b6e8b64a2e Merge branch 'main' into kubernetes 2023-01-09 08:34:43 -06:00
James Wynn 4d6ce1f7e2 Widgets in discovered services now work correctly 2023-01-09 08:30:50 -06:00
shamoon cf38395100 Merge pull request #791 from benphelps/fix-787
Fix: useWidgetAPI refreshInterval not working
2023-01-09 01:37:21 -08:00
Michael Shamoon fc2e17fa59 fix useWidgetAPI refreshInterval 2023-01-09 01:33:58 -08:00
Chun Chi Hsieh 642f21e56b Translated using Weblate (Chinese (Traditional))
Currently translated at 42.7% (123 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-01-08 16:48:30 +01:00
shamoon e1799f17e3 Merge pull request #777 from jhollowe-forks/truenas-apikey
Change TrueNAS to use API key
2023-01-07 11:05:43 -08:00
Michael Shamoon 730f1c5ec1 Support api key + username / pass for truenas widget 2023-01-07 10:00:25 -08:00
John Hollowell 34a7b25c9c Add truenas key to credentialed proxy handler
Revert "Change TrueNAS to use API key"

This reverts commit 1926c26b77d8e048d92da6e20ff24a3056237daf.

Co-Authored-By: John Hollowell <jhollowe@johnhollowell.com>
2023-01-07 10:00:16 -08:00
Anonymous f93106970a Translated using Weblate (Japanese)
Currently translated at 5.2% (15 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-07 01:13:54 +01:00
SASAGAWA, Kiyoshi 2b4fb03dcf Translated using Weblate (Japanese)
Currently translated at 5.2% (15 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-06 01:14:21 +01:00
Anonymous 11fad11b6d Translated using Weblate (Japanese)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-05 10:26:06 +01:00
Milo Ivir 885dca1750 Translated using Weblate (Croatian)
Currently translated at 97.9% (282 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-05 10:26:03 +01:00
ze cabra 1caa9faded Translated using Weblate (Portuguese)
Currently translated at 88.8% (256 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-05 10:26:03 +01:00
SASAGAWA, Kiyoshi 4f24c0f909 Added translation using Weblate (Japanese) 2023-01-05 10:25:44 +01:00
shamoon 1fd198c255 Merge pull request #771 from benphelps/datetime-locale
Feature: allow setting locale for datetime widget directly
2023-01-04 19:12:23 -08:00
Michael Shamoon 84b7f103c3 Allow setting locale for datetime widget directly 2023-01-04 13:53:06 -08:00
shamoon 272be2c086 Merge pull request #770 from HaroldVB/patch-1
Giving Read Only rights to homepage
2023-01-04 12:28:31 -08:00
Harold 6705197a35 Giving Read Only rights to homepage
Giving Read Only rights to homepage container.
Adding :RO to the docker.sock volume. When the container gets compromised the intruder will have root access basically. The container doesn't need the write privileges.

This measure will stop inexperienced people from exposing their docker.socket to the public internet.
2023-01-04 20:10:18 +01:00
shamoon 2ac06937f9 Merge pull request #769 from benphelps/downloadstation-support-v6+v7
Fix: Support Synology DownloadStation v6 + v7
2023-01-03 23:19:56 -08:00
Michael ShamoonandBenoit SERRA 35a2cd9b94 Support Synology DownloadStation v6 + v7
Co-Authored-By: Benoit SERRA <11260343+Oupsman@users.noreply.github.com>
2023-01-03 15:51:21 -08:00
James Wynn 9a072cddde added documentation 2023-01-03 16:50:24 -06:00
James Wynn 36ed1022e3 detection now uses annotation "gethomepage.dev/enabled" instead of label 2023-01-03 16:15:08 -06:00
shamoon 3a43cf247b Merge pull request #765 from benphelps/fix-764
Use tabular nums for datetime to prevent size changing
2023-01-02 08:34:49 -08:00
Michael Shamoon af29f5b266 Use tabular nums for datetime to prevent size changing 2023-01-02 08:30:57 -08:00
James Wynn e15ba1c82c Merge branch 'main' into kubernetes 2022-12-31 11:19:42 -06:00
James Wynn 7ac862be75 removed overly verbose logging message 2022-12-31 11:13:52 -06:00
shamoon f6b1304e22 Merge pull request #749 from benphelps/fix-docker-log-error
Fix: remove error on no discovered services
2022-12-30 20:32:11 -08:00
Michael Shamoon ee729a7e6a remove error on no discovered services 2022-12-30 20:31:25 -08:00
Michael Shamoon bc7937db71 omada widget cleanup 2022-12-29 00:25:50 -08:00
shamoon 0e1aeaf54c Merge pull request #719 from benphelps/docker-server-failovers
Fix: Handle docker server failures if others succeed
2022-12-28 18:40:08 -08:00
shamoon 2e8717247d Merge pull request #745 from benphelps/fix-version-check-cache
Fix: version check caching
2022-12-28 18:38:50 -08:00
Michael Shamoon d17a17bd3c Use server-side endpoint to properly cache GH release data 2022-12-28 18:33:14 -08:00
Michael Shamoon 0afc1b96f1 CPU / memory / disk usage bars start from 0
Closes #737
2022-12-28 16:21:04 -08:00
Michael Shamoon 5fbc6702bc Prevent blocking error on GH releases failure
Closes #738
2022-12-28 16:17:49 -08:00
Nonoss117 75455a23e2 Translated using Weblate (French)
Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-27 12:50:18 +01:00
gallegonovato 2aed46671f Translated using Weblate (Spanish)
Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-27 12:50:18 +01:00
shamoon 88934ec39a Correct debug messages in Pyload widget
Closes #733
2022-12-26 06:07:43 -08:00
shamoon 21c0c687cd Update README.md 2022-12-26 01:17:54 -08:00
shamoon 9f63a5a1d5 Merge pull request #732 from benphelps/fix-update-checker
Fix broken update checker
2022-12-26 01:02:37 -08:00
Michael Shamoon 679704949e Fix broken update checker 2022-12-26 01:02:01 -08:00
Michael Shamoon 6b90d3ef28 Handle docker server failures if others succeed 2022-12-22 21:16:52 -08:00
James Wynn 51ff424d98 added check for nodes without disks 2022-12-09 17:00:05 -06:00
James Wynn ec08535204 fixed podSelector discovery 2022-12-09 07:56:51 -06:00
James Wynn a146c13c4f fixed unintentional blank default podSelector from discovery 2022-12-09 07:52:32 -06:00
James Wynn 8543118607 updated ingress selector label, added href override annotation 2022-12-09 07:43:52 -06:00
James Wynn 27d067dc4c Typo in kubernetes component 2022-12-08 18:31:51 -06:00
James Wynn 09eb172079 new status format, new podSelector field, more accurate pod stats
* renamed pod label prefix from "homepage" to "gethomepage.dev"
  which is more inline with typical kubernetes practices
2022-12-08 16:04:33 -06:00
James Wynn 174cb651b4 Merge branch 'main' into kubernetes 2022-12-08 09:57:51 -06:00
Michael Shamoon c01b60dbd1 try to detect invalid settings load 2022-12-03 00:14:07 -08:00
James Wynn c54374068d fixed a formatting error and longhorn's usage bar 2022-11-25 10:21:51 -06:00
James Wynn a1f2003a77 Merge branch 'main' into kubernetes 2022-11-19 09:09:23 -06:00
James Wynn 1ca61114ef Merge branch 'benphelps:main' into kubernetes 2022-11-18 18:02:53 -06:00
James Wynn fdb143304f Separated kubernetes widgets from resources widgets 2022-11-18 18:02:23 -06:00
James Wynn 056e26dfd3 Improved handling of empty or disabled kubernetes configuration 2022-11-06 06:58:52 -06:00
James Wynn 0c6f7dbee1 Cleaned up some variable names 2022-11-06 06:58:52 -06:00
James Wynn 4fc6db49ca Improved kubernetes error handling 2022-11-06 06:58:52 -06:00
James Wynn 8887fcc3ee longhorn support
* longhorn widget for showing storage stats as "disks"
2022-11-06 06:58:52 -06:00
James Wynn c4333fd2dc Kubernetes support
* Total CPU and Memory usage for the entire cluster
* Total CPU and Memory usage for kubernetes pods
* Service discovery via annotations on ingress
* No storage stats yet
* No network stats yet
2022-11-06 06:58:52 -06:00
114 changed files with 14127 additions and 1109 deletions

No files matched your search

+2
View File
@@ -20,5 +20,7 @@
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
**/.next
README.md
config/
k3d/
+1 -1
View File
@@ -88,7 +88,7 @@ jobs:
# https://github.com/docker/build-push-action
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v3
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
+16 -16
View File
@@ -7,12 +7,10 @@ WORKDIR /app
COPY --link package.json pnpm-lock.yaml* ./
RUN <<EOF
set -xe
apk add libc6-compat
apk add --virtual .gyp python3 make g++
npm install -g pnpm
EOF
SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
RUN apk add --no-cache libc6-compat \
&& apk add --no-cache --virtual .gyp python3 make g++ \
&& npm install -g pnpm
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
@@ -29,12 +27,10 @@ ARG REVISION
COPY --link --from=deps /app/node_modules ./node_modules/
COPY . .
RUN <<EOF
set -xe
npm run telemetry
mkdir config && echo '-' > config/settings.yaml
NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
EOF
SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
RUN npm run telemetry \
&& mkdir config && echo '---' > config/settings.yaml \
&& NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
# Production image, copy all the files and run next
FROM docker.io/node:18-alpine AS runner
@@ -50,12 +46,15 @@ ENV NODE_ENV production
WORKDIR /app
# Copy files from context (this allows the files to copy before the builder stage is done).
COPY --link package.json next.config.js ./
COPY --link /public ./public
COPY --link --chown=1000:1000 package.json next.config.js ./
COPY --link --chown=1000:1000 /public ./public/
# Copy files from builder
COPY --link --from=builder /app/.next/standalone ./
COPY --link --from=builder /app/.next/static/ ./.next/static/
COPY --link --from=builder --chown=1000:1000 /app/.next/standalone ./
COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static/
COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
RUN apk add --no-cache su-exec
ENV PORT 3000
EXPOSE $PORT
@@ -63,4 +62,5 @@ EXPOSE $PORT
HEALTHCHECK --interval=10s --timeout=3s --start-period=20s \
CMD wget --no-verbose --tries=1 --spider --no-check-certificate http://localhost:$PORT/api/healthcheck || exit 1
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["node", "server.js"]
+22
View File
@@ -0,0 +1,22 @@
# syntax = docker/dockerfile:latest
FROM docker.io/node:18-alpine
WORKDIR /app
COPY --link package.json pnpm-lock.yaml* ./
RUN <<EOF
set -xe
apk add libc6-compat
apk add --virtual .gyp python3 make g++
npm install -g pnpm
npm install -g next
EOF
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm install -r --offline
COPY . .
CMD ["npx", "next", "dev"]
+9 -7
View File
@@ -45,15 +45,17 @@
- Container status (Running / Stopped) & statistics (CPU, Memory, Network)
- Automatic service discovery (via labels)
- Service Integration
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentik, Proxmox
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli, Plex and more
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent and more
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentik, Proxmox and more
- Information Providers
- Coin Market Cap, Mastodon
- Coin Market Cap, Mastodon and more
- Information & Utility Widgets
- System Stats (Disk, CPU, Memory)
- Weather via [OpenWeatherMap](https://openweathermap.org/) or [Open-Meteo](https://open-meteo.com/)
- Search Bar
- Web Search Bar
- UniFi Console, Glances and more
- Instant "Quick-launch" search
- Customizable
- 21 theme colors with light and dark mode support
- Background image support
@@ -63,7 +65,7 @@
If you have any questions, suggestions, or general issues, please start a discussion on the [Discussions](https://github.com/benphelps/homepage/discussions) page.
If you have a more specific issue, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page.
For bug reports, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page.
## Getting Started
@@ -83,7 +85,7 @@ services:
- 3000:3000
volumes:
- /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:ro # (optional) For docker integrations
```
or docker run:
+15 -1
View File
@@ -2,8 +2,22 @@
set -e
# Default to root, so old installations won't break
export PUID=${PUID:-0}
export PGID=${PGID:-0}
# 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
# Set privileges for /app but only if pid 1 user is root and we are dropping privileges.
# If container is run as an unprivileged user, it means owner already handled ownership setup on their own.
# Running chown in that case (as non-root) will cause error
[ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ] && chown -R ${PUID}:${PGID} /app
# Drop privileges (when asked to) if root, otherwise run as current user
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
su-exec ${PUID}:${PGID} "$@"
else
exec "$@"
fi
+2
View File
@@ -0,0 +1,2 @@
#shellcheck disable=SC2148,SC2155
export KUBECONFIG=$(readlink -f ./kubeconfig)
+2
View File
@@ -0,0 +1,2 @@
kubeconfig
+64
View File
@@ -0,0 +1,64 @@
# Kubernetes Development
These configs and scripts attempt to simplify spinning up a kubernetes cluster
for development and testing purposes. It leverages [k3d](https://k3d.io) to create
a [k3s](https://k3s.io) cluster in Docker. Homepage can then be deployed either via
the `k3d-deploy.sh` script, or [tilt](https://tilt.dev) can be used to spin up a
local CI loop that will automatically update the deployment.
All the commands in the document should be run from the `k3d` directory.
## Requisite Tools
| Tool | Description |
|-------------------------------------------------------------|----------------------------------------------------------|
| [docker](https://docker.io) | Docker container runtime |
| [kubectl](https://kubernetes.io/releases/download/#kubectl) | Kubernetes CLI |
| [helm](https://helm.sh) | Kubernetes package manager |
| [k3d](https://k3d.io) | Kubernetes on Docker - used to create the cluster |
| [k9s](https://k9scli.io) | (Optional) Command line view for kubernetes cluster |
| [tilt](https://tilt.dev) | (Optional) Local CI loop for kubernetes deployment |
| [direnv](https://direnv.net/) | (Optional) Automatically loads `kubeconfig` via `.envrc` |
## One-off Test Deployments
Create a cluster:
```sh
./k3d-up.sh
```
Build and deploy:
```sh
./k3d-deploy.sh
```
Open the Homepage deployment:
```sh
xdg-open http://homepage.k3d.localhost:8080/
```
## Continuous Deployment
Create a cluster:
```sh
./k3d-up.sh
```
Kick off tilt:
```sh
tilt up
```
Press space bar to open the tilt web UI, which is quite informative.
Open the Homepage deployment:
```sh
xdg-open http://homepage.k3d.localhost:8080/
```
+25
View File
@@ -0,0 +1,25 @@
docker_build('k3d-registry.localhost:55000/homepage:local', '..',
dockerfile = "../Dockerfile-tilt",
build_args={'node_env': 'development'},
#entrypoint='pnpm run nodemon /app/server.js',
live_update=[
sync('.', '/app'),
run('cd /app && pnpm install', trigger=['.package.json', './pnpm-lock.yaml'])
]
)
load('ext://helm_resource', 'helm_resource', 'helm_repo')
helm_repo('jameswynn', 'https://jameswynn.github.io/helm-charts')
helm_resource('homepage', 'jameswynn/homepage',
image_deps=[
"k3d-registry.localhost:55000/homepage:local"
],
image_keys=[
("image.repository", "image.tag")
],
# image_selector= "k3d-registry.localhost:55000/homepage:local",
flags=[
"-f", "k3d-helm-values.yaml",
"--set", "persistence.dotnext.enabled=true"
]
)
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
DOCKER_BUILDKIT=1 docker build -t k3d-registry.localhost:55000/homepage:local ..
docker push k3d-registry.localhost:55000/homepage:local
HELM_REPO_NAME=jameswynn
HELM_REPO_URL=https://jameswynn.github.io/helm-charts
if ! helm repo list | grep $HELM_REPO_URL > /dev/null; then
helm repo add $HELM_REPO_NAME $HELM_REPO_URL
helm repo update
fi
helm upgrade --install homepage jameswynn/homepage -f k3d-helm-values.yaml
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
k3d cluster delete homepage
rm kubeconfig
+78
View File
@@ -0,0 +1,78 @@
image:
repository: k3d-registry.localhost:55000/homepage
tag: local
pullPolicy: Always
config:
bookmarks:
- Developer:
- Github:
- abbr: GH
href: https://github.com/
services:
- My First Group:
- My First Service:
href: http://localhost/
description: Homepage is awesome
- My Second Group:
- My Second Service:
href: http://localhost/
description: Homepage is the best
- My Third Group:
- My Third Service:
href: http://localhost/
description: Homepage is 😎
widgets:
# show the kubernetes widget, with the cluster summary and individual nodes
- kubernetes:
cluster:
show: true
cpu: true
memory: true
showLabel: true
label: "cluster"
nodes:
show: true
cpu: true
memory: true
showLabel: true
- search:
provider: duckduckgo
target: _blank
kubernetes:
mode: cluster
docker:
settings:
serviceAccount:
create: true
name: homepage
enableRbac: true
ingress:
main:
enabled: true
annotations:
gethomepage.dev/enabled: "true"
gethomepage.dev/name: "Homepage"
gethomepage.dev/description: "Dynamically Detected Homepage"
gethomepage.dev/group: "Dynamic"
gethomepage.dev/icon: "homepage.png"
hosts:
- host: homepage.k3d.localhost
paths:
- path: /
pathType: Prefix
persistence:
# this persists the .next directory which greatly improves successive pod startup times in Tilt,
# but it breaks normal deployments, so it is disabled by default
dotnext:
enabled: false
type: pvc
accessMode: ReadWriteOnce
size: 1Gi
mountPath: /app/.next
Executable
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
k3d cluster create --config k3d.yaml --wait
k3d kubeconfig get homepage > kubeconfig
chmod 600 kubeconfig
export KUBECONFIG=$(pwd)/kubeconfig
echo "Waiting for traefik install job to complete (CTRL+C is safe if you're impatient)"
kubectl wait jobs/helm-install-traefik -n kube-system --for condition=complete --timeout 90s && echo "Completed" || echo "Timed out (but it should still come up eventually)"
+59
View File
@@ -0,0 +1,59 @@
kind: Simple
apiVersion: k3d.io/v1alpha3
name: homepage
servers: 1
agents: 2
kubeAPI:
hostIP: 0.0.0.0
hostPort: "6443"
image: rancher/k3s:v1.25.5-k3s1
volumes:
- volume: /tmp:/tmp/k3d-homepage
nodeFilters:
- all
ports:
- port: 8080:80
nodeFilters:
- loadbalancer
- port: 0.0.0.0:8443:443
nodeFilters:
- loadbalancer
options:
k3d:
wait: true
timeout: 6m0s
disableLoadbalancer: false
disableImageVolume: false
disableRollback: false
k3s:
extraArgs:
- arg: --tls-san=127.0.0.1
nodeFilters:
- server:*
nodeLabels: []
kubeconfig:
updateDefaultKubeconfig: false
switchCurrentContext: false
runtime:
gpuRequest: ""
serversMemory: "1024Mi"
agentsMemory: "1024Mi"
labels:
- label: foo=bar
nodeFilters:
- server:0
- loadbalancer
env:
- envVar: bar=baz
nodeFilters:
- all
registries:
create:
name: k3d-registry
# host: 0.0.0.0
hostPort: "55000"
config: |
mirrors:
"k3d-registry.localhost:55000":
endpoint:
- http://k3d-registry:5000
+147
View File
@@ -0,0 +1,147 @@
# Kubernetes Support
## Requirements
* Kubernetes 1.19+
* Metrics service
* An Ingress controller
## Deployment
Use the unofficial helm chart: https://github.com/jameswynn/helm-charts/tree/main/charts/homepage
```sh
helm repo add jameswynn https://jameswynn.github.io/helm-charts
helm install my-release jameswynn/homepage
```
### Configuration
Set the `mode` in the `kubernetes.yaml` to `cluster`.
```yaml
mode: default
```
## Widgets
The Kubernetes widget can show a high-level overview of the cluster,
individual nodes, or both.
```yaml
- kubernetes:
cluster:
# Shows the cluster node
show: true
# Shows the aggregate CPU stats
cpu: true
# Shows the aggregate memory stats
memory: true
# Shows a custom label
showLabel: true
label: "cluster"
nodes:
# Shows the clusters
show: true
# Shows the CPU for each node
cpu: true
# Shows the memory for each node
memory: true
# Shows the label, which is always the node name
showLabel: true
```
## Service Discovery
Sample yaml:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: homepage
annotations:
gethomepage.dev/enabled: "true"
gethomepage.dev/description: Dynamically Detected Homepage
gethomepage.dev/group: Operations
gethomepage.dev/icon: homepage.png
gethomepage.dev/name: Homepage
spec:
rules:
- host: homepage.example.com
http:
paths:
- backend:
service:
name: homepage
port:
number: 3000
path: /
pathType: Prefix
```
## Service Widgets
To manually configure a Service Widget the `namespace` and `app` fields must
be configured on the service entry.
```yaml
- Home Automation
- Home-Assistant:
icon: home-assistant.png
href: https://home.example.com
description: Home Automation
app: home-assistant
namespace: home
```
This works by creating a label selector `app.kubernetes.io/name=home-assistant`,
which typically will be the same both for the ingress and the deployment. However,
some deployments can be complex and will not conform to this rule. In such
cases the `podSelector` variable can bridge the gap. Any field selector can
be used in it which allows for some powerful selection capabilities.
For instance, it can be utilized to roll multiple underlying deployments under
one application to see a high-level aggregate:
```yaml
- Comms
- Element Chat:
icon: matrix-light.png
href: https://chat.example.com
description: Matrix Synapse Powered Chat
app: matrix-element
namespace: comms
podSelector: >-
app.kubernetes.io/instance in (
matrix-element,
matrix-media-repo,
matrix-media-repo-postgresql,
matrix-synapse
)
```
## Longhorn Widget
There is a widget for showing storage stats from [Longhorn](https://longhorn.io).
Configure it from the `widgets.yaml`.
```yaml
- longhorn:
# Show the expanded
expanded: true
# Shows a node representing the aggregate values
total: true
# Shows the node names as labels
labels: true
# Show the nodes
nodes: true
# An explicit list of nodes to show. All are shown by default if "nodes" is true
include:
- node1
- node2
```
## Testing
Refer to the [k3d readme](k3d/README.md).
+8518
View File
File diff suppressed because it is too large. Load diff
+1
View File
@@ -11,6 +11,7 @@
},
"dependencies": {
"@headlessui/react": "^1.7.2",
"@kubernetes/client-node": "^0.17.1",
"classnames": "^2.3.2",
"compare-versions": "^5.0.1",
"dockerode": "^3.3.4",
+447 -33
View File
@@ -2,6 +2,7 @@ lockfileVersion: 5.4
specifiers:
'@headlessui/react': ^1.7.2
'@kubernetes/client-node': ^0.17.1
'@tailwindcss/forms': ^0.5.3
autoprefixer: ^10.4.12
classnames: ^2.3.2
@@ -44,6 +45,7 @@ specifiers:
dependencies:
'@headlessui/react': 1.7.2_biqbaboplfbrettd7655fr4n2y
'@kubernetes/client-node': 0.17.1
classnames: 2.3.2
compare-versions: 5.0.1
dockerode: 3.3.4
@@ -171,6 +173,30 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
/@kubernetes/client-node/0.17.1:
resolution: {integrity: sha512-qXANjukuTq/drb1hq1NCYZafpdRTvbyTzbliWO6RwW7eEb2b9qwINbw0DiVHpBQg3e9DeQd8+brI1sR1Fck5kQ==}
dependencies:
byline: 5.0.0
execa: 5.0.0
isomorphic-ws: 4.0.1_ws@7.5.9
js-yaml: 4.1.0
jsonpath-plus: 0.19.0
request: 2.88.2
rfc4648: 1.5.2
shelljs: 0.8.5
stream-buffers: 3.0.2
tar: 6.1.13
tmp-promise: 3.0.3
tslib: 1.14.1
underscore: 1.13.6
ws: 7.5.9
optionalDependencies:
openid-client: 5.3.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
dev: false
/@next/env/12.3.1:
resolution: {integrity: sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg==}
dev: false
@@ -467,7 +493,6 @@ packages:
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
dev: true
/ansi-regex/5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
@@ -546,6 +571,11 @@ packages:
safer-buffer: 2.1.2
dev: false
/assert-plus/1.0.0:
resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
engines: {node: '>=0.8'}
dev: false
/ast-types-flow/0.0.7:
resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
dev: true
@@ -574,6 +604,14 @@ packages:
postcss-value-parser: 4.2.0
dev: true
/aws-sign2/0.7.0:
resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
dev: false
/aws4/1.12.0:
resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
dev: false
/axe-core/4.4.3:
resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==}
engines: {node: '>=4'}
@@ -585,7 +623,6 @@ packages:
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
/base64-js/1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -615,7 +652,6 @@ packages:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
dev: true
/braces/3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
@@ -648,6 +684,11 @@ packages:
dev: false
optional: true
/byline/5.0.0:
resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==}
engines: {node: '>=0.10.0'}
dev: false
/bytes/3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
@@ -673,6 +714,10 @@ packages:
/caniuse-lite/1.0.30001410:
resolution: {integrity: sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==}
/caseless/0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
dev: false
/chalk/4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -700,6 +745,11 @@ packages:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
dev: false
/chownr/2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
engines: {node: '>=10'}
dev: false
/classnames/2.3.2:
resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
dev: false
@@ -758,7 +808,6 @@ packages:
/concat-map/0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
/confusing-browser-globals/1.0.11:
resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
@@ -774,13 +823,17 @@ packages:
requiresBuild: true
dev: false
/core-util-is/1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
dev: false
/cpu-features/0.0.4:
resolution: {integrity: sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==}
engines: {node: '>=10.0.0'}
requiresBuild: true
dependencies:
buildcheck: 0.0.3
nan: 2.16.0
nan: 2.17.0
dev: false
optional: true
@@ -791,7 +844,6 @@ packages:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
dev: true
/cssesc/3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@@ -807,6 +859,13 @@ packages:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
dev: true
/dashdash/1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
dependencies:
assert-plus: 1.0.0
dev: false
/debug/2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
peerDependencies:
@@ -928,6 +987,13 @@ packages:
esutils: 2.0.3
dev: true
/ecc-jsbn/0.1.2:
resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
dependencies:
jsbn: 0.1.1
safer-buffer: 2.1.2
dev: false
/electron-to-chromium/1.4.261:
resolution: {integrity: sha512-fVXliNUGJ7XUVJSAasPseBbVgJIeyw5M1xIkgXdTSRjlmCqBbiSTsEdLOCJS31Fc8B7CaloQ/BFAg8By3ODLdg==}
dev: true
@@ -1396,9 +1462,32 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/execa/5.0.0:
resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==}
engines: {node: '>=10'}
dependencies:
cross-spawn: 7.0.3
get-stream: 6.0.1
human-signals: 2.1.0
is-stream: 2.0.1
merge-stream: 2.0.0
npm-run-path: 4.0.1
onetime: 5.1.2
signal-exit: 3.0.7
strip-final-newline: 2.0.0
dev: false
/extend/3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
dev: false
/extsprintf/1.3.0:
resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
engines: {'0': node >=0.6.0}
dev: false
/fast-deep-equal/3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
/fast-diff/1.2.0:
resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
@@ -1417,7 +1506,6 @@ packages:
/fast-json-stable-stringify/2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
dev: true
/fast-levenshtein/2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
@@ -1481,6 +1569,19 @@ packages:
optional: true
dev: false
/forever-agent/0.6.1:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
dev: false
/form-data/2.3.3:
resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
engines: {node: '>= 0.12'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/form-data/3.0.1:
resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
engines: {node: '>= 6'}
@@ -1498,9 +1599,15 @@ packages:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
dev: false
/fs-minipass/2.1.0:
resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
engines: {node: '>= 8'}
dependencies:
minipass: 3.3.6
dev: false
/fs.realpath/1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: true
/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
@@ -1512,7 +1619,6 @@ packages:
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
/function.prototype.name/1.1.5:
resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
@@ -1536,6 +1642,11 @@ packages:
has-symbols: 1.0.3
dev: true
/get-stream/6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
dev: false
/get-symbol-description/1.0.0:
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
engines: {node: '>= 0.4'}
@@ -1544,6 +1655,12 @@ packages:
get-intrinsic: 1.1.3
dev: true
/getpass/0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
dependencies:
assert-plus: 1.0.0
dev: false
/glob-parent/5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -1578,7 +1695,6 @@ packages:
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
dev: true
/globals/13.17.0:
resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
@@ -1603,6 +1719,20 @@ packages:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
/har-schema/2.0.0:
resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
engines: {node: '>=4'}
dev: false
/har-validator/5.1.5:
resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
engines: {node: '>=6'}
deprecated: this library is no longer supported
dependencies:
ajv: 6.12.6
har-schema: 2.0.0
dev: false
/has-bigints/1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
dev: true
@@ -1635,7 +1765,6 @@ packages:
engines: {node: '>= 0.4.0'}
dependencies:
function-bind: 1.1.1
dev: true
/hoist-non-react-statics/3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
@@ -1660,6 +1789,20 @@ packages:
toidentifier: 1.0.1
dev: false
/http-signature/1.2.0:
resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
engines: {node: '>=0.8', npm: '>=1.3.7'}
dependencies:
assert-plus: 1.0.0
jsprim: 1.4.2
sshpk: 1.17.0
dev: false
/human-signals/2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'}
dev: false
/i18next-fs-backend/1.1.5:
resolution: {integrity: sha512-raTel3EfshiUXxR0gvmIoqp75jhkj8+7R1LjB006VZKPTFBbXyx6TlUVhb8Z9+7ahgpFbcQg1QWVOdf/iNzI5A==}
dev: false
@@ -1704,7 +1847,6 @@ packages:
dependencies:
once: 1.4.0
wrappy: 1.0.2
dev: true
/inherits/2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -1718,6 +1860,11 @@ packages:
side-channel: 1.0.4
dev: true
/interpret/1.4.0:
resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
engines: {node: '>= 0.10'}
dev: false
/is-arrayish/0.3.2:
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
dev: false
@@ -1752,7 +1899,6 @@ packages:
resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
dependencies:
has: 1.0.3
dev: true
/is-date-object/1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
@@ -1823,6 +1969,10 @@ packages:
has-symbols: 1.0.3
dev: true
/is-typedarray/1.0.0:
resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
dev: false
/is-weakref/1.0.2:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
dependencies:
@@ -1831,7 +1981,23 @@ packages:
/isexe/2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
/isomorphic-ws/4.0.1_ws@7.5.9:
resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==}
peerDependencies:
ws: '*'
dependencies:
ws: 7.5.9
dev: false
/isstream/0.1.2:
resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
dev: false
/jose/4.11.2:
resolution: {integrity: sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==}
dev: false
optional: true
/js-sdsl/4.1.4:
resolution: {integrity: sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==}
@@ -1846,18 +2012,29 @@ packages:
dependencies:
argparse: 2.0.1
/jsbn/0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
dev: false
/json-rpc-2.0/1.4.1:
resolution: {integrity: sha512-OX1NJhpIfuK4GjDnJ/gKtZy1HOYo0l4eL0a4rb0rNeQheX1xlyQ9+JMmPzs/sFNthpS/TXKPWlGo09X7B5l81A==}
dev: false
/json-schema-traverse/0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
dev: true
/json-schema/0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
dev: false
/json-stable-stringify-without-jsonify/1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
dev: true
/json-stringify-safe/5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
dev: false
/json5/1.0.1:
resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
hasBin: true
@@ -1865,6 +2042,21 @@ packages:
minimist: 1.2.6
dev: true
/jsonpath-plus/0.19.0:
resolution: {integrity: sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==}
engines: {node: '>=6.0'}
dev: false
/jsprim/1.4.2:
resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
engines: {node: '>=0.6.0'}
dependencies:
assert-plus: 1.0.0
extsprintf: 1.3.0
json-schema: 0.4.0
verror: 1.10.0
dev: false
/jsx-ast-utils/3.3.3:
resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
engines: {node: '>=4.0'}
@@ -1932,12 +2124,15 @@ packages:
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
dev: true
/memory-cache/0.2.0:
resolution: {integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==}
dev: false
/merge-stream/2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
dev: false
/merge2/1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
@@ -1963,6 +2158,11 @@ packages:
mime-db: 1.52.0
dev: false
/mimic-fn/2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
dev: false
/mini-svg-data-uri/1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
hasBin: true
@@ -1972,16 +2172,43 @@ packages:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
brace-expansion: 1.1.11
dev: true
/minimist/1.2.6:
resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
dev: true
/minipass/3.3.6:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
engines: {node: '>=8'}
dependencies:
yallist: 4.0.0
dev: false
/minipass/4.0.0:
resolution: {integrity: sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==}
engines: {node: '>=8'}
dependencies:
yallist: 4.0.0
dev: false
/minizlib/2.1.2:
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
engines: {node: '>= 8'}
dependencies:
minipass: 3.3.6
yallist: 4.0.0
dev: false
/mkdirp-classic/0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
dev: false
/mkdirp/1.0.4:
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
engines: {node: '>=10'}
hasBin: true
dev: false
/ms/2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
dev: true
@@ -1992,8 +2219,8 @@ packages:
/ms/2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
/nan/2.16.0:
resolution: {integrity: sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==}
/nan/2.17.0:
resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==}
dev: false
optional: true
@@ -2102,11 +2329,28 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/npm-run-path/4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
dependencies:
path-key: 3.1.1
dev: false
/oauth-sign/0.9.0:
resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
dev: false
/object-assign/4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
dev: true
/object-hash/2.2.0:
resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
engines: {node: '>= 6'}
dev: false
optional: true
/object-hash/3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
@@ -2165,6 +2409,12 @@ packages:
es-abstract: 1.20.3
dev: true
/oidc-token-hash/5.0.1:
resolution: {integrity: sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==}
engines: {node: ^10.13.0 || >=12.0.0}
dev: false
optional: true
/once/1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
@@ -2176,6 +2426,24 @@ packages:
fn.name: 1.1.0
dev: false
/onetime/5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
dependencies:
mimic-fn: 2.1.0
dev: false
/openid-client/5.3.1:
resolution: {integrity: sha512-RLfehQiHch9N6tRWNx68cicf3b1WR0x74bJWHRc25uYIbSRwjxYcTFaRnzbbpls5jroLAaB/bFIodTgA5LJMvw==}
requiresBuild: true
dependencies:
jose: 4.11.2
lru-cache: 6.0.0
object-hash: 2.2.0
oidc-token-hash: 5.0.1
dev: false
optional: true
/optionator/0.9.1:
resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
engines: {node: '>= 0.8.0'}
@@ -2217,22 +2485,23 @@ packages:
/path-is-absolute/1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
dev: true
/path-key/3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
dev: true
/path-parse/1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/path-type/4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
dev: true
/performance-now/2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
dev: false
/picocolors/1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
@@ -2371,6 +2640,11 @@ packages:
resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
engines: {node: '>=6'}
/qs/6.5.3:
resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
engines: {node: '>=0.6'}
dev: false
/querystringify/2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
dev: false
@@ -2464,6 +2738,13 @@ packages:
picomatch: 2.3.1
dev: true
/rechoir/0.6.2:
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
engines: {node: '>= 0.10'}
dependencies:
resolve: 1.22.1
dev: false
/regenerator-runtime/0.13.9:
resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
@@ -2481,6 +2762,33 @@ packages:
engines: {node: '>=8'}
dev: true
/request/2.88.2:
resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
engines: {node: '>= 6'}
deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
dependencies:
aws-sign2: 0.7.0
aws4: 1.12.0
caseless: 0.12.0
combined-stream: 1.0.8
extend: 3.0.2
forever-agent: 0.6.1
form-data: 2.3.3
har-validator: 5.1.5
http-signature: 1.2.0
is-typedarray: 1.0.0
isstream: 0.1.2
json-stringify-safe: 5.0.1
mime-types: 2.1.35
oauth-sign: 0.9.0
performance-now: 2.1.0
qs: 6.5.3
safe-buffer: 5.2.1
tough-cookie: 2.5.0
tunnel-agent: 0.6.0
uuid: 3.4.0
dev: false
/requires-port/1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
dev: false
@@ -2497,7 +2805,6 @@ packages:
is-core-module: 2.10.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
/resolve/2.0.0-next.4:
resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
@@ -2513,12 +2820,15 @@ packages:
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: true
/rfc4648/1.5.2:
resolution: {integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==}
dev: false
/rimraf/3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true
dependencies:
glob: 7.2.3
dev: true
/run-parallel/1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -2588,12 +2898,20 @@ packages:
engines: {node: '>=8'}
dependencies:
shebang-regex: 3.0.0
dev: true
/shebang-regex/3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
dev: true
/shelljs/0.8.5:
resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==}
engines: {node: '>=4'}
hasBin: true
dependencies:
glob: 7.2.3
interpret: 1.4.0
rechoir: 0.6.2
dev: false
/shvl/3.0.0:
resolution: {integrity: sha512-5IomAM3ykE/g9K9L6lhODc+TpCuN03rrhlboegeKyyfh66DDdpRD5JN37DYhNHH+RaYjiIDx64K/Ms/xQYOR5w==}
@@ -2607,6 +2925,10 @@ packages:
object-inspect: 1.12.2
dev: true
/signal-exit/3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
dev: false
/simple-swizzle/0.2.2:
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
dependencies:
@@ -2635,7 +2957,23 @@ packages:
bcrypt-pbkdf: 1.0.2
optionalDependencies:
cpu-features: 0.0.4
nan: 2.16.0
nan: 2.17.0
dev: false
/sshpk/1.17.0:
resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
engines: {node: '>=0.10.0'}
hasBin: true
dependencies:
asn1: 0.2.6
assert-plus: 1.0.0
bcrypt-pbkdf: 1.0.2
dashdash: 1.14.1
ecc-jsbn: 0.1.2
getpass: 0.1.7
jsbn: 0.1.1
safer-buffer: 2.1.2
tweetnacl: 0.14.5
dev: false
/stack-trace/0.0.10:
@@ -2647,6 +2985,11 @@ packages:
engines: {node: '>= 0.8'}
dev: false
/stream-buffers/3.0.2:
resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==}
engines: {node: '>= 0.10.0'}
dev: false
/string.prototype.matchall/4.0.7:
resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==}
dependencies:
@@ -2694,6 +3037,11 @@ packages:
engines: {node: '>=4'}
dev: true
/strip-final-newline/2.0.0:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
dev: false
/strip-json-comments/3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@@ -2725,7 +3073,6 @@ packages:
/supports-preserve-symlinks-flag/1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
dev: true
/swr/1.3.0_react@18.2.0:
resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==}
@@ -2797,6 +3144,18 @@ packages:
readable-stream: 3.6.0
dev: false
/tar/6.1.13:
resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==}
engines: {node: '>=10'}
dependencies:
chownr: 2.0.0
fs-minipass: 2.1.0
minipass: 4.0.0
minizlib: 2.1.2
mkdirp: 1.0.4
yallist: 4.0.0
dev: false
/text-hex/1.0.0:
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
dev: false
@@ -2805,6 +3164,19 @@ packages:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
dev: true
/tmp-promise/3.0.3:
resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
dependencies:
tmp: 0.2.1
dev: false
/tmp/0.2.1:
resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
engines: {node: '>=8.17.0'}
dependencies:
rimraf: 3.0.2
dev: false
/to-regex-range/5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -2817,6 +3189,14 @@ packages:
engines: {node: '>=0.6'}
dev: false
/tough-cookie/2.5.0:
resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
engines: {node: '>=0.8'}
dependencies:
psl: 1.9.0
punycode: 2.1.1
dev: false
/tough-cookie/4.1.2:
resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==}
engines: {node: '>=6'}
@@ -2846,7 +3226,6 @@ packages:
/tslib/1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
/tslib/2.4.0:
resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
@@ -2862,6 +3241,12 @@ packages:
typescript: 4.8.3
dev: true
/tunnel-agent/0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
dependencies:
safe-buffer: 5.2.1
dev: false
/tweetnacl/0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
dev: false
@@ -2893,6 +3278,10 @@ packages:
which-boxed-primitive: 1.0.2
dev: true
/underscore/1.13.6:
resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==}
dev: false
/universalify/0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
@@ -2918,7 +3307,6 @@ packages:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
punycode: 2.1.1
dev: true
/url-parse/1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
@@ -2938,6 +3326,21 @@ packages:
/util-deprecate/1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
/uuid/3.4.0:
resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
hasBin: true
dev: false
/verror/1.10.0:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
dependencies:
assert-plus: 1.0.0
core-util-is: 1.0.2
extsprintf: 1.3.0
dev: false
/void-elements/3.1.0:
resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
engines: {node: '>=0.10.0'}
@@ -2970,7 +3373,6 @@ packages:
hasBin: true
dependencies:
isexe: 2.0.0
dev: true
/winston-transport/4.5.0:
resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==}
@@ -3006,6 +3408,19 @@ packages:
/wrappy/1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
/ws/7.5.9:
resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
engines: {node: '>=8.3.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
dev: false
/xml-js/1.6.11:
resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
hasBin: true
@@ -3020,7 +3435,6 @@ packages:
/yallist/4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
/yaml/1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+250 -215
View File
@@ -3,16 +3,16 @@
"missing_type": "نوع القطعة مفقود: {{type}}",
"api_error": "API خطأ",
"status": "الحالة",
"information": "Information",
"information": "معلومات",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"response_data": "بيانات الاستجابة"
},
"weather": {
"current": "الموقع الحالي",
"allow": "اضغط للسماح",
"allow": "أنقر للسماح",
"updating": "جاري التحديث",
"wait": "الرجاء الانتظار"
"wait": "الرجاء الإنتظار"
},
"search": {
"placeholder": "بحث …"
@@ -27,88 +27,88 @@
"unifi": {
"users": "المستخدمون",
"uptime": "مدة تشغيل النظام",
"days": "ايام",
"days": "أيام",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "الاجهزة",
"lan_devices": "LAN اجهزة",
"wlan_devices": "WLAN احهزة",
"devices": "الأجهزة",
"lan_devices": "LAN أجهزة",
"wlan_devices": "WLAN أجهزة",
"lan_users": "LAN مستخدمين",
"wlan_users": "WLAN مستخدمين",
"up": "اعلي",
"down": "اسفل",
"wait": "الرجاء الانتظار"
"up": "يعمل",
"down": "لا يعمل",
"wait": "الرجاء الإنتظار"
},
"wmo": {
"73-day": "Snow",
"0-day": "Sunny",
"0-night": "Clear",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-day": "Drizzle",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"73-day": "ثلج",
"0-day": "مشمس",
"0-night": "صافي",
"1-day": "مشمس غالباً",
"1-night": "صافي غالباً",
"2-day": "غائم جزئياً",
"2-night": "غائم جزئياً",
"3-day": "غائم",
"3-night": "غائم",
"45-day": "ضبابي",
"45-night": "ضبابي",
"48-day": "ضبابي",
"48-night": "ضبابي",
"51-day": "رذاذ خفيف",
"51-night": "رذاذ خفيف",
"53-day": "رذاذ",
"53-night": "رذاذ",
"55-day": "رذاذ كثيف",
"55-night": "رذاذ كثيف",
"56-day": "رذاذ متجمد خفيف",
"56-night": "رذاذ متجمد خفيف",
"57-day": "رذاذ متجمد",
"57-night": "رذاذ متجمد",
"61-day": "مطر خفيف",
"61-night": "مطر خفيف",
"63-day": "مطر",
"63-night": "مطر",
"65-day": "مطر شديد",
"65-night": "مطر شديد",
"66-day": "مطر متجمد",
"66-night": "مطر متجمد",
"67-day": "مطر متجمد",
"67-night": "مطر متجمد",
"71-day": "ثلج خفيف",
"71-night": "ثلج خفيف",
"73-night": "ثلج",
"75-day": "ثلج شديد",
"75-night": "ثلج شديد",
"77-day": "حبيبات الثلج",
"77-night": "حبيبات الثلج",
"80-day": "أمطار خفيفة",
"80-night": "أمطار خفيفة",
"81-day": "أمطار",
"81-night": "أمطار",
"82-day": "أمطار شديدة",
"82-night": "أمطار شديدة",
"85-day": "زخات الثلوج",
"85-night": "زخات الثلوج",
"86-day": "زخات الثلوج",
"86-night": "زخات الثلوج",
"95-day": "عاصفة رعدية",
"95-night": "‬عاصفة رعدية",
"96-day": "عاصفة رعدية مع مطر",
"96-night": "عاصفة رعدية مع مطر",
"99-day": "عاصفة رعدية مع مطر",
"99-night": "عاصفة رعدية مع مطر"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "الرام",
"mem": "الذاكرة",
"cpu": "المعالج",
"offline": "غير متصل",
"error": "Error",
"unknown": "Unknown"
"error": "خطأ",
"unknown": "مجهول"
},
"emby": {
"playing": "يعمل الان",
"playing": "يعمل الآن",
"transcoding": "التحويل",
"bitrate": "معدل البت",
"no_active": "No Active Streams"
@@ -118,290 +118,325 @@
"diffsDetected": "Diffs Detected"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"playing": "يشتغل",
"transcoding": "التحويل",
"bitrate": "معدل البت",
"no_active": "No Active Streams"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
"rate": "معدل",
"remaining": "متبقي",
"downloaded": "مُنزل"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"movies": "أفلام",
"tv": "مسلسلات"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
"rate": "معدل",
"queue": "إنتظار",
"timeleft": "الوقت المتبقي"
},
"rutorrent": {
"active": "Active",
"upload": "Upload",
"download": "Download"
"active": "نشط",
"upload": "تحميل",
"download": "تنزيل"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"download": "تنزيل",
"upload": "تحميل",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"download": "تنزيل",
"upload": "تحميل",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "مطلوب",
"queued": "في الإنتظار",
"series": "سلسلة"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Movies"
"wanted": "مطلوب",
"missing": "مفقود",
"queued": "في الإنتظار",
"movies": "أفلام"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
"wanted": "مطلوب",
"queued": "في الإنتظار",
"albums": "ألبومات"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
"wanted": "مطلوب",
"queued": "في الإنتظار",
"books": "كتب"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
"missingEpisodes": "حلقات مفقودة",
"missingMovies": "أفلام مفقودة"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "معلق",
"approved": "مصدق",
"available": "متاح"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "معلق",
"approved": "مصدق",
"available": "متاح"
},
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"processing": "Processing"
"pending": "معلق",
"approved": "مصدق",
"available": "متاح",
"processing": "معالجة"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
"queries": "الاستعلامات",
"blocked": "محظور",
"gravity": "الجاذبية"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
"queries": "الاستعلامات",
"blocked": "محظور",
"filtered": "مرشح",
"latency": "الإستجابة"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"upload": "التحميل",
"download": "تنزيل",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
"running": "يعمل",
"stopped": "متوقف",
"total": "مجموع"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
"routers": "راوتر",
"services": "خدمات",
"middleware": "الوسيطة"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
"enabled": "مفعل",
"disabled": "معطل",
"total": "مجموع"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
"configure": "قم بأنشاء عملة تشفير واحدة أو أكثر للتتبع",
"1hour": "١ ساعة",
"1day": "١ يوم",
"7days": "٧ أيام",
"30days": "٣٠ يوم"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
"apps": "التطبيقات",
"clients": "العملاء",
"messages": "الرسائل"
},
"prowlarr": {
"enableIndexers": "Indexers",
"enableIndexers": "مفهرسات",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfQueries": "الاستعلامات",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
"numberOfFailQueries": "فشل الاستعلامات"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
"errored": "خطأ"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"numActiveSessions": "الجلسات",
"numConnections": "التوصيلات",
"dataRelayed": "Relayed",
"transferRate": "Rate"
"transferRate": "معدل"
},
"mastodon": {
"user_count": "Users",
"user_count": "المستخدمين",
"status_count": "Posts",
"domain_count": "Domains"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"users": "المستخدمين",
"loginsLast24H": "تسجيلات الدخول (٢٤س)",
"failedLoginsLast24H": "فشل تسجيلات الدخول (٢٤س)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"mem": "الذاكرة",
"cpu": "المعالج",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
"cpu": "معالج",
"mem": "الذاكرة",
"wait": "الرجاء الإنتظار"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"bookmark": "مفضلة",
"service": "خدمة",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"available_update": "نظام",
"updates": "تحديثات",
"update_available": "تحديث متاح",
"up_to_date": "حتى الآن",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_updated": "محدث",
"containers_failed": "فشل"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "مصدق",
"rejectedPushes": "مرفوض",
"filters": "المرشحات",
"indexers": "مفهرسات"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "إنتظار",
"videos": "الفيديوهات",
"channels": "القنوات",
"playlists": "قوائم التشغيل"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "حمل النظام",
"uptime": "مدة التشغيل",
"alerts": "تنبيهات",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"please_wait": "الرجاء الإنتظار"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
"speed": "السرعة",
"active": "نشط",
"queue": "إنتظار",
"total": "مجموع"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
"public_ip": "العام IP",
"region": "منطقة",
"country": "الدولة"
},
"hdhomerun": {
"channels": "Channels",
"channels": "قنوات",
"hd": "HD"
},
"ping": {
"error": "Error",
"error": "خطأ",
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "إجتاز",
"failed": "فشل",
"unknown": "مجهول"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "صندوق الوارد",
"total": "المجموع"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"download": "تنزيل",
"upload": "تحميل",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"download": "التنزيل",
"upload": "التحميل",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "إنتظار",
"processed": "معالجة",
"errored": "خطأ",
"saved": "حفظ"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "قراءة",
"unread": "غير مقروء"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "الرجاء الإنتظار",
"no_devices": "لم يتم استلام بيانات الجهاز"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedAp": "المتصلة APs",
"activeUser": "الأجهزة النشطة",
"alerts": "تنبيهات",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"download": "تنزيل",
"upload": "تحميل",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"cpuLoad": "حمل المعالج",
"memoryUsed": "الذاكرة الستخدمة",
"uptime": "مدة التشغيل",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_xepg": "XEPG قنوات"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "حمل المعالج",
"memory": "الذاكرة النشطة",
"wanUpload": "WAN التحميل",
"wanDownload": "WAN التنزيل"
},
"moonraker": {
"printer_state": "حالة الطابعة",
"print_status": "حالة الطابعة",
"print_progress": "تقدم",
"layers": "طبقات"
},
"medusa": {
"wanted": "مطلوب",
"queued": "في الإنتظار",
"series": "سلسلة"
},
"octoprint": {
"printer_state": "حالة",
"temp_tool": "أداة درجة الحرارة",
"temp_bed": "درجة حرارة السرير",
"job_completion": "إتمام"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "حالة"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"print_progress": "Progress",
"printer_state": "Printer State",
"print_status": "Print Status",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+37 -2
View File
@@ -184,7 +184,7 @@
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
},
"proxmox": {
"vms": "Màquines Virtuals",
"vms": "VMs",
"mem": "Memòria",
"cpu": "Processador",
"lxc": "LXC"
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Marcador",
"service": "Servei"
"service": "Servei",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "Sistema",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -291,7 +291,9 @@
},
"quicklaunch": {
"bookmark": "Záložka",
"service": "Služba"
"service": "Služba",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"update_available": "Dostupná aktualizace",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"print_progress": "Progress",
"printer_state": "Printer State",
"print_status": "Print Status",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -287,7 +287,9 @@
},
"quicklaunch": {
"bookmark": "Bogmærker",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"watchtower": {
"containers_scanned": "Scannet",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Lesezeichen",
"service": "Dienst"
"service": "Dienst",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"cpu_usage": "CPU",
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+44 -2
View File
@@ -255,6 +255,11 @@
"status_count": "Posts",
"domain_count": "Domains"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
@@ -277,7 +282,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"wmo": {
"0-day": "Sunny",
@@ -412,5 +419,40 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
},
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime",
"incident": "Incident",
"m": "m"
}
}
}
+36 -1
View File
@@ -235,7 +235,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Servo"
"service": "Servo",
"search": "Search",
"custom": "Custom"
},
"wmo": {
"0-day": "Suna",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"layers": "Layers",
"print_progress": "Progress"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+47 -12
View File
@@ -164,7 +164,7 @@
"qbittorrent": {
"download": "Bajada",
"upload": "Subida",
"leech": "Leech",
"leech": "Depender",
"seed": "Semillas"
},
"mastodon": {
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Marcadores",
"service": "Servicio"
"service": "Servicio",
"search": "Buscar",
"custom": "Personalizado"
},
"homebridge": {
"available_update": "Sistema",
@@ -347,14 +349,14 @@
"deluge": {
"download": "Descarga",
"upload": "Subida",
"leech": "Leech",
"leech": "Depender",
"seed": "Semilla"
},
"flood": {
"download": "Descargar",
"upload": "Subir",
"leech": "Leech",
"seed": "Seed"
"leech": "Depender",
"seed": "Semillas"
},
"tdarr": {
"queue": "Cola",
@@ -394,14 +396,47 @@
"numberOfLeases": "Alquileres"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Todas las corrientes",
"streams_active": "Corrientes activas",
"streams_xepg": "Canales XEPG"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "Carga de la CPU",
"memory": "Memoria activa",
"wanUpload": "Carga WAN",
"wanDownload": "Descargar WAN"
},
"moonraker": {
"printer_state": "Estado de la impresora",
"print_status": "Estado de la impresora",
"print_progress": "Progreso",
"layers": "Capas"
},
"medusa": {
"wanted": "Querido",
"queued": "A la espera",
"series": "Serie"
},
"octoprint": {
"temp_bed": "Bed temp",
"printer_state": "Status",
"temp_tool": "Tool temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "IP de origen",
"status": "Estado"
},
"proxmoxbackupserver": {
"cpu_usage": "CPU",
"datastore_usage": "Almacén de datos",
"failed_tasks_24h": "Tareas fallidas en 24h",
"memory_usage": "Memoria"
},
"immich": {
"users": "Usuarios",
"photos": "Fotos",
"videos": "Vídeos",
"storage": "Almacenamiento"
}
}
+38 -3
View File
@@ -194,7 +194,7 @@
"uptime": "System Uptime",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"wait": "Please wait",
"wait": "Odota, ole hyvä",
"days": "Days",
"wan": "WAN",
"up": "UP",
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -314,7 +316,7 @@
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"please_wait": "Odota, ole hyvä"
},
"pyload": {
"speed": "Speed",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Haluttu",
"queued": "Jonossa",
"series": "Sarja"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+40 -5
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Signet",
"service": "Service"
"service": "Service",
"search": "Recherche",
"custom": "Personnalisé"
},
"homebridge": {
"available_update": "Système",
@@ -399,9 +401,42 @@
"streams_xepg": "Canal XEPG"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "Charge CPU",
"memory": "Mém. Utilisée",
"wanUpload": "WAN Envoi",
"wanDownload": "WAN Récep."
},
"moonraker": {
"printer_state": "État Imprimante",
"print_status": "Statut Imprimante",
"print_progress": "Progression",
"layers": "Couches"
},
"medusa": {
"wanted": "Demande",
"queued": "En attente",
"series": "Séries"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Achèvement"
},
"cloudflared": {
"origin_ip": "IP Publique",
"status": "Statut"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Tâches échouées 24h",
"cpu_usage": "CPU",
"memory_usage": "Mémoire"
},
"immich": {
"users": "Utilisateurs",
"photos": "Photos",
"videos": "Vidéos",
"storage": "Stockage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -225,7 +225,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"wmo": {
"0-day": "Sunny",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+70 -35
View File
@@ -77,13 +77,13 @@
"emby": {
"playing": "Reprodukcija",
"transcoding": "Prekodiranje",
"bitrate": "Brzina prijenosa",
"bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa"
},
"tautulli": {
"playing": "Reprodukcija",
"transcoding": "Prekodiranje",
"bitrate": "Brzina prijenosa",
"bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa"
},
"nzbget": {
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Straničnik",
"service": "Usluga"
"service": "Usluga",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "Sustav",
@@ -347,61 +349,94 @@
"deluge": {
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Leech",
"seed": "Seed"
"leech": "Korištenje tuđeg sadržaja",
"seed": "Prenošenje preuzetog sadržaja"
},
"flood": {
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Leech",
"seed": "Seed"
"leech": "Korištenje tuđeg sadržaja",
"seed": "Prenošenje preuzetog sadržaja"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "Red čekanja",
"processed": "Obrađeno",
"errored": "S greškom",
"saved": "Spremljeno"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Pročitano",
"unread": "Nepročitano"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Pričekaj",
"no_devices": "Podaci o uređaju nisu primljeni"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
"connectedAp": "Povezani AP-ovi",
"activeUser": "Aktivni uređaji",
"alerts": "Upozorenja",
"connectedGateway": "Povezani pristupi",
"connectedSwitches": "Povezani prekidači"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Korištenje tuđeg sadržaja",
"seed": "Prenošenje preuzetog sadržaja"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
"cpuLoad": "CPU opterećenje",
"memoryUsed": "Korištena memorija",
"uptime": "Radno vrijeme",
"numberOfLeases": "Unajmljivanja"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Svi prijenosi",
"streams_active": "Aktivni prijenosi",
"streams_xepg": "XEPG kanali"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "CPU opterećenje",
"memory": "Aktivna memorija",
"wanUpload": "WAN prijenos",
"wanDownload": "WAN preuzimanje"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"layers": "Layers",
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+49 -14
View File
@@ -51,7 +51,7 @@
"total": "Totale",
"free": "Libero",
"used": "In utilizzo",
"load": "Carica",
"load": "Carico",
"cpu": "CPU"
},
"rutorrent": {
@@ -175,7 +175,7 @@
"strelaysrv": {
"numActiveSessions": "Sessioni",
"numConnections": "Connessioni",
"dataRelayed": "Ritrasmettessi",
"dataRelayed": "Ritrasmessi",
"transferRate": "Velocità"
},
"authentik": {
@@ -222,10 +222,10 @@
"wmo": {
"65-day": "Pioggia Intensa",
"2-night": "Parzialmente Nuvoloso",
"0-day": "Solleggiato",
"0-night": "Pulisci",
"1-day": "Principalmente Soleggiato",
"1-night": "Principalmente Sereno",
"0-day": "Soleggiato",
"0-night": "Sereno",
"1-day": "Prevalentemente Soleggiato",
"1-night": "Prevalentemente Sereno",
"2-day": "Parzialmente Nuvoloso",
"3-day": "Nuvoloso",
"3-night": "Nuvoloso",
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Segnalibro",
"service": "Servizio"
"service": "Servizio",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "Sistema",
@@ -314,7 +316,7 @@
},
"navidrome": {
"nothing_streaming": "Nessun Sistema Attivo",
"please_wait": "Attendere, Prego"
"please_wait": "Attendere prego"
},
"pyload": {
"speed": "Velocità",
@@ -391,17 +393,50 @@
"cpuLoad": "Carico della CPU",
"memoryUsed": "Memoria Utilizzata",
"uptime": "Tempo di attività",
"numberOfLeases": "Leases"
"numberOfLeases": "Lease"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Tutti gli stream",
"streams_active": "Stream attivi",
"streams_xepg": "Canali XEPG"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"cpu": "Carico CPU",
"memory": "Memoria in uso",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+442
View File
@@ -0,0 +1,442 @@
{
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"npm": {
"total": "Total",
"enabled": "Enabled",
"disabled": "Disabled"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"glances": {
"mem": "MEM",
"cpu": "CPU",
"wait": "Please wait"
},
"autobrr": {
"filters": "Filters",
"indexers": "Indexers",
"approvedPushes": "Approved",
"rejectedPushes": "Rejected"
},
"gluetun": {
"region": "Region",
"country": "Country",
"public_ip": "Public IP"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"widget": {
"api_error": "APIエラー",
"information": "情報",
"missing_type": "見つからないウィジェットタイプ: {{type}}",
"status": "ステータス",
"url": "URL",
"raw_error": "生のエラー",
"response_data": "レスポンスデータ"
},
"weather": {
"current": "Current Location",
"allow": "Click to allow",
"updating": "Updating",
"wait": "Please wait"
},
"search": {
"placeholder": "Search…"
},
"resources": {
"cpu": "CPU",
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline",
"error": "Error",
"unknown": "Unknown"
},
"ping": {
"error": "Error",
"ping": "Ping"
},
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
},
"rutorrent": {
"active": "Active",
"upload": "Upload",
"download": "Download"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Movies"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"overseerr": {
"pending": "Pending",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"wmo": {
"0-day": "Sunny",
"1-day": "Mainly Sunny",
"0-night": "Clear",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-day": "Drizzle",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"temp_bed": "Bed temp",
"printer_state": "Status",
"temp_tool": "Tool temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+442
View File
@@ -0,0 +1,442 @@
{
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"widget": {
"missing_type": "Iztrūkst logrīka tips: {{type}}",
"api_error": "API kļūda",
"information": "Informācija",
"status": "Statuss",
"url": "URL",
"raw_error": "Kļūda",
"response_data": "Atbilde"
},
"weather": {
"current": "Pašreizējā atrašanās vieta",
"allow": "Piemiedziet, lai atļaut",
"updating": "Atjaunina",
"wait": "Lūdzu, uzgaidiet"
},
"search": {
"placeholder": "Meklēt…"
},
"resources": {
"cpu": "CPU",
"total": "Kopā",
"free": "Brīvs",
"used": "Izmantojas",
"load": "Ielādē"
},
"unifi": {
"users": "Lietotāji",
"uptime": "Sistēmas darbības laiks",
"days": "Dienas",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Ierīces",
"lan_devices": "LAN ierīces",
"wlan_devices": "WLAN ierīces",
"lan_users": "LAN lietotāji",
"wlan_users": "WLAN lietotāji",
"up": "DARBOJAS",
"down": "NEDARBOJAS",
"wait": "Lūdzu, uzgaidiet"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "Atmiņa",
"cpu": "CPU",
"offline": "Bezsaistē",
"error": "Kļūda",
"unknown": "Nezināms"
},
"ping": {
"error": "Kļūda",
"ping": "Ping"
},
"emby": {
"playing": "Atskaņo",
"transcoding": "Pārkodē",
"bitrate": "Bitrate",
"no_active": "Nav aktīvu straumju"
},
"flood": {
"download": "Lejupielāde",
"upload": "Augšupielāde",
"leech": "Ņēmēji",
"seed": "Devēji"
},
"changedetectionio": {
"totalObserved": "Kopā novēro",
"diffsDetected": "Atšķirības atrastas"
},
"tautulli": {
"playing": "Atskaņo",
"transcoding": "Pārkodē",
"bitrate": "Bitrate",
"no_active": "Nav aktīvu straumju"
},
"omada": {
"connectedAp": "Savienotie piekļuves punkti",
"activeUser": "Aktīvās ierīces",
"alerts": "Paziņojumi",
"connectedGateway": "Savienotās vārtejas",
"connectedSwitches": "Savienotie komutatori"
},
"nzbget": {
"rate": "Rate",
"remaining": "Palika",
"downloaded": "Lejupielādēts"
},
"plex": {
"streams": "Aktīvās straumes",
"movies": "Filmas",
"tv": "TV pārraides"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Rindā",
"timeleft": "Atlikušais laiks"
},
"rutorrent": {
"active": "Aktīvs",
"upload": "Augšupielāde",
"download": "Lejupielāde"
},
"transmission": {
"download": "Lejupielāde",
"upload": "Augšupielāde",
"leech": "Leech",
"seed": "Devēji"
},
"qbittorrent": {
"download": "Lejupielāde",
"upload": "Augšupielāde",
"leech": "Leech",
"seed": "Devēji"
},
"deluge": {
"download": "Lejupielāde",
"upload": "Augšupielāde",
"leech": "Leech",
"seed": "Devēji"
},
"downloadstation": {
"download": "Download",
"upload": "Augšupielāde",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Filmas"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albumi"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Grāmatas"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"overseerr": {
"pending": "Pending",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"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"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"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"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"wmo": {
"0-day": "Saulains",
"0-night": "Skaidrs",
"1-day": "Galvenokārt saulains",
"1-night": "Galvenokārt skaidrs",
"2-day": "Daļēji apmācies",
"2-night": "Daļēji apmācies",
"3-day": "Apmācies",
"3-night": "Apmācies",
"45-day": "Miglains",
"45-night": "Miglains",
"48-day": "Miglains",
"48-night": "Miglains",
"51-day": "Neliels lietus",
"51-night": "Neliels lietus",
"53-day": "Lietus",
"53-night": "Lietus",
"55-day": "Spēcīgs lietus",
"55-night": "Spēcīgs lietus",
"56-day": "Neliels stindzinošs lietus",
"56-night": "Neliels stindzinošs lietus",
"57-day": "Sasalstošs lietus",
"57-night": "Freezing Drizzle",
"61-day": "Viegls lietus",
"61-night": "Viegls lietus",
"63-day": "Lietus",
"63-night": "Lietus",
"65-day": "Spēcīgs lietus",
"65-night": "Spēcīgs lietus",
"66-day": "Ledains lietus",
"66-night": "Ledains lietus",
"67-day": "Ledains lietus",
"67-night": "Ledains lietus",
"71-day": "Neliels sniegs",
"71-night": "Neliels sniegs",
"73-day": "Sniegs",
"73-night": "Sniegs",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -62,7 +62,9 @@
},
"quicklaunch": {
"bookmark": "Tandabuku",
"service": "Servis"
"service": "Servis",
"search": "Search",
"custom": "Custom"
},
"wmo": {
"0-day": "Terik",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+53 -18
View File
@@ -3,16 +3,16 @@
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"status": "Status",
"information": "Information",
"information": "Informatie",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "Raw Fout",
"response_data": "Reactiegegevens"
},
"resources": {
"total": "Totaal",
"free": "Vrij",
"used": "Gebruikt",
"load": "Load",
"load": "Laadt",
"cpu": "CPU"
},
"docker": {
@@ -21,8 +21,8 @@
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline",
"error": "Error",
"unknown": "Unknown"
"error": "Fout",
"unknown": "Onbekend"
},
"speedtest": {
"upload": "Upload",
@@ -190,20 +190,20 @@
"vms": "VMs"
},
"unifi": {
"users": "Users",
"lan_users": "LAN Users",
"uptime": "System Uptime",
"days": "Days",
"users": "Gebruikers",
"lan_users": "LAN Gebruikers",
"uptime": "Uptime van het systeem",
"days": "Dagen",
"wan": "WAN",
"wlan_users": "WLAN Users",
"wlan_users": "WLAN Gebruikers",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"wait": "Wachten aub",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices"
"devices": "Apparaten",
"lan_devices": "LAN Apparaten",
"wlan_devices": "WLAN Apparaten"
},
"plex": {
"streams": "Active Streams",
@@ -216,7 +216,7 @@
"wait": "Please wait"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"totalObserved": "Totaal waargenomen",
"diffsDetected": "Diffs Detected"
},
"wmo": {
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -332,7 +334,7 @@
"hd": "HD"
},
"ping": {
"error": "Error",
"error": "Fout",
"ping": "Ping"
},
"scrutiny": {
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+43 -8
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Zakładka",
"service": "Usługi"
"service": "Usługi",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -394,14 +396,47 @@
"numberOfLeases": "Dzierżawy"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Wszystkie strumienie",
"streams_active": "Aktywne strumienie",
"streams_xepg": "Kanały XEPG"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "Obciążenie procesora",
"memory": "Pamięć rzeczywista",
"wanUpload": "WAN wysyłanie",
"wanDownload": "WAN pobieranie"
},
"moonraker": {
"printer_state": "Stan drukarki",
"print_status": "Status wydruku",
"print_progress": "Postęp",
"layers": "Warstwy"
},
"medusa": {
"wanted": "Poszukiwane",
"queued": "Zakolejkowane",
"series": "Seria"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+87 -52
View File
@@ -31,10 +31,10 @@
"missing_type": "Tipo de Widget ausente: {{type}}",
"api_error": "Erro da API",
"status": "Status",
"information": "Information",
"information": "Informação",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"response_data": "Dados de Resposta"
},
"weather": {
"current": "Localização atual",
@@ -53,13 +53,13 @@
"cpu": "CPU"
},
"docker": {
"rx": "Rx",
"tx": "Tx",
"mem": "Mem",
"rx": "Recebido",
"tx": "Transmitido",
"mem": "Memória",
"cpu": "CPU",
"offline": "Desligado",
"error": "Error",
"unknown": "Unknown"
"error": "Erro",
"unknown": "Desconhecido"
},
"emby": {
"playing": "Reproduzindo",
@@ -99,7 +99,7 @@
"wanted": "Desejado",
"queued": "Na fila",
"movies": "Filmes",
"missing": "Missing"
"missing": "Faltando"
},
"lidarr": {
"wanted": "Desejado",
@@ -129,7 +129,7 @@
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível",
"processing": "Processing"
"processing": "Processando"
},
"pihole": {
"queries": "Consultas",
@@ -148,9 +148,9 @@
"ping": "Ping"
},
"traefik": {
"routers": "Rotas",
"routers": "Roteadores",
"services": "Serviços",
"middleware": "Middleware"
"middleware": "Software intermediario"
},
"npm": {
"enabled": "Habilitado",
@@ -164,10 +164,10 @@
},
"prowlarr": {
"enableIndexers": "Indexadores",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfGrabs": "Pegos",
"numberOfQueries": "Consultas",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
"numberOfFailQueries": "Consultas Falhas"
},
"jackett": {
"configured": "Configurado",
@@ -179,36 +179,36 @@
"domain_count": "Domínios"
},
"authentik": {
"users": "Users",
"users": "Usuários",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"mem": "Memória",
"cpu": "Processador",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"users": "Usuários",
"uptime": "Tempo de Funcionamento",
"days": "Dias",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"lan_users": "Usuarios locais",
"wlan_users": "Usuarios WLAN",
"up": "LIGADO",
"down": "CÁIDO",
"wait": "Por favor guarde",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices"
"devices": "Dispositivos",
"lan_devices": "Dispositivos LAN",
"wlan_devices": "Dispositivos WLAN"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"streams": "Transmissões ativas",
"movies": "Filmes",
"tv": "Séries de TV"
},
"glances": {
"cpu": "CPU",
@@ -222,10 +222,10 @@
"wmo": {
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"2-night": "Parcialmente nublado",
"3-day": "Nublado",
"3-night": "Nublado",
"45-day": "Névoa",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
@@ -233,9 +233,9 @@
"57-day": "Freezing Drizzle",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail",
"0-day": "Sunny",
"0-day": "Ensolarado",
"53-day": "Drizzle",
"0-night": "Clear",
"0-night": "Limpo",
"1-day": "Mainly Sunny",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -313,8 +315,8 @@
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "Sem transmissões ativas",
"please_wait": "Por favor aguarde"
},
"pyload": {
"speed": "Speed",
@@ -332,7 +334,7 @@
"hd": "HD"
},
"ping": {
"error": "Error",
"error": "Erro",
"ping": "Ping"
},
"scrutiny": {
@@ -357,14 +359,14 @@
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "Fila",
"processed": "Processado",
"errored": "Erro",
"saved": "Salvo"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Lidos",
"unread": "Não Lidos"
},
"nextdns": {
"wait": "Please Wait",
@@ -375,11 +377,11 @@
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
"connectedAp": "Pontos de acesso conectados",
"activeUser": "Dispositivos ativos",
"alerts": "Alertas",
"connectedGateway": "Gateways conectados",
"connectedSwitches": "Interruptores conectados"
},
"downloadstation": {
"download": "Download",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+134 -99
View File
@@ -1,6 +1,6 @@
{
"widget": {
"missing_type": "Widget ausente: {{type}}",
"missing_type": "Tipo de Widget ausente: {{type}}",
"api_error": "Erro da API",
"status": "Estado",
"information": "Informação",
@@ -14,8 +14,8 @@
"resources": {
"total": "Total",
"free": "Livre",
"used": "Usado",
"load": "Carregar",
"used": "Utilizado",
"load": "Carga",
"cpu": "CPU"
},
"docker": {
@@ -53,7 +53,7 @@
"wanted": "Desejado",
"queued": "Fila",
"movies": "Filmes",
"missing": "Missing"
"missing": "Faltando"
},
"readarr": {
"wanted": "Desejados",
@@ -111,14 +111,14 @@
"weather": {
"current": "Localização atual",
"allow": "Clicar para permitir",
"updating": "A atualizar",
"updating": "Atualizando",
"wait": "Por favor aguarde"
},
"overseerr": {
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível",
"processing": "Processing"
"processing": "Processando"
},
"sabnzbd": {
"rate": "Taxa",
@@ -192,9 +192,9 @@
"transferRate": "Taxa"
},
"authentik": {
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)",
"users": "Users"
"loginsLast24H": "Inícios de sessão (24h)",
"failedLoginsLast24H": "Inícios de sessão falhados (24h)",
"users": "Utilizadores"
},
"proxmox": {
"mem": "MEM",
@@ -204,13 +204,13 @@
},
"unifi": {
"users": "Utilizadores",
"uptime": "Tempo de Atividade do Sistema",
"uptime": "Sistema Ativo",
"days": "Dias",
"wan": "WAN",
"lan_users": "Utilizadores LAN",
"wlan_users": "Utilizadores WLAN",
"up": "Ligados",
"down": "Desligados",
"up": "Ligado",
"down": "Desligado",
"wait": "Por favor, aguarde",
"lan": "LAN",
"wlan": "WLAN",
@@ -241,7 +241,7 @@
"2-night": "Parcialmente nublado",
"3-day": "Nublado",
"3-night": "Nublado",
"99-night": "Thunderstorm With Hail",
"99-night": "Trovoada com granizo",
"45-day": "Nevoeiro",
"45-night": "Nevoeiro",
"48-day": "Nevoeiro",
@@ -257,160 +257,195 @@
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"66-day": "Freezing Rain",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"65-day": "Heavy Rain",
"61-day": "Chuva fraca",
"61-night": "Chuva fraca",
"63-day": "Chuva",
"63-night": "Chuva",
"65-day": "Chuva forte",
"66-night": "Freezing Rain",
"65-night": "Heavy Rain",
"65-night": "Chuva forte",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"71-day": "Neve fraca",
"71-night": "Neve fraca",
"73-day": "Neve",
"73-night": "Neve",
"75-day": "Neve forte",
"75-night": "Neve forte",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"80-day": "Neve fraca",
"80-night": "Chuviscos ligeiros",
"81-day": "Chuviscos",
"81-night": "Chuviscos",
"82-day": "Chuviscos fortes",
"82-night": "Chuviscos fortes",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail"
"95-day": "Trovoada",
"95-night": "Trovoada",
"96-day": "Trovoada com granizo",
"96-night": "Trovoada com granizo",
"99-day": "Trovoada com granizo"
},
"quicklaunch": {
"bookmark": "Marcador",
"service": "Serviço"
"service": "Serviço",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"available_update": "Sistema",
"updates": "Atualizações",
"update_available": "Atualização disponível",
"up_to_date": "Atualizado",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "Aprovado",
"rejectedPushes": "Rejeitado",
"filters": "Filtros",
"indexers": "Indexadores"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_scanned": "Verificado",
"containers_updated": "Atualizado",
"containers_failed": "Falhou"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "Fila",
"videos": "Vídeos",
"channels": "Canais",
"playlists": "Listas"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "Carga do sistema",
"uptime": "Ligado",
"alerts": "Alertas",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "Sem streams ativos",
"please_wait": "Por favor aguarde"
},
"pyload": {
"queue": "Queue",
"queue": "Fila",
"total": "Total",
"speed": "Speed",
"active": "Active"
"speed": "Velocidade",
"active": "Ativo"
},
"gluetun": {
"region": "Region",
"country": "Country",
"public_ip": "Public IP"
"region": "Região",
"country": "País",
"public_ip": "IP público"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Canais",
"hd": "HD"
},
"ping": {
"error": "Erro",
"ping": "Ping"
"ping": "Tempo de resposta"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Aprovado",
"failed": "Falhou",
"unknown": "Desconhecido"
},
"paperlessngx": {
"inbox": "Inbox",
"inbox": "Caixa de entrada",
"total": "Total"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"download": "Descarregar",
"upload": "Enviar",
"leech": "Leech",
"seed": "Seed"
"seed": "Semente"
},
"flood": {
"download": "Descarregar",
"upload": "Carregar",
"leech": "Leech",
"seed": "Seed"
"seed": "Semente"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "Fila",
"processed": "Processado",
"errored": "Erro",
"saved": "Guardado"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Lido",
"unread": "Não lido"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Aguarde",
"no_devices": "Nenhum dado do dispositivo recebido"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
"connectedAp": "APs Ligados",
"activeUser": "Dispositivos activos",
"alerts": "Alertas",
"connectedGateway": "Gateways ligados",
"connectedSwitches": "Switches ligados"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"download": "Descarregar",
"upload": "Enviar",
"leech": "Leech",
"seed": "Seed"
"seed": "Semente"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"cpuLoad": "Carga do CPU",
"memoryUsed": "Memória Utilizada",
"uptime": "Ativo",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Todos os Streams",
"streams_active": "Streams ativos",
"streams_xepg": "Canais XEPG"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "Carga do CPU",
"memory": "Memória Ativa",
"wanUpload": "Envio WAN",
"wanDownload": "WAN Descarga"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"update_available": "Update Available",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"print_progress": "Progress",
"printer_state": "Printer State",
"print_status": "Print Status",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "బుక్మార్క్",
"service": "సేవ"
"service": "సేవ",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "వ్యవస్థ",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Yer İmi",
"service": "Hizmet"
"service": "Hizmet",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "Sistem",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+186 -151
View File
@@ -23,8 +23,8 @@
"deluge": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
"leech": "Ліч",
"seed": "Сід"
},
"readarr": {
"wanted": "Розшукується",
@@ -32,76 +32,76 @@
"books": "Книжки"
},
"wmo": {
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"0-day": "Sunny",
"0-night": "Clear",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"53-day": "Drizzle",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-night": "Drizzle",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"81-night": "Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"55-day": "Сильна мряка",
"55-night": "Сильна мряка",
"56-day": "Невеликий морозний дощ",
"56-night": "Невеликий морозний дощ",
"0-day": "Сонячно",
"0-night": "Ясно",
"1-day": "Переважно сонячно",
"1-night": "Переважно ясно",
"2-day": "Частково хмарно",
"2-night": "Частково хмарно",
"3-day": "Хмарно",
"3-night": "Хмарно",
"53-day": "Мряка",
"45-day": "Туманно",
"45-night": "Туманно",
"48-day": "Туманно",
"48-night": "Туманно",
"51-day": "Легка мряка",
"51-night": "Легка мряка",
"53-night": "Мряка",
"57-day": "Морозний дощ",
"57-night": "Морозний дощ",
"61-day": "Невеликий дощ",
"61-night": "Невеликий дощ",
"63-day": "Дощ",
"63-night": "Дощ",
"65-day": "Сильний дощ",
"65-night": "Сильний дощ",
"66-day": "Холодний дощ",
"66-night": "Холодний дощ",
"67-day": "Холодний дощ",
"67-night": "Холодний дощ",
"71-day": "Невеликий сніг",
"71-night": "Невеликий сніг",
"73-day": "Сніг",
"73-night": "Сніг",
"75-day": "Снігопад",
"75-night": "Снігопад",
"77-day": "Снігові зерна",
"77-night": "Снігові зерна",
"80-day": "Невелика злива",
"80-night": "Невелика злива",
"81-day": "Злива",
"82-day": "Сильна злива",
"82-night": "Сильна злива",
"81-night": "Злива",
"85-day": "Дощ зі снігом",
"85-night": "Дощ зі снігом",
"86-day": "Дощ зі снігом",
"86-night": "Дощ зі снігом",
"95-day": "Гроза",
"95-night": "Гроза",
"96-day": "Гроза з градом",
"96-night": "Гроза з градом",
"99-day": "Гроза з градом",
"99-night": "Гроза з градом"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
"speed": "Швидкість",
"active": "Активно",
"queue": "Черга",
"total": "Всього"
},
"gluetun": {
"country": "Country",
"public_ip": "Public IP",
"region": "Region"
"country": "Країна",
"public_ip": "Публічний IP",
"region": "Регіон"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Канали",
"hd": "HD"
},
"widget": {
@@ -167,8 +167,8 @@
"flood": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
"leech": "Ліч",
"seed": "Сід"
},
"changedetectionio": {
"totalObserved": "Всього спостережень",
@@ -193,20 +193,20 @@
"transmission": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
"leech": "Ліч",
"seed": "Сід"
},
"qbittorrent": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
"leech": "Ліч",
"seed": "Сід"
},
"downloadstation": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
"leech": "Ліч",
"seed": "Сід"
},
"sonarr": {
"wanted": "Розшукується",
@@ -225,13 +225,13 @@
"albums": "Альбоми"
},
"traefik": {
"middleware": "Middleware",
"middleware": "Проміжне програмне забезпечення",
"routers": "Роутери",
"services": "Сервіси"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "Немає активних потоків",
"please_wait": "Будь ласка, зачекайте"
},
"bazarr": {
"missingEpisodes": "Відсутні епізоди",
@@ -281,127 +281,162 @@
"saved": "Збережено"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
"enabled": "Увімкнено",
"disabled": "Вимкнено",
"total": "Всього"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
"configure": "Налаштуйте одну або кілька криптовалют для відстеження",
"1hour": "1 година",
"1day": "1 день",
"7days": "7 днів",
"30days": "30 днів"
},
"mastodon": {
"domain_count": "Domains",
"user_count": "Users",
"status_count": "Posts"
"domain_count": "Домени",
"user_count": "Користувачі",
"status_count": "Пости"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Прочитано",
"unread": "Не прочитано"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
"apps": "Застосунки",
"clients": "Клієнти",
"messages": "Повідомлення"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
"enableIndexers": "Індексатори",
"numberOfGrabs": "Захоплення",
"numberOfQueries": "Запити",
"numberOfFailGrabs": "Невдалі захоплення",
"numberOfFailQueries": "Невдалі запити"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
"configured": "Налаштовано",
"errored": "Помилка"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
"numActiveSessions": "Сесії",
"numConnections": "Підключення",
"dataRelayed": "Ретрансльовано",
"transferRate": "Швидкість"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"users": "Користувачі",
"loginsLast24H": "Вхід (24 години)",
"failedLoginsLast24H": "Невдалі входи (24 години)"
},
"proxmox": {
"mem": "MEM",
"mem": "Пам'ять",
"cpu": "CPU",
"vms": "VMs",
"lxc": "LXC"
"vms": "Віртуальні машини",
"lxc": "Контейнери Linux"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
"mem": "Пам'ять",
"wait": "Будь ласка, зачекайте"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"bookmark": "Закладка",
"service": "Сервіс",
"search": "Пошук",
"custom": "Користувацький"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"available_update": "Система",
"updates": "Оновлення",
"child_bridges_status": "{{ok}}/{{total}}",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges"
"update_available": "Доступне оновлення",
"up_to_date": "Актуально",
"child_bridges": "Дитячі мости"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_scanned": "Відскановано",
"containers_updated": "Оновлено",
"containers_failed": "Невдача"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "Схвалено",
"rejectedPushes": "Відхилено",
"filters": "Фільтри",
"indexers": "Індексатори"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "Черга",
"videos": "Відео",
"channels": "Канали",
"playlists": "Плейлисти"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "Завантаження системи",
"uptime": "Час роботи",
"alerts": "Сповіщення",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Пройшов",
"failed": "Невдача",
"unknown": "Невідомо"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "Вхідні",
"total": "Всього"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Будь ласка, зачекайте",
"no_devices": "Дані про пристрій не отримано"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
"cpuLoad": "Завантаження CPU",
"memoryUsed": "Використана пам'ять",
"uptime": "Час роботи",
"numberOfLeases": "Оренди"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Всі потоки",
"streams_active": "Активні потоки",
"streams_xepg": "Канали XEPG"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "Завантаження CPU",
"memory": "Активна пам'ять",
"wanUpload": "Вивантаження WAN",
"wanDownload": "Завантаження WAN"
},
"moonraker": {
"printer_state": "Стан принтера",
"print_status": "Статус друку",
"print_progress": "Прогрес",
"layers": "Шари"
},
"medusa": {
"wanted": "Розшукується",
"queued": "У черзі",
"series": "Серії"
},
"octoprint": {
"printer_state": "Стан",
"temp_tool": "Температура інструменту",
"temp_bed": "Температура ліжка",
"job_completion": "Завершення"
},
"cloudflared": {
"origin_ip": "Походження IP",
"status": "Стан"
},
"proxmoxbackupserver": {
"datastore_usage": "Сховище даних",
"failed_tasks_24h": "Невиконані завдання 24 години",
"cpu_usage": "CPU",
"memory_usage": "Пам'ять"
},
"immich": {
"users": "Користувачі",
"photos": "Фотографії",
"videos": "Відео",
"storage": "Сховище"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+36 -1
View File
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"service": "Service",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"print_progress": "Progress",
"layers": "Layers",
"printer_state": "Printer State",
"print_status": "Print Status"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+61 -26
View File
@@ -3,16 +3,16 @@
"missing_type": "缺少小部件类型:{{type}}",
"api_error": "API错误",
"status": "状态",
"information": "Information",
"information": "信息",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "原始错误",
"response_data": "返回数据"
},
"search": {
"placeholder": "搜索…"
},
"resources": {
"total": "共",
"total": "总计",
"free": "空闲",
"used": "已用",
"load": "负载",
@@ -24,8 +24,8 @@
"mem": "内存",
"cpu": "处理器",
"offline": "离线",
"error": "Error",
"unknown": "Unknown"
"error": "错误",
"unknown": "未知"
},
"emby": {
"playing": "播放中",
@@ -279,7 +279,9 @@
},
"quicklaunch": {
"bookmark": "书签",
"service": "服务"
"service": "服务",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
@@ -332,7 +334,7 @@
"hd": "HD"
},
"ping": {
"error": "Error",
"error": "错误",
"ping": "Ping"
},
"scrutiny": {
@@ -345,22 +347,22 @@
"total": "Total"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下载",
"upload": "上传",
"leech": "下载中",
"seed": "做种"
},
"flood": {
"leech": "Leech",
"download": "Download",
"upload": "Upload",
"seed": "Seed"
"leech": "下载中",
"download": "下载",
"upload": "上传",
"seed": "做种"
},
"tdarr": {
"saved": "Saved",
"queue": "Queue",
"queue": "队列",
"processed": "Processed",
"errored": "Errored"
"errored": "出错"
},
"miniflux": {
"read": "Read",
@@ -376,16 +378,16 @@
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
"activeUser": "活跃设备",
"alerts": "警报",
"connectedGateway": "已连接网关",
"connectedSwitches": "已连接开关"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下载",
"upload": "上传",
"leech": "下载中",
"seed": "做种"
},
"mikrotik": {
"cpuLoad": "CPU Load",
@@ -403,5 +405,38 @@
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+292 -257
View File
@@ -1,407 +1,442 @@
{
"widget": {
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"status": "Status",
"information": "Information",
"missing_type": "遺失小工具的類型: {{type}}",
"api_error": "API錯誤",
"status": "狀態",
"information": "資訊",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
},
"weather": {
"current": "Current Location",
"allow": "Click to allow",
"updating": "Updating",
"wait": "Please wait"
"current": "目前位置",
"allow": "點擊以允許",
"updating": "更新中",
"wait": "請稍後"
},
"docker": {
"rx": "RX",
"offline": "Offline",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"error": "Error",
"unknown": "Unknown"
"rx": "接收",
"offline": "離線",
"tx": "發送",
"mem": "記憶體",
"cpu": "處理器",
"error": "錯誤",
"unknown": "未知的"
},
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
"playing": "正在播放",
"transcoding": "轉碼",
"bitrate": "位元率",
"no_active": "無播放活動"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
"playing": "正在播放",
"transcoding": "轉碼",
"bitrate": "位元率",
"no_active": "無播放活動"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "待定",
"approved": "已接受",
"available": "可用的"
},
"search": {
"placeholder": "Search…"
"placeholder": "搜尋…"
},
"resources": {
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load",
"total": "全部",
"free": "剩餘",
"used": "已使用",
"load": "負載",
"cpu": "CPU"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
"rate": "速率",
"remaining": "剩餘",
"downloaded": "已下載"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
"rate": "速率",
"queue": "佇列",
"timeleft": "剩餘時間"
},
"rutorrent": {
"active": "Active",
"upload": "Upload",
"download": "Download"
"active": "活動中",
"upload": "上行速率",
"download": "下行速率"
},
"radarr": {
"movies": "Movies",
"wanted": "Wanted",
"queued": "Queued",
"missing": "Missing"
"movies": "電影",
"wanted": "關注中",
"queued": "已加入佇列",
"missing": "缺少"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "關注中",
"queued": "已加入佇列",
"series": "影集"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
"wanted": "關注中",
"queued": "已加入佇列",
"books": "書籍"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "待定",
"approved": "已接受",
"available": "可用的"
},
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"processing": "Processing"
"pending": "待定",
"approved": "已接受",
"available": "可用的",
"processing": "處理中"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"queries": "查詢",
"blocked": "已阻擋",
"gravity": "Gravity"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"upload": "上行速率",
"download": "下行速率",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
"running": "運行中",
"stopped": "未運行",
"total": "全部"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
"routers": "路由器",
"services": "服務",
"middleware": "中介軟體"
},
"gotify": {
"clients": "Clients",
"apps": "Applications",
"messages": "Messages"
"clients": "客戶端",
"apps": "應用程式",
"messages": "訊息"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
"enabled": "已啟用",
"disabled": "已停用",
"total": "全部"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
"configure": "請設定一個或多個欲追蹤的加密貨幣",
"1hour": "1小時",
"1day": "1天",
"7days": "7天",
"30days": "30天"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
"enableIndexers": "索引器",
"numberOfGrabs": "抓取",
"numberOfQueries": "查詢",
"numberOfFailGrabs": "抓取失敗",
"numberOfFailQueries": "查詢失敗"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下行速率",
"upload": "上行速率",
"leech": "未完成下載",
"seed": "已完成下載"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
"configured": "已配置",
"errored": "發生錯誤"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
"missingEpisodes": "缺少的劇集",
"missingMovies": "缺少的電影"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
"wanted": "關注中",
"queued": "已加入佇列",
"albums": "專輯"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
"queries": "查詢",
"blocked": "已阻擋",
"filtered": "已過濾",
"latency": "延遲"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下行速率",
"upload": "上行速率",
"leech": "未完成下載",
"seed": "已完成下載"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
"user_count": "使用者",
"status_count": "文章",
"domain_count": "網域"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
"numActiveSessions": "工作階段",
"numConnections": "連線",
"dataRelayed": "中繼",
"transferRate": "速率"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"users": "使用者",
"loginsLast24H": "登錄(24h)",
"failedLoginsLast24H": "登錄失敗(24h)"
},
"proxmox": {
"mem": "MEM",
"mem": "記憶體",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"users": "使用者",
"uptime": "系統運行時間",
"days": "天",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"lan_users": "LAN使用者",
"wlan_users": "WLAN使用者",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"wait": "請稍後",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices"
"devices": "設備",
"lan_devices": "LAN設備",
"wlan_devices": "WLAN設備"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"streams": "正在播放",
"movies": "電影",
"tv": "影集"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
"mem": "記憶體",
"wait": "請稍後"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
"totalObserved": "總監測數",
"diffsDetected": "偵測到的變更"
},
"wmo": {
"0-day": "Sunny",
"0-night": "Clear",
"71-day": "Light Snow",
"71-night": "Light Snow",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-day": "Drizzle",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"0-day": "晴",
"0-night": "晴朗",
"71-day": "小雪",
"71-night": "小雪",
"1-day": "晴時多雲",
"1-night": "晴時多雲",
"2-day": "多雲時陰",
"2-night": "多雲時陰",
"3-day": "陰天",
"3-night": "陰天",
"45-day": "有霧",
"45-night": "有霧",
"48-day": "有霧",
"48-night": "有霧",
"51-day": "小毛雨",
"51-night": "小毛雨",
"53-day": "毛雨",
"53-night": "毛雨",
"55-day": "大毛雨",
"55-night": "大毛雨",
"56-day": "小凍毛雨",
"56-night": "小凍毛雨",
"57-day": "凍毛雨",
"57-night": "凍毛雨",
"61-day": "小雨",
"61-night": "小雨",
"63-day": "雨",
"63-night": "雨",
"65-day": "大雨",
"65-night": "大雨",
"66-day": "凍雨",
"66-night": "凍雨",
"67-day": "凍雨",
"67-night": "凍雨",
"73-day": "雪",
"73-night": "雪",
"75-day": "大雪",
"75-night": "大雪",
"77-day": "雪粒",
"77-night": "雪粒",
"80-day": "微陣雨",
"80-night": "微陣雨",
"81-day": "陣雨",
"81-night": "陣雨",
"82-day": "強陣雨",
"82-night": "強陣雨",
"85-day": "陣雪",
"85-night": "陣雪",
"86-day": "陣雪",
"86-night": "陣雪",
"95-day": "雷雨",
"95-night": "雷雨",
"96-day": "雷雨伴隨冰雹",
"96-night": "雷雨伴隨冰雹",
"99-day": "雷雨伴隨冰雹",
"99-night": "雷雨伴隨冰雹"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"bookmark": "書籤",
"service": "服務",
"search": "Search",
"custom": "Custom"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"available_update": "系統",
"updates": "更新",
"update_available": "有可用的更新",
"up_to_date": "已更新至最新",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "接受",
"rejectedPushes": "拒絕",
"filters": "篩選器",
"indexers": "索引器"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_scanned": "已掃描",
"containers_updated": "已更新",
"containers_failed": "失敗"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "佇列",
"videos": "影片",
"channels": "頻道",
"playlists": "播放清單"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "系統負載",
"uptime": "運行時間",
"alerts": "警示",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "無播放活動",
"please_wait": "請稍後"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
"speed": "速度",
"active": "運行中",
"queue": "佇列",
"total": "全部"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
"public_ip": "公用IP",
"region": "地區",
"country": "國家"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
"channels": "頻道",
"hd": "高畫質"
},
"ping": {
"error": "Error",
"error": "錯誤",
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "通過",
"failed": "失敗",
"unknown": "未知的"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "收件箱",
"total": "全部"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下行速率",
"upload": "上行速率",
"leech": "未完成下載",
"seed": "已完成下載"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下行速率",
"upload": "上行速率",
"leech": "未完成下載",
"seed": "已完成下載"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "佇列",
"processed": "已處理",
"errored": "發生錯誤",
"saved": "已儲存"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "已讀",
"unread": "未讀"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "請稍後",
"no_devices": "未收到裝置資料"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
"connectedAp": "已連接的存取點",
"activeUser": "在線裝置",
"alerts": "警示",
"connectedGateway": "已連接的閘道",
"connectedSwitches": "已連接的交換器"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "下行速率",
"upload": "上行速率",
"leech": "未完成下載",
"seed": "已完成下載"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
"cpuLoad": "CPU負載",
"memoryUsed": "已使用的記憶體",
"uptime": "運行時間",
"numberOfLeases": "租約"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "所有播放活動",
"streams_active": "正在播放",
"streams_xepg": "XEPG頻道"
},
"opnsense": {
"cpu": "CPU Load",
"cpu": "CPU負載",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"wanUpload": "WAN上傳",
"wanDownload": "WAN下載"
},
"moonraker": {
"printer_state": "列印機狀態",
"print_status": "列印狀態",
"print_progress": "進度",
"layers": "層"
},
"medusa": {
"wanted": "關注中",
"queued": "已加入佇列",
"series": "影集"
},
"octoprint": {
"printer_state": "狀態",
"temp_tool": "噴頭溫度",
"temp_bed": "平台溫度",
"job_completion": "完成度"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
}
}
+1 -1
View File
@@ -19,7 +19,7 @@ export default function Item({ bookmark }) {
<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">
{bookmark.icon &&
<div className="flex-shrink-0 w-5 h-5">
<ResolvedIcon icon={bookmark.icon} />
<ResolvedIcon icon={bookmark.icon} alt={bookmark.abbr} />
</div>
}
{!bookmark.icon && bookmark.abbr}
+18 -8
View File
@@ -6,7 +6,7 @@ import ResolvedIcon from "./resolvedicon";
import { SettingsContext } from "utils/contexts/settings";
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions}) {
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions, searchProvider}) {
const { t } = useTranslation();
const { settings } = useContext(SettingsContext);
@@ -34,7 +34,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
function handleSearchKeyDown(event) {
if (!isOpen) return;
if (event.key === "Escape") {
closeAndReset();
event.preventDefault();
@@ -50,6 +50,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
}
}
function handleItemHover(event) {
setCurrentItemIndex(parseInt(event.target?.dataset?.index, 10));
}
@@ -75,6 +76,15 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
if (searchDescriptions) {
newResults = newResults.sort((a, b) => b.priority - a.priority);
}
if (searchProvider) {
newResults.push(
{
href: searchProvider.url + encodeURIComponent(searchString),
name: `${searchProvider.name ?? t("quicklaunch.custom")} ${t("quicklaunch.search")} `,
type: 'search',
}
)
}
setResults(newResults);
@@ -82,7 +92,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
setCurrentItemIndex(0);
}
}
}, [searchString, servicesAndBookmarks, searchDescriptions]);
}, [searchString, servicesAndBookmarks, searchDescriptions, searchProvider, t]);
const [hidden, setHidden] = useState(true);
@@ -90,7 +100,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
function handleBackdropClick(event) {
if (event.target?.tagName === "DIV") closeAndReset();
}
if (isOpen) {
searchField.current.focus();
document.body.addEventListener('click', handleBackdropClick);
@@ -135,20 +145,20 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50",
)} onClick={handleItemClick}>
<div className="flex flex-row items-center mr-4 pointer-events-none">
<div className="w-5 text-xs mr-4">
{(r.icon || r.abbr) && <div className="w-5 text-xs mr-4">
{r.icon && <ResolvedIcon icon={r.icon} />}
{r.abbr && r.abbr}
</div>
</div>}
<div className="flex flex-col md:flex-row text-left items-baseline mr-4 pointer-events-none">
<span className="mr-4">{r.name}</span>
{r.description &&
{r.description &&
<span className="text-xs text-theme-600 text-light">
{searchDescriptions && r.priority < 2 ? highlightText(r.description) : r.description}
</span>
}
</div>
</div>
<div className="text-xs text-theme-600 font-bold pointer-events-none">{r.type === 'service' ? t("quicklaunch.service") : t("quicklaunch.bookmark")}</div>
<div className="text-xs text-theme-600 font-bold pointer-events-none">{t(`quicklaunch.${r.type ? r.type.toLowerCase() : 'bookmark'}`)}</div>
</button>
</li>
))}
+4 -4
View File
@@ -1,9 +1,9 @@
import Image from "next/future/image";
export default function ResolvedIcon({ icon, width = 32, height = 32 }) {
export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "logo" }) {
// direct or relative URLs
if (icon.startsWith("http") || icon.startsWith("/")) {
return <Image src={`${icon}`} width={width} height={height} alt="logo" />;
return <Image src={`${icon}`} width={width} height={height} alt={alt} />;
}
// mdi- prefixed, material design icons
@@ -31,7 +31,7 @@ export default function ResolvedIcon({ icon, width = 32, height = 32 }) {
src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
width={width}
height={height}
alt="logo"
alt={alt}
/>
);
}
}
+22
View File
@@ -4,8 +4,10 @@ import { useContext, useState } from "react";
import Status from "./status";
import Widget from "./widget";
import Ping from "./ping";
import KubernetesStatus from "./kubernetes-status";
import Docker from "widgets/docker/component";
import Kubernetes from "widgets/kubernetes/component";
import { SettingsContext } from "utils/contexts/settings";
import ResolvedIcon from "components/resolvedicon";
@@ -89,6 +91,16 @@ export default function Item({ service }) {
<span className="sr-only">View container stats</span>
</button>
)}
{service.app && (
<button
type="button"
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
className="flex-shrink-0 flex items-center justify-center cursor-pointer"
>
<KubernetesStatus service={service} />
<span className="sr-only">View container stats</span>
</button>
)}
</div>
</div>
@@ -102,6 +114,16 @@ export default function Item({ service }) {
{statsOpen && <Docker service={{ widget: { container: service.container, server: service.server } }} />}
</div>
)}
{service.app && (
<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 && <Kubernetes service={{ widget: { namespace: service.namespace, app: service.app, podSelector: service.podSelector } }} />}
</div>
)}
{service.widget && <Widget service={service} />}
</div>
@@ -0,0 +1,35 @@
import useSWR from "swr";
import { t } from "i18next";
export default function KubernetesStatus({ service }) {
const podSelectorString = service.podSelector !== undefined ? `podSelector=${service.podSelector}` : "";
const { data, error } = useSWR(`/api/kubernetes/status/${service.namespace}/${service.app}?${podSelectorString}`);
if (error) {
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
<div className="text-[8px] font-bold text-rose-500/80 uppercase">{t("docker.error")}</div>
</div>
}
if (data && data.status === "running") {
return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health ?? data.status}>
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.health ?? data.status}</div>
</div>
);
}
if (data && (data.status === "not found" || data.status === "down" || data.status === "partial")) {
return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{data.status}</div>
</div>
);
}
return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden">
<div className="text-[8px] font-bold text-black/20 dark:text-white/40 uppercase">{t("docker.unknown")}</div>
</div>
);
}
+2 -2
View File
@@ -30,8 +30,8 @@ export default function Status({ service }) {
}
return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health ?? data.status}>
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.health ?? data.status}</div>
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health || data.status}>
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.health || data.status}</div>
</div>
);
}
+2 -6
View File
@@ -3,8 +3,6 @@ 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();
@@ -12,9 +10,7 @@ export default function Version() {
const revision = process.env.NEXT_PUBLIC_REVISION?.length ? process.env.NEXT_PUBLIC_REVISION : "dev";
const version = process.env.NEXT_PUBLIC_VERSION?.length ? 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);
const { data: releaseData } = useSWR("/api/releases");
// use Intl.DateTimeFormat to format the date
const formatDate = (date) => {
@@ -48,7 +44,7 @@ export default function Version() {
</span>
{version === "main" || version === "dev" || version === "nightly"
? null
: releaseData &&
: releaseData && latestRelease &&
compareVersions(latestRelease.tag_name, version) > 0 && (
<a
href={latestRelease.html_url}
+5 -4
View File
@@ -13,22 +13,23 @@ const textSizes = {
};
export default function DateTime({ options }) {
const { text_size: textSize, format } = options;
const { text_size: textSize, locale, format } = options;
const { i18n } = useTranslation();
const [date, setDate] = useState("");
const dateLocale = locale ?? i18n.language;
useEffect(() => {
const dateFormat = new Intl.DateTimeFormat(i18n.language, { ...format });
const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format });
const interval = setInterval(() => {
setDate(dateFormat.format(new Date()));
}, 1000);
return () => clearInterval(interval);
}, [date, setDate, i18n.language, format]);
}, [date, setDate, dateLocale, format]);
return (
<div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center grow justify-end">
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[textSize || "lg"]}`}>
<span className={`text-theme-800 dark:text-theme-200 tabular-nums ${textSizes[textSize || "lg"]}`}>
{date}
</span>
</div>
@@ -0,0 +1,74 @@
import useSWR from "swr";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next";
import Node from "./node";
export default function Widget({ options }) {
const { cluster, nodes } = options;
const { t, i18n } = useTranslation();
const defaultData = {
cpu: {
load: 0,
total: 0,
percent: 0
},
memory: {
used: 0,
total: 0,
free: 0,
precent: 0
}
};
const { data, error } = useSWR(
`/api/widgets/kubernetes?${new URLSearchParams({ lang: i18n.language }).toString()}`, {
refreshInterval: 1500
}
);
if (error || data?.error) {
return (
<div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-row items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
</div>
</div>
</div>
</div>
);
}
if (!data) {
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<div className="flex flex-row self-center flex-wrap justify-between">
{cluster.show &&
<Node type="cluster" key="cluster" options={options.cluster} data={defaultData} />
}
{nodes.show &&
<Node type="node" key="nodes" options={options.nodes} data={defaultData} />
}
</div>
</div>
);
}
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<div className="flex flex-row self-center flex-wrap justify-between">
{cluster.show &&
<Node key="cluster" type="cluster" options={options.cluster} data={data.cluster} />
}
{nodes.show && data.nodes &&
data.nodes.map((node) =>
<Node key={node.name} type="node" options={options.nodes} data={node} />)
}
</div>
</div>
);
}
@@ -0,0 +1,60 @@
import { FaMemory } from "react-icons/fa";
import { FiAlertTriangle, FiCpu, FiServer } from "react-icons/fi";
import { SiKubernetes } from "react-icons/si";
import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar";
export default function Node({ type, options, data }) {
const { t } = useTranslation();
function icon() {
if (type === "cluster") {
return <SiKubernetes className="text-theme-800 dark:text-theme-200 w-5 h-5" />;
}
if (data.ready) {
return <FiServer className="text-theme-800 dark:text-theme-200 w-5 h-5" />;
}
return <FiAlertTriangle className="text-theme-800 dark:text-theme-200 w-5 h-5" />;
}
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4">
<div className="flex flex-row self-center flex-wrap justify-between">
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
{icon()}
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{t("common.number", {
value: data.cpu.percent,
style: "unit",
unit: "percent",
maximumFractionDigits: 0
})}
</div>
<FiCpu className="text-theme-800 dark:text-theme-200 w-3 h-3" />
</div>
<UsageBar percent={data.cpu.percent} />
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{t("common.bytes", {
value: data.memory.free,
maximumFractionDigits: 0,
binary: true
})}
</div>
<FaMemory className="text-theme-800 dark:text-theme-200 w-3 h-3" />
</div>
<UsageBar percent={data.memory.percent} />
{options.showLabel && (
<div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{type === "cluster" ? options.label : data.name}</div>
)}
</div>
</div>
</div>
</div>
);
}
@@ -0,0 +1,12 @@
export default function UsageBar({ percent }) {
return (
<div className="mt-0.5 w-full bg-theme-800/30 rounded-full h-1 dark:bg-theme-200/20">
<div
className="bg-theme-800/70 h-1 rounded-full dark:bg-theme-200/50 transition-all duration-1000"
style={{
width: `${percent}%`,
}}
/>
</div>
);
}
@@ -0,0 +1,57 @@
import useSWR from "swr";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next";
import Node from "./node";
export default function Longhorn({ options }) {
const { expanded, total, labels, include, nodes } = options;
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/longhorn`, {
refreshInterval: 1500
});
if (error || data?.error) {
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
}
if (!data) {
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<div className="flex flex-row self-center flex-wrap justify-between" />
</div>
);
}
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<div className="flex flex-row self-center flex-wrap justify-between">
{data.nodes
.filter((node) => {
if (node.id === 'total' && total) {
return true;
}
if (!nodes) {
return false;
}
if (include && !include.includes(node.id)) {
return false;
}
return true;
})
.map((node) =>
<div key={node.id}>
<Node data={{ node }} expanded={expanded} labels={labels} />
</div>
)}
</div>
</div>
);
}
+32
View File
@@ -0,0 +1,32 @@
import { FiHardDrive } from "react-icons/fi";
import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar";
export default function Node({ data, expanded, labels }) {
const { t } = useTranslation();
return (
<>
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FiHardDrive className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">{t("common.bytes", { value: data.node.available })}</div>
<div className="pr-1">{t("resources.free")}</div>
</span>
{expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">{t("common.bytes", { value: data.node.maximum })}</div>
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={Math.round(((data.node.maximum - data.node.available) / data.node.maximum) * 100)} />
</div>
</div>
{labels && (
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{data.node.id}</div>
)}
</>
);
}
+1 -1
View File
@@ -38,7 +38,7 @@ export default function Cpu({ expanded }) {
<div className="pr-1">{t("resources.load")}</div>
</div>
)}
<UsageBar percent={100} />
<UsageBar percent={0} />
</div>
</div>
);
+1 -1
View File
@@ -38,7 +38,7 @@ export default function Disk({ options, expanded }) {
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={100} />
<UsageBar percent={0} />
</div>
</div>
);
+1 -1
View File
@@ -38,7 +38,7 @@ export default function Memory({ expanded }) {
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={100} />
<UsageBar percent={0} />
</div>
</div>
);
+99 -15
View File
@@ -1,9 +1,11 @@
import { useState } from "react";
import { useState, useEffect, Fragment } from "react";
import { useTranslation } from "next-i18next";
import { FiSearch } from "react-icons/fi";
import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu } from "react-icons/si";
import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si";
import { Listbox, Transition } from "@headlessui/react";
import classNames from "classnames";
const providers = {
export const searchProviders = {
google: {
name: "Google",
url: "https://www.google.com/search?q=",
@@ -24,6 +26,11 @@ const providers = {
url: "https://www.baidu.com/s?wd=",
icon: SiBaidu,
},
brave: {
name: "Brave",
url: "https://search.brave.com/search?q=",
icon: SiBrave,
},
custom: {
name: "Custom",
url: false,
@@ -31,21 +38,55 @@ const providers = {
},
};
function getAvailableProviderIds(options) {
if (options.provider && Array.isArray(options.provider)) {
return Object.keys(searchProviders).filter((value) => options.provider.includes(value));
}
if (options.provider && searchProviders[options.provider]) {
return [options.provider];
}
return null;
}
const localStorageKey = "search-name";
export function getStoredProvider() {
if (typeof window !== 'undefined') {
const storedName = localStorage.getItem(localStorageKey);
if (storedName) {
return Object.values(searchProviders).find((el) => el.name === storedName);
}
}
return null;
}
export default function Search({ options }) {
const { t } = useTranslation();
const provider = providers[options.provider];
const [query, setQuery] = useState("");
const availableProviderIds = getAvailableProviderIds(options);
if (!provider) {
const [query, setQuery] = useState("");
const [selectedProvider, setSelectedProvider] = useState(searchProviders[availableProviderIds[0] ?? searchProviders.google]);
useEffect(() => {
const storedProvider = getStoredProvider();
let storedProviderKey = null;
storedProviderKey = Object.keys(searchProviders).find((pkey) => searchProviders[pkey] === storedProvider);
if (storedProvider && availableProviderIds.includes(storedProviderKey)) {
setSelectedProvider(storedProvider);
}
}, [availableProviderIds]);
if (!availableProviderIds) {
return null;
}
function handleSubmit(event) {
const q = encodeURIComponent(query);
if (provider.url) {
window.open(`${provider.url}${q}`, options.target || "_blank");
const url = { selectedProvider };
if (url) {
window.open(`${url}${q}`, options.target || "_blank");
} else {
window.open(`${options.url}${q}`, options.target || "_blank");
}
@@ -55,6 +96,11 @@ export default function Search({ options }) {
setQuery("");
}
const onChangeProvider = (provider) => {
setSelectedProvider(provider);
localStorage.setItem(localStorageKey, provider.name);
}
return (
<form className="flex-col relative h-8 my-4 min-w-fit grow first:ml-0 ml-4" onSubmit={handleSubmit}>
<div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" />
@@ -77,17 +123,55 @@ export default function Search({ options }) {
// eslint-disable-next-line jsx-a11y/no-autofocus
autoFocus={options.focus}
/>
<button
type="submit"
className="
<Listbox as="div" value={selectedProvider} onChange={onChangeProvider} className="relative text-left" disabled={availableProviderIds?.length === 1}>
<div>
<Listbox.Button
className="
absolute right-0.5 bottom-0.5 rounded-r-md px-4 py-2 border-1
text-white font-medium text-sm
bg-theme-600/40 dark:bg-white/10
focus:ring-theme-500 dark:focus:ring-white/50"
>
<provider.icon className="text-white w-3 h-3" />
<span className="sr-only">{t("search.search")}</span>
</button>
>
<selectedProvider.icon className="text-white w-3 h-3" />
<span className="sr-only">{t("search.search")}</span>
</Listbox.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"
>
<Listbox.Options
className="absolute right-0 z-10 mt-1 origin-top-right rounded-md
bg-theme-100 dark:bg-theme-600 shadow-lg
ring-1 ring-black ring-opacity-5 focus:outline-none"
>
<div className="flex flex-col">
{availableProviderIds.map((providerId) => {
const p = searchProviders[providerId];
return (
<Listbox.Option key={providerId} value={p} as={Fragment}>
{({ active }) => (
<li
className={classNames(
"rounded-md cursor-pointer",
active ? "bg-theme-600/10 dark:bg-white/10 dark:text-gray-900" : "dark:text-gray-100"
)}
>
<p.icon className="h-4 w-4 mx-4 my-2" />
</li>
)}
</Listbox.Option>
);
})}
</div>
</Listbox.Options>
</Transition>
</Listbox>
</form>
);
}
+2
View File
@@ -13,6 +13,8 @@ const widgetMappings = {
unifi_console: dynamic(() => import("components/widgets/unifi_console/unifi_console")),
glances: dynamic(() => import("components/widgets/glances/glances")),
openmeteo: dynamic(() => import("components/widgets/openmeteo/openmeteo")),
longhorn: dynamic(() => import("components/widgets/longhorn/longhorn")),
kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")),
};
export default function Widget({ widget }) {
+1
View File
@@ -6,6 +6,7 @@ import Head from "next/head";
import "styles/globals.css";
import "styles/theme.css";
import "styles/manrope.css";
import "styles/custom.css";
import nextI18nextConfig from "../../next-i18next.config";
import { ColorProvider } from "utils/contexts/color";
+12 -12
View File
@@ -1,16 +1,18 @@
import Docker from "dockerode";
import getDockerArguments from "utils/config/docker";
import createLogger from "utils/logger";
const logger = createLogger("dockerStatsService");
export default async function handler(req, res) {
const { service } = req.query;
const [containerName, containerServer] = service;
if (!containerName && !containerServer) {
res.status(400).send({
return res.status(400).send({
error: "docker query parameters are required",
});
return;
}
try {
@@ -23,10 +25,9 @@ export default async function handler(req, res) {
// bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
res.status(500).send({
return res.status(500).send({
error: "query failed",
});
return;
}
const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
@@ -36,10 +37,9 @@ export default async function handler(req, res) {
const container = docker.getContainer(containerName);
const stats = await container.stats({ stream: false });
res.status(200).json({
return res.status(200).json({
stats,
});
return;
}
// Try with a service deployed in Docker Swarm, if enabled
@@ -61,19 +61,19 @@ export default async function handler(req, res) {
const container = docker.getContainer(taskContainerId);
const stats = await container.stats({ stream: false });
res.status(200).json({
return res.status(200).json({
stats,
});
return;
}
}
res.status(200).send({
return res.status(200).send({
error: "not found",
});
} catch {
res.status(500).send({
error: {message: "Unknown error"},
} catch (e) {
logger.error(e);
return res.status(500).send({
error: {message: e?.message ?? "Unknown error"},
});
}
}
+6 -2
View File
@@ -1,6 +1,9 @@
import Docker from "dockerode";
import getDockerArguments from "utils/config/docker";
import createLogger from "utils/logger";
const logger = createLogger("dockerStatusService");
export default async function handler(req, res) {
const { service } = req.query;
@@ -68,9 +71,10 @@ export default async function handler(req, res) {
return res.status(200).send({
error: "not found",
});
} catch {
} catch (e) {
logger.error(e);
return res.status(500).send({
error: "unknown error",
error: {message: e?.message ?? "Unknown error"},
});
}
}
@@ -0,0 +1,110 @@
import { CoreV1Api, Metrics } from "@kubernetes/client-node";
import getKubeConfig from "../../../../utils/config/kubernetes";
import { parseCpu, parseMemory } from "../../../../utils/kubernetes/kubernetes-utils";
import createLogger from "../../../../utils/logger";
const logger = createLogger("kubernetesStatsService");
export default async function handler(req, res) {
const APP_LABEL = "app.kubernetes.io/name";
const { service, podSelector } = req.query;
const [namespace, appName] = service;
if (!namespace && !appName) {
res.status(400).send({
error: "kubernetes query parameters are required"
});
return;
}
const labelSelector = podSelector !== undefined ? podSelector : `${APP_LABEL}=${appName}`;
try {
const kc = getKubeConfig();
if (!kc) {
res.status(500).send({
error: "No kubernetes configuration"
});
return;
}
const coreApi = kc.makeApiClient(CoreV1Api);
const metricsApi = new Metrics(kc);
const podsResponse = await coreApi.listNamespacedPod(namespace, null, null, null, null, labelSelector)
.then((response) => response.body)
.catch((err) => {
logger.error("Error getting pods: %d %s %s", err.statusCode, err.body, err.response);
return null;
});
if (!podsResponse) {
res.status(500).send({
error: "Error communicating with kubernetes"
});
return;
}
const pods = podsResponse.items;
if (pods.length === 0) {
res.status(404).send({
error: "not found"
});
return;
}
let cpuLimit = 0;
let memLimit = 0;
pods.forEach((pod) => {
pod.spec.containers.forEach((container) => {
if (container?.resources?.limits?.cpu) {
cpuLimit += parseCpu(container?.resources?.limits?.cpu);
}
if (container?.resources?.limits?.memory) {
memLimit += parseMemory(container?.resources?.limits?.memory);
}
});
});
const podStatsList = await Promise.all(pods.map(async (pod) => {
let depMem = 0;
let depCpu = 0;
const podMetrics = await metricsApi.getPodMetrics(namespace, pod.metadata.name)
.then((response) => response)
.catch((err) => {
// 404 generally means that the metrics have not been populated yet
if (err.statusCode !== 404) {
logger.error("Error getting pod metrics: %d %s %s", err.statusCode, err.body, err.response);
}
return null;
});
if (podMetrics) {
podMetrics.containers.forEach((container) => {
depMem += parseMemory(container.usage.memory);
depCpu += parseCpu(container.usage.cpu);
});
}
return {
mem: depMem,
cpu: depCpu
};
}));
const stats = {
mem: 0,
cpu: 0
}
podStatsList.forEach((podStat) => {
stats.mem += podStat.mem;
stats.cpu += podStat.cpu;
});
stats.cpuLimit = cpuLimit;
stats.memLimit = memLimit;
stats.cpuUsage = cpuLimit ? stats.cpu / cpuLimit : 0;
stats.memUsage = memLimit ? stats.mem / memLimit : 0;
res.status(200).json({
stats
});
} catch (e) {
logger.error(e);
res.status(500).send({
error: "unknown error"
});
}
}
@@ -0,0 +1,66 @@
import { CoreV1Api } from "@kubernetes/client-node";
import getKubeConfig from "../../../../utils/config/kubernetes";
import createLogger from "../../../../utils/logger";
const logger = createLogger("kubernetesStatusService");
export default async function handler(req, res) {
const APP_LABEL = "app.kubernetes.io/name";
const { service, podSelector } = req.query;
const [namespace, appName] = service;
if (!namespace && !appName) {
res.status(400).send({
error: "kubernetes query parameters are required",
});
return;
}
const labelSelector = podSelector !== undefined ? podSelector : `${APP_LABEL}=${appName}`;
try {
const kc = getKubeConfig();
if (!kc) {
res.status(500).send({
error: "No kubernetes configuration"
});
return;
}
const coreApi = kc.makeApiClient(CoreV1Api);
const podsResponse = await coreApi.listNamespacedPod(namespace, null, null, null, null, labelSelector)
.then((response) => response.body)
.catch((err) => {
logger.error("Error getting pods: %d %s %s", err.statusCode, err.body, err.response);
return null;
});
if (!podsResponse) {
res.status(500).send({
error: "Error communicating with kubernetes"
});
return;
}
const pods = podsResponse.items;
if (pods.length === 0) {
res.status(404).send({
error: "not found",
});
return;
}
const someReady = pods.find(pod => pod.status.phase === "Running");
const allReady = pods.every((pod) => pod.status.phase === "Running");
let status = "down";
if (allReady) {
status = "running";
} else if (someReady) {
status = "partial";
}
res.status(200).json({
status
});
} catch (e) {
logger.error(e);
res.status(500).send({
error: "unknown error",
});
}
}
+6
View File
@@ -0,0 +1,6 @@
import cachedFetch from "utils/proxy/cached-fetch";
export default async function handler(req, res) {
const releasesURL = "https://api.github.com/repos/benphelps/homepage/releases";
return res.send(await cachedFetch(releasesURL, 5));
}
+92
View File
@@ -0,0 +1,92 @@
import { CoreV1Api, Metrics } from "@kubernetes/client-node";
import getKubeConfig from "../../../utils/config/kubernetes";
import { parseCpu, parseMemory } from "../../../utils/kubernetes/kubernetes-utils";
import createLogger from "../../../utils/logger";
const logger = createLogger("kubernetes-widget");
export default async function handler(req, res) {
try {
const kc = getKubeConfig();
if (!kc) {
return res.status(500).send({
error: "No kubernetes configuration"
});
}
const coreApi = kc.makeApiClient(CoreV1Api);
const metricsApi = new Metrics(kc);
const nodes = await coreApi.listNode()
.then((response) => response.body)
.catch((error) => {
logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response);
return null;
});
if (!nodes) {
return res.status(500).send({
error: "unknown error"
});
}
let cpuTotal = 0;
let cpuUsage = 0;
let memTotal = 0;
let memUsage = 0;
const nodeMap = {};
nodes.items.forEach((node) => {
const cpu = Number.parseInt(node.status.capacity.cpu, 10);
const mem = parseMemory(node.status.capacity.memory);
const ready = node.status.conditions.filter(condition => condition.type === "Ready" && condition.status === "True").length > 0;
nodeMap[node.metadata.name] = {
name: node.metadata.name,
ready,
cpu: {
total: cpu
},
memory: {
total: mem
}
};
cpuTotal += cpu;
memTotal += mem;
});
const nodeMetrics = await metricsApi.getNodeMetrics();
nodeMetrics.items.forEach((nodeMetric) => {
const cpu = parseCpu(nodeMetric.usage.cpu);
const mem = parseMemory(nodeMetric.usage.memory);
cpuUsage += cpu;
memUsage += mem;
nodeMap[nodeMetric.metadata.name].cpu.load = cpu;
nodeMap[nodeMetric.metadata.name].cpu.percent = (cpu / nodeMap[nodeMetric.metadata.name].cpu.total) * 100;
nodeMap[nodeMetric.metadata.name].memory.used = mem;
nodeMap[nodeMetric.metadata.name].memory.free = nodeMap[nodeMetric.metadata.name].memory.total - mem;
nodeMap[nodeMetric.metadata.name].memory.percent = (mem / nodeMap[nodeMetric.metadata.name].memory.total) * 100;
});
const cluster = {
cpu: {
load: cpuUsage,
total: cpuTotal,
percent: (cpuUsage / cpuTotal) * 100
},
memory: {
used: memUsage,
total: memTotal,
free: (memTotal - memUsage),
percent: (memUsage / memTotal) * 100
}
};
return res.status(200).json({
cluster,
nodes: Object.entries(nodeMap).map(([name, node]) => ({ name, ...node }))
});
} catch (e) {
logger.error("exception %s", e);
return res.status(500).send({
error: "unknown error"
});
}
}
+84
View File
@@ -0,0 +1,84 @@
import { httpProxy } from "../../../utils/proxy/http";
import createLogger from "../../../utils/logger";
import { getSettings } from "../../../utils/config/config";
const logger = createLogger("longhorn");
function parseLonghornData(data) {
const json = JSON.parse(data);
if (!json) {
return null;
}
const nodes = json.data.map((node) => {
let available = 0;
let maximum = 0;
let reserved = 0;
let scheduled = 0;
if (node.disks) {
Object.keys(node.disks).forEach((diskKey) => {
const disk = node.disks[diskKey];
available += disk.storageAvailable;
maximum += disk.storageMaximum;
reserved += disk.storageReserved;
scheduled += disk.storageScheduled;
});
}
return {
id: node.id,
available,
maximum,
reserved,
scheduled,
};
});
const total = nodes.reduce((summary, node) => ({
available: summary.available + node.available,
maximum: summary.maximum + node.maximum,
reserved: summary.reserved + node.reserved,
scheduled: summary.scheduled + node.scheduled,
}));
total.id = "total";
nodes.push(total);
return nodes;
}
export default async function handler(req, res) {
const settings = getSettings();
const longhornSettings = settings?.providers?.longhorn;
const {url, username, password} = longhornSettings;
if (!url) {
const errorMessage = "Missing Longhorn URL";
logger.error(errorMessage);
return res.status(400).json({ error: errorMessage });
}
const apiUrl = `${url}/v1/nodes`;
const headers = {
"Accept-Encoding": "application/json"
};
if (username && password) {
headers.Authorization = `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`
}
const params = { method: "GET", headers };
const [status, contentType, data] = await httpProxy(apiUrl, params);
if (status === 401) {
logger.error("Authorization failure getting data from Longhorn API. Data: %s", data);
}
if (status !== 200) {
logger.error("HTTP %d getting data from Longhorn API. Data: %s", status, data);
}
if (contentType) res.setHeader("Content-Type", contentType);
const nodes = parseLonghornData(data);
return res.status(200).json({
nodes,
});
}
+18 -2
View File
@@ -22,6 +22,7 @@ import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/conf
import ErrorBoundary from "components/errorboundry";
import themes from "utils/styles/themes";
import QuickLaunch from "components/quicklaunch";
import { getStoredProvider, searchProviders } from "components/widgets/search/search";
const ThemeToggle = dynamic(() => import("components/toggles/theme"), {
ssr: false,
@@ -99,7 +100,7 @@ function Index({ initialSettings, fallback }) {
localStorage.setItem("hash", hashData.hash);
}
if (previousHash && previousHash !== hashData.hash) {
if (!initialSettings.isValid || (previousHash && previousHash !== hashData.hash)) {
setStale(true);
localStorage.setItem("hash", hashData.hash);
@@ -111,7 +112,7 @@ function Index({ initialSettings, fallback }) {
}
}
}
}, [hashData]);
}, [hashData, initialSettings]);
if (stale) {
return (
@@ -193,6 +194,20 @@ function Home({ initialSettings }) {
const [searching, setSearching] = useState(false);
const [searchString, setSearchString] = useState("");
let searchProvider = null;
const searchWidget = Object.values(widgets).find(w => w.type === "search");
if (searchWidget) {
if (Array.isArray(searchWidget.options?.provider)) {
// if search provider is a list, try to retrieve from localstorage, fall back to the first
searchProvider = getStoredProvider() ?? searchProviders[searchWidget.options.provider[0]];
} else if (searchWidget.options?.provider === 'custom') {
searchProvider = {
url: searchWidget.options.url
}
} else {
searchProvider = searchProviders[searchWidget.options?.provider];
}
}
useEffect(() => {
function handleKeyDown(e) {
@@ -251,6 +266,7 @@ function Home({ initialSettings }) {
isOpen={searching}
close={setSearching}
searchDescriptions={settings.quicklaunch?.searchDescriptions}
searchProvider={settings.quicklaunch?.hideInternetSearch ? null : searchProvider}
/>
{widgets && (
<>
+2
View File
@@ -0,0 +1,2 @@
---
# sample kubernetes config
+3
View File
@@ -0,0 +1,3 @@
/*
Mount this file and define your custom styles
*/
+48 -10
View File
@@ -5,9 +5,25 @@ import path from "path";
import yaml from "js-yaml";
import checkAndCopyConfig, { getSettings } from "utils/config/config";
import { servicesFromConfig, servicesFromDocker, cleanServiceGroups } from "utils/config/service-helpers";
import {
servicesFromConfig,
servicesFromDocker,
cleanServiceGroups,
servicesFromKubernetes
} from "utils/config/service-helpers";
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
/**
* Compares services by weight then by name.
*/
function compareServices(service1, service2) {
const comp = service1.weight - service2.weight;
if (comp !== 0) {
return comp;
}
return service1.name.localeCompare(service2.name);
}
export async function bookmarksResponse() {
checkAndCopyConfig("bookmarks.yaml");
@@ -44,23 +60,35 @@ export async function widgetsResponse() {
}
export async function servicesResponse() {
let discoveredServices;
let discoveredDockerServices;
let discoveredKubernetesServices;
let configuredServices;
let initialSettings;
try {
discoveredServices = cleanServiceGroups(await servicesFromDocker());
discoveredDockerServices = cleanServiceGroups(await servicesFromDocker());
if (discoveredDockerServices?.length === 0) {
console.debug("No containers were found with homepage labels.");
}
} catch (e) {
console.error("Failed to discover services, please check docker.yaml for errors or remove example entries.");
if (e) console.error(e);
discoveredServices = [];
if (e) console.error(e.toString());
discoveredDockerServices = [];
}
try {
discoveredKubernetesServices = cleanServiceGroups(await servicesFromKubernetes());
} catch (e) {
console.error("Failed to discover services, please check kubernetes.yaml for errors or remove example entries.");
if (e) console.error(e.toString());
discoveredKubernetesServices = [];
}
try {
configuredServices = cleanServiceGroups(await servicesFromConfig());
} catch (e) {
console.error("Failed to load services.yaml, please check for errors");
if (e) console.error(e);
if (e) console.error(e.toString());
configuredServices = [];
}
@@ -68,12 +96,16 @@ export async function servicesResponse() {
initialSettings = await getSettings();
} catch (e) {
console.error("Failed to load settings.yaml, please check for errors");
if (e) console.error(e);
if (e) console.error(e.toString());
initialSettings = {};
}
const mergedGroupsNames = [
...new Set([discoveredServices.map((group) => group.name), configuredServices.map((group) => group.name)].flat()),
...new Set([
discoveredDockerServices.map((group) => group.name),
discoveredKubernetesServices.map((group) => group.name),
configuredServices.map((group) => group.name),
].flat()),
];
const sortedGroups = [];
@@ -81,12 +113,18 @@ export async function servicesResponse() {
const definedLayouts = initialSettings.layout ? Object.keys(initialSettings.layout) : null;
mergedGroupsNames.forEach((groupName) => {
const discoveredGroup = discoveredServices.find((group) => group.name === groupName) || { services: [] };
const discoveredDockerGroup = discoveredDockerServices.find((group) => group.name === groupName) || { services: [] };
const discoveredKubernetesGroup = discoveredKubernetesServices.find((group) => group.name === groupName) || { services: [] };
const configuredGroup = configuredServices.find((group) => group.name === groupName) || { services: [] };
const mergedGroup = {
name: groupName,
services: [...discoveredGroup.services, ...configuredGroup.services].filter((service) => service),
services: [
...discoveredDockerGroup.services,
...discoveredKubernetesGroup.services,
...configuredGroup.services
].filter((service) => service)
.sort(compareServices),
};
if (definedLayouts) {
+15 -2
View File
@@ -1,6 +1,6 @@
/* eslint-disable no-console */
import { join } from "path";
import { existsSync, copyFile, readFileSync } from "fs";
import { existsSync, copyFile, readFileSync, statSync } from "fs";
import yaml from "js-yaml";
@@ -32,5 +32,18 @@ export function getSettings() {
const settingsYaml = join(process.cwd(), "config", "settings.yaml");
const fileContents = readFileSync(settingsYaml, "utf8");
return yaml.load(fileContents) ?? {};
let stats;
try {
stats = statSync(settingsYaml);
} catch (e) {
stats = {};
}
const yamlLoaded = yaml.load(fileContents) ?? {};
return {
...yamlLoaded,
isValid: fileContents !== "-\n" && stats.size !== 2 // see https://github.com/benphelps/homepage/pull/609
};
}
+30
View File
@@ -0,0 +1,30 @@
import path from "path";
import { readFileSync } from "fs";
import yaml from "js-yaml";
import { KubeConfig } from "@kubernetes/client-node";
import checkAndCopyConfig from "utils/config/config";
export default function getKubeConfig() {
checkAndCopyConfig("kubernetes.yaml");
const configFile = path.join(process.cwd(), "config", "kubernetes.yaml");
const configData = readFileSync(configFile, "utf8");
const config = yaml.load(configData);
const kc = new KubeConfig();
switch (config?.mode) {
case 'cluster':
kc.loadFromCluster();
break;
case 'default':
kc.loadFromDefault();
break;
case 'disabled':
default:
return null;
}
return kc;
}
+168 -30
View File
@@ -4,9 +4,14 @@ import path from "path";
import yaml from "js-yaml";
import Docker from "dockerode";
import * as shvl from "shvl";
import { NetworkingV1Api } from "@kubernetes/client-node";
import createLogger from "utils/logger";
import checkAndCopyConfig from "utils/config/config";
import getDockerArguments from "utils/config/docker";
import getKubeConfig from "utils/config/kubernetes";
const logger = createLogger("service-helpers");
export async function servicesFromConfig() {
checkAndCopyConfig("services.yaml");
@@ -28,6 +33,15 @@ export async function servicesFromConfig() {
})),
}));
// add default weight to services based on their position in the configuration
servicesArray.forEach((group, groupIndex) => {
group.services.forEach((service, serviceIndex) => {
if(!service.weight) {
servicesArray[groupIndex].services[serviceIndex].weight = (serviceIndex + 1) * 100;
}
});
});
return servicesArray;
}
@@ -44,36 +58,41 @@ export async function servicesFromDocker() {
const serviceServers = await Promise.all(
Object.keys(servers).map(async (serverName) => {
const docker = new Docker(getDockerArguments(serverName).conn);
const containers = await docker.listContainers({
all: true,
});
// bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
return [];
}
const discovered = containers.map((container) => {
let constructedService = null;
Object.keys(container.Labels).forEach((label) => {
if (label.startsWith("homepage.")) {
if (!constructedService) {
constructedService = {
container: container.Names[0].replace(/^\//, ""),
server: serverName,
};
}
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
}
try {
const docker = new Docker(getDockerArguments(serverName).conn);
const containers = await docker.listContainers({
all: true,
});
return constructedService;
});
// bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
return [];
}
return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
const discovered = containers.map((container) => {
let constructedService = null;
Object.keys(container.Labels).forEach((label) => {
if (label.startsWith("homepage.")) {
if (!constructedService) {
constructedService = {
container: container.Names[0].replace(/^\//, ""),
server: serverName,
};
}
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
}
});
return constructedService;
});
return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
} catch (e) {
// a server failed, but others may succeed
return { server: serverName, services: [] };
}
})
);
@@ -103,11 +122,106 @@ export async function servicesFromDocker() {
return mappedServiceGroups;
}
function getUrlFromIngress(ingress) {
const urlHost = ingress.spec.rules[0].host;
const urlPath = ingress.spec.rules[0].http.paths[0].path;
const urlSchema = ingress.spec.tls ? 'https' : 'http';
return `${urlSchema}://${urlHost}${urlPath}`;
}
export async function servicesFromKubernetes() {
const ANNOTATION_BASE = 'gethomepage.dev';
const ANNOTATION_WIDGET_BASE = `${ANNOTATION_BASE}/widget.`;
const ANNOTATION_POD_SELECTOR = `${ANNOTATION_BASE}/pod-selector`;
checkAndCopyConfig("kubernetes.yaml");
try {
const kc = getKubeConfig();
if (!kc) {
return [];
}
const networking = kc.makeApiClient(NetworkingV1Api);
const ingressList = await networking.listIngressForAllNamespaces(null, null, null, null)
.then((response) => response.body)
.catch((error) => {
logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response);
return null;
});
if (!ingressList) {
return [];
}
const services = ingressList.items
.filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/enabled`] === 'true')
.map((ingress) => {
const constructedService = {
app: ingress.metadata.name,
namespace: ingress.metadata.namespace,
href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress),
name: ingress.metadata.annotations[`${ANNOTATION_BASE}/name`] || ingress.metadata.name,
group: ingress.metadata.annotations[`${ANNOTATION_BASE}/group`] || "Kubernetes",
weight: ingress.metadata.annotations[`${ANNOTATION_BASE}/weight`] || '0',
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
};
if (ingress.metadata.annotations[ANNOTATION_POD_SELECTOR]) {
constructedService.podSelector = ingress.metadata.annotations[ANNOTATION_POD_SELECTOR];
}
Object.keys(ingress.metadata.annotations).forEach((annotation) => {
if (annotation.startsWith(ANNOTATION_WIDGET_BASE)) {
shvl.set(constructedService, annotation.replace(`${ANNOTATION_BASE}/`, ""), ingress.metadata.annotations[annotation]);
}
});
return constructedService;
});
const mappedServiceGroups = [];
services.forEach((serverService) => {
let serverGroup = mappedServiceGroups.find((searchedGroup) => searchedGroup.name === serverService.group);
if (!serverGroup) {
mappedServiceGroups.push({
name: serverService.group,
services: [],
});
serverGroup = mappedServiceGroups[mappedServiceGroups.length - 1];
}
const { name: serviceName, group: serverServiceGroup, ...pushedService } = serverService;
const result = {
name: serviceName,
...pushedService,
};
serverGroup.services.push(result);
});
return mappedServiceGroups;
} catch (e) {
logger.error(e);
throw e;
}
}
export function cleanServiceGroups(groups) {
return groups.map((serviceGroup) => ({
name: serviceGroup.name,
services: serviceGroup.services.map((service) => {
const cleanedService = { ...service };
if (typeof service.weight === 'string') {
const weight = parseInt(service.weight, 10);
if (Number.isNaN(weight)) {
cleanedService.weight = 0;
} else {
cleanedService.weight = weight;
}
}
if (typeof cleanedService.weight !== "number") {
cleanedService.weight = 0;
}
if (cleanedService.widget) {
// whitelisted set of keys to pass to the frontend
@@ -118,12 +232,18 @@ export function cleanServiceGroups(groups) {
container,
currency, // coinmarketcap widget
symbols,
defaultinterval
defaultinterval,
namespace, // kubernetes widget
app,
podSelector,
wan // opnsense widget
} = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
cleanedService.widget = {
type,
fields: fields || null,
fields: fieldsList || null,
service_name: service.name,
service_group: serviceGroup.name,
};
@@ -136,6 +256,14 @@ export function cleanServiceGroups(groups) {
if (server) cleanedService.widget.server = server;
if (container) cleanedService.widget.container = container;
}
if (type === "kubernetes") {
if (namespace) cleanedService.widget.namespace = namespace;
if (app) cleanedService.widget.app = app;
if (podSelector) cleanedService.widget.podSelector = podSelector;
}
if (type === "opnsense") {
if (wan) cleanedService.widget.wan = wan;
}
}
return cleanedService;
@@ -166,5 +294,15 @@ export default async function getServiceWidget(group, service) {
}
}
const kubernetesServices = await servicesFromKubernetes();
const kubernetesServiceGroup = kubernetesServices.find((g) => g.name === group);
if (kubernetesServiceGroup) {
const kubernetesServiceEntry = kubernetesServiceGroup.services.find((s) => s.name === service);
if (kubernetesServiceEntry) {
const { widget } = kubernetesServiceEntry;
return widget;
}
}
return false;
}
}
+45
View File
@@ -0,0 +1,45 @@
export function parseCpu(cpuStr) {
const unitLength = 1;
const base = Number.parseInt(cpuStr, 10);
const units = cpuStr.substring(cpuStr.length - unitLength);
if (Number.isNaN(Number(units))) {
switch (units) {
case 'n':
return base / 1000000000;
case 'u':
return base / 1000000;
case 'm':
return base / 1000;
default:
return base;
}
} else {
return Number.parseInt(cpuStr, 10);
}
}
export function parseMemory(memStr) {
const unitLength = (memStr.substring(memStr.length - 1) === 'i' ? 2 : 1);
const base = Number.parseInt(memStr, 10);
const units = memStr.substring(memStr.length - unitLength);
if (Number.isNaN(Number(units))) {
switch (units) {
case 'Ki':
return base * 1000;
case 'K':
return base * 1024;
case 'Mi':
return base * 1000000;
case 'M':
return base * 1024 * 1024;
case 'Gi':
return base * 1000000000;
case 'G':
return base * 1024 * 1024 * 1024;
default:
return base;
}
} else {
return Number.parseInt(memStr, 10);
}
}
+8
View File
@@ -30,14 +30,22 @@ export default async function credentialedProxyHandler(req, res, map) {
headers["X-gotify-Key"] = `${widget.key}`;
} else if (widget.type === "authentik") {
headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "truenas") {
headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "proxmox") {
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
} else if (widget.type === "proxmoxbackupserver") {
delete headers["Content-Type"];
headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`;
} else if (widget.type === "autobrr") {
headers["X-API-Token"] = `${widget.key}`;
} else if (widget.type === "tubearchivist") {
headers.Authorization = `Token ${widget.key}`;
} else if (widget.type === "miniflux") {
headers["X-Auth-Token"] = `${widget.key}`;
} else if (widget.type === "cloudflared") {
headers["X-Auth-Email"] = `${widget.email}`;
headers["X-Auth-Key"] = `${widget.key}`;
} else {
headers["X-API-Key"] = `${widget.key}`;
}
+2 -2
View File
@@ -4,8 +4,8 @@ import { formatProxyUrl } from "./api-helpers";
export default function useWidgetAPI(widget, ...options) {
const config = {};
if (options?.refreshInterval) {
config.refreshInterval = options.refreshInterval;
if (options && options[1]?.refreshInterval) {
config.refreshInterval = options[1].refreshInterval;
}
const { data, error } = useSWR(formatProxyUrl(widget, ...options), config);
// make the data error the top-level error
+31
View File
@@ -0,0 +1,31 @@
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel");
if (statsError) {
return <Container error={statsError} />;
}
if (!statsData) {
return (
<Container service={service}>
<Block label="cloudflared.status" />
<Block label="cloudflared.origin_ip" />
</Container>
);
}
const originIP = statsData.result.connections?.origin_ip ?? statsData.result.connections[0]?.origin_ip;
return (
<Container service={service}>
<Block label="cloudflared.status" value={statsData.result.status.charAt(0).toUpperCase() + statsData.result.status.slice(1)} />
<Block label="cloudflared.origin_ip" value={originIP} />
</Container>
);
}
+18
View File
@@ -0,0 +1,18 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "https://api.cloudflare.com/client/v4/accounts/{accountid}/{endpoint}/{tunnelid}",
proxyHandler: credentialedProxyHandler,
mappings: {
"cfd_tunnel": {
endpoint: "cfd_tunnel",
validate: [
"success",
"result"
]
},
},
};
export default widget;
+8
View File
@@ -6,10 +6,12 @@ const components = {
autobrr: dynamic(() => import("./autobrr/component")),
bazarr: dynamic(() => import("./bazarr/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")),
cloudflared: dynamic(() => import("./cloudflared/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
deluge: dynamic(() => import("./deluge/component")),
downloadstation: dynamic(() => import("./downloadstation/component")),
docker: dynamic(() => import("./docker/component")),
kubernetes: dynamic(() => import("./kubernetes/component")),
emby: dynamic(() => import("./emby/component")),
flood: dynamic(() => import("./flood/component")),
gluetun: dynamic(() => import("./gluetun/component")),
@@ -21,17 +23,21 @@ const components = {
jellyseerr: dynamic(() => import("./jellyseerr/component")),
lidarr: dynamic(() => import("./lidarr/component")),
mastodon: dynamic(() => import("./mastodon/component")),
medusa: dynamic(() => import("./medusa/component")),
miniflux: dynamic(() => import("./miniflux/component")),
mikrotik: dynamic(() => import("./mikrotik/component")),
moonraker: dynamic(() => import("./moonraker/component")),
navidrome: dynamic(() => import("./navidrome/component")),
nextdns: dynamic(() => import("./nextdns/component")),
npm: dynamic(() => import("./npm/component")),
nzbget: dynamic(() => import("./nzbget/component")),
octoprint: dynamic(() => import("./octoprint/component")),
omada: dynamic(() => import("./omada/component")),
ombi: dynamic(() => import("./ombi/component")),
opnsense: dynamic(() => import("./opnsense/component")),
overseerr: dynamic(() => import("./overseerr/component")),
paperlessngx: dynamic(() => import("./paperlessngx/component")),
proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")),
pihole: dynamic(() => import("./pihole/component")),
plex: dynamic(() => import("./plex/component")),
portainer: dynamic(() => import("./portainer/component")),
@@ -56,6 +62,8 @@ const components = {
unifi: dynamic(() => import("./unifi/component")),
watchtower: dynamic(() => import("./watchtower/component")),
xteve: dynamic(() => import("./xteve/component")),
immich: dynamic(() => import("./immich/component")),
uptimekuma: dynamic(() => import("./uptimekuma/component")),
};
export default components;
+23 -5
View File
@@ -5,10 +5,8 @@ import widgets from "widgets/widgets";
import getServiceWidget from "utils/config/service-helpers";
const logger = createLogger("downloadstationProxyHandler");
const authApi = "{url}/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie"
async function login(widget) {
const loginUrl = formatApiCall(authApi, widget);
async function login(loginUrl) {
const [status, contentType, data] = await httpProxy(loginUrl);
if (status !== 200) {
return [status, contentType, data];
@@ -56,8 +54,28 @@ export default async function downloadstationProxyHandler(req, res) {
const json = JSON.parse(data.toString());
if (json?.success !== true) {
logger.debug("Logging in to DownloadStation");
[status, contentType, data] = await login(widget);
logger.debug("Attempting login to DownloadStation");
const apiInfoUrl = formatApiCall("{url}/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query", widget);
let path = "entry.cgi";
let maxVersion = 7;
[status, contentType, data] = await httpProxy(apiInfoUrl);
if (status === 200) {
try {
const apiAuthInfo = JSON.parse(data.toString()).data['SYNO.API.Auth'];
if (apiAuthInfo) {
path = apiAuthInfo.path;
maxVersion = apiAuthInfo.maxVersion;
logger.debug(`Deteceted Downloadstation auth API path: ${path} and maxVersion: ${maxVersion}`);
}
} catch {
logger.debug(`Error ${status} obtaining DownloadStation API info`);
}
}
const authApi = `{url}/webapi/${path}?api=SYNO.API.Auth&version=${maxVersion}&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie`
const loginUrl = formatApiCall(authApi, widget);
[status, contentType, data] = await login(loginUrl);
if (status !== 200) {
return res.status(status).end(data)
}
+33
View File
@@ -0,0 +1,33 @@
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: immichData, error: immichError } = useWidgetAPI(widget);
if (immichError || immichData?.statusCode === 401) {
return <Container error={immichError ?? immichData} />;
}
if (!immichData) {
return (
<Container service={service}>
<Block label="immich.users" />
<Block label="immich.photos" />
<Block label="immich.videos" />
<Block label="immich.storage" />
</Container>
);
}
return (
<Container service={service}>
<Block label="immich.users" value={immichData.usageByUser.length} />
<Block label="immich.photos" value={immichData.photos} />
<Block label="immich.videos" value={immichData.videos} />
<Block label="immich.storage" value={immichData.usage} />
</Container>
);
}
+8
View File
@@ -0,0 +1,8 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/server-info/stats",
proxyHandler: credentialedProxyHandler,
};
export default widget;
+50
View File
@@ -0,0 +1,50 @@
import useSWR from "swr";
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const podSelectorString = widget.podSelector !== undefined ? `podSelector=${widget.podSelector}` : "";
const { data: statusData, error: statusError } = useSWR(
`/api/kubernetes/status/${widget.namespace}/${widget.app}?${podSelectorString}`);
const { data: statsData, error: statsError } = useSWR(
`/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`);
if (statsError || statusError) {
return <Container error={t("widget.api_error")} />;
}
if (statusData && statusData.status !== "running") {
return (
<Container>
<Block label={t("widget.status")} value={t("docker.offline")} />
</Container>
);
}
if (!statsData || !statusData) {
return (
<Container service={service}>
<Block label="docker.cpu" />
<Block label="docker.mem" />
</Container>
);
}
return (
<Container service={service}>
{statsData.stats.cpuLimit && (
<Block label="docker.cpu" value={t("common.percent", { value: statsData.stats.cpuUsage })} />
) || (
<Block label="docker.cpu" value={t("common.number", { value: statsData.stats.cpu, maximumFractionDigits: 4 })}
/>
)}
<Block label="docker.mem" value={t("common.bytes", { value: statsData.stats.mem })} />
</Container>
);
}
+39
View File
@@ -0,0 +1,39 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats");
const { data: futureData, error: futureError } = useWidgetAPI(widget, "future");
if (statsError || futureError) {
const finalError = statsError ?? futureError;
return <Container error={finalError} />;
}
if (!statsData || !futureData) {
return (
<Container service={service}>
<Block label="medusa.wanted" />
<Block label="medusa.queued" />
<Block label="medusa.series" />
</Container>
);
}
const { later, missed, soon, today } = futureData.data;
const future = later.length + missed.length + soon.length + today.length;
return (
<Container service={service}>
<Block label="medusa.wanted" value={t("common.number", { value: future })} />
<Block label="medusa.queued" value={t("common.number", { value: statsData.data.ep_snatched })} />
<Block label="medusa.series" value={t("common.number", { value: statsData.data.shows_active })} />
</Container>
);
}
+23
View File
@@ -0,0 +1,23 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/v1/{key}/{endpoint}/",
proxyHandler: genericProxyHandler,
mappings: {
stats: {
endpoint: "?cmd=shows.stats",
validate: [
"data"
]
},
future: {
endpoint: "?cmd=future",
validate: [
"data"
]
}
}
};
export default widget;
+51
View File
@@ -0,0 +1,51 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: printStats, error: printStatsError } = useWidgetAPI(widget, "print_stats");
const { data: displayStatus, error: displayStatsError } = useWidgetAPI(widget, "display_status");
const { data: webHooks, error: webHooksError } = useWidgetAPI(widget, "webhooks");
if (printStatsError || displayStatsError || webHooksError) {
const finalError = printStatsError ?? displayStatsError ?? webHooksError;
return <Container error={finalError} />;
}
if (!printStats || !displayStatus || !webHooks) {
return (
<Container service={service}>
<Block label="moonraker.printer_state" />
</Container>
);
}
if (webHooks.result.status.webhooks.state === "shutdown") {
return (
<Container service={service}>
<Block label="moonraker.printer_state" value={webHooks.result.status.webhooks.state} />
</Container>
);
}
let currentLayer = "-";
let totalLayer = "-";
if (printStats.result.status.print_stats.info.total_layer !== null) {
currentLayer = printStats.result.status.print_stats.info.current_layer;
totalLayer = printStats.result.status.print_stats.info.total_layer;
}
return (
<Container service={service}>
<Block label="moonraker.layers" value={`${currentLayer} / ${totalLayer}`} />
<Block label="moonraker.print_progress" value={t("common.percent", { value: (displayStatus.result.status.display_status.progress * 100) })} />
<Block label="moonraker.print_status" value={printStats.result.status.print_stats.state} />
</Container>
);
}
Loaded 100 of 114 files, more files were not shown because too many files have changed in this diff. Show more