Compare commits

...
62 Commits
Author SHA1 Message Date
Crowdin Bot a22dad3d67 New Crowdin translations by GitHub Action
Lint / Linting Checks (push) Waiting to run
Tests / vitest (1) (push) Waiting to run
Tests / vitest (2) (push) Waiting to run
Tests / vitest (3) (push) Waiting to run
Tests / vitest (4) (push) Waiting to run
2026-10-15 00:47:29 +00:00
Mustafa 11ca29104a Chore: send Gitea/Forgejo API key as Authorization header (#7245)
Docker CI / Docker Build & Push (push) Waiting to run
Lint / Linting Checks (push) Waiting to run
Release Drafter / Update Release Draft (push) Waiting to run
Release Drafter / Auto Label PR (push) Waiting to run
Tests / vitest (1) (push) Waiting to run
Tests / vitest (2) (push) Waiting to run
Tests / vitest (3) (push) Waiting to run
Tests / vitest (4) (push) Waiting to run
2026-10-14 16:29:58 -07:00
Anirudh SharmaandCodex 6bf81a78f3 Fix: preserve dollar sequences in environment and file secrets (#7242)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Co-authored-by: Codex <codex@openai.com>
2026-10-13 06:44:40 -07:00
shamoon 4a38eea1b0 Fix api page tests creating routes
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-10-10 23:12:49 -07:00
shamoon 347d34c08c 2.5.0
Docs / Test Build Docs (push) Canceled after 0s
Docs / Build & Deploy Docs (push) Canceled after 0s
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-10-10 11:30:59 -07:00
github-actions[bot]andCrowdin Bot f63901f51b New Crowdin translations by GitHub Action (#7240)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-10-10 18:24:05 +00:00
shamoon 03ad0e5d30 Chorehancement: add fileflows widget v2 for 26.10 breaking changes (#7239) 2026-10-10 08:10:15 -07:00
shamoon 447c4f1467 Chore: remove custom Vitest JSX esbuild config (#7234)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-10-08 21:29:24 -07:00
dependabot[bot] f54bcf4ef3 Chore(deps): Bump source-map-js from 1.2.1 to 1.2.2 (#7229)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 18:01:38 +00:00
dependabot[bot] 739c2ae551 Chore(deps): Bump sharp from 0.35.4 to 0.35.5 (#7228)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 17:43:57 +00:00
dependabot[bot] 9c6e621951 Chore(deps): Bump http-cache-semantics from 4.2.0 to 4.3.0 (#7231)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 17:33:25 +00:00
dependabot[bot] 68db3aec7d Chore(deps): Bump js-yaml from 5.4.2 to 5.4.3 (#7230)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 17:25:22 +00:00
dependabot[bot] eb3f97a58f Chore(deps): Bump next from 16.3.6 to 16.3.8 (#7232)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 17:17:15 +00:00
shamoon 97db55ab36 Fix: use x-total-count header for correct gitea totals (#7227) 2026-10-08 10:10:30 -07:00
dependabot[bot] fec0f5d8b2 Chore(deps): Bump release-drafter/release-drafter/autolabeler from 7.6.0 to 7.8.0 (#7226)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 16:49:47 +00:00
dependabot[bot] 1a4c4f0db5 Chore(deps): Bump release-drafter/release-drafter from 7.6.0 to 7.8.0 (#7225)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-08 09:41:50 -07:00
shamoon 904e895fec Chorehancement: limit log size + rotate (#7218)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-10-05 21:21:25 -07:00
shamoon 8ec79250e6 Chore: handle cloudflare breaking API change dropping connections (#7217) 2026-10-05 20:56:01 -07:00
github-actions[bot]andCrowdin Bot d41f56feb5 New Crowdin translations by GitHub Action (#7162)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-10-06 02:00:28 +00:00
shamoon 666869ca0c Update next-i18next.config.js
Docker CI / Docker Build & Push (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-10-01 20:13:43 -07:00
dependabot[bot] 6ba7e487d7 Chore(deps): Bump crowdin/github-action from 3.1.0 to 3.3.0 (#7204)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-02 03:10:16 +00:00
dependabot[bot] ed83113bf2 Chore(deps): Bump astral-sh/setup-uv from 10.1.0 to 10.2.0 (#7203)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-02 03:03:04 +00:00
dependabot[bot] cdb8282dd7 Chore(deps): Bump @grpc/grpc-js from 1.14.4 to 1.14.5 (#7212)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 21:04:02 +00:00
dependabot[bot] b0f2561560 Chore(deps): Bump next from 16.3.3 to 16.3.6 (#7213)
Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 20:57:34 +00:00
dependabot[bot] d39b7da27a Chore(deps): Bump brace-expansion from 1.1.18 to 1.1.21 (#7211)
Signed-off-by: dependabot[bot] <support@github.com>
2026-10-01 13:49:45 -07:00
dependabot[bot] 82ccdd38df Chore(deps): Bump react-i18next from 17.0.12 to 17.0.15 (#7207)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 20:36:51 +00:00
dependabot[bot] 9c73c329c4 Chore(deps): Bump the react group with 2 updates (#7205)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 20:25:34 +00:00
dependabot[bot] dec0176d49 Chore(deps): Bump systeminformation from 5.33.1 to 5.33.13 (#7206)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 20:17:04 +00:00
dependabot[bot] 3dc3ccccc3 Chore(deps): Bump i18next from 26.3.6 to 26.4.2 (#7209)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 20:06:05 +00:00
dependabot[bot] 277d0e4405 Chore(deps-dev): Bump prettier from 3.9.6 to 3.9.9 (#7208)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 12:57:18 -07:00
shamoon 9ae584f0ec Feature: Bookorbit service widget (#7202)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-09-30 08:59:42 -07:00
dependabot[bot] 8d39113bbe Chore(deps): Bump undici from 8.10.0 to 8.11.2 (#7200)
Lint / Linting Checks (push) Canceled after 0s
Docker CI / Docker Build & Push (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-29 14:08:11 +00:00
dependabot[bot] 8f32d61920 Chore(deps): Bump ip-address from 10.5.0 to 10.7.2 (#7199)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-29 06:58:37 -07:00
d001910e86 Feature: qui widget (#7192)
Docker CI / Docker Build & Push (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Co-authored-by: yorah <yoram.harmelin@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-09-25 16:46:43 +00:00
shamoon 18a5c4ad73 Feature: feeds widget (#7170)
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Release Drafter / Auto Label PR (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
2026-09-24 21:47:15 -07:00
dependabot[bot] 83d7fe2556 Chore(deps): Bump crowdin/github-action from 3.0.2 to 3.1.0 (#7183)
Release Drafter / Auto Label PR (push) Canceled after 0s
Docker CI / Docker Build & Push (push) Canceled after 0s
Lint / Linting Checks (push) Canceled after 0s
Release Drafter / Update Release Draft (push) Canceled after 0s
Tests / vitest (1) (push) Canceled after 0s
Tests / vitest (2) (push) Canceled after 0s
Tests / vitest (3) (push) Canceled after 0s
Tests / vitest (4) (push) Canceled after 0s
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-24 17:17:23 +00:00
dependabot[bot] 9669a68995 Chore(deps): Bump codecov/codecov-action from 7.0.0 to 7.1.1 (#7184)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-24 17:11:27 +00:00
dependabot[bot] b1935ed8a0 Chore(deps): Bump docker/build-push-action from 7.3.0 to 7.4.0 (#7182)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-24 17:04:48 +00:00
dependabot[bot] c5a218c39a Chore(deps): Bump docker/setup-buildx-action from 4.3.0 to 4.4.1 (#7185)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-24 09:58:27 -07:00
dependabot[bot] 2e287402c4 Chore(deps): Bump docker/setup-qemu-action from 4.3.0 to 4.4.0 (#7181)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-24 09:51:54 -07:00
Andy Georgeandshamoon 40082f798d Documentation: Arcane widget documentation formatting (#7171)
Docker CI / Docker Build & Push (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-09-23 22:39:41 +00:00
shamoon db480ca991 Performance: reduce json data transformations (#7175) 2026-09-23 15:32:30 -07:00
shamoon a7a4378a40 Fix: ensure correct relative dates formatter uses calendar days (#7174)
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-23 11:41:55 -07:00
shamoon d1c1ee7a1e Feature: Plex mono font support, card + block styles (#7169)
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-22 21:58:11 -07:00
shamoon e0be80085e Feature: customapi info widget (#7168) 2026-09-22 21:03:51 -07:00
dependabot[bot] b8ed72a03f Chore(deps): Bump astral-sh/setup-uv from 10.0.1 to 10.1.0 (#7156)
Lint / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-17 21:29:47 +00:00
dependabot[bot] ebff6f4a7d Chore(deps): Bump crowdin/github-action from 3.0.1 to 3.0.2 (#7155)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-17 21:23:19 +00:00
dependabot[bot] e890b544dc Chore(deps): Bump pnpm/action-setup from 6.0.10 to 6.1.0 (#7154)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-17 14:16:45 -07:00
shamoon f7666df9d8 Move PBS since param to optional params
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-17 07:36:08 -07:00
shamoon 6b6926108e 2.4.0
Docker CI / Docker Build & Push (push) Has been cancelled
Docs / Test Build Docs (push) Has been cancelled
Docs / Build & Deploy Docs (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-17 00:14:55 -07:00
shamoon c391c91517 Merge branch 'dev' 2026-09-17 00:14:40 -07:00
github-actions[bot]andCrowdin Bot 941db5706c New Crowdin translations by GitHub Action (#7120)
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-09-16 14:41:12 +00:00
dependabot[bot] 643ebe8c02 Chore(deps): Bump js-yaml from 5.4.1 to 5.4.2 (#7147)
Signed-off-by: dependabot[bot] <support@github.com>
2026-09-16 14:23:30 +00:00
dependabot[bot] 1021027b5a Chore(deps): Bump sharp from 0.35.3 to 0.35.4 (#7146)
Signed-off-by: dependabot[bot] <support@github.com>
2026-09-16 07:16:22 -07:00
shamoon 0e131aa0d4 Documentation: change npm credentials to 'view-only' user
Docker CI / Docker Build & Push (push) Has been cancelled
Docs / Test Build Docs (push) Has been cancelled
Docs / Build & Deploy Docs (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-16 07:15:09 -07:00
shamoon 3598869ef0 Fix: prevent mcp operations losing var placeholders (#7144) 2026-09-16 07:08:20 -07:00
shamoon c764d05a0c Fix: better handle PeaNUT missing data (#7139)
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-12 21:49:05 -07:00
Ben Belov fcd9a715d9 Enhancement: Add bearer authentication to whatsupdocker widget (#7134)
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
2026-09-11 23:24:08 -07:00
dependabot[bot] eacc205249 Chore(deps): Bump crowdin/github-action from 3.0.0 to 3.0.1 (#7128)
Docker CI / Docker Build & Push (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-10 16:57:51 +00:00
dependabot[bot] 4249a3fb95 Chore(deps): Bump actions/deploy-pages from 5.0.0 to 5.0.1 (#7127)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-10 16:50:37 +00:00
dependabot[bot] 0b98428ab5 Chore(deps): Bump docker/setup-qemu-action from 4.2.0 to 4.3.0 (#7129)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-10 09:44:14 -07:00
dependabot[bot] bbe52519bb Chore(deps): Bump js-yaml from 5.4.0 to 5.4.1 (#7119)
Docker CI / Docker Build & Push (push) Has been cancelled
Tests / vitest (1) (push) Has been cancelled
Tests / vitest (2) (push) Has been cancelled
Tests / vitest (3) (push) Has been cancelled
Tests / vitest (4) (push) Has been cancelled
Lint / Linting Checks (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Release Drafter / Auto Label PR (push) Has been cancelled
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-09 15:12:08 -07:00
157 changed files with 5358 additions and 1695 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: crowdin action - name: crowdin action
uses: crowdin/github-action@e4a6c1338b4063c77d46a81875265f9e8bd76f95 # v3.0.0 uses: crowdin/github-action@9c23991700c0ec5256fd41089b9d9d7d540e424e # v3.3.0
with: with:
upload_translations: false upload_translations: false
download_translations: true download_translations: true
+4 -4
View File
@@ -62,7 +62,7 @@ jobs:
nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
with: with:
version: 10 version: 10
run_install: false run_install: false
@@ -99,14 +99,14 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Setup QEMU - name: Setup QEMU
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0 uses: docker/setup-qemu-action@99012661954931238ded8c8b007157a8430204e1 # v4.4.0
- name: Setup Docker buildx - name: Setup Docker buildx
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4 uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4
- name: Build and push Docker image - name: Build and push Docker image
id: build-and-push id: build-and-push
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7 uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7
with: with:
context: . context: .
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
+3 -3
View File
@@ -23,7 +23,7 @@ jobs:
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- run: sudo apt-get install pngquant - run: sudo apt-get install pngquant
- name: Test Docs Build - name: Test Docs Build
run: uv run --frozen zensical build --clean run: uv run --frozen zensical build --clean
@@ -45,12 +45,12 @@ jobs:
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
- run: sudo apt-get install pngquant - run: sudo apt-get install pngquant
- name: Build Docs - name: Build Docs
run: uv run --frozen zensical build --clean run: uv run --frozen zensical build --clean
- uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
with: with:
path: site path: site
- uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 - uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
id: deployment id: deployment
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
with: with:
version: 10 version: 10
run_install: false run_install: false
+3 -3
View File
@@ -26,14 +26,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- if: github.event_name == 'workflow_dispatch' && github.event.inputs.version != '' - if: github.event_name == 'workflow_dispatch' && github.event.inputs.version != ''
uses: release-drafter/release-drafter@eada3c96a64734dd381cfbda23511034e328ddb0 # v7 uses: release-drafter/release-drafter@c345907820e0396f6f44bcfd9ac4763325f8feb0 # v7
with: with:
config-name: release-drafter.yml config-name: release-drafter.yml
version: ${{ github.event.inputs.version }} version: ${{ github.event.inputs.version }}
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- if: github.event_name != 'workflow_dispatch' || github.event.inputs.version == '' - if: github.event_name != 'workflow_dispatch' || github.event.inputs.version == ''
uses: release-drafter/release-drafter@eada3c96a64734dd381cfbda23511034e328ddb0 # v7 uses: release-drafter/release-drafter@c345907820e0396f6f44bcfd9ac4763325f8feb0 # v7
with: with:
config-name: release-drafter.yml config-name: release-drafter.yml
env: env:
@@ -47,7 +47,7 @@ jobs:
pull-requests: write pull-requests: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: release-drafter/release-drafter/autolabeler@eada3c96a64734dd381cfbda23511034e328ddb0 - uses: release-drafter/release-drafter/autolabeler@c345907820e0396f6f44bcfd9ac4763325f8feb0
with: with:
config-name: release-drafter.yml config-name: release-drafter.yml
env: env:
+2 -2
View File
@@ -18,7 +18,7 @@ jobs:
steps: steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
with: with:
version: 9 version: 9
@@ -31,7 +31,7 @@ jobs:
# Run Vitest directly so `--shard` is parsed as an option # Run Vitest directly so `--shard` is parsed as an option
- run: pnpm -s exec vitest run --coverage --shard ${{ matrix.shard }}/4 --pool forks - run: pnpm -s exec vitest run --coverage --shard ${{ matrix.shard }}/4 --pool forks
- name: Upload coverage reports to Codecov - name: Upload coverage reports to Codecov
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
with: with:
token: ${{ secrets.CODECOV_TOKEN }} token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/lcov.info files: ./coverage/lcov.info
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

+60
View File
@@ -430,6 +430,64 @@ headerStyle: clean
headerStyle: boxedWidgets headerStyle: boxedWidgets
``` ```
## Card Style
Service and bookmark cards use a drop shadow by default. The `hairline` style replaces it with a thin border that brightens on hover.
<img width="896" alt="default cards" src="../../assets/style-default.webp">
```yaml
# default, shadowed cards
```
---
<img width="896" alt="hairline cards" src="../../assets/card-style-hairline.webp">
```yaml
cardStyle: hairline
```
## Block Style
Widget blocks (the value / label pairs inside a service card) can use the `refined` style to make values heavier and easier to read.
<img width="896" alt="default blocks" src="../../assets/style-default.webp">
```yaml
# default, standard blocks
```
---
<img width="896" alt="refined blocks" src="../../assets/block-style-refined.webp">
```yaml
blockStyle: refined
```
## Font
Homepage uses Manrope by default. You can switch to IBM Plex Mono instead, either everywhere or for data only.
<img width="896" alt="IBM Plex Mono everywhere" src="../../assets/font-plex.webp">
```yaml
font: plex # the whole dashboard
```
---
<img width="896" alt="IBM Plex Mono for data only" src="../../assets/font-plex-data.webp">
```yaml
font: plexData # only values, stats, the clock and status tags
```
With `plexData`, labels and names stay in Manrope while numbers line up in columns.
Both fonts are bundled with Homepage, so no external requests are made.
## Base URL ## Base URL
In some proxy configurations, it may be necessary to set the documents base URL. You can do this by providing a `base` value, like so: In some proxy configurations, it may be necessary to set the documents base URL. You can do this by providing a `base` value, like so:
@@ -554,6 +612,8 @@ logpath: /logfile/path
By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`. By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`.
Log files rotate automatically when they reach 10 MiB. Up to five files are retained: the current `homepage.log` and four rotated files (`homepage1.log` through `homepage4.log`). The oldest rotated file is removed when a new one is created.
## Show Container Stats ## Show Container Stats
You can show all docker or proxmox stats expanded in `settings.yaml`: You can show all docker or proxmox stats expanded in `settings.yaml`:
+36
View File
@@ -0,0 +1,36 @@
---
title: Custom API
description: Custom API Information Widget Configuration
---
_(Find the Custom API service widget [here](../services/customapi.md))_
The Custom API information widget shows values from a custom self-hosted or third party API in your Homepage header, alongside an icon.
```yaml
- customapi:
url: http://custom.api.host.or.ip:port/path/to/exact/api/endpoint
icon: mdi-api # optional, see below
label: My API # optional, shown below the values
href: https://custom.api.host # optional, makes the widget a link
refreshInterval: 10000 # optional - in milliseconds, defaults to 10s
username: username # auth - optional
password: password # auth - optional
method: GET # optional, e.g. POST
headers: # optional, must be object
X-API-Token: token
requestBody: # optional, can be string or object
mappings:
- field: key
label: Field 1
- field: path.to.key2
label: Field 2
format: number # optional - defaults to text
- field: path.to.key3
label: Field 3
format: percent
```
The `icon` accepts the same values as [service icons](../../configs/services.md#icons), e.g. `mdi-api`, `si-github`, `sh-homepage`, a dashboard icon name like `homepage.png`, or a full URL. If no icon is set, a generic API icon is shown.
Mappings support the same `field`, `format`, `remap`, `scale`, `prefix` and `suffix` options as the [Custom API service widget](../services/customapi.md). The `additionalField` option and the `display` modes are not supported.
+1
View File
@@ -7,6 +7,7 @@ search:
You can also find a list of all available info widgets in the sidebar navigation. You can also find a list of all available info widgets in the sidebar navigation.
- [Custom API](customapi.md)
- [Date & Time](datetime.md) - [Date & Time](datetime.md)
- [Glances](glances.md) - [Glances](glances.md)
- [Greeting](greeting.md) - [Greeting](greeting.md)
+2 -1
View File
@@ -6,6 +6,7 @@ description: Arcane Widget Configuration
Learn more about [Arcane](https://github.com/getarcaneapp/arcane). Learn more about [Arcane](https://github.com/getarcaneapp/arcane).
**Allowed fields** (max 4): `running`, `stopped`, `total`, `images`, `images_used`, `images_unused`, `image_updates`. **Allowed fields** (max 4): `running`, `stopped`, `total`, `images`, `images_used`, `images_unused`, `image_updates`.
**Default fields**: `running`, `stopped`, `total`, `image_updates`. **Default fields**: `running`, `stopped`, `total`, `image_updates`.
```yaml ```yaml
@@ -17,4 +18,4 @@ widget:
fields: ["running", "stopped", "total", "image_updates"] # optional fields: ["running", "stopped", "total", "image_updates"] # optional
``` ```
Using an api key for the widget requires permissions for: `containers:list` `images:list and `image-updates:read` Using an API key for the widget requires permissions for: `containers:list`, `images:list`, and `image-updates:read`.
+21
View File
@@ -0,0 +1,21 @@
---
title: BookOrbit
description: BookOrbit Widget Configuration
---
Learn more about [BookOrbit](https://github.com/bookorbit/bookorbit).
```yaml
widget:
type: bookorbit
url: http://bookorbit.host.or.ip:3000
username: username
password: password
fields: ["books", "authors", "reading", "finished"] # optional
```
## Fields
Allowed fields: `["books", "authors", "series", "storage", "reading", "finished"]` (maximum of 4).
Default fields: `["books", "authors", "reading", "finished"]`.
+2
View File
@@ -3,6 +3,8 @@ title: Custom API
description: Custom Widget Configuration from the API description: Custom Widget Configuration from the API
--- ---
_(Find the Custom API information widget [here](../info/customapi.md))_
This widget can show information from custom self-hosted or third party API. This widget can show information from custom self-hosted or third party API.
Fields need to be defined in the `mappings` section YAML object to correlate with the value in the APIs JSON object. Final field definition needs to be the key with the desired value information. Fields need to be defined in the `mappings` section YAML object to correlate with the value in the APIs JSON object. Final field definition needs to be the key with the desired value information.
+46
View File
@@ -0,0 +1,46 @@
---
title: Feed
description: RSS / Atom feed widget
---
This widget shows the latest items from an RSS 2.0 or Atom feed.
```yaml
widget:
type: feed
url: https://feeds.bbci.co.uk/news/rss.xml
maxItems: 5 # optional - defaults to 5
layout: list # optional - possible values list, grid - defaults to list
images: true # optional - set to false to hide images - defaults to true
```
## Layouts
`list` shows one row per item. Items with an image get a small thumbnail.
![Feed widget list layout](../../assets/widget_feed_list.webp)
![Feed widget list layout with thumbnails](../../assets/widget_feed_thumbnails.webp)
`grid` shows image tiles that re-flow to fit the width of the widget, e.g.:
```yaml
- NASA Image of the Day:
widget:
type: feed
url: https://www.nasa.gov/feeds/iotd-feed/
layout: grid
maxItems: 8
```
![Feed widget grid layout](../../assets/widget_feed_grid.webp)
## Images
Images are taken from the feed's `media:thumbnail` / `media:content` tags or image enclosures, falling back to the first image in the item's content. Some feeds do not include images at all.
Images are loaded by your browser directly from the feed's host, at whatever size the feed provides. Feeds that link full-size originals can be slow to load; set `images: false` for those.
## Notes
Feeds are fetched by homepage, not your browser, and cached for 10 minutes.
+10 -1
View File
@@ -5,10 +5,19 @@ description: Fileflows Widget Configuration
Learn more about [FileFlows](https://github.com/revenz/FileFlows). Learn more about [FileFlows](https://github.com/revenz/FileFlows).
Allowed fields: `["queue", "processing", "processed", "time"]`. Allowed fields: `["queue", "processing", "processed", "time"]` (version 1) or `["queue", "processing", "processed", "failed"]` (version 2).
| FileFlows Version | Homepage Widget Version |
| ----------------- | ----------------------- |
| < 26.10 | 1 (default) |
| >= 26.10 | 2 |
Version 2 uses the ["Fenrus Dashboard Endpoint"](https://fileflows.com/docs/webconsole/config/settings/general#fenrus-dashboard-endpoint), which must be enabled. Use the token shown there as the `key`.
```yaml ```yaml
widget: widget:
type: fileflows type: fileflows
url: http://your.fileflows.host:port url: http://your.fileflows.host:port
version: 2 # optional, defaults to 1
key: yourfenrustoken # required for version 2
``` ```
+3
View File
@@ -19,6 +19,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [Backrest](backrest.md) - [Backrest](backrest.md)
- [Bazarr](bazarr.md) - [Bazarr](bazarr.md)
- [Booklore](booklore.md) - [Booklore](booklore.md)
- [BookOrbit](bookorbit.md)
- [Beszel](beszel.md) - [Beszel](beszel.md)
- [Caddy](caddy.md) - [Caddy](caddy.md)
- [Calendar](calendar.md) - [Calendar](calendar.md)
@@ -39,6 +40,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [Emby](emby.md) - [Emby](emby.md)
- [ESPHome](esphome.md) - [ESPHome](esphome.md)
- [EVCC](evcc.md) - [EVCC](evcc.md)
- [Feed](feed.md)
- [Filebrowser](filebrowser.md) - [Filebrowser](filebrowser.md)
- [Fileflows](fileflows.md) - [Fileflows](fileflows.md)
- [Firefly III](firefly.md) - [Firefly III](firefly.md)
@@ -119,6 +121,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [PyLoad](pyload.md) - [PyLoad](pyload.md)
- [qBittorrent](qbittorrent.md) - [qBittorrent](qbittorrent.md)
- [QNAP](qnap.md) - [QNAP](qnap.md)
- [qui](qui.md)
- [Radarr](radarr.md) - [Radarr](radarr.md)
- [Readarr](readarr.md) - [Readarr](readarr.md)
- [ROMM](romm.md) - [ROMM](romm.md)
+3 -3
View File
@@ -5,7 +5,7 @@ description: Nginx Proxy Manager Widget Configuration
Learn more about [Nginx Proxy Manager](https://nginxproxymanager.com/). Learn more about [Nginx Proxy Manager](https://nginxproxymanager.com/).
Login with the same admin username and password used to access the web UI. Use a "view-only" user for the username and password.
Allowed fields: `["enabled", "disabled", "total"]`. Allowed fields: `["enabled", "disabled", "total"]`.
@@ -13,6 +13,6 @@ Allowed fields: `["enabled", "disabled", "total"]`.
widget: widget:
type: npm type: npm
url: http://npm.host.or.ip url: http://npm.host.or.ip
username: admin_username username: view_only_username
password: admin_password password: view_only_password
``` ```
+30
View File
@@ -0,0 +1,30 @@
---
title: qui
description: qui Widget Configuration
---
Learn more about [qui](https://github.com/autobrr/qui).
Generate an API key in qui under **Settings → API Keys**.
The widget has two modes:
- **Aggregated (default):** omit `instance` to show combined stats across all qBittorrent instances monitored by qui.
- **Per-instance:** set `instance` to the qui ID (visible in the qui UI) to show just that one.
```yaml
widget:
type: qui
url: http://qui.host.or.ip:7476
key: quiapikeyquiapikeyquiapikey
instance: 1 # optional; omit for aggregated stats across all instances
fields: ["leech", "download", "seed", "upload"] # optional
```
## Fields
Allowed fields: `["leech", "download", "seed", "upload", "total", "errored", "ratio", "freeSpace"]` (maximum of 4).
Default fields: `["leech", "download", "seed", "upload"]`.
Note: `ratio` and `freeSpace` are only available with the 'single instance' version of the widget.
+1
View File
@@ -13,4 +13,5 @@ widget:
url: http://whatsupdocker:port url: http://whatsupdocker:port
username: username # optional username: username # optional
password: password # optional password: password # optional
key: bearer-token # optional, takes precedence over username/password
``` ```
+4
View File
@@ -44,6 +44,7 @@ nav:
- widgets/services/backrest.md - widgets/services/backrest.md
- widgets/services/bazarr.md - widgets/services/bazarr.md
- widgets/services/booklore.md - widgets/services/booklore.md
- widgets/services/bookorbit.md
- widgets/services/beszel.md - widgets/services/beszel.md
- widgets/services/caddy.md - widgets/services/caddy.md
- widgets/services/calendar.md - widgets/services/calendar.md
@@ -65,6 +66,7 @@ nav:
- widgets/services/emby.md - widgets/services/emby.md
- widgets/services/esphome.md - widgets/services/esphome.md
- widgets/services/evcc.md - widgets/services/evcc.md
- widgets/services/feed.md
- widgets/services/filebrowser.md - widgets/services/filebrowser.md
- widgets/services/fileflows.md - widgets/services/fileflows.md
- widgets/services/firefly.md - widgets/services/firefly.md
@@ -148,6 +150,7 @@ nav:
- widgets/services/pyload.md - widgets/services/pyload.md
- widgets/services/qbittorrent.md - widgets/services/qbittorrent.md
- widgets/services/qnap.md - widgets/services/qnap.md
- widgets/services/qui.md
- widgets/services/radarr.md - widgets/services/radarr.md
- widgets/services/readarr.md - widgets/services/readarr.md
- widgets/services/romm.md - widgets/services/romm.md
@@ -194,6 +197,7 @@ nav:
- widgets/services/zabbix.md - widgets/services/zabbix.md
- "Information Widgets": - "Information Widgets":
- widgets/info/index.md - widgets/info/index.md
- widgets/info/customapi.md
- widgets/info/datetime.md - widgets/info/datetime.md
- widgets/info/glances.md - widgets/info/glances.md
- widgets/info/greeting.md - widgets/info/greeting.md
+8
View File
@@ -106,6 +106,12 @@ function relativeDate(date, formatter) {
const unitIndex = cutoffs.findIndex((cutoff) => cutoff > Math.abs(delta)); const unitIndex = cutoffs.findIndex((cutoff) => cutoff > Math.abs(delta));
const divisor = unitIndex ? cutoffs[unitIndex - 1] : 1; const divisor = unitIndex ? cutoffs[unitIndex - 1] : 1;
if (units[unitIndex] === "day") {
// compare calendar days, not elapsed 24h blocks
const startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
return formatter.format(Math.round((startOfDay(date) - startOfDay(new Date())) / 86400000), "day");
}
return formatter.format(Math.floor(delta / divisor), units[unitIndex]); return formatter.format(Math.floor(delta / divisor), units[unitIndex]);
} }
@@ -115,6 +121,8 @@ module.exports = {
locales: ["en"], locales: ["en"],
}, },
serializeConfig: false, serializeConfig: false,
// see https://github.com/i18next/i18next/issues/2227
cacheInBuiltFormats: false,
use: [ use: [
{ {
init: (i18next) => { init: (i18next) => {
+10 -9
View File
@@ -1,6 +1,6 @@
{ {
"name": "homepage", "name": "homepage",
"version": "2.3.0", "version": "2.5.0",
"private": true, "private": true,
"scripts": { "scripts": {
"preinstall": "npx only-allow pnpm", "preinstall": "npx only-allow pnpm",
@@ -21,26 +21,27 @@
"dockerode": "^5.0.0", "dockerode": "^5.0.0",
"follow-redirects": "^1.16.0", "follow-redirects": "^1.16.0",
"gamedig": "^5.3.3", "gamedig": "^5.3.3",
"i18next": "^26.3.6", "i18next": "^26.4.2",
"ical.js": "^2.2.1", "ical.js": "^2.2.1",
"js-yaml": "^5.4.0", "js-yaml": "^5.4.3",
"json-rpc-2.0": "^1.7.1", "json-rpc-2.0": "^1.7.1",
"luxon": "^3.7.2", "luxon": "^3.7.2",
"memory-cache": "^0.2.0", "memory-cache": "^0.2.0",
"minecraftstatuspinger": "^1.2.2", "minecraftstatuspinger": "^1.2.2",
"next": "^16.3.3", "next": "^16.3.8",
"next-auth": "^4.24.15", "next-auth": "^4.24.15",
"next-i18next": "^16.0.8", "next-i18next": "^16.0.8",
"ping": "^1.0.0", "ping": "^1.0.0",
"pretty-bytes": "^7.1.1", "pretty-bytes": "^7.1.1",
"raw-body": "^4.0.0", "raw-body": "^4.0.0",
"react": "^19.2.8", "react": "^19.3.0",
"react-dom": "^19.2.8", "react-dom": "^19.3.0",
"react-i18next": "^17.0.12", "react-i18next": "^17.0.15",
"react-icons": "^5.6.0", "react-icons": "^5.6.0",
"recharts": "^3.1.2", "recharts": "^3.1.2",
"sax": "^1.6.1",
"swr": "^2.5.1", "swr": "^2.5.1",
"systeminformation": "^5.33.1", "systeminformation": "^5.33.13",
"tough-cookie": "^6.0.2", "tough-cookie": "^6.0.2",
"urbackup-server-api": "^0.92.2", "urbackup-server-api": "^0.92.2",
"winston": "^3.19.0", "winston": "^3.19.0",
@@ -58,7 +59,7 @@
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"jsdom": "^30.0.1", "jsdom": "^30.0.1",
"postcss": "^8.5.26", "postcss": "^8.5.26",
"prettier": "^3.8.4", "prettier": "^3.9.9",
"prettier-plugin-organize-imports": "^4.3.0", "prettier-plugin-organize-imports": "^4.3.0",
"tailwind-scrollbar": "^4.0.2", "tailwind-scrollbar": "^4.0.2",
"tailwindcss": "^4.3.3", "tailwindcss": "^4.3.3",
+328 -325
View File
File diff suppressed because it is too large Load Diff
+28 -6
View File
@@ -100,11 +100,11 @@
"not_found": "Nie Gevind Nie", "not_found": "Nie Gevind Nie",
"exited": "Verlaat", "exited": "Verlaat",
"partial": "Gedeeltelik", "partial": "Gedeeltelik",
"created": "Created", "created": "Geskep",
"paused": "Paused", "paused": "Onderbreek",
"restarting": "Restarting", "restarting": "Herlaai",
"removing": "Removing", "removing": "Verwydering",
"dead": "Dead" "dead": "Dood"
}, },
"ping": { "ping": {
"error": "Fout", "error": "Fout",
@@ -256,6 +256,16 @@
"leech": "Seier", "leech": "Seier",
"seed": "Vul" "seed": "Vul"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "SVE Gebruik", "cpuUsage": "SVE Gebruik",
"memUsage": "MEM Gebruik", "memUsage": "MEM Gebruik",
@@ -780,7 +790,8 @@
"queue": "Tou", "queue": "Tou",
"processing": "Verwerking", "processing": "Verwerking",
"processed": "Verwerk", "processed": "Verwerk",
"time": "Tyd" "time": "Tyd",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Netto Waarde", "networth": "Netto Waarde",
@@ -859,6 +870,14 @@
"reading": "Lees", "reading": "Lees",
"finished": "Klaar" "finished": "Klaar"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Tou", "downloadCount": "Tou",
"downloadBytesRemaining": "Oorblywende", "downloadBytesRemaining": "Oorblywende",
@@ -1258,5 +1277,8 @@
"wanted": "Gesoek", "wanted": "Gesoek",
"queued": "In ry", "queued": "In ry",
"leagues": "Ligas" "leagues": "Ligas"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "المُستهلكون", "leech": "المُستهلكون",
"seed": "المُزوِّدين" "seed": "المُزوِّدين"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "استهلاك المعالج", "cpuUsage": "استهلاك المعالج",
"memUsage": "استخدام الذاكرة العشوائية", "memUsage": "استخدام الذاكرة العشوائية",
@@ -780,7 +790,8 @@
"queue": "الطابور", "queue": "الطابور",
"processing": "قيد المعالجة", "processing": "قيد المعالجة",
"processed": "مُعَالَج", "processed": "مُعَالَج",
"time": "الوقت" "time": "الوقت",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "صافي القيمة", "networth": "صافي القيمة",
@@ -859,6 +870,14 @@
"reading": "أقرأُه", "reading": "أقرأُه",
"finished": "منتهي" "finished": "منتهي"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "الطابور", "downloadCount": "الطابور",
"downloadBytesRemaining": "متبقِ", "downloadBytesRemaining": "متبقِ",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU употреба", "cpuUsage": "CPU употреба",
"memUsage": "Упортеба памет", "memUsage": "Упортеба памет",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Време" "time": "Време",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+40 -18
View File
@@ -256,6 +256,16 @@
"leech": "Sangonera", "leech": "Sangonera",
"seed": "Sembrat" "seed": "Sembrat"
}, },
"qui": {
"leech": "Sangonera",
"download": "Baixada",
"seed": "Sembrat",
"upload": "Pujada",
"total": "Total",
"errored": "Errors",
"ratio": "Ràtio",
"freeSpace": "Lliure"
},
"qnap": { "qnap": {
"cpuUsage": "Ús de CPU", "cpuUsage": "Ús de CPU",
"memUsage": "Ús de Memòria", "memUsage": "Ús de Memòria",
@@ -281,28 +291,28 @@
"seed": "Sembrat" "seed": "Sembrat"
}, },
"sonarr": { "sonarr": {
"wanted": "Volgut", "wanted": "Pendents",
"queued": "En cua", "queued": "En cua",
"series": "Sèries", "series": "Sèries",
"queue": "Cua", "queue": "Cua",
"unknown": "Desconegut" "unknown": "Desconegut"
}, },
"radarr": { "radarr": {
"wanted": "Volguts", "wanted": "Pendents",
"missing": "Falten", "missing": "Falten",
"queued": "Encuat", "queued": "En cua",
"movies": "Pel·lícules", "movies": "Pel·lícules",
"queue": "Cua", "queue": "Cua",
"unknown": "Desconegut" "unknown": "Desconegut"
}, },
"lidarr": { "lidarr": {
"wanted": "Volguts", "wanted": "Pendents",
"queued": "Encuat", "queued": "En cua",
"artists": "Artistes" "artists": "Artistes"
}, },
"readarr": { "readarr": {
"wanted": "Volguts", "wanted": "Pendents",
"queued": "Encuat", "queued": "En cua",
"books": "Llibres" "books": "Llibres"
}, },
"bazarr": { "bazarr": {
@@ -320,7 +330,7 @@
"available": "Disponible", "available": "Disponible",
"completed": "Completat", "completed": "Completat",
"processing": "Processant", "processing": "Processant",
"issues": "Temes oberts" "issues": "Incidències"
}, },
"netalertx": { "netalertx": {
"total": "Total", "total": "Total",
@@ -460,8 +470,8 @@
"domain_count": "Dominis" "domain_count": "Dominis"
}, },
"medusa": { "medusa": {
"wanted": "Volguts", "wanted": "Pendents",
"queued": "Encuat", "queued": "En cua",
"series": "Sèries" "series": "Sèries"
}, },
"minecraft": { "minecraft": {
@@ -767,8 +777,8 @@
}, },
"mylar": { "mylar": {
"series": "Sèries", "series": "Sèries",
"issues": "Problemes", "issues": "Números",
"wanted": "Volguts" "wanted": "Pendents"
}, },
"photoprism": { "photoprism": {
"albums": "Àlbums", "albums": "Àlbums",
@@ -780,7 +790,8 @@
"queue": "Cua", "queue": "Cua",
"processing": "Processant", "processing": "Processant",
"processed": "Processat", "processed": "Processat",
"time": "Temps" "time": "Temps",
"failed": "Error"
}, },
"firefly": { "firefly": {
"networth": "Valor Net", "networth": "Valor Net",
@@ -859,6 +870,14 @@
"reading": "Llegint", "reading": "Llegint",
"finished": "Acabats" "finished": "Acabats"
}, },
"bookorbit": {
"books": "Llibres",
"authors": "Autors",
"series": "Sèries",
"storage": "Emmagatzematge",
"reading": "Llegint",
"finished": "Acabats"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Cua", "downloadCount": "Cua",
"downloadBytesRemaining": "Restant", "downloadBytesRemaining": "Restant",
@@ -994,7 +1013,7 @@
}, },
"gitea": { "gitea": {
"notifications": "Notificacions", "notifications": "Notificacions",
"issues": "Problemes", "issues": "Incidències",
"pulls": "Sol·licitud de Canvis", "pulls": "Sol·licitud de Canvis",
"repositories": "Repositoris" "repositories": "Repositoris"
}, },
@@ -1124,7 +1143,7 @@
}, },
"gitlab": { "gitlab": {
"groups": "Grups", "groups": "Grups",
"issues": "Problemes", "issues": "Incidències",
"merges": "Merge Requests", "merges": "Merge Requests",
"projects": "Projectes" "projects": "Projectes"
}, },
@@ -1161,7 +1180,7 @@
}, },
"checkmk": { "checkmk": {
"serviceErrors": "Errors de servei", "serviceErrors": "Errors de servei",
"hostErrors": "Problemes de l'hoste" "hostErrors": "Errors de l'hoste"
}, },
"komodo": { "komodo": {
"total": "Total", "total": "Total",
@@ -1255,8 +1274,11 @@
"storage": "Emmagatzematge" "storage": "Emmagatzematge"
}, },
"sportarr": { "sportarr": {
"wanted": "Volgut", "wanted": "Pendents",
"queued": "Encuat", "queued": "En cua",
"leagues": "Lligues" "leagues": "Lligues"
},
"feed": {
"noItems": "Sense elements"
} }
} }
+30 -8
View File
@@ -40,8 +40,8 @@
}, },
"search": { "search": {
"placeholder": "Hledat…", "placeholder": "Hledat…",
"provider": "Search engine: {{name}}", "provider": "Vyhledávač: {{name}}",
"select_provider": "Select search engine" "select_provider": "Vyberte vyhledávač"
}, },
"resources": { "resources": {
"cpu": "Využití procesoru", "cpu": "Využití procesoru",
@@ -100,11 +100,11 @@
"not_found": "Nenalezen", "not_found": "Nenalezen",
"exited": "Ukončen", "exited": "Ukončen",
"partial": "Částečný", "partial": "Částečný",
"created": "Created", "created": "Vytvořeno",
"paused": "Paused", "paused": "Pozastaveno",
"restarting": "Restarting", "restarting": "Restartuji",
"removing": "Removing", "removing": "Odebírání",
"dead": "Dead" "dead": "Mrtvý"
}, },
"ping": { "ping": {
"error": "Chyba", "error": "Chyba",
@@ -256,6 +256,16 @@
"leech": "Leechované", "leech": "Leechované",
"seed": "Seedované" "seed": "Seedované"
}, },
"qui": {
"leech": "Leechované",
"download": "Stahování",
"seed": "Seedované",
"upload": "Nahravání",
"total": "Celkem",
"errored": "Chybné",
"ratio": "Poměr",
"freeSpace": "Volné"
},
"qnap": { "qnap": {
"cpuUsage": "Využití procesoru", "cpuUsage": "Využití procesoru",
"memUsage": "Využití paměti", "memUsage": "Využití paměti",
@@ -780,7 +790,8 @@
"queue": "Fronta", "queue": "Fronta",
"processing": "Zpracovává se", "processing": "Zpracovává se",
"processed": "Zpracováno", "processed": "Zpracováno",
"time": "Čas" "time": "Čas",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Čisté jmění", "networth": "Čisté jmění",
@@ -859,6 +870,14 @@
"reading": "Čtené", "reading": "Čtené",
"finished": "Přečtené" "finished": "Přečtené"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Fronta", "downloadCount": "Fronta",
"downloadBytesRemaining": "Zbývá", "downloadBytesRemaining": "Zbývá",
@@ -1258,5 +1277,8 @@
"wanted": "Požadované", "wanted": "Požadované",
"queued": "Ve frontě", "queued": "Ve frontě",
"leagues": "Ligy" "leagues": "Ligy"
},
"feed": {
"noItems": "Žádné položky"
} }
} }
File diff suppressed because it is too large Load Diff
+79 -57
View File
@@ -21,7 +21,7 @@
"seconds": "s" "seconds": "s"
}, },
"auth": { "auth": {
"signout": "Sign out" "signout": "Abmelden"
}, },
"widget": { "widget": {
"missing_type": "Fehlender Widget-Typ: {{type}}", "missing_type": "Fehlender Widget-Typ: {{type}}",
@@ -40,8 +40,8 @@
}, },
"search": { "search": {
"placeholder": "Suche…", "placeholder": "Suche…",
"provider": "Search engine: {{name}}", "provider": "Suchmaschine: {{name}}",
"select_provider": "Select search engine" "select_provider": "Suchmaschine auswählen"
}, },
"resources": { "resources": {
"cpu": "CPU", "cpu": "CPU",
@@ -77,13 +77,13 @@
"no_data": "Keine Speicherdaten verfügbar" "no_data": "Keine Speicherdaten verfügbar"
}, },
"duplicati": { "duplicati": {
"jobs": "Jobs", "jobs": "Aufgaben",
"stored": "Stored", "stored": "Gespeichert",
"lastBackup": "Last Run", "lastBackup": "Zuletzt ausgeführt",
"nextRun": "Next Run", "nextRun": "Nächste Ausführung",
"running": "Running", "running": "Wird ausgeführt",
"warnings": "Warnings", "warnings": "Warnungen",
"errors": "Errors" "errors": "Fehler"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
@@ -100,11 +100,11 @@
"not_found": "Nicht gefunden", "not_found": "Nicht gefunden",
"exited": "Beendet", "exited": "Beendet",
"partial": "Teilweise", "partial": "Teilweise",
"created": "Created", "created": "Erstellt am",
"paused": "Paused", "paused": "Pausiert",
"restarting": "Restarting", "restarting": "Wird neu gestartet",
"removing": "Removing", "removing": "Wird entfernt",
"dead": "Dead" "dead": "Tot"
}, },
"ping": { "ping": {
"error": "Fehler", "error": "Fehler",
@@ -140,7 +140,7 @@
"series": "Serien", "series": "Serien",
"episodes": "Episoden", "episodes": "Episoden",
"songs": "Titel", "songs": "Titel",
"albums": "Albums" "albums": "Alben"
}, },
"esphome": { "esphome": {
"offline": "Offline", "offline": "Offline",
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU-Nutzung", "cpuUsage": "CPU-Nutzung",
"memUsage": "Speichernutzung", "memUsage": "Speichernutzung",
@@ -364,15 +374,15 @@
"address": "Adresse", "address": "Adresse",
"expires": "Läuft ab", "expires": "Läuft ab",
"never": "Nie", "never": "Nie",
"user": "User", "user": "Benutzer",
"hostname": "Hostname", "hostname": "Hostname",
"name": "Name", "name": "Name",
"client_version": "Client Version", "client_version": "Client-Version",
"os": "OS", "os": "Betriebssystem",
"created": "Created", "created": "Erstellt am",
"authorized": "Authorized", "authorized": "Autorisiert",
"is_external": "Is External", "is_external": "Ist extern",
"update_available": "Update Available", "update_available": "Aktualisierung verfügbar",
"tags": "Tags", "tags": "Tags",
"last_seen": "Zuletzt gesehen", "last_seen": "Zuletzt gesehen",
"now": "Jetzt", "now": "Jetzt",
@@ -383,8 +393,8 @@
"minutes": "{{number}}min", "minutes": "{{number}}min",
"seconds": "{{number}}s", "seconds": "{{number}}s",
"ago": "Vor {{value}}", "ago": "Vor {{value}}",
"true": "Yes", "true": "Ja",
"false": "No" "false": "Nein"
}, },
"technitium": { "technitium": {
"totalQueries": "Anfragen", "totalQueries": "Anfragen",
@@ -479,7 +489,7 @@
"users": "Benutzer", "users": "Benutzer",
"loginsLast24H": "Anmeldungen (24 h)", "loginsLast24H": "Anmeldungen (24 h)",
"failedLoginsLast24H": "Fehlversuche (24 h)", "failedLoginsLast24H": "Fehlversuche (24 h)",
"authorizationsLast24H": "Auths (24h)" "authorizationsLast24H": "Autorisierungen (24h)"
}, },
"proxmox": { "proxmox": {
"mem": "RAM", "mem": "RAM",
@@ -488,7 +498,7 @@
"vms": "VMs" "vms": "VMs"
}, },
"pulse": { "pulse": {
"nodes": "Nodes", "nodes": "Knoten",
"vms": "VMs", "vms": "VMs",
"lxcs": "LXCs" "lxcs": "LXCs"
}, },
@@ -657,13 +667,13 @@
"total": "Total" "total": "Total"
}, },
"pangolin": { "pangolin": {
"orgs": "Orgs", "orgs": "Organisationen",
"sites": "Seiten", "sites": "Seiten",
"resources": "Ressourcen", "resources": "Ressourcen",
"targets": "Ziele", "targets": "Ziele",
"traffic": "Traffic", "traffic": "Traffic",
"in": "In", "in": "Eingehend",
"out": "Out" "out": "Ausgehend"
}, },
"peanut": { "peanut": {
"battery_charge": "Akkuladung", "battery_charge": "Akkuladung",
@@ -780,7 +790,8 @@
"queue": "Warteschlange", "queue": "Warteschlange",
"processing": "Wird verarbeitet", "processing": "Wird verarbeitet",
"processed": "Wird verarbeitet", "processed": "Wird verarbeitet",
"time": "Zeit" "time": "Zeit",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Reinvermögen", "networth": "Reinvermögen",
@@ -859,6 +870,14 @@
"reading": "Am Lesen", "reading": "Am Lesen",
"finished": "Fertig" "finished": "Fertig"
}, },
"bookorbit": {
"books": "Bücher",
"authors": "Autoren",
"series": "Serien",
"storage": "Storage",
"reading": "Reading",
"finished": "Beendet"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Warteschlange", "downloadCount": "Warteschlange",
"downloadBytesRemaining": "Verbleibend", "downloadBytesRemaining": "Verbleibend",
@@ -959,32 +978,32 @@
"storage": "Speicher" "storage": "Speicher"
}, },
"maintainerr": { "maintainerr": {
"itemsHandled": "Items Handled", "itemsHandled": "Items bearbeitet",
"episodesHandled": "Episodes Handled", "episodesHandled": "Episoden behandelt",
"moviesHandled": "Movies Handled", "moviesHandled": "Filme behandelt",
"showsHandled": "Shows Handled", "showsHandled": "Serien behandelt",
"seasonsHandled": "Seasons Handled", "seasonsHandled": "Staffeln bearbeitet",
"reclaimable": "Reclaimable", "reclaimable": "Zurückforderbar",
"movieReclaimable": "Movie Reclaimable", "movieReclaimable": "Film zurückforderbar",
"showReclaimable": "Show Reclaimable", "showReclaimable": "Serie zurückforderbar",
"totalCapacity": "Total Capacity" "totalCapacity": "Gesamte Kapazität"
}, },
"netdata": { "netdata": {
"warnings": "Warnungen", "warnings": "Warnungen",
"criticals": "Kritisch" "criticals": "Kritisch"
}, },
"ntfy": { "ntfy": {
"title": "Title", "title": "Titel",
"priority": "Priority", "priority": "Priorität",
"lastReceived": "Last Received", "lastReceived": "Zuletzt erhalten",
"message": "Message", "message": "Nachricht",
"tags": "Tags", "tags": "Schlagwörter",
"none": "None", "none": "Keine",
"min": "Min", "min": "Minimal",
"low": "Low", "low": "Niedrig",
"default": "Default", "default": "Standard",
"high": "High", "high": "Hoch",
"urgent": "Urgent" "urgent": "Dringend"
}, },
"plantit": { "plantit": {
"events": "Ereignisse", "events": "Ereignisse",
@@ -1098,8 +1117,8 @@
"beszel": { "beszel": {
"name": "Name", "name": "Name",
"systems": "Systeme", "systems": "Systeme",
"up": "Up", "up": "Online",
"down": "Down", "down": "Offline",
"paused": "Pausiert", "paused": "Pausiert",
"pending": "Wartend", "pending": "Wartend",
"status": "Status", "status": "Status",
@@ -1249,14 +1268,17 @@
"steps": "Schritte" "steps": "Schritte"
}, },
"syncthing": { "syncthing": {
"connected": "Connected", "connected": "Verbunden",
"synced": "Synced", "synced": "Synchronisiert",
"errors": "Errors", "errors": "Fehler",
"storage": "Storage" "storage": "Speicher"
}, },
"sportarr": { "sportarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+285 -263
View File
@@ -14,11 +14,11 @@
"date": "{{value, date}}", "date": "{{value, date}}",
"relativeDate": "{{value, relativeDate}}", "relativeDate": "{{value, relativeDate}}",
"duration": "{{value, duration}}", "duration": "{{value, duration}}",
"months": "mo", "months": "Μ",
"days": "d", "days": "μ",
"hours": "h", "hours": "ω",
"minutes": "m", "minutes": "λ",
"seconds": "s" "seconds": "δ"
}, },
"auth": { "auth": {
"signout": "Αποσύνδεση" "signout": "Αποσύνδεση"
@@ -40,7 +40,7 @@
}, },
"search": { "search": {
"placeholder": "Αναζήτηση…", "placeholder": "Αναζήτηση…",
"provider": "Search engine: {{name}}", "provider": "Μηχανή αναζήτησης: {{name}}",
"select_provider": "Επιλέξτε τις μηχανές αναζήτησης" "select_provider": "Επιλέξτε τις μηχανές αναζήτησης"
}, },
"resources": { "resources": {
@@ -74,7 +74,7 @@
"unifi_drive": { "unifi_drive": {
"healthy": "Υγειές", "healthy": "Υγειές",
"degraded": "Degraded", "degraded": "Degraded",
"no_data": "No storage data available" "no_data": "Δεν υπάρχουν διαθέσιμα δεδομένα χώρου αποθήκευσης"
}, },
"duplicati": { "duplicati": {
"jobs": "Εργασίες", "jobs": "Εργασίες",
@@ -104,7 +104,7 @@
"paused": "Σε παύση", "paused": "Σε παύση",
"restarting": "Γίνεται επανεκκίνηση", "restarting": "Γίνεται επανεκκίνηση",
"removing": "Αφαιρείται", "removing": "Αφαιρείται",
"dead": "Dead" "dead": "Νεκρό"
}, },
"ping": { "ping": {
"error": "Σφάλμα", "error": "Σφάλμα",
@@ -117,8 +117,8 @@
"http_status": "Κατάσταση HTTP", "http_status": "Κατάσταση HTTP",
"error": "Σφάλμα", "error": "Σφάλμα",
"response": "Απόκριση", "response": "Απόκριση",
"down": "Down", "down": "Κάτω",
"up": "Up", "up": "Πάνω",
"not_available": "Μη Διαθέσιμο" "not_available": "Μη Διαθέσιμο"
}, },
"emby": { "emby": {
@@ -133,21 +133,21 @@
}, },
"jellyfin": { "jellyfin": {
"playing": "Γίνεται αναπαραγωγή", "playing": "Γίνεται αναπαραγωγή",
"transcoding": "Transcoding", "transcoding": "Επανακωδικοποίηση",
"bitrate": "Bitrate", "bitrate": "Ρυθμός μετάδοσης",
"no_active": "No Active Streams", "no_active": "Δεν Υπάρχουν Ενεργές Ροές",
"movies": "Movies", "movies": "Ταινίες",
"series": "Series", "series": "Σειρές",
"episodes": "Episodes", "episodes": "Επεισόδια",
"songs": "Songs", "songs": "Τραγούδια",
"albums": "Albums" "albums": "Άλμπουμ"
}, },
"esphome": { "esphome": {
"offline": "Offline", "offline": "Εκτός σύνδεσης",
"offline_alt": "Offline", "offline_alt": "Χωρίς Σύνδεση",
"online": "Συνδεδεμένοι", "online": "Συνδεδεμένοι",
"total": "Total", "total": "Σύνολο",
"unknown": "Unknown" "unknown": "Άγνωστο"
}, },
"evcc": { "evcc": {
"pv_power": "Παραγωγή", "pv_power": "Παραγωγή",
@@ -168,7 +168,7 @@
"unread": "Μη Διαβασμένο" "unread": "Μη Διαβασμένο"
}, },
"fritzbox": { "fritzbox": {
"connectionStatus": "Status", "connectionStatus": "Κατάσταση",
"connectionStatusUnconfigured": "Μη Ρυθμισμένο", "connectionStatusUnconfigured": "Μη Ρυθμισμένο",
"connectionStatusConnecting": "Κατάσταση Σύνδεσης", "connectionStatusConnecting": "Κατάσταση Σύνδεσης",
"connectionStatusAuthenticating": "Ταυτοποίηση", "connectionStatusAuthenticating": "Ταυτοποίηση",
@@ -176,16 +176,16 @@
"connectionStatusDisconnecting": "Αποσύνδεση", "connectionStatusDisconnecting": "Αποσύνδεση",
"connectionStatusDisconnected": "Αποσυνδέθηκε", "connectionStatusDisconnected": "Αποσυνδέθηκε",
"connectionStatusConnected": "Συνδέθηκε", "connectionStatusConnected": "Συνδέθηκε",
"uptime": "Uptime", "uptime": "Συνεχής λειτουργία",
"maxDown": "Μέγιστο Download", "maxDown": "Μέγιστο Download",
"maxUp": "Μέγιστο Upload", "maxUp": "Μέγιστο Upload",
"down": "Down", "down": "Κάτω",
"up": "Up", "up": "Πάνω",
"received": "Ληφθέντα", "received": "Ληφθέντα",
"sent": "Απεσταλμένα", "sent": "Απεσταλμένα",
"externalIPAddress": "Εξωτερική IP", "externalIPAddress": "Εξωτερική IP",
"externalIPv6Address": "Ext. IPv6", "externalIPv6Address": "Εξωτ. IPv6",
"externalIPv6Prefix": "Ext. IPv6-Prefix" "externalIPv6Prefix": "Εξωτ. IPv6-Prefix"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Upstreams",
@@ -203,10 +203,10 @@
"passes": "Περάσματα" "passes": "Περάσματα"
}, },
"tautulli": { "tautulli": {
"playing": "Playing", "playing": "Γίνεται αναπαραγωγή",
"transcoding": "Transcoding", "transcoding": "Γίνεται επανακωδικοποίηση",
"bitrate": "Bitrate", "bitrate": "Ρυθμός μετάδοσης",
"no_active": "No Active Streams", "no_active": "Δεν Υπάρχουν Ενεργές Ροές",
"plex_connection_error": "Έλεγχος Σύνδεσης με Plex" "plex_connection_error": "Έλεγχος Σύνδεσης με Plex"
}, },
"tracearr": { "tracearr": {
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Χρήση επεξεργαστή", "cpuUsage": "Χρήση επεξεργαστή",
"memUsage": "Χρήση μνήμης", "memUsage": "Χρήση μνήμης",
@@ -293,16 +303,16 @@
"queued": "Queued", "queued": "Queued",
"movies": "Movies", "movies": "Movies",
"queue": "Queue", "queue": "Queue",
"unknown": "Unknown" "unknown": "Άγνωστο"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Επιθυμητό",
"queued": "Queued", "queued": "Σε αναμονή",
"artists": "Καλλιτέχνες" "artists": "Καλλιτέχνες"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Επιθυμητό",
"queued": "Queued", "queued": "Σε αναμονή",
"books": "Βιβλία" "books": "Βιβλία"
}, },
"bazarr": { "bazarr": {
@@ -315,16 +325,16 @@
"available": "Διαθέσιμο" "available": "Διαθέσιμο"
}, },
"seerr": { "seerr": {
"pending": "Pending", "pending": "Σε εκκρεμότητα",
"approved": "Approved", "approved": "Εγκρίθηκε",
"available": "Available", "available": "Διαθέσιμα",
"completed": "Completed", "completed": "Ολοκληρώθηκε",
"processing": "Processing", "processing": "Σε επεξεργασία",
"issues": "Open Issues" "issues": "Ανοιχτά θέματα"
}, },
"netalertx": { "netalertx": {
"total": "Total", "total": "Σύνολο",
"connected": "Connected", "connected": "Σε σύνδεση",
"new_devices": "Νέες συσκευές", "new_devices": "Νέες συσκευές",
"down_alerts": "Ειδοποιήσεις offline" "down_alerts": "Ειδοποιήσεις offline"
}, },
@@ -335,45 +345,45 @@
"gravity": "Gravity" "gravity": "Gravity"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "Ερωτήματα",
"blocked": "Blocked", "blocked": "Αποκλεισμένα",
"filtered": "Φιλτραρισμένα", "filtered": "Φιλτραρισμένα",
"latency": "Καθυστέρηση" "latency": "Καθυστέρηση"
}, },
"speedtest": { "speedtest": {
"upload": "Upload", "upload": "Αποστολή",
"download": "Download", "download": "Λήψη",
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
"running": "Running", "running": "Εκτελείται",
"stopped": "Σταματημένο", "stopped": "Σταματημένο",
"total": "Total" "total": "Σύνολο"
}, },
"suwayomi": { "suwayomi": {
"download": "Downloaded", "download": "Ελήφθησαν",
"nondownload": "Non-Downloaded", "nondownload": "Δεν Ελήφθησαν",
"read": "Read", "read": "Διαβάστηκε",
"unread": "Unread", "unread": "Μη αναγνωσμένα",
"downloadedread": "Downloaded & Read", "downloadedread": "Ληφθέν & Αναγνωσμένο",
"downloadedunread": "Downloaded & Unread", "downloadedunread": "Ληφθέν & Μη Αναγνωσμένο",
"nondownloadedread": "Non-Downloaded & Read", "nondownloadedread": "Μη Ληφθέν & Αναγνωσμένο",
"nondownloadedunread": "Non-Downloaded & Unread" "nondownloadedunread": "Μη Ληφθέν & Μη Αναγνωσμένο"
}, },
"tailscale": { "tailscale": {
"address": "Διεύθυνση", "address": "Διεύθυνση",
"expires": "Λήγει", "expires": "Λήγει",
"never": "Ποτέ", "never": "Ποτέ",
"user": "User", "user": "Χρήστης",
"hostname": "Hostname", "hostname": "Όνομα υπολογιστή",
"name": "Name", "name": "Όνομα",
"client_version": "Client Version", "client_version": "Έκδοση Πελάτη",
"os": "OS", "os": "Λειτουργικό",
"created": "Created", "created": "Δημιουργήθηκε",
"authorized": "Authorized", "authorized": "Εξουσιοδοτημένο",
"is_external": "Is External", "is_external": "Είναι Εξωτερική",
"update_available": "Update Available", "update_available": "Διαθέσιμη ενημέρωση",
"tags": "Tags", "tags": "Ετικέτες",
"last_seen": "Τελευταία Σύνδεση", "last_seen": "Τελευταία Σύνδεση",
"now": "Τώρα", "now": "Τώρα",
"years": "{{number}}χρόνια", "years": "{{number}}χρόνια",
@@ -383,20 +393,20 @@
"minutes": "{{number}}λεπτά", "minutes": "{{number}}λεπτά",
"seconds": "{{number}}δευτερόλεπτα", "seconds": "{{number}}δευτερόλεπτα",
"ago": "{{value}} πρίν", "ago": "{{value}} πρίν",
"true": "Yes", "true": "Ναι",
"false": "No" "false": "Όχι"
}, },
"technitium": { "technitium": {
"totalQueries": "Queries", "totalQueries": "Ερωτήματα",
"totalNoError": "Success", "totalNoError": "Επιτυχία",
"totalServerFailure": "Failures", "totalServerFailure": "Σφάλματα",
"totalNxDomain": "NX Domains", "totalNxDomain": "Τομείς NX",
"totalRefused": "Refused", "totalRefused": "Απορρίφθηκαν",
"totalAuthoritative": "Authoritative", "totalAuthoritative": "Εξουσιοδοτημένο",
"totalRecursive": "Recursive", "totalRecursive": "Recursive",
"totalCached": "Cached", "totalCached": "Cached",
"totalBlocked": "Blocked", "totalBlocked": "Αποκλεισμένα",
"totalDropped": "Dropped", "totalDropped": "Απορρίφθηκαν",
"totalClients": "Πελάτες" "totalClients": "Πελάτες"
}, },
"tdarr": { "tdarr": {
@@ -529,75 +539,75 @@
"2-day": "Αραιές Νεφώσεις", "2-day": "Αραιές Νεφώσεις",
"2-night": "Partly Cloudy", "2-night": "Partly Cloudy",
"3-day": "Συννεφιές", "3-day": "Συννεφιές",
"3-night": "Cloudy", "3-night": "Συννεφιά",
"45-day": "Ομίχλη", "45-day": "Ομίχλη",
"45-night": "Foggy", "45-night": "Ομίχλη",
"48-day": "Foggy", "48-day": "Ομίχλη",
"48-night": "Foggy", "48-night": "Ομίχλη",
"51-day": "Ψιλόβροχο", "51-day": "Ψιλόβροχο",
"51-night": "Light Drizzle", "51-night": "Ελαφρύ Ψιλόβροχο",
"53-day": "Ψιλόβροχο", "53-day": "Ψιλόβροχο",
"53-night": "Drizzle", "53-night": "Ψιλόβροχο",
"55-day": "Heavy Drizzle", "55-day": "Βαρύ Ψιλόβροχο",
"55-night": "Heavy Drizzle", "55-night": "Βαρύ Ψιλόβροχο",
"56-day": "Light Freezing Drizzle", "56-day": "Ελαφρύ Παγωμένο Ψιλόβροχο",
"56-night": "Light Freezing Drizzle", "56-night": "Ελαφρύ Παγωμένο Ψιλόβροχο",
"57-day": "Παγωμένο ψιχάλισμα", "57-day": "Παγωμένο ψιχάλισμα",
"57-night": "Freezing Drizzle", "57-night": "Παγωμένο ψιλόβροχο",
"61-day": "Ψιλόβροχο", "61-day": "Ψιλόβροχο",
"61-night": "Light Rain", "61-night": "Ελαφριά Βροχή",
"63-day": "Βροχή", "63-day": "Βροχή",
"63-night": "Rain", "63-night": "Βροχή",
"65-day": "Δυνατή βροχή", "65-day": "Δυνατή βροχή",
"65-night": "Heavy Rain", "65-night": "Δυνατή βροχή",
"66-day": "Παγωμένη βροχή", "66-day": "Παγωμένη βροχή",
"66-night": "Freezing Rain", "66-night": "Παγωμένη βροχή",
"67-day": "Freezing Rain", "67-day": "Παγωμένη βροχή",
"67-night": "Freezing Rain", "67-night": "Παγωμένη βροχή",
"71-day": "Ελαφριά Χιονόπτωση", "71-day": "Ελαφριά Χιονόπτωση",
"71-night": "Light Snow", "71-night": "Ελαφρά Χιονόπτωση",
"73-day": "Χιόνι", "73-day": "Χιόνι",
"73-night": "Snow", "73-night": "Χιόνι",
"75-day": "Ισχυρή χιονόπτωση", "75-day": "Ισχυρή χιονόπτωση",
"75-night": "Heavy Snow", "75-night": "Ισχυρή χιονόπτωση",
"77-day": "Κόκκοι Χιονιού", "77-day": "Κόκκοι Χιονιού",
"77-night": "Snow Grains", "77-night": "Χιονάκι",
"80-day": "Ασθενείς βροχές", "80-day": "Ασθενείς βροχές",
"80-night": "Light Showers", "80-night": "Ασθενείς βροχές",
"81-day": "Βροχοπτώσεις", "81-day": "Βροχοπτώσεις",
"81-night": "Showers", "81-night": "Βροχοπτώσεις",
"82-day": "Ισχυρές βροχοπτώσεις", "82-day": "Ισχυρές βροχοπτώσεις",
"82-night": "Heavy Showers", "82-night": "Ισχυρές βροχοπτώσεις",
"85-day": "Χιονοπτώσεις", "85-day": "Χιονοπτώσεις",
"85-night": "Snow Showers", "85-night": "Χιονοπτώσεις",
"86-day": "Snow Showers", "86-day": "Χιονοπτώσεις",
"86-night": "Snow Showers", "86-night": "Χιονοπτώσεις",
"95-day": "Καταιγίδα", "95-day": "Καταιγίδα",
"95-night": "Thunderstorm", "95-night": "Καταιγίδα",
"96-day": "Καταιγίδα Με Χαλάζι", "96-day": "Καταιγίδα Με Χαλάζι",
"96-night": "Thunderstorm With Hail", "96-night": "Καταιγίδα Με Χαλάζι",
"99-day": "Thunderstorm With Hail", "99-day": "Καταιγίδα Με Χαλάζι",
"99-night": "Thunderstorm With Hail" "99-night": "Καταιγίδα Με Χαλάζι"
}, },
"homebridge": { "homebridge": {
"available_update": "Σύστημα", "available_update": "Σύστημα",
"updates": "Ενημερώσεις", "updates": "Ενημερώσεις",
"update_available": "Διαθέσιμη ενημέρωση", "update_available": "Διαθέσιμη ενημέρωση",
"up_to_date": "Ενημερωμένο", "up_to_date": "Ενημερωμένο",
"child_bridges": "Child Bridges", "child_bridges": "Θυγατρικές Γέφυρες",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "Πάνω",
"pending": "Pending", "pending": "Σε εκκρεμότητα",
"down": "Down", "down": "Κάτω",
"ok": "Ok" "ok": "Οκ"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Νέο",
"up": "Up", "up": "Πάνω",
"grace": "In Grace Period", "grace": "Σε Περίοδο Χάριτος",
"down": "Down", "down": "Κάτω",
"paused": "Paused", "paused": "Σε παύση",
"status": "Status", "status": "Κατάσταση",
"last_ping": "Τελευταίο Ping", "last_ping": "Τελευταίο Ping",
"never": "Δεν υπάρχουν ping ακόμα" "never": "Δεν υπάρχουν ping ακόμα"
}, },
@@ -607,26 +617,26 @@
"containers_failed": "Απέτυχε" "containers_failed": "Απέτυχε"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Approved", "approvedPushes": "Εγκρίθηκε",
"rejectedPushes": "Απορρίφθηκε", "rejectedPushes": "Απορρίφθηκε",
"filters": "Φίλτρα", "filters": "Φίλτρα",
"indexers": "Indexers" "indexers": "Ευρετήρια"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Queue", "downloads": "Αναμονή",
"videos": "Βίντεο", "videos": "Βίντεο",
"channels": "Κανάλια", "channels": "Κανάλια",
"playlists": "Λίστες αναπαραγωγής" "playlists": "Λίστες αναπαραγωγής"
}, },
"truenas": { "truenas": {
"load": "Φόρτος Συστήματος", "load": "Φόρτος Συστήματος",
"uptime": "Uptime", "uptime": "Συνεχής λειτουργία",
"alerts": "Alerts" "alerts": "Ειδοποιήσεις"
}, },
"pyload": { "pyload": {
"speed": "Ταχύτητα", "speed": "Ταχύτητα",
"active": "Active", "active": "Ενεργό",
"queue": "Queue", "queue": "Αναμονή",
"total": "Total" "total": "Total"
}, },
"gluetun": { "gluetun": {
@@ -735,56 +745,57 @@
"immich": { "immich": {
"users": "Users", "users": "Users",
"photos": "Φωτογραφίες", "photos": "Φωτογραφίες",
"videos": "Videos", "videos": "Βίντεο",
"storage": "Αποθηκευτικός χώρος" "storage": "Αποθηκευτικός χώρος"
}, },
"uptimekuma": { "uptimekuma": {
"up": "Online τοποθεσίες", "up": "Online τοποθεσίες",
"down": "Offline τοποθεσίες", "down": "Offline τοποθεσίες",
"uptime": "Uptime", "uptime": "Συνεχής λειτουργία",
"incident": "Περιστατικό", "incident": "Περιστατικό",
"m": "m" "m": "λ"
}, },
"atsumeru": { "atsumeru": {
"series": "Series", "series": "Σειρές",
"archives": "Archives", "archives": "Αρχεία",
"chapters": "Chapters", "chapters": "Κεφάλαια",
"categories": "Κατηγορίες" "categories": "Κατηγορίες"
}, },
"komga": { "komga": {
"libraries": "Libraries", "libraries": "Βιβλιοθήκες",
"series": "Series", "series": "Σειρές",
"books": "Books" "books": "Βιβλία"
}, },
"diskstation": { "diskstation": {
"days": "Days", "days": "Ημέρες",
"uptime": "Uptime", "uptime": "Συνεχής λειτουργία",
"volumeAvailable": "Available" "volumeAvailable": "Διαθέσιμα"
}, },
"dispatcharr": { "dispatcharr": {
"channels": "Channels", "channels": "Κανάλια",
"streams": "Streams" "streams": "Ροές"
}, },
"mylar": { "mylar": {
"series": "Series", "series": "Σειρές",
"issues": "Issues", "issues": "Προβλήματα",
"wanted": "Wanted" "wanted": "Επιθυμητά"
}, },
"photoprism": { "photoprism": {
"albums": "Albums", "albums": "Άλμπουμ",
"photos": "Photos", "photos": "Φωτογραφίες",
"videos": "Videos", "videos": "Βίντεο",
"people": "Άνθρωποι" "people": "Άνθρωποι"
}, },
"fileflows": { "fileflows": {
"queue": "Queue", "queue": "Αναμονή",
"processing": "Processing", "processing": "Σε επεξεργασία",
"processed": "Processed", "processed": "Επεξεργασμένα",
"time": "Ώρα" "time": "Ώρα",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Καθαρή αξία",
"budget": "Budget" "budget": "Προϋπολογισμός"
}, },
"grafana": { "grafana": {
"dashboards": "Πίνακας Ελέγχου", "dashboards": "Πίνακας Ελέγχου",
@@ -801,15 +812,15 @@
"numshares": "Κοινόχρηστα στοιχεία" "numshares": "Κοινόχρηστα στοιχεία"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Κατάσταση",
"size": "Μέγεθος", "size": "Μέγεθος",
"lastrun": "Τελευταία εκτέλεση", "lastrun": "Τελευταία εκτέλεση",
"nextrun": "Επόμενη εκτέλεση", "nextrun": "Επόμενη εκτέλεση",
"failed": "Failed" "failed": "Απέτυχε"
}, },
"unmanic": { "unmanic": {
"active_workers": "Ενεργοί χρήστες", "active_workers": "Ενεργοί χρήστες",
"total_workers": "Total Workers", "total_workers": "Σύνολο Εργατών",
"records_total": "Μήκος Ουράς" "records_total": "Μήκος Ουράς"
}, },
"pterodactyl": { "pterodactyl": {
@@ -822,21 +833,21 @@
"targets_total": "Συνολικοί Στόχοι" "targets_total": "Συνολικοί Στόχοι"
}, },
"gatus": { "gatus": {
"up": "Sites Up", "up": "Ιστοσελίδες Πάνω",
"down": "Sites Down", "down": "Ιστοσελίδες Κάτω",
"uptime": "Uptime" "uptime": "Συνεχής λειτουργία"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Σήμερα",
"gross_percent_1y": "Ένας χρόνος", "gross_percent_1y": "Ένας χρόνος",
"gross_percent_max": "Διαχρονικά", "gross_percent_max": "Διαχρονικά",
"net_worth": "Net Worth" "net_worth": "Καθαρή αξία"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasts", "podcasts": "Podcasts",
"books": "Books", "books": "Βιβλία",
"podcastsDuration": "Διάρκεια", "podcastsDuration": "Διάρκεια",
"booksDuration": "Duration" "booksDuration": "Διάρκεια"
}, },
"homeassistant": { "homeassistant": {
"people_home": "Σύνολο ανθρώπων στο σπίτι", "people_home": "Σύνολο ανθρώπων στο σπίτι",
@@ -845,33 +856,41 @@
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Παρακολούθηση", "monitoring": "Παρακολούθηση",
"updates": "Updates" "updates": "Ενημερώσεις"
}, },
"calibreweb": { "calibreweb": {
"books": "Books", "books": "Βιβλία",
"authors": "Συντάκτες", "authors": "Συντάκτες",
"categories": "Categories", "categories": "Κατηγορίες",
"series": "Series" "series": "Σειρές"
}, },
"booklore": { "booklore": {
"libraries": "Libraries", "libraries": "Βιβλιοθήκες",
"books": "Βιβλία",
"reading": "Ανάγνωση",
"finished": "Ολοκληρώθηκε"
},
"bookorbit": {
"books": "Books", "books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Αναμονή",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Απομένουν",
"downloadTotalBytes": "Size", "downloadTotalBytes": "Μέγεθος",
"downloadSpeed": "Speed" "downloadSpeed": "Ταχύτητα"
}, },
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Σειρές",
"totalFiles": "Files" "totalFiles": "Αρχεία"
}, },
"azuredevops": { "azuredevops": {
"result": "Αποτέλεσμα", "result": "Αποτέλεσμα",
"status": "Status", "status": "Κατάσταση",
"buildId": "Build ID", "buildId": "Build ID",
"succeeded": "Πέτυχε", "succeeded": "Πέτυχε",
"notStarted": "Δεν ξεκίνησε", "notStarted": "Δεν ξεκίνησε",
@@ -956,7 +975,7 @@
"domains": "Domains", "domains": "Domains",
"mailboxes": "Mailboxes", "mailboxes": "Mailboxes",
"mails": "Mails", "mails": "Mails",
"storage": "Storage" "storage": "Αποθηκευτικός χώρος"
}, },
"maintainerr": { "maintainerr": {
"itemsHandled": "Items Handled", "itemsHandled": "Items Handled",
@@ -967,61 +986,61 @@
"reclaimable": "Reclaimable", "reclaimable": "Reclaimable",
"movieReclaimable": "Movie Reclaimable", "movieReclaimable": "Movie Reclaimable",
"showReclaimable": "Show Reclaimable", "showReclaimable": "Show Reclaimable",
"totalCapacity": "Total Capacity" "totalCapacity": "Συνολική χωρητικότητα"
}, },
"netdata": { "netdata": {
"warnings": "Warnings", "warnings": "Προειδοποιήσεις",
"criticals": "Criticals" "criticals": "Κρίσιμα"
}, },
"ntfy": { "ntfy": {
"title": "Title", "title": "Τίτλος",
"priority": "Priority", "priority": "Προτεραιότητα",
"lastReceived": "Last Received", "lastReceived": "Τελευταία Ληφθέντα",
"message": "Message", "message": "Μήνυμα",
"tags": "Tags", "tags": "Ετικέτες",
"none": "None", "none": "Κανένα",
"min": "Min", "min": "Ελάχιστο",
"low": "Low", "low": "Χαμηλό",
"default": "Default", "default": "Προεπιλογή",
"high": "High", "high": "Υψηλό",
"urgent": "Urgent" "urgent": "Επείγον"
}, },
"plantit": { "plantit": {
"events": "Events", "events": "Συμβάντα",
"plants": "Plants", "plants": "Φυτά",
"photos": "Photos", "photos": "Φωτογραφίες",
"species": "Species" "species": "Είδη"
}, },
"gitea": { "gitea": {
"notifications": "Notifications", "notifications": "Ειδοποιήσεις",
"issues": "Issues", "issues": "Προβλήματα",
"pulls": "Pull Requests", "pulls": "Pull Requests",
"repositories": "Repositories" "repositories": "Αποθετήρια"
}, },
"stash": { "stash": {
"scenes": "Scenes", "scenes": "Σκηνές",
"scenesPlayed": "Scenes Played", "scenesPlayed": "Σκηνές Που Παίχτηκαν",
"playCount": "Total Plays", "playCount": "Συνολικές Αναπαραγωγές",
"playDuration": "Time Watched", "playDuration": "Ώρα Παρακολούθησης",
"sceneSize": "Scenes Size", "sceneSize": "Μέγεθος Σκηνών",
"sceneDuration": "Scenes Duration", "sceneDuration": "Διάρκεια Σκηνών",
"images": "Images", "images": "Εικόνες",
"imageSize": "Images Size", "imageSize": "Μέγεθος Εικόνων",
"galleries": "Galleries", "galleries": "Συλλογές",
"performers": "Performers", "performers": "Καλλιτέχνες",
"studios": "Studios", "studios": "Στούντιο",
"movies": "Movies", "movies": "Ταινίες",
"tags": "Tags", "tags": "Ετικέτες",
"oCount": "O Count" "oCount": "Μετρητής O"
}, },
"tandoor": { "tandoor": {
"users": "Users", "users": "Χρήστες",
"recipes": "Recipes", "recipes": "Συνταγές",
"keywords": "Keywords" "keywords": "Λέξεις-κλειδιά"
}, },
"homebox": { "homebox": {
"items": "Items", "items": "Στοιχεία",
"totalWithWarranty": "With Warranty", "totalWithWarranty": "Με Εγγύηση",
"locations": "Locations", "locations": "Locations",
"labels": "Labels", "labels": "Labels",
"users": "Users", "users": "Users",
@@ -1084,72 +1103,72 @@
"vikunja": { "vikunja": {
"projects": "Active Projects", "projects": "Active Projects",
"tasks7d": "Tasks Due This Week", "tasks7d": "Tasks Due This Week",
"tasksOverdue": "Overdue Tasks", "tasksOverdue": "Εκπρόθεσμες Εργασίες",
"tasksInProgress": "Tasks In Progress" "tasksInProgress": "Εργασίες Σε Εξέλιξη"
}, },
"headscale": { "headscale": {
"name": "Name", "name": "Όνομα",
"address": "Address", "address": "Διεύθυνση",
"last_seen": "Last Seen", "last_seen": "Τελευταία Σύνδεση",
"status": "Status", "status": "Κατάσταση",
"online": "Online", "online": "Σε Σύνδεση",
"offline": "Offline" "offline": "Χωρίς Σύνδεση"
}, },
"beszel": { "beszel": {
"name": "Name", "name": "Όνομα",
"systems": "Systems", "systems": "Συστήματα",
"up": "Up", "up": "Πάνω",
"down": "Down", "down": "Κάτω",
"paused": "Paused", "paused": "Σε παύση",
"pending": "Pending", "pending": "Σε εκκρεμότητα",
"status": "Status", "status": "Κατάσταση",
"updated": "Updated", "updated": "Ενημερώθηκε",
"cpu": "CPU", "cpu": "CPU",
"memory": "MEM", "memory": "MEM",
"disk": "Disk", "disk": "Δίσκος",
"network": "NET" "network": "Δίκτυο"
}, },
"argocd": { "argocd": {
"apps": "Apps", "apps": "Εφαρμογές",
"synced": "Synced", "synced": "Συγχρονισμένα",
"outOfSync": "Out Of Sync", "outOfSync": "Εκτός Συγχρονισμού",
"healthy": "Healthy", "healthy": "Υγιή",
"degraded": "Degraded", "degraded": "Degraded",
"progressing": "Progressing", "progressing": "Σε εξέλιξη",
"missing": "Missing", "missing": "Λείπουν",
"suspended": "Suspended" "suspended": "Σε αναστολή"
}, },
"spoolman": { "spoolman": {
"loading": "Loading" "loading": "Γίνεται φόρτωση"
}, },
"gitlab": { "gitlab": {
"groups": "Groups", "groups": "Ομάδες",
"issues": "Issues", "issues": "Προβλήματα",
"merges": "Merge Requests", "merges": "Αιτήματα Συγχώνευσης",
"projects": "Projects" "projects": "Projects"
}, },
"apcups": { "apcups": {
"status": "Status", "status": "Κατάσταση",
"load": "Load", "load": "Φόρτωση",
"bcharge": "Battery Charge", "bcharge": "Φόρτιση Μπαταρίας",
"timeleft": "Time Left" "timeleft": "Χρόνος που απομένει"
}, },
"karakeep": { "karakeep": {
"bookmarks": "Bookmarks", "bookmarks": "Σελιδοδείκτες",
"favorites": "Favorites", "favorites": "Αγαπημένα",
"archived": "Archived", "archived": "Αρχειοθετημένα",
"highlights": "Highlights", "highlights": "Επισημάνσεις",
"lists": "Lists", "lists": "Λίστες",
"tags": "Tags" "tags": "Ετικέτες"
}, },
"slskd": { "slskd": {
"slskStatus": "Network", "slskStatus": "Δίκτυο",
"connected": "Connected", "connected": "Σε σύνδεση",
"disconnected": "Disconnected", "disconnected": "Αποσυνδέθηκε",
"updateStatus": "Update", "updateStatus": "Ενημέρωση",
"update_yes": "Available", "update_yes": "Διαθέσιμα",
"update_no": "Up to Date", "update_no": "Ενημερωμένο",
"downloads": "Downloads", "downloads": "Λήψεις",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
}, },
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+28 -6
View File
@@ -100,11 +100,11 @@
"not_found": "No encontrado", "not_found": "No encontrado",
"exited": "Terminado", "exited": "Terminado",
"partial": "Parcial", "partial": "Parcial",
"created": "Created", "created": "Creado",
"paused": "Paused", "paused": "Pausado",
"restarting": "Restarting", "restarting": "Reiniciando",
"removing": "Removing", "removing": "Eliminando",
"dead": "Dead" "dead": "Muerto"
}, },
"ping": { "ping": {
"error": "Error", "error": "Error",
@@ -256,6 +256,16 @@
"leech": "Descargando", "leech": "Descargando",
"seed": "Semillas" "seed": "Semillas"
}, },
"qui": {
"leech": "Sanguijuela",
"download": "Descargar",
"seed": "Semilla",
"upload": "Subir",
"total": "Total",
"errored": "Con error",
"ratio": "Ratio",
"freeSpace": "Libre"
},
"qnap": { "qnap": {
"cpuUsage": "Uso de la CPU", "cpuUsage": "Uso de la CPU",
"memUsage": "Uso de la memoria", "memUsage": "Uso de la memoria",
@@ -780,7 +790,8 @@
"queue": "Cola", "queue": "Cola",
"processing": "Procesando", "processing": "Procesando",
"processed": "Procesado", "processed": "Procesado",
"time": "Tiempo" "time": "Tiempo",
"failed": "Fallido"
}, },
"firefly": { "firefly": {
"networth": "Patrimonio neto", "networth": "Patrimonio neto",
@@ -859,6 +870,14 @@
"reading": "Lectura", "reading": "Lectura",
"finished": "Finalizado" "finished": "Finalizado"
}, },
"bookorbit": {
"books": "Libros",
"authors": "Autores",
"series": "Series",
"storage": "Almacenamiento",
"reading": "Lectura",
"finished": "Finalizado"
},
"jdownloader": { "jdownloader": {
"downloadCount": "En cola", "downloadCount": "En cola",
"downloadBytesRemaining": "Restante", "downloadBytesRemaining": "Restante",
@@ -1258,5 +1277,8 @@
"wanted": "Buscado", "wanted": "Buscado",
"queued": "En cola", "queued": "En cola",
"leagues": "Ligas" "leagues": "Ligas"
},
"feed": {
"noItems": "No hay elementos"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "En téléchargement", "leech": "En téléchargement",
"seed": "En partage" "seed": "En partage"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Utilisation CPU", "cpuUsage": "Utilisation CPU",
"memUsage": "RAM utilisée", "memUsage": "RAM utilisée",
@@ -780,7 +790,8 @@
"queue": "File d'attente", "queue": "File d'attente",
"processing": "En traitement", "processing": "En traitement",
"processed": "Traité", "processed": "Traité",
"time": "Temps" "time": "Temps",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Valeur Nette", "networth": "Valeur Nette",
@@ -859,6 +870,14 @@
"reading": "En cours de lecture", "reading": "En cours de lecture",
"finished": "Terminés" "finished": "Terminés"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "File d'attente", "downloadCount": "File d'attente",
"downloadBytesRemaining": "Restant", "downloadBytesRemaining": "Restant",
@@ -1258,5 +1277,8 @@
"wanted": "Recherché", "wanted": "Recherché",
"queued": "En file d'attente", "queued": "En file d'attente",
"leagues": "Ligues" "leagues": "Ligues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "עלוקה", "leech": "עלוקה",
"seed": "זורע" "seed": "זורע"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "שימוש במעבד", "cpuUsage": "שימוש במעבד",
"memUsage": "שימוש בזיכרון", "memUsage": "שימוש בזיכרון",
@@ -780,7 +790,8 @@
"queue": "תור", "queue": "תור",
"processing": "בעיבוד", "processing": "בעיבוד",
"processed": "עובדו", "processed": "עובדו",
"time": "זמן" "time": "זמן",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "שווי נקי", "networth": "שווי נקי",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "תור", "downloadCount": "תור",
"downloadBytesRemaining": "נותר", "downloadBytesRemaining": "נותר",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Korištenje tuđeg sadržaja", "leech": "Korištenje tuđeg sadržaja",
"seed": "Prenošenje preuzetog sadržaja" "seed": "Prenošenje preuzetog sadržaja"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Korištenje procesora", "cpuUsage": "Korištenje procesora",
"memUsage": "Korištenje memorije", "memUsage": "Korištenje memorije",
@@ -780,7 +790,8 @@
"queue": "Red čekanja", "queue": "Red čekanja",
"processing": "Obrada", "processing": "Obrada",
"processed": "Obrađeno", "processed": "Obrađeno",
"time": "Vrijeme" "time": "Vrijeme",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Neto vrijednost", "networth": "Neto vrijednost",
@@ -859,6 +870,14 @@
"reading": "Čitanje", "reading": "Čitanje",
"finished": "Završeno" "finished": "Završeno"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Red čekanja", "downloadCount": "Red čekanja",
"downloadBytesRemaining": "Preostalo", "downloadBytesRemaining": "Preostalo",
@@ -1258,5 +1277,8 @@
"wanted": "Željeno", "wanted": "Željeno",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"leagues": "Lige" "leagues": "Lige"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Processzor Használat", "cpuUsage": "Processzor Használat",
"memUsage": "Memória Használat", "memUsage": "Memória Használat",
@@ -780,7 +790,8 @@
"queue": "Sorban", "queue": "Sorban",
"processing": "Feldolgozás alatt", "processing": "Feldolgozás alatt",
"processed": "Feldolgozott", "processed": "Feldolgozott",
"time": "Idő" "time": "Idő",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Nettó érték", "networth": "Nettó érték",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Penggunaan CPU", "cpuUsage": "Penggunaan CPU",
"memUsage": "Penggunaan MEM", "memUsage": "Penggunaan MEM",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Waktu" "time": "Waktu",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Kekayaan Bersih", "networth": "Kekayaan Bersih",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "In download", "leech": "In download",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Utilizzo CPU", "cpuUsage": "Utilizzo CPU",
"memUsage": "Utilizzo MEM", "memUsage": "Utilizzo MEM",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Tempo" "time": "Tempo",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Valore Netto", "networth": "Valore Netto",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+169 -147
View File
@@ -39,9 +39,9 @@
"wait": "お待ちください" "wait": "お待ちください"
}, },
"search": { "search": {
"placeholder": "検索…", "placeholder": "検索 ...",
"provider": "Search engine: {{name}}", "provider": "Search engine: {{name}}",
"select_provider": "Select search engine" "select_provider": "検索エンジンを選択"
}, },
"resources": { "resources": {
"cpu": "CPU", "cpu": "CPU",
@@ -132,18 +132,18 @@
"songs": "曲" "songs": "曲"
}, },
"jellyfin": { "jellyfin": {
"playing": "Playing", "playing": "再生中",
"transcoding": "Transcoding", "transcoding": "変換中",
"bitrate": "Bitrate", "bitrate": "ビットレート",
"no_active": "No Active Streams", "no_active": "アクティブ・ストリーム無し",
"movies": "Movies", "movies": "映画",
"series": "Series", "series": "シリーズ",
"episodes": "Episodes", "episodes": "エピソード",
"songs": "Songs", "songs": "曲",
"albums": "Albums" "albums": "アルバム"
}, },
"esphome": { "esphome": {
"offline": "", "offline": "オフライン ",
"offline_alt": "オフライン", "offline_alt": "オフライン",
"online": "オンライン", "online": "オンライン",
"total": "Total", "total": "Total",
@@ -241,21 +241,31 @@
}, },
"rutorrent": { "rutorrent": {
"active": "アクティブ", "active": "アクティブ",
"upload": "Upload", "upload": "アップロード",
"download": "Download" "download": "ダウンロード"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "ダウンロード",
"upload": "Upload", "upload": "アップロード",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qbittorrent": { "qbittorrent": {
"download": "Download", "download": "ダウンロード",
"upload": "Upload", "upload": "アップロード",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU使用量", "cpuUsage": "CPU使用量",
"memUsage": "MEM使用量", "memUsage": "MEM使用量",
@@ -285,7 +295,7 @@
"queued": "待機中", "queued": "待機中",
"series": "Series", "series": "Series",
"queue": "Queue", "queue": "Queue",
"unknown": "Unknown" "unknown": "不明"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -365,15 +375,15 @@
"expires": "失効", "expires": "失効",
"never": "なし", "never": "なし",
"user": "User", "user": "User",
"hostname": "Hostname", "hostname": "ホスト名",
"name": "Name", "name": "名前",
"client_version": "Client Version", "client_version": "クライアントバージョン",
"os": "OS", "os": "OS",
"created": "Created", "created": "作成済み",
"authorized": "Authorized", "authorized": "承認済み",
"is_external": "Is External", "is_external": "Is External",
"update_available": "Update Available", "update_available": "アップデートが利用できます",
"tags": "Tags", "tags": "タグ",
"last_seen": "最終日時", "last_seen": "最終日時",
"now": "現在", "now": "現在",
"years": "{{number}}年", "years": "{{number}}年",
@@ -383,11 +393,11 @@
"minutes": "{{number}}分", "minutes": "{{number}}分",
"seconds": "{{number}}秒", "seconds": "{{number}}秒",
"ago": "{{value}} 前", "ago": "{{value}} 前",
"true": "Yes", "true": "はい",
"false": "No" "false": "いいえ"
}, },
"technitium": { "technitium": {
"totalQueries": "Queries", "totalQueries": "クエリ",
"totalNoError": "成功", "totalNoError": "成功",
"totalServerFailure": "失敗", "totalServerFailure": "失敗",
"totalNxDomain": "NXドメイン", "totalNxDomain": "NXドメイン",
@@ -395,7 +405,7 @@
"totalAuthoritative": "正式", "totalAuthoritative": "正式",
"totalRecursive": "再帰的", "totalRecursive": "再帰的",
"totalCached": "キャッシュ済み", "totalCached": "キャッシュ済み",
"totalBlocked": "Blocked", "totalBlocked": "ブロック中",
"totalDropped": "ドロップ済み", "totalDropped": "ドロップ済み",
"totalClients": "クライアント" "totalClients": "クライアント"
}, },
@@ -411,13 +421,13 @@
"middleware": "ミドルウェア" "middleware": "ミドルウェア"
}, },
"trilium": { "trilium": {
"version": "Version", "version": "バージョン",
"notesCount": "Notes", "notesCount": "メモ",
"dbSize": "Database Size", "dbSize": "データベースサイズ",
"unknown": "Unknown" "unknown": "不明"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "アクティブストリーム無し",
"please_wait": "お待ちください" "please_wait": "お待ちください"
}, },
"npm": { "npm": {
@@ -482,7 +492,7 @@
"authorizationsLast24H": "Auths (24h)" "authorizationsLast24H": "Auths (24h)"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "メモリ",
"cpu": "CPU", "cpu": "CPU",
"lxc": "LXC", "lxc": "LXC",
"vms": "VM" "vms": "VM"
@@ -494,17 +504,17 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"load": "Load", "load": "負荷",
"wait": "Please wait", "wait": "お待ちください",
"temp": "TEMP", "temp": "温度",
"_temp": "温度", "_temp": "温度",
"warn": "警告", "warn": "警告",
"uptime": "UP", "uptime": "稼働時間",
"total": "Total", "total": "合計",
"free": "Free", "free": "空き容量",
"used": "Used", "used": "使用済み",
"days": "d", "days": "日",
"hours": "h", "hours": "時",
"crit": "クリティカル", "crit": "クリティカル",
"read": "Read", "read": "Read",
"write": "書き込み", "write": "書き込み",
@@ -545,39 +555,39 @@
"57-day": "着氷性の小雨", "57-day": "着氷性の小雨",
"57-night": "Freezing Drizzle", "57-night": "Freezing Drizzle",
"61-day": "小雨", "61-day": "小雨",
"61-night": "Light Rain", "61-night": "小雨",
"63-day": "雨", "63-day": "雨",
"63-night": "Rain", "63-night": "雨",
"65-day": "大雨", "65-day": "大雨",
"65-night": "Heavy Rain", "65-night": "大雨",
"66-day": "着氷性の雨", "66-day": "着氷性の雨",
"66-night": "Freezing Rain", "66-night": "着氷性の雨",
"67-day": "Freezing Rain", "67-day": "着氷性の雨",
"67-night": "Freezing Rain", "67-night": "着氷性の雨",
"71-day": "小雪", "71-day": "小雪",
"71-night": "Light Snow", "71-night": "小雪",
"73-day": "雪", "73-day": "雪",
"73-night": "Snow", "73-night": "雪",
"75-day": "大雪", "75-day": "大雪",
"75-night": "Heavy Snow", "75-night": "Heavy Snow",
"77-day": "霧雪", "77-day": "霧雪",
"77-night": "Snow Grains", "77-night": "Snow Grains",
"80-day": "弱いにわか雨", "80-day": "弱いにわか雨",
"80-night": "Light Showers", "80-night": "弱いにわか雨",
"81-day": "にわか雨", "81-day": "にわか雨",
"81-night": "Showers", "81-night": "にわか雨",
"82-day": "強いにわか雨", "82-day": "強いにわか雨",
"82-night": "Heavy Showers", "82-night": "強いにわか雨",
"85-day": "にわか雪", "85-day": "にわか雪",
"85-night": "Snow Showers", "85-night": "にわか雪",
"86-day": "Snow Showers", "86-day": "にわか雪",
"86-night": "Snow Showers", "86-night": "にわか雪",
"95-day": "雷雨", "95-day": "雷雨",
"95-night": "Thunderstorm", "95-night": "雷雨",
"96-day": "雷雨・ひょう", "96-day": "雷雨・ひょう",
"96-night": "Thunderstorm With Hail", "96-night": "雹を伴う雷雨",
"99-day": "Thunderstorm With Hail", "99-day": "雹を伴う雷雨",
"99-night": "Thunderstorm With Hail" "99-night": "雹を伴う雷雨"
}, },
"homebridge": { "homebridge": {
"available_update": "システム", "available_update": "システム",
@@ -645,7 +655,7 @@
"signalQuality": "クオリティ", "signalQuality": "クオリティ",
"symbolQuality": "Quality", "symbolQuality": "Quality",
"networkRate": "Bitrate", "networkRate": "Bitrate",
"clientIP": "クライアント IP" "clientIP": "クライアントIP"
}, },
"scrutiny": { "scrutiny": {
"passed": "合格", "passed": "合格",
@@ -661,7 +671,7 @@
"sites": "Sites", "sites": "Sites",
"resources": "Resources", "resources": "Resources",
"targets": "Targets", "targets": "Targets",
"traffic": "Traffic", "traffic": "トラフィック",
"in": "In", "in": "In",
"out": "Out" "out": "Out"
}, },
@@ -674,7 +684,7 @@
"low_battery": "バッテリー残量低下" "low_battery": "バッテリー残量低下"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "お待ちください",
"no_devices": "デバイス データを受信していません" "no_devices": "デバイス データを受信していません"
}, },
"mikrotik": { "mikrotik": {
@@ -695,7 +705,7 @@
"limit": "リミット" "limit": "リミット"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "CPU負荷",
"memory": "アクティブ・メモリ", "memory": "アクティブ・メモリ",
"wanUpload": "WANアップロード", "wanUpload": "WANアップロード",
"wanDownload": "WANダウンロード" "wanDownload": "WANダウンロード"
@@ -707,14 +717,14 @@
"layers": "レイヤー" "layers": "レイヤー"
}, },
"octoprint": { "octoprint": {
"printer_state": "Status", "printer_state": "ステータス",
"temp_tool": "ツール温度", "temp_tool": "ツール温度",
"temp_bed": "ベッド温度", "temp_bed": "ベッド温度",
"job_completion": "完了" "job_completion": "完了"
}, },
"cloudflared": { "cloudflared": {
"origin_ip": "オリジンIP", "origin_ip": "オリジンIP",
"status": "Status" "status": "ステータス"
}, },
"pfsense": { "pfsense": {
"load": "読み込み平均", "load": "読み込み平均",
@@ -733,17 +743,17 @@
"memory_usage": "メモリ" "memory_usage": "メモリ"
}, },
"immich": { "immich": {
"users": "Users", "users": "ユーザ",
"photos": "写真", "photos": "写真",
"videos": "Videos", "videos": "ビデオ",
"storage": "ストレージ" "storage": "ストレージ"
}, },
"uptimekuma": { "uptimekuma": {
"up": "サイトUp", "up": "サイトUp",
"down": "サイトDown", "down": "サイトDown",
"uptime": "Uptime", "uptime": "稼働時間",
"incident": "事件", "incident": "事件",
"m": "m" "m": "分"
}, },
"atsumeru": { "atsumeru": {
"series": "Series", "series": "Series",
@@ -772,15 +782,16 @@
}, },
"photoprism": { "photoprism": {
"albums": "Albums", "albums": "Albums",
"photos": "Photos", "photos": "写真",
"videos": "Videos", "videos": "動画",
"people": "人" "people": "人"
}, },
"fileflows": { "fileflows": {
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "時間" "time": "時間",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -884,12 +903,12 @@
}, },
"gamedig": { "gamedig": {
"status": "Status", "status": "Status",
"online": "Online", "online": "オンライン",
"offline": "Offline", "offline": "オフライン ",
"name": "名前", "name": "名前",
"map": "マップ", "map": "マップ",
"currentPlayers": "現在のプレーヤー", "currentPlayers": "現在のプレーヤー",
"players": "Players", "players": "プレイヤー",
"maxPlayers": "最大プレイヤー数", "maxPlayers": "最大プレイヤー数",
"bots": "ボット", "bots": "ボット",
"ping": "Ping" "ping": "Ping"
@@ -902,21 +921,21 @@
}, },
"mealie": { "mealie": {
"recipes": "レシピ", "recipes": "レシピ",
"users": "Users", "users": "ユーザ",
"categories": "Categories", "categories": "カテゴリ",
"tags": "タグ" "tags": "タグ"
}, },
"openmediavault": { "openmediavault": {
"downloading": "ダウンロード中", "downloading": "ダウンロード中",
"total": "Total", "total": "合計",
"running": "Running", "running": "実行中",
"stopped": "Stopped", "stopped": "停止中",
"passed": "Passed", "passed": "Passed",
"failed": "Failed" "failed": "Failed"
}, },
"openwrt": { "openwrt": {
"uptime": "Uptime", "uptime": "Uptime",
"cpuLoad": "CPU 平均負荷(5 分)", "cpuLoad": "CPU 平均負荷(5分)",
"up": "Up", "up": "Up",
"down": "Down", "down": "Down",
"bytesTx": "送信済み", "bytesTx": "送信済み",
@@ -924,7 +943,7 @@
}, },
"uptimerobot": { "uptimerobot": {
"status": "Status", "status": "Status",
"uptime": "Uptime", "uptime": "稼働時間",
"lastDown": "最後のダウンタイム", "lastDown": "最後のダウンタイム",
"downDuration": "ダウンタイム時間", "downDuration": "ダウンタイム時間",
"sitesUp": "Sites Up", "sitesUp": "Sites Up",
@@ -954,9 +973,9 @@
}, },
"mailcow": { "mailcow": {
"domains": "Domains", "domains": "Domains",
"mailboxes": "Mailboxes", "mailboxes": "受信箱",
"mails": "Mails", "mails": "メール",
"storage": "Storage" "storage": "ストレージ"
}, },
"maintainerr": { "maintainerr": {
"itemsHandled": "Items Handled", "itemsHandled": "Items Handled",
@@ -974,7 +993,7 @@
"criticals": "重大" "criticals": "重大"
}, },
"ntfy": { "ntfy": {
"title": "Title", "title": "タイトル",
"priority": "Priority", "priority": "Priority",
"lastReceived": "Last Received", "lastReceived": "Last Received",
"message": "Message", "message": "Message",
@@ -989,7 +1008,7 @@
"plantit": { "plantit": {
"events": "イベント", "events": "イベント",
"plants": "植物", "plants": "植物",
"photos": "Photos", "photos": "写真",
"species": "種" "species": "種"
}, },
"gitea": { "gitea": {
@@ -1137,27 +1156,27 @@
"karakeep": { "karakeep": {
"bookmarks": "Bookmarks", "bookmarks": "Bookmarks",
"favorites": "Favorites", "favorites": "Favorites",
"archived": "Archived", "archived": "アーカイブ済み",
"highlights": "Highlights", "highlights": "ハイライト",
"lists": "Lists", "lists": "リスト",
"tags": "Tags" "tags": "タグ"
}, },
"slskd": { "slskd": {
"slskStatus": "Network", "slskStatus": "ネットワーク",
"connected": "Connected", "connected": "接続されています",
"disconnected": "Disconnected", "disconnected": "切断されています",
"updateStatus": "Update", "updateStatus": "更新",
"update_yes": "Available", "update_yes": "利用可能",
"update_no": "Up to Date", "update_no": "最新",
"downloads": "Downloads", "downloads": "ダウンロード",
"uploads": "Uploads", "uploads": "アップロード",
"sharedFiles": "Files" "sharedFiles": "ファイル"
}, },
"jellystat": { "jellystat": {
"songs": "Songs", "songs": "曲",
"movies": "Movies", "movies": "映画",
"episodes": "Episodes", "episodes": "エピソード",
"other": "Other" "other": "その他"
}, },
"checkmk": { "checkmk": {
"serviceErrors": "Service issues", "serviceErrors": "Service issues",
@@ -1198,11 +1217,11 @@
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks", "TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
"NEW_DISK_TOO_SMALL": "New Disk Too Small", "NEW_DISK_TOO_SMALL": "New Disk Too Small",
"NO_DATA_DISKS": "No Data Disks", "NO_DATA_DISKS": "No Data Disks",
"notifications": "Notifications", "notifications": "通知",
"status": "Status", "status": "ステータス",
"cpu": "CPU", "cpu": "CPU",
"memoryUsed": "Memory Used", "memoryUsed": "メモリ使用量",
"memoryAvailable": "Memory Available", "memoryAvailable": "使用可能なメモリ",
"arrayUsed": "Array Used", "arrayUsed": "Array Used",
"arrayFree": "Array Free", "arrayFree": "Array Free",
"poolUsed": "{{pool}} Used", "poolUsed": "{{pool}} Used",
@@ -1210,53 +1229,56 @@
}, },
"backrest": { "backrest": {
"num_plans": "Plans", "num_plans": "Plans",
"num_success_30": "Successes", "num_success_30": "成功",
"num_failure_30": "Failures", "num_failure_30": "失敗",
"num_success_latest": "Succeeding", "num_success_latest": "成功",
"num_failure_latest": "Failing", "num_failure_latest": "失敗",
"bytes_added_30": "Bytes Added" "bytes_added_30": "バイトが追加されました"
}, },
"yourspotify": { "yourspotify": {
"songs": "Songs", "songs": "曲",
"time": "Time", "time": "時間",
"artists": "Artists" "artists": "アーティスト"
}, },
"arcane": { "arcane": {
"containers": "Containers", "containers": "コンテナ",
"images": "Images", "images": "イメージ",
"image_updates": "Image Updates", "image_updates": "イメージの更新",
"images_unused": "Unused", "images_unused": "未使用",
"environment_required": "Environment ID Required" "environment_required": "Enviroment ID が必要です"
}, },
"dockhand": { "dockhand": {
"running": "Running", "running": "実行中",
"stopped": "Stopped", "stopped": "停止中",
"cpu": "CPU", "cpu": "CPU",
"memory": "Memory", "memory": "メモリ",
"images": "Images", "images": "イメージ",
"volumes": "Volumes", "volumes": "ボリューム",
"events_today": "Events Today", "events_today": "今日のイベント",
"pending_updates": "Pending Updates", "pending_updates": "保留中の更新",
"stacks": "Stacks", "stacks": "スタック数",
"paused": "Paused", "paused": "一時停止中",
"total": "Total", "total": "合計",
"environment_not_found": "Environment Not Found" "environment_not_found": "環境が見つかりません"
}, },
"sparkyfitness": { "sparkyfitness": {
"eaten": "Eaten", "eaten": "摂取カロリー",
"burned": "Burned", "burned": "消費カロリー",
"remaining": "Remaining", "remaining": "残り",
"steps": "Steps" "steps": "ステップ"
}, },
"syncthing": { "syncthing": {
"connected": "Connected", "connected": "接続されています",
"synced": "Synced", "synced": "同期しました",
"errors": "Errors", "errors": "エラー",
"storage": "Storage" "storage": "ストレージ"
}, },
"sportarr": { "sportarr": {
"wanted": "Wanted", "wanted": "募集中",
"queued": "Queued", "queued": "処理待ち",
"leagues": "Leagues" "leagues": "リーグ"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "리치", "leech": "리치",
"seed": "시드" "seed": "시드"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU 사용량", "cpuUsage": "CPU 사용량",
"memUsage": "메모리 사용량", "memUsage": "메모리 사용량",
@@ -780,7 +790,8 @@
"queue": "대기열", "queue": "대기열",
"processing": "처리 중", "processing": "처리 중",
"processed": "처리됨", "processed": "처리됨",
"time": "시간" "time": "시간",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "순자산", "networth": "순자산",
@@ -859,6 +870,14 @@
"reading": "읽는 중", "reading": "읽는 중",
"finished": "완료" "finished": "완료"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "대기열", "downloadCount": "대기열",
"downloadBytesRemaining": "남음", "downloadBytesRemaining": "남음",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Delen" "seed": "Delen"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Verbruik", "cpuUsage": "CPU Verbruik",
"memUsage": "MEM Gebruik", "memUsage": "MEM Gebruik",
@@ -780,7 +790,8 @@
"queue": "Wachtrij", "queue": "Wachtrij",
"processing": "Verwerken", "processing": "Verwerken",
"processed": "Verwerkt", "processed": "Verwerkt",
"time": "Tijd" "time": "Tijd",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Totaal eigen vermogen", "networth": "Totaal eigen vermogen",
@@ -859,6 +870,14 @@
"reading": "Lezen", "reading": "Lezen",
"finished": "Voltooid" "finished": "Voltooid"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Wachtrij", "downloadCount": "Wachtrij",
"downloadBytesRemaining": "Resterend", "downloadBytesRemaining": "Resterend",
@@ -1258,5 +1277,8 @@
"wanted": "Gewenst", "wanted": "Gewenst",
"queued": "In de wachtrij", "queued": "In de wachtrij",
"leagues": "Competities" "leagues": "Competities"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Bruk", "cpuUsage": "CPU Bruk",
"memUsage": "Minnebruk", "memUsage": "Minnebruk",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+28 -6
View File
@@ -100,11 +100,11 @@
"not_found": "Nie znaleziono", "not_found": "Nie znaleziono",
"exited": "Zakończony", "exited": "Zakończony",
"partial": "Częściowy", "partial": "Częściowy",
"created": "Created", "created": "Utworzony",
"paused": "Paused", "paused": "Wstrzymany",
"restarting": "Restarting", "restarting": "Ponowne uruchamianie",
"removing": "Removing", "removing": "Usuwanie",
"dead": "Dead" "dead": "Martwy"
}, },
"ping": { "ping": {
"error": "Błąd", "error": "Błąd",
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Pobieranie",
"seed": "Seed",
"upload": "Wysyłanie",
"total": "Razem",
"errored": "Z błędami",
"ratio": "Ratio",
"freeSpace": "Wolne"
},
"qnap": { "qnap": {
"cpuUsage": "Użycie CPU", "cpuUsage": "Użycie CPU",
"memUsage": "Użycie pamięci", "memUsage": "Użycie pamięci",
@@ -780,7 +790,8 @@
"queue": "W kolejce", "queue": "W kolejce",
"processing": "Przetwarzane", "processing": "Przetwarzane",
"processed": "Przetworzone", "processed": "Przetworzone",
"time": "Czas" "time": "Czas",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Wartość netto", "networth": "Wartość netto",
@@ -859,6 +870,14 @@
"reading": "Czytane", "reading": "Czytane",
"finished": "Skończone" "finished": "Skończone"
}, },
"bookorbit": {
"books": "Książki",
"authors": "Autorzy",
"series": "Serie",
"storage": "Pamięć",
"reading": "Czytane",
"finished": "Skończone"
},
"jdownloader": { "jdownloader": {
"downloadCount": "W kolejce", "downloadCount": "W kolejce",
"downloadBytesRemaining": "Pozostało", "downloadBytesRemaining": "Pozostało",
@@ -1258,5 +1277,8 @@
"wanted": "Poszukiwane", "wanted": "Poszukiwane",
"queued": "W kolejce", "queued": "W kolejce",
"leagues": "Ligi" "leagues": "Ligi"
},
"feed": {
"noItems": "Brak elementów"
} }
} }
+31 -9
View File
@@ -40,8 +40,8 @@
}, },
"search": { "search": {
"placeholder": "Pesquisar…", "placeholder": "Pesquisar…",
"provider": "Search engine: {{name}}", "provider": "Motor de Pesquisa: {{name}}",
"select_provider": "Select search engine" "select_provider": "Seleciona o motor de pesquisa"
}, },
"resources": { "resources": {
"cpu": "CPU", "cpu": "CPU",
@@ -100,11 +100,11 @@
"not_found": "Não Encontrado", "not_found": "Não Encontrado",
"exited": "Saiu", "exited": "Saiu",
"partial": "Parcial", "partial": "Parcial",
"created": "Created", "created": "Criado",
"paused": "Paused", "paused": "Pausado",
"restarting": "Restarting", "restarting": "A reiniciar",
"removing": "Removing", "removing": "A remover",
"dead": "Dead" "dead": "Morto"
}, },
"ping": { "ping": {
"error": "Erro", "error": "Erro",
@@ -256,6 +256,16 @@
"leech": "Fuga", "leech": "Fuga",
"seed": "Semear" "seed": "Semear"
}, },
"qui": {
"leech": "Fuga",
"download": "Transferir",
"seed": "Semear",
"upload": "Enviar",
"total": "Total",
"errored": "Erro",
"ratio": "Rácio",
"freeSpace": "Livre"
},
"qnap": { "qnap": {
"cpuUsage": "Utilização do CPU", "cpuUsage": "Utilização do CPU",
"memUsage": "Utilização de Memória", "memUsage": "Utilização de Memória",
@@ -479,7 +489,7 @@
"users": "Utilizadores", "users": "Utilizadores",
"loginsLast24H": "Inícios de Sessão (24h)", "loginsLast24H": "Inícios de Sessão (24h)",
"failedLoginsLast24H": "Inícios de Sessão Falhados (24h)", "failedLoginsLast24H": "Inícios de Sessão Falhados (24h)",
"authorizationsLast24H": "Auths (24h)" "authorizationsLast24H": "Autenticações (24h)"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "MEM",
@@ -780,7 +790,8 @@
"queue": "Fila de espera", "queue": "Fila de espera",
"processing": "A Processar", "processing": "A Processar",
"processed": "Processado", "processed": "Processado",
"time": "Hora" "time": "Hora",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Valor Líquido", "networth": "Valor Líquido",
@@ -859,6 +870,14 @@
"reading": "A ler", "reading": "A ler",
"finished": "Concluído" "finished": "Concluído"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Fila de espera", "downloadCount": "Fila de espera",
"downloadBytesRemaining": "Restante", "downloadBytesRemaining": "Restante",
@@ -1258,5 +1277,8 @@
"wanted": "Procurado", "wanted": "Procurado",
"queued": "Em fila de espera", "queued": "Em fila de espera",
"leagues": "Ligas" "leagues": "Ligas"
},
"feed": {
"noItems": "Sem itens"
} }
} }
+44 -22
View File
@@ -21,7 +21,7 @@
"seconds": "s" "seconds": "s"
}, },
"auth": { "auth": {
"signout": "Sign out" "signout": "Encerrar Sessão"
}, },
"widget": { "widget": {
"missing_type": "Tipo de Widget ausente: {{type}}", "missing_type": "Tipo de Widget ausente: {{type}}",
@@ -40,8 +40,8 @@
}, },
"search": { "search": {
"placeholder": "Pesquisar…", "placeholder": "Pesquisar…",
"provider": "Search engine: {{name}}", "provider": "Motor de pesquisa: {{name}}",
"select_provider": "Select search engine" "select_provider": "Selecionar motor de busca"
}, },
"resources": { "resources": {
"cpu": "CPU", "cpu": "CPU",
@@ -100,11 +100,11 @@
"not_found": "Não Encontrado", "not_found": "Não Encontrado",
"exited": "Encerrado", "exited": "Encerrado",
"partial": "Parcial", "partial": "Parcial",
"created": "Created", "created": "Criado",
"paused": "Paused", "paused": "Pausado",
"restarting": "Restarting", "restarting": "Reiniciando",
"removing": "Removing", "removing": "Removendo",
"dead": "Dead" "dead": "Inativo"
}, },
"ping": { "ping": {
"error": "Erro", "error": "Erro",
@@ -140,7 +140,7 @@
"series": "Séries", "series": "Séries",
"episodes": "Episódios", "episodes": "Episódios",
"songs": "Músicas", "songs": "Músicas",
"albums": "Albums" "albums": "Álbuns"
}, },
"esphome": { "esphome": {
"offline": "Offline", "offline": "Offline",
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Uso de CPU", "cpuUsage": "Uso de CPU",
"memUsage": "Uso de Memória", "memUsage": "Uso de Memória",
@@ -780,7 +790,8 @@
"queue": "Fila de espera", "queue": "Fila de espera",
"processing": "Processando", "processing": "Processando",
"processed": "Processado", "processed": "Processado",
"time": "Hora" "time": "Hora",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Valor Líquido", "networth": "Valor Líquido",
@@ -859,6 +870,14 @@
"reading": "Lendo", "reading": "Lendo",
"finished": "Finalizado" "finished": "Finalizado"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Fila de espera", "downloadCount": "Fila de espera",
"downloadBytesRemaining": "Restante", "downloadBytesRemaining": "Restante",
@@ -959,15 +978,15 @@
"storage": "Armazenamento" "storage": "Armazenamento"
}, },
"maintainerr": { "maintainerr": {
"itemsHandled": "Items Handled", "itemsHandled": "Itens manuseados",
"episodesHandled": "Episodes Handled", "episodesHandled": "Episódios tratados",
"moviesHandled": "Movies Handled", "moviesHandled": "Filmes tratados",
"showsHandled": "Shows Handled", "showsHandled": "Séries tratados",
"seasonsHandled": "Seasons Handled", "seasonsHandled": "Temporadas tratadas",
"reclaimable": "Reclaimable", "reclaimable": "Reclamável",
"movieReclaimable": "Movie Reclaimable", "movieReclaimable": "Filme Reclamável",
"showReclaimable": "Show Reclaimable", "showReclaimable": "Show Reclamável",
"totalCapacity": "Total Capacity" "totalCapacity": "Capacidade total"
}, },
"netdata": { "netdata": {
"warnings": "Alertas", "warnings": "Alertas",
@@ -1255,8 +1274,11 @@
"storage": "Armazenagem" "storage": "Armazenagem"
}, },
"sportarr": { "sportarr": {
"wanted": "Wanted", "wanted": "Desejado",
"queued": "Queued", "queued": "Na fila",
"leagues": "Leagues" "leagues": "Ligas"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Timp" "time": "Timp",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Лич", "leech": "Лич",
"seed": "Сид" "seed": "Сид"
}, },
"qui": {
"leech": "Лич",
"download": "Скачивание",
"seed": "Сид",
"upload": "Загрузка",
"total": "Всего",
"errored": "Ошибок",
"ratio": "Соотношение",
"freeSpace": "Свободно"
},
"qnap": { "qnap": {
"cpuUsage": "Использование ЦП", "cpuUsage": "Использование ЦП",
"memUsage": "Использование ОЗУ", "memUsage": "Использование ОЗУ",
@@ -780,7 +790,8 @@
"queue": "Очередь", "queue": "Очередь",
"processing": "Обрабатывается", "processing": "Обрабатывается",
"processed": "Обработано", "processed": "Обработано",
"time": "Время" "time": "Время",
"failed": "Неудачно"
}, },
"firefly": { "firefly": {
"networth": "Общая средства", "networth": "Общая средства",
@@ -859,6 +870,14 @@
"reading": "Читаю", "reading": "Читаю",
"finished": "Завершено" "finished": "Завершено"
}, },
"bookorbit": {
"books": "Книги",
"authors": "Авторы",
"series": "Серии",
"storage": "Память",
"reading": "Чтение",
"finished": "Завершено"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Очередь", "downloadCount": "Очередь",
"downloadBytesRemaining": "Осталось", "downloadBytesRemaining": "Осталось",
@@ -1258,5 +1277,8 @@
"wanted": "Требуется", "wanted": "Требуется",
"queued": "В очереди", "queued": "В очереди",
"leagues": "Лиги" "leagues": "Лиги"
},
"feed": {
"noItems": "Ничего нет"
} }
} }
+29 -7
View File
@@ -72,7 +72,7 @@
"empty_data": "Stav podsystému neznámy" "empty_data": "Stav podsystému neznámy"
}, },
"unifi_drive": { "unifi_drive": {
"healthy": "Healthy", "healthy": "Zdravý",
"degraded": "Degraded", "degraded": "Degraded",
"no_data": "No storage data available" "no_data": "No storage data available"
}, },
@@ -100,11 +100,11 @@
"not_found": "Nenájdené", "not_found": "Nenájdené",
"exited": "Ukončené", "exited": "Ukončené",
"partial": "Čiastočný", "partial": "Čiastočný",
"created": "Created", "created": "Vytvorené",
"paused": "Paused", "paused": "Pozastavené",
"restarting": "Restarting", "restarting": "Reštartuje sa",
"removing": "Removing", "removing": "Odstraňuje sa",
"dead": "Dead" "dead": "Mŕtve"
}, },
"ping": { "ping": {
"error": "Chyba", "error": "Chyba",
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Využitie CPU", "cpuUsage": "Využitie CPU",
"memUsage": "Využitie pamäte", "memUsage": "Využitie pamäte",
@@ -780,7 +790,8 @@
"queue": "Poradie", "queue": "Poradie",
"processing": "Processing", "processing": "Processing",
"processed": "Spracované", "processed": "Spracované",
"time": "Čas" "time": "Čas",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Úložisko",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Poradie", "downloadCount": "Poradie",
"downloadBytesRemaining": "Zostávajúce", "downloadBytesRemaining": "Zostávajúce",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "V poradí", "queued": "V poradí",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "Žiadne položky"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU", "cpuUsage": "CPU",
"memUsage": "MEM", "memUsage": "MEM",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Čas" "time": "Čas",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Neto vrednost", "networth": "Neto vrednost",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Искоришћеност процесора", "cpuUsage": "Искоришћеност процесора",
"memUsage": "Заузеће меморије", "memUsage": "Заузеће меморије",
@@ -780,7 +790,8 @@
"queue": "Ред", "queue": "Ред",
"processing": "Обрада", "processing": "Обрада",
"processed": "Обрада", "processed": "Обрада",
"time": "Време" "time": "Време",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Нето вредност", "networth": "Нето вредност",
@@ -859,6 +870,14 @@
"reading": "Читање", "reading": "Читање",
"finished": "Завршено" "finished": "Завршено"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Ред", "downloadCount": "Ред",
"downloadBytesRemaining": "Преостало", "downloadBytesRemaining": "Преостало",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "İndirilen", "leech": "İndirilen",
"seed": "Gönderilen" "seed": "Gönderilen"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "İşlemci Kullanımı", "cpuUsage": "İşlemci Kullanımı",
"memUsage": "Bellek Kullanımı", "memUsage": "Bellek Kullanımı",
@@ -780,7 +790,8 @@
"queue": "Kuyruk", "queue": "Kuyruk",
"processing": "İşleniyor", "processing": "İşleniyor",
"processed": "İşlendi", "processed": "İşlendi",
"time": "Zaman" "time": "Zaman",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net değer", "networth": "Net değer",
@@ -859,6 +870,14 @@
"reading": "Okunuyor", "reading": "Okunuyor",
"finished": "Bitti" "finished": "Bitti"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Kuyruk", "downloadCount": "Kuyruk",
"downloadBytesRemaining": "Kalan", "downloadBytesRemaining": "Kalan",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+28 -6
View File
@@ -21,7 +21,7 @@
"seconds": "с" "seconds": "с"
}, },
"auth": { "auth": {
"signout": "Sign out" "signout": "Вихід"
}, },
"widget": { "widget": {
"missing_type": "Відсутній тип віджета: {{type}}", "missing_type": "Відсутній тип віджета: {{type}}",
@@ -41,7 +41,7 @@
"search": { "search": {
"placeholder": "Пошук…", "placeholder": "Пошук…",
"provider": "Search engine: {{name}}", "provider": "Search engine: {{name}}",
"select_provider": "Select search engine" "select_provider": "Вибрати пошукову систему"
}, },
"resources": { "resources": {
"cpu": "ЦП", "cpu": "ЦП",
@@ -83,7 +83,7 @@
"nextRun": "Next Run", "nextRun": "Next Run",
"running": "Running", "running": "Running",
"warnings": "Warnings", "warnings": "Warnings",
"errors": "Errors" "errors": "Помилки"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
@@ -140,7 +140,7 @@
"series": "Серіали", "series": "Серіали",
"episodes": "Серії", "episodes": "Серії",
"songs": "Пiснi", "songs": "Пiснi",
"albums": "Albums" "albums": "Альбоми"
}, },
"esphome": { "esphome": {
"offline": "Офлайн", "offline": "Офлайн",
@@ -256,6 +256,16 @@
"leech": "Ліч", "leech": "Ліч",
"seed": "Сід" "seed": "Сід"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Використання CPU", "cpuUsage": "Використання CPU",
"memUsage": "Використання пам'яті", "memUsage": "Використання пам'яті",
@@ -780,7 +790,8 @@
"queue": "Черга", "queue": "Черга",
"processing": "Обробка", "processing": "Обробка",
"processed": "Оброблено", "processed": "Оброблено",
"time": "Час" "time": "Час",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Чисті Активи", "networth": "Чисті Активи",
@@ -859,6 +870,14 @@
"reading": "Читаю", "reading": "Читаю",
"finished": "Завершено" "finished": "Завершено"
}, },
"bookorbit": {
"books": "Книжки",
"authors": "Автори",
"series": "Серії",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Черга", "downloadCount": "Черга",
"downloadBytesRemaining": "Залишилось", "downloadBytesRemaining": "Залишилось",
@@ -1257,6 +1276,9 @@
"sportarr": { "sportarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Ліги"
},
"feed": {
"noItems": "Немає елементів"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "Leecher", "leech": "Leecher",
"seed": "Seeder" "seed": "Seeder"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "Mức sử dụng CPU", "cpuUsage": "Mức sử dụng CPU",
"memUsage": "Mức sử dụng bộ nhớ", "memUsage": "Mức sử dụng bộ nhớ",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Time",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "Queue", "downloadCount": "Queue",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Remaining",
@@ -1258,5 +1277,8 @@
"wanted": "Cần tải", "wanted": "Cần tải",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "未完成下載", "leech": "未完成下載",
"seed": "已完成下載" "seed": "已完成下載"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU 使用率", "cpuUsage": "CPU 使用率",
"memUsage": "記憶體使用率", "memUsage": "記憶體使用率",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "時間" "time": "時間",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "淨值", "networth": "淨值",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "佇列", "downloadCount": "佇列",
"downloadBytesRemaining": "剩餘大小", "downloadBytesRemaining": "剩餘大小",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "下载中", "leech": "下载中",
"seed": "做种" "seed": "做种"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "处理器", "cpuUsage": "处理器",
"memUsage": "内存使用", "memUsage": "内存使用",
@@ -780,7 +790,8 @@
"queue": "队列", "queue": "队列",
"processing": "处理中", "processing": "处理中",
"processed": "已处理", "processed": "已处理",
"time": "时间" "time": "时间",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "净值", "networth": "净值",
@@ -859,6 +870,14 @@
"reading": "阅读中", "reading": "阅读中",
"finished": "已读完" "finished": "已读完"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "队列", "downloadCount": "队列",
"downloadBytesRemaining": "剩余", "downloadBytesRemaining": "剩余",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
+23 -1
View File
@@ -256,6 +256,16 @@
"leech": "未完成下載", "leech": "未完成下載",
"seed": "已完成下載" "seed": "已完成下載"
}, },
"qui": {
"leech": "Leech",
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"total": "Total",
"errored": "Errored",
"ratio": "Ratio",
"freeSpace": "Free"
},
"qnap": { "qnap": {
"cpuUsage": "CPU 使用率", "cpuUsage": "CPU 使用率",
"memUsage": "記憶體使用率", "memUsage": "記憶體使用率",
@@ -780,7 +790,8 @@
"queue": "Queue", "queue": "Queue",
"processing": "Processing", "processing": "Processing",
"processed": "Processed", "processed": "Processed",
"time": "時間" "time": "時間",
"failed": "Failed"
}, },
"firefly": { "firefly": {
"networth": "淨值", "networth": "淨值",
@@ -859,6 +870,14 @@
"reading": "Reading", "reading": "Reading",
"finished": "Finished" "finished": "Finished"
}, },
"bookorbit": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"storage": "Storage",
"reading": "Reading",
"finished": "Finished"
},
"jdownloader": { "jdownloader": {
"downloadCount": "佇列", "downloadCount": "佇列",
"downloadBytesRemaining": "剩餘大小", "downloadBytesRemaining": "剩餘大小",
@@ -1258,5 +1277,8 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"leagues": "Leagues" "leagues": "Leagues"
},
"feed": {
"noItems": "No items"
} }
} }
@@ -34,7 +34,7 @@ function mockResponse() {
async function loadHandler() { async function loadHandler() {
vi.resetModules(); vi.resetModules();
return (await import("./index")).default; return (await import("pages/api/mcp/index")).default;
} }
describe("pages/api/mcp", () => { describe("pages/api/mcp", () => {
@@ -57,7 +57,7 @@ vi.mock("widgets/widgets", () => ({
}, },
})); }));
import handler from "./proxy"; import handler from "pages/api/services/proxy";
function createReq({ method = "GET", body, query = {} } = {}) { function createReq({ method = "GET", body, query = {} } = {}) {
return { method, body, query }; return { method, body, query };
@@ -0,0 +1,118 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import createMockRes from "test-utils/create-mock-res";
const { getPrivateWidgetOptions, httpProxy, logger } = vi.hoisted(() => ({
getPrivateWidgetOptions: vi.fn(),
httpProxy: vi.fn(),
logger: { debug: vi.fn() },
}));
vi.mock("utils/config/widget-helpers", () => ({
getPrivateWidgetOptions,
}));
vi.mock("utils/proxy/http", () => ({
httpProxy,
}));
vi.mock("utils/logger", () => ({
default: () => logger,
}));
import handler from "pages/api/widgets/customapi";
const json = (body) => Buffer.from(JSON.stringify(body));
async function callRoute(options, index = "0") {
getPrivateWidgetOptions.mockResolvedValueOnce(options);
const res = createMockRes();
await handler({ query: { index } }, res);
return res;
}
describe("pages/api/widgets/customapi", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it.each([
["no widget at that index", undefined],
["a widget without a url", { method: "GET" }],
["an invalid url", { url: "api.local/data" }],
])("returns 400 without calling upstream for %s", async (_, options) => {
const res = await callRoute(options, "3");
expect(getPrivateWidgetOptions).toHaveBeenCalledWith("customapi", "3");
expect(res.statusCode).toBe(400);
expect(httpProxy).not.toHaveBeenCalled();
});
it("proxies an authenticated POST with custom headers and a JSON body", async () => {
httpProxy.mockResolvedValueOnce([200, "application/json", json({ json: { hello: "world" } })]);
const res = await callRoute({
url: "https://httpbin.org/post",
username: "admin",
password: "hunter2",
method: "POST",
headers: { "X-Secret-Token": "super-secret", "Content-Type": "application/json" },
requestBody: { hello: "world" },
});
expect(httpProxy).toHaveBeenCalledWith(new URL("https://httpbin.org/post"), {
method: "POST",
headers: {
"User-Agent": "homepage",
Accept: "application/json",
"X-Secret-Token": "super-secret",
"Content-Type": "application/json",
Authorization: `Basic ${Buffer.from("admin:hunter2").toString("base64")}`,
},
body: '{"hello":"world"}',
});
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({ json: { hello: "world" } });
});
it("sends a string body as-is and lets config override default headers", async () => {
httpProxy.mockResolvedValueOnce([200, "application/json", json({ data: { viewer: { login: "shamoon" } } })]);
const query = '{"query":"{ viewer { login } }"}';
const res = await callRoute({
url: "https://api.github.com/graphql",
method: "POST",
headers: { Authorization: "Bearer ghp_token", "User-Agent": "my-dashboard" },
requestBody: query,
});
expect(httpProxy).toHaveBeenCalledWith(expect.any(URL), {
method: "POST",
headers: { "User-Agent": "my-dashboard", Accept: "application/json", Authorization: "Bearer ghp_token" },
body: query,
});
expect(res.body).toEqual({ data: { viewer: { login: "shamoon" } } });
});
it.each([
["an HTTP error", [403, "application/json", json({ message: "API rate limit exceeded for 1.2.3.4" })]],
[
"a network failure",
[500, "application/json", { error: { message: "connect ECONNREFUSED", rawError: { address: "10.0.0.5" } } }],
],
["a non-JSON response", [200, "text/html", Buffer.from("<html><body>Login</body></html>")]],
])("returns only a sanitized error for %s", async (_, upstream) => {
httpProxy.mockResolvedValueOnce(upstream);
const res = await callRoute({ url: "https://api.github.com/repos/gethomepage/homepage?token=abc" });
expect(httpProxy).toHaveBeenCalledWith(expect.any(URL), {
method: "GET",
headers: { "User-Agent": "homepage", Accept: "application/json" },
});
expect(res.statusCode).toBe(upstream[0] === 200 ? 500 : upstream[0]);
expect(res.body.error.url).toBe("api.github.com (see logs for details)");
expect(JSON.stringify(res.body)).not.toMatch(/rate limit|ECONNREFUSED|10\.0\.0\.5|<html>|token=abc/);
expect(res.setHeader).not.toHaveBeenCalled();
});
});
@@ -0,0 +1,19 @@
import { readdirSync } from "fs";
import { expect, it } from "vitest";
// Next compiles everything under src/pages into routes, so a colocated test ships
// to users and drags its dev dependencies into the runtime image.
function filesIn(dir, found = []) {
readdirSync(dir, { withFileTypes: true }).forEach((entry) => {
const path = `${dir}/${entry.name}`;
if (entry.isDirectory()) filesIn(path, found);
else found.push(path);
});
return found;
}
it("keeps test files out of src/pages", () => {
const tests = filesIn("src/pages").filter((path) => /\.(test|spec)\.[jt]sx?$/.test(path));
expect(tests).toEqual([]);
});
+6 -1
View File
@@ -7,6 +7,10 @@ import { SettingsContext } from "utils/contexts/settings";
export default function Item({ bookmark, iconOnly = false }) { export default function Item({ bookmark, iconOnly = false }) {
const description = bookmark.description ?? new URL(bookmark.href).hostname; const description = bookmark.description ?? new URL(bookmark.href).hostname;
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const cardStyle =
settings.cardStyle === "hairline"
? "shadow-xs inset-ring inset-ring-black/5 dark:inset-ring-white/5 hover:inset-ring-black/10 dark:hover:inset-ring-white/10"
: "shadow-md shadow-theme-900/10 dark:shadow-theme-900/20";
return ( return (
<li <li
@@ -22,7 +26,8 @@ export default function Item({ bookmark, iconOnly = false }) {
target={bookmark.target ?? settings.target ?? "_blank"} target={bookmark.target ?? settings.target ?? "_blank"}
className={classNames( className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`, settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,
"text-left cursor-pointer transition-all rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10", cardStyle,
"text-left cursor-pointer transition-all rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10",
iconOnly ? "h-[60px] w-[60px] grid" : "block w-full mb-3", iconOnly ? "h-[60px] w-[60px] grid" : "block w-full mb-3",
)} )}
> >
+10
View File
@@ -21,6 +21,16 @@ describe("components/bookmarks/item", () => {
expect(screen.getByRole("link").getAttribute("target")).toBe("_self"); expect(screen.getByRole("link").getAttribute("target")).toBe("_self");
}); });
it("applies hairline card styles when cardStyle is set", () => {
renderWithProviders(<Item bookmark={{ name: "A", href: "http://example.com/x", abbr: "A" }} iconOnly={false} />, {
settings: { cardStyle: "hairline" },
});
const className = screen.getByRole("link").className;
expect(className).toContain("inset-ring");
expect(className).not.toContain("shadow-md");
});
it("renders icon-only layout with icon when provided", () => { it("renders icon-only layout with icon when provided", () => {
renderWithProviders( renderWithProviders(
<Item bookmark={{ name: "A", href: "http://example.com/x", abbr: "A", icon: "mdi-home" }} iconOnly />, <Item bookmark={{ name: "A", href: "http://example.com/x", abbr: "A", icon: "mdi-home" }} iconOnly />,
+6 -1
View File
@@ -19,6 +19,10 @@ export default function Item({ service, groupName, useEqualHeights }) {
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const showStats = service.showStats === false ? false : settings.showStats; const showStats = service.showStats === false ? false : settings.showStats;
const statusStyle = service.statusStyle !== undefined ? service.statusStyle : settings.statusStyle; const statusStyle = service.statusStyle !== undefined ? service.statusStyle : settings.statusStyle;
const cardStyle =
settings.cardStyle === "hairline"
? "shadow-xs inset-ring inset-ring-black/5 dark:inset-ring-white/5 hover:inset-ring-black/10 dark:hover:inset-ring-white/10"
: "shadow-md shadow-theme-900/10 dark:shadow-theme-900/20";
const [statsOpen, setStatsOpen] = useState(service.showStats); const [statsOpen, setStatsOpen] = useState(service.showStats);
const [statsClosing, setStatsClosing] = useState(false); const [statsClosing, setStatsClosing] = useState(false);
@@ -39,7 +43,8 @@ export default function Item({ service, groupName, useEqualHeights }) {
className={classNames( className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`, settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? "-" : ""}${settings.cardBlur}`,
useEqualHeights && "h-[calc(100%-0.5rem)]", useEqualHeights && "h-[calc(100%-0.5rem)]",
"transition-all mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative overflow-clip service-card", cardStyle,
"transition-all mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative overflow-clip service-card",
)} )}
> >
<div className="flex select-none z-0 service-title"> <div className="flex select-none z-0 service-title">
+16 -2
View File
@@ -4,11 +4,14 @@ import { useContext, useMemo } from "react";
import { BlockHighlightContext } from "./highlight-context"; import { BlockHighlightContext } from "./highlight-context";
import { SettingsContext } from "utils/contexts/settings";
import { evaluateHighlight, getHighlightClass } from "utils/highlights"; import { evaluateHighlight, getHighlightClass } from "utils/highlights";
export default function Block({ value, highlightValue, label, field }) { export default function Block({ value, highlightValue, label, field }) {
const { t } = useTranslation(); const { t } = useTranslation();
const highlightConfig = useContext(BlockHighlightContext); const highlightConfig = useContext(BlockHighlightContext);
const { settings } = useContext(SettingsContext);
const refined = settings?.blockStyle === "refined";
const highlight = useMemo(() => { const highlight = useMemo(() => {
if (!highlightConfig) return null; if (!highlightConfig) return null;
@@ -45,9 +48,20 @@ export default function Block({ value, highlightValue, label, field }) {
data-highlight-level={highlight?.level} data-highlight-level={highlight?.level}
data-highlight-source={highlight?.source} data-highlight-source={highlight?.source}
> >
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
<div <div
className={classNames("font-bold text-xs uppercase", applyToValueOnly && "text-theme-700 dark:text-theme-200")} className={classNames(
refined ? "text-[13px] font-medium tabular-nums" : "font-thin text-sm",
"service-block-value",
)}
>
{value === undefined || value === null ? "-" : value}
</div>
<div
className={classNames(
refined ? "text-[10px] font-semibold uppercase tracking-wider opacity-60" : "font-bold text-xs uppercase",
applyToValueOnly && "text-theme-700 dark:text-theme-200",
"service-block-label",
)}
> >
{t(label)} {t(label)}
</div> </div>
@@ -39,6 +39,24 @@ describe("components/services/widget/block", () => {
expect(el.className).toContain("danger-class"); expect(el.className).toContain("danger-class");
}); });
it("uses the standard block styles by default", () => {
const { container } = renderWithProviders(<Block label="some.label" value="1" />, { settings: {} });
expect(container.querySelector(".service-block-value").className).toContain("font-thin");
expect(container.querySelector(".service-block-label").className).toContain("font-bold");
});
it("applies refined block styles when blockStyle is set", () => {
const { container } = renderWithProviders(<Block label="some.label" value="1" />, {
settings: { blockStyle: "refined" },
});
const value = container.querySelector(".service-block-value");
expect(value.className).toContain("tabular-nums");
expect(value.className).not.toContain("font-thin");
expect(container.querySelector(".service-block-label").className).toContain("tracking-wider");
});
it("prefers highlightValue over the rendered value for numeric highlighting", () => { it("prefers highlightValue over the rendered value for numeric highlighting", () => {
const highlightConfig = { const highlightConfig = {
levels: { warn: "warn-class" }, levels: { warn: "warn-class" },
@@ -0,0 +1,53 @@
import classNames from "classnames";
import { useTranslation } from "next-i18next/pages";
import { TbApi } from "react-icons/tb";
import useSWR from "swr";
import Container from "../widget/container";
import Error from "../widget/error";
import Raw from "../widget/raw";
import WidgetLabel from "../widget/widget_label";
import ResolvedIcon from "components/resolvedicon";
import { formatValue, getValue } from "widgets/customapi/utils";
export default function CustomApi({ options }) {
const { t } = useTranslation();
const { index, icon, label, mappings = [], refreshInterval = 10000 } = options;
const { data, error } = useSWR(`/api/widgets/customapi?${new URLSearchParams({ index }).toString()}`, {
refreshInterval: Math.max(1000, refreshInterval),
});
if (error || (data?.error && !mappings.some((mapping) => mapping.field === "error"))) {
return <Error options={options} />;
}
return (
<Container options={options} additionalClassNames="information-widget-customapi">
<Raw>
<div className="flex flex-row items-center">
<div className="flex-none mr-2">
{icon ? (
<ResolvedIcon icon={icon} width={24} height={24} />
) : (
<TbApi className="w-6 h-6 text-theme-800 dark:text-theme-200" />
)}
</div>
<div className={classNames("flex flex-wrap items-center gap-0.5", !data && "animate-pulse")}>
{mappings.map((mapping) => (
<div key={mapping.label} className="flex flex-col items-center justify-center px-1 text-xs">
<span className="text-theme-800 dark:text-theme-200">{mapping.label}</span>
<span className="text-theme-800/70 dark:text-theme-200/50">
{data ? formatValue(t, mapping, getValue(mapping.field, data)) : "-"}
</span>
</div>
))}
</div>
</div>
{label && <WidgetLabel label={label} />}
</Raw>
</Container>
);
}
@@ -0,0 +1,117 @@
// @vitest-environment jsdom
import { screen } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { renderWithProviders } from "test-utils/render-with-providers";
const { useSWR } = vi.hoisted(() => ({ useSWR: vi.fn() }));
vi.mock("swr", () => ({ default: useSWR }));
vi.mock("components/resolvedicon", () => ({
default: ({ icon }) => <div data-testid="resolved-icon" data-icon={icon} />,
}));
import CustomApi from "./customapi";
const settings = { settings: { target: "_self" } };
describe("components/widgets/customapi", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("shows GitHub repo stats once loaded, with the fallback icon and a label", () => {
const options = {
index: 6,
label: "Homepage",
refreshInterval: 300000,
mappings: [
{ field: "stargazers_count", label: "Stars", format: "number" },
{ field: "open_issues_count", label: "Open", format: "number" },
{ field: "forks_count", label: "Forks", format: "number" },
],
};
useSWR.mockReturnValue({ data: undefined, error: undefined });
const { container, rerender } = renderWithProviders(<CustomApi options={options} />, settings);
expect(useSWR).toHaveBeenCalledWith("/api/widgets/customapi?index=6", { refreshInterval: 300000 });
expect(screen.getAllByText("-")).toHaveLength(3);
expect(screen.queryByTestId("resolved-icon")).toBeNull();
expect(container.querySelector("svg")).not.toBeNull();
useSWR.mockReturnValue({
data: { stargazers_count: 32809, open_issues_count: 1, forks_count: 2127, owner: { login: "gethomepage" } },
error: undefined,
});
rerender(<CustomApi options={options} />);
expect(screen.queryByText("-")).toBeNull();
expect(screen.getByText("Stars").nextSibling).toHaveTextContent("32809");
expect(screen.getByText("Open").nextSibling).toHaveTextContent("1");
expect(screen.getByText("Forks").nextSibling).toHaveTextContent("2127");
expect(screen.getByText("Homepage")).toHaveClass("information-widget-label");
});
it("shows a nested weather value with a configured icon and suffix", () => {
useSWR.mockReturnValue({
data: { current: { time: "2026-09-22T20:15", temperature_2m: 7.8, wind_speed_10m: 12.4 } },
error: undefined,
});
renderWithProviders(
<CustomApi
options={{
index: 7,
icon: "mdi-thermometer",
mappings: [{ field: "current.temperature_2m", label: "Temp", format: "float", suffix: "°C" }],
}}
/>,
settings,
);
expect(useSWR).toHaveBeenCalledWith("/api/widgets/customapi?index=7", { refreshInterval: 10000 });
expect(screen.getByTestId("resolved-icon")).toHaveAttribute("data-icon", "mdi-thermometer");
expect(screen.getByText("7.8 °C")).toBeInTheDocument();
});
it("shows a status API's error field as data when it is mapped", () => {
useSWR.mockReturnValue({ data: { error: "E_NONE", pending: 3 }, error: undefined });
renderWithProviders(
<CustomApi
options={{
index: 0,
mappings: [
{ field: "error", label: "Status", remap: [{ value: "E_NONE", to: "OK" }] },
{ field: "pending", label: "Queue", format: "number" },
],
}}
/>,
settings,
);
expect(screen.queryByText("widget.api_error")).toBeNull();
expect(screen.getByText("OK")).toBeInTheDocument();
expect(screen.getByText("3")).toBeInTheDocument();
});
it("shows the error state when the upstream API fails, clamping a too-fast refresh", () => {
useSWR.mockReturnValue({
data: { error: { message: "HTTP Error", url: "api.github.com (see logs for details)" } },
error: undefined,
});
renderWithProviders(
<CustomApi
options={{ index: 6, refreshInterval: 500, mappings: [{ field: "stargazers_count", label: "Stars" }] }}
/>,
settings,
);
expect(useSWR).toHaveBeenCalledWith("/api/widgets/customapi?index=6", { refreshInterval: 1000 });
expect(screen.getByText("widget.api_error")).toBeInTheDocument();
expect(screen.queryByText("Stars")).toBeNull();
});
});
+1
View File
@@ -16,6 +16,7 @@ const widgetMappings = {
longhorn: dynamic(() => import("components/widgets/longhorn/longhorn")), longhorn: dynamic(() => import("components/widgets/longhorn/longhorn")),
kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")), kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")),
stocks: dynamic(() => import("components/widgets/stocks/stocks")), stocks: dynamic(() => import("components/widgets/stocks/stocks")),
customapi: dynamic(() => import("components/widgets/customapi/customapi")),
}; };
export default function Widget({ widget, style }) { export default function Widget({ widget, style }) {
+2 -2
View File
@@ -25,12 +25,12 @@ export default function Resource({
}`} }`}
> >
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between gap-2"> <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between gap-2">
<div className="pl-0.5">{value}</div> <div className="pl-0.5 resource-value">{value}</div>
<div className="pr-1">{label}</div> <div className="pr-1">{label}</div>
</div> </div>
{expanded && ( {expanded && (
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between gap-2"> <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between gap-2">
<div className="pl-0.5">{expandedValue}</div> <div className="pl-0.5 resource-value">{expandedValue}</div>
<div className="pr-1">{expandedLabel}</div> <div className="pr-1">{expandedLabel}</div>
</div> </div>
)} )}
+1
View File
@@ -3,6 +3,7 @@ import { appWithTranslation } from "next-i18next/pages";
import Head from "next/head"; import Head from "next/head";
import "styles/globals.css"; import "styles/globals.css";
import "styles/manrope.css"; import "styles/manrope.css";
import "styles/plex-mono.css";
import "styles/theme.css"; import "styles/theme.css";
import { SWRConfig } from "swr"; import { SWRConfig } from "swr";
+46
View File
@@ -0,0 +1,46 @@
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
import createLogger from "utils/logger";
import { sanitizeErrorURL } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
const logger = createLogger("customapi");
export default async function handler(req, res) {
const { index } = req.query;
const options = await getPrivateWidgetOptions("customapi", index);
if (!options?.url) {
return res.status(400).json({ error: "Missing Custom API URL" });
}
let url;
try {
url = new URL(options.url);
} catch {
return res.status(400).json({ error: "Invalid Custom API URL" });
}
const headers = { "User-Agent": "homepage", Accept: "application/json", ...(options.headers ?? {}) };
if (options.username && options.password) {
headers.Authorization = `Basic ${Buffer.from(`${options.username}:${options.password}`).toString("base64")}`;
}
const params = { method: options.method ?? "GET", headers };
if (options.requestBody) {
params.body = typeof options.requestBody === "object" ? JSON.stringify(options.requestBody) : options.requestBody;
}
const [status, , data] = await httpProxy(url, params);
if (status >= 400) {
logger.debug("HTTP Error %d calling %s//%s%s", status, url.protocol, url.host, url.pathname);
return res.status(status).json({ error: { message: "HTTP Error", url: sanitizeErrorURL(url) } });
}
try {
return res.status(status).json(JSON.parse(Buffer.from(data).toString()));
} catch {
return res.status(500).json({ error: { message: "Invalid JSON", url: sanitizeErrorURL(url) } });
}
}
+4 -2
View File
@@ -552,7 +552,9 @@ export default function Wrapper({ initialSettings, fallback }) {
const html = document.documentElement; const html = document.documentElement;
const body = document.body; const body = document.body;
html.classList.remove("dark", "scheme-dark", "scheme-light"); html.classList.remove("dark", "scheme-dark", "scheme-light", "font-plex", "font-plex-data");
if (initialSettings.font === "plex") html.classList.add("font-plex");
if (initialSettings.font === "plexData") html.classList.add("font-plex-data");
html.classList.toggle("dark", theme === "dark"); html.classList.toggle("dark", theme === "dark");
html.classList.add(theme === "dark" ? "scheme-dark" : "scheme-light"); html.classList.add(theme === "dark" ? "scheme-dark" : "scheme-light");
@@ -571,7 +573,7 @@ export default function Wrapper({ initialSettings, fallback }) {
body.style.backgroundImage = ""; body.style.backgroundImage = "";
body.style.backgroundColor = ""; body.style.backgroundColor = "";
body.style.backgroundAttachment = ""; body.style.backgroundAttachment = "";
}, [backgroundImage, opacity, theme, color, initialSettings.color]); }, [backgroundImage, opacity, theme, color, initialSettings.color, initialSettings.font]);
return ( return (
<> <>
Binary file not shown.
+93
View File
@@ -0,0 +1,93 @@
Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+56
View File
@@ -0,0 +1,56 @@
@font-face {
font-family: "IBM Plex Mono";
font-weight: 400;
font-style: normal;
src:
local("IBM Plex Mono"),
url("./font/IBMPlexMono-Regular.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "IBM Plex Mono";
font-weight: 500;
font-style: normal;
src:
local("IBM Plex Mono Medium"),
url("./font/IBMPlexMono-Medium.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "IBM Plex Mono";
font-weight: 600;
font-style: normal;
src:
local("IBM Plex Mono SemiBold"),
url("./font/IBMPlexMono-SemiBold.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "IBM Plex Mono";
font-weight: 700;
font-style: normal;
src:
local("IBM Plex Mono Bold"),
url("./font/IBMPlexMono-Bold.woff2") format("woff2");
font-display: swap;
}
/* font-size-adjust keeps mono from reading larger than Manrope at the same size */
.font-plex,
.font-plex body {
font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
font-size-adjust: 0.5;
letter-spacing: -0.01em;
}
.font-plex-data .service-block-value,
.font-plex-data .service-tags,
.font-plex-data .tabular-nums,
.font-plex-data .information-widget-resource .resource-value,
.font-plex-data .service-container {
font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
font-size-adjust: 0.5;
}
+3 -1
View File
@@ -9,5 +9,7 @@ export function renderWithProviders(ui, { settings = {} } = {}) {
setSettings: () => {}, setSettings: () => {},
}; };
return render(<SettingsContext.Provider value={value}>{ui}</SettingsContext.Provider>); const wrapper = ({ children }) => <SettingsContext.Provider value={value}>{children}</SettingsContext.Provider>;
return render(ui, { wrapper });
} }
+2 -2
View File
@@ -69,11 +69,11 @@ export function substituteEnvironmentVars(str) {
const cachedVars = getCachedEnvironmentVars(); const cachedVars = getCachedEnvironmentVars();
cachedVars.forEach(([key, value]) => { cachedVars.forEach(([key, value]) => {
if (key.startsWith(homepageVarPrefix)) { if (key.startsWith(homepageVarPrefix)) {
result = result.replaceAll(`{{${key}}}`, value); result = result.replaceAll(`{{${key}}}`, () => value);
} else if (key.startsWith(homepageFilePrefix)) { } else if (key.startsWith(homepageFilePrefix)) {
const filename = value; const filename = value;
const fileContents = readFileSync(filename, "utf8"); const fileContents = readFileSync(filename, "utf8");
result = result.replaceAll(`{{${key}}}`, fileContents); result = result.replaceAll(`{{${key}}}`, () => fileContents);
} }
}); });
} }
+34 -1
View File
@@ -1,4 +1,4 @@
import { mkdtempSync, writeFileSync } from "node:fs"; import { mkdtempSync, rmdirSync, unlinkSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import path from "node:path"; import path from "node:path";
@@ -37,6 +37,39 @@ describe("utils/config/config", () => {
expect(mod.substituteEnvironmentVars("token={{HOMEPAGE_FILE_SECRET}}")).toBe("token=secret"); expect(mod.substituteEnvironmentVars("token={{HOMEPAGE_FILE_SECRET}}")).toBe("token=secret");
}); });
it.each(["pa$$word", "pa$&word", "pa$`word", "pa$'word", "pa$1word"])(
"substituteEnvironmentVars preserves literal environment value %j in every occurrence",
async (secret) => {
process.env.HOMEPAGE_VAR_SECRET = secret;
const mod = await import("./config");
expect(
mod.substituteEnvironmentVars("before {{HOMEPAGE_VAR_SECRET}} between {{HOMEPAGE_VAR_SECRET}} after"),
).toBe(`before ${secret} between ${secret} after`);
},
);
it.each(["pa$$word", "pa$&word", "pa$`word", "pa$'word", "pa$1word"])(
"substituteEnvironmentVars preserves literal secret file contents %j in every occurrence",
async (secret) => {
const dir = mkdtempSync(path.join(tmpdir(), "homepage-config-test-"));
const secretPath = path.join(dir, "secret.txt");
writeFileSync(secretPath, secret, "utf8");
try {
process.env.HOMEPAGE_FILE_SECRET = secretPath;
const mod = await import("./config");
expect(
mod.substituteEnvironmentVars("before {{HOMEPAGE_FILE_SECRET}} between {{HOMEPAGE_FILE_SECRET}} after"),
).toBe(`before ${secret} between ${secret} after`);
} finally {
unlinkSync(secretPath);
rmdirSync(dir);
}
},
);
it("getSettings reads from HOMEPAGE_CONFIG_DIR and converts layout list to an object", async () => { it("getSettings reads from HOMEPAGE_CONFIG_DIR and converts layout list to an object", async () => {
const dir = mkdtempSync(path.join(tmpdir(), "homepage-settings-test-")); const dir = mkdtempSync(path.join(tmpdir(), "homepage-settings-test-"));
process.env.HOMEPAGE_CONFIG_DIR = dir; process.env.HOMEPAGE_CONFIG_DIR = dir;
+13
View File
@@ -353,6 +353,9 @@ export function cleanServiceGroups(groups) {
expandOneStreamToTwoRows, expandOneStreamToTwoRows,
showEpisodeNumber, showEpisodeNumber,
// feed
layout,
// frigate // frigate
enableRecentEvents, enableRecentEvents,
@@ -430,6 +433,9 @@ export function cleanServiceGroups(groups) {
// proxmoxbackupserver // proxmoxbackupserver
datastore, datastore,
// qui
instance,
// speedtest // speedtest
bitratePrecision, bitratePrecision,
@@ -540,6 +546,9 @@ export function cleanServiceGroups(groups) {
if (type === "portainer") { if (type === "portainer") {
if (kubernetes) widget.kubernetes = !!JSON.parse(kubernetes); if (kubernetes) widget.kubernetes = !!JSON.parse(kubernetes);
} }
if (type === "qui") {
if (instance !== undefined) widget.instance = instance;
}
if (type === "proxmox") { if (type === "proxmox") {
if (node) widget.node = node; if (node) widget.node = node;
} }
@@ -610,6 +619,7 @@ export function cleanServiceGroups(groups) {
[ [
"authentik", "authentik",
"beszel", "beszel",
"fileflows",
"glances", "glances",
"immich", "immich",
"jellyfin", "jellyfin",
@@ -675,6 +685,9 @@ export function cleanServiceGroups(groups) {
if (showTime) widget.showTime = showTime; if (showTime) widget.showTime = showTime;
if (timezone) widget.timezone = timezone; if (timezone) widget.timezone = timezone;
} }
if (type === "feed") {
if (layout) widget.layout = layout;
}
if (type === "dockhand") { if (type === "dockhand") {
if (environment) widget.environment = environment; if (environment) widget.environment = environment;
} }
+34
View File
@@ -403,6 +403,7 @@ describe("utils/config/service-helpers", () => {
{ type: "radarr", enableQueue: "true" }, { type: "radarr", enableQueue: "true" },
{ type: "truenas", enablePools: "true", nasType: "scale" }, { type: "truenas", enablePools: "true", nasType: "scale" },
{ type: "qnap", volume: "vol1" }, { type: "qnap", volume: "vol1" },
{ type: "qui", instance: 2 },
{ type: "dispatcharr", enableActiveStreams: "true" }, { type: "dispatcharr", enableActiveStreams: "true" },
{ type: "gamedig", gameToken: "t" }, { type: "gamedig", gameToken: "t" },
{ type: "kopia", snapshotHost: "h", snapshotPath: "/p" }, { type: "kopia", snapshotHost: "h", snapshotPath: "/p" },
@@ -468,6 +469,7 @@ describe("utils/config/service-helpers", () => {
expect.objectContaining({ namespace: "default", app: "app", podSelector: "app=test" }), expect.objectContaining({ namespace: "default", app: "app", podSelector: "app=test" }),
); );
expect(widgets.find((w) => w.type === "qnap")).toEqual(expect.objectContaining({ volume: "vol1" })); expect(widgets.find((w) => w.type === "qnap")).toEqual(expect.objectContaining({ volume: "vol1" }));
expect(widgets.find((w) => w.type === "qui")).toEqual(expect.objectContaining({ instance: 2 }));
expect(widgets.find((w) => w.type === "speedtest")).toEqual( expect(widgets.find((w) => w.type === "speedtest")).toEqual(
expect.objectContaining({ bitratePrecision: 3, version: 1 }), expect.objectContaining({ bitratePrecision: 3, version: 1 }),
); );
@@ -524,6 +526,38 @@ describe("utils/config/service-helpers", () => {
]); ]);
}); });
it("cleanServiceGroups keeps feed layout and drops server-side options", async () => {
const mod = await import("./service-helpers");
const { cleanServiceGroups } = mod;
const rawGroups = [
{
name: "Core",
services: [
{
name: "News",
widgets: [
{
type: "feed",
url: "https://example.com/feed.xml?token=secret",
maxItems: 3,
images: false,
layout: "grid",
},
],
},
],
groups: [],
},
];
const feedWidget = cleanServiceGroups(rawGroups)[0].services[0].widgets[0];
expect(feedWidget).toEqual(expect.objectContaining({ type: "feed", layout: "grid" }));
expect(feedWidget).not.toHaveProperty("url");
expect(feedWidget).not.toHaveProperty("maxItems");
expect(feedWidget).not.toHaveProperty("images");
});
it("findGroupByName deep-searches and annotates parent", async () => { it("findGroupByName deep-searches and annotates parent", async () => {
const mod = await import("./service-helpers"); const mod = await import("./service-helpers");
const { findGroupByName } = mod; const { findGroupByName } = mod;

Some files were not shown because too many files have changed in this diff Show More