Compare commits

..

80 Commits

Author SHA1 Message Date
Crowdin Bot
ce710901b3 New Crowdin translations by GitHub Action
Some checks are pending
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-03-31 12:31:33 +00:00
shamoon
463bb4e306 Chore: move lint checks to separate workflow (#6481)
Some checks are pending
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-03-29 13:18:45 -07:00
shamoon
4c3c4805c8 Security: pin GitHub Actions to specific SHAs (#6480) 2026-03-29 13:04:10 -07:00
Alex
a81ac47be9 Fix: fix compatibility with flood changes (#6477) 2026-03-29 13:48:43 +00:00
dependabot[bot]
36b909d4a4 Chore(deps): Bump brace-expansion from 1.1.12 to 1.1.13 in the npm_and_yarn group across 1 directory (#6478)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-29 06:15:45 -07:00
github-actions[bot]
7b552f5080 New Crowdin translations by GitHub Action (#6433)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-03-27 15:16:31 -07:00
Steven Harris
0f767d14bb Feature: UniFi Drive (UNAS) service widget (#6461)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-03-27 15:10:18 -07:00
shamoon
ff4eaa2cd9 Chore: make unifi proxy more generic (#6469) 2026-03-27 14:39:27 -07:00
Adam
b37645b8d0 Documentation: fix kubernetes config examples (#6468) 2026-03-27 14:17:54 -07:00
shamoon
45af25d6ce Fix: revert changes to qbittorrent widget endpoints (#6467) 2026-03-27 08:05:31 -07:00
dependabot[bot]
ea9fca02d3 Chore(deps): Bump picomatch from 2.3.1 to 2.3.2 in the npm_and_yarn group across 1 directory (#6460)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-26 04:09:24 +00:00
shamoon
3fb2dcbc47 Chore: return to gh runners (#6462) 2026-03-25 21:01:55 -07:00
Zhenzhong Tang
96e3c7ac45 Fix: remove trailing space from Watchtower widget loading label (#6448) 2026-03-19 23:54:52 -07:00
dependabot[bot]
f261879fcb Chore(deps): Bump the npm_and_yarn group across 1 directory with 5 updates (#6445)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-19 00:00:36 +00:00
dependabot[bot]
495065a6fa Chore(deps-dev): Bump eslint-plugin-prettier from 5.5.4 to 5.5.5 (#6442)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 23:50:19 +00:00
dependabot[bot]
d18bdb011a Chore(deps): Bump urbackup-server-api from 0.91.0 to 0.92.2 (#6444)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 23:36:36 +00:00
dependabot[bot]
2b65a0df04 Chore(deps): Bump react-icons from 5.5.0 to 5.6.0 (#6443)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 23:27:16 +00:00
shamoon
311f232686 Add translation category and Crowdin PR label 2026-03-18 12:28:27 -07:00
dependabot[bot]
9893c5e846 Chore(deps): Bump swr from 2.4.0 to 2.4.1 (#6441)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 12:14:16 -07:00
dependabot[bot]
f70dcd6a03 Chore(deps): Bump flatted from 3.3.3 to 3.4.2 in the npm_and_yarn group across 1 directory (#6439)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 19:06:57 +00:00
shamoon
657dc917b4 Relax Dependabot schedule and add cooldowns 2026-03-18 11:58:01 -07:00
shamoon
de0c8558fb Add webpack exclude to dynamic import 2026-03-18 11:54:54 -07:00
shamoon
daa1c27d9b Bump Node.js version in docker-publish workflow 2026-03-18 11:48:38 -07:00
shamoon
6e850bfed8 Use webpack flag in Next build script 2026-03-18 11:44:25 -07:00
dependabot[bot]
02309211ac Chore(deps): Bump next from 15.5.11 to 16.1.7 in the npm_and_yarn group across 1 directory (#6438)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 18:35:42 +00:00
shamoon
3d1be51ed4 Add pnpm install preLaunchTask and task 2026-03-18 10:33:56 -07:00
dependabot[bot]
75b01bec9a Chore(deps): Bump pnpm/action-setup from 4 to 5 (#6436)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-17 09:45:05 -07:00
shamoon
fadb03ad27 Enhancement: better support for raw values in block highlighting (#6434) 2026-03-17 09:12:01 -07:00
shamoon
6bdea294c1 Try this fix for release-drafter again 2026-03-17 09:10:42 -07:00
dependabot[bot]
11de525fc0 Chore(deps): Bump release-drafter/release-drafter from 6 to 7 (#6429)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-16 16:04:14 -07:00
shamoon
ca67ba2e49 Tweak: sanitize calendar integration URLs from markup (#6431) 2026-03-16 16:02:50 -07:00
shamoon
c069cb3333 Maybe fix release drafter 2026-03-16 16:00:54 -07:00
github-actions[bot]
34be817eb2 New Crowdin translations by GitHub Action (#6292)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-03-15 00:29:37 -07:00
shamoon
0598a27d60 Update release-drafter.yml 2026-03-14 21:49:02 -07:00
shamoon
be5ef3448e Chore: add release drafter (#6424) 2026-03-14 21:45:25 -07:00
shamoon
f7c12ad642 Enhancement: better Crowdsec auth parsing, caching, and retries (#6419) 2026-03-13 21:58:24 -07:00
shamoon
a6639b04b9 Fix troubleshooting link in support.yml 2026-03-09 10:02:06 -07:00
shamoon
597059045f Change: use byterate for beszel network field (#6402) 2026-03-06 23:20:38 -08:00
dependabot[bot]
b676424d98 Chore(deps): Bump docker/build-push-action from 6 to 7 (#6397)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 17:51:11 +00:00
dependabot[bot]
e87b62f3ac Chore(deps): Bump docker/setup-buildx-action from 3 to 4 (#6398)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 17:38:26 +00:00
dependabot[bot]
776f190aed Chore(deps): Bump docker/metadata-action from 5 to 6 (#6399)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 09:27:07 -08:00
dependabot[bot]
71a524da89 Chore(deps): Bump docker/setup-qemu-action from 3.7.0 to 4.0.0 (#6386)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 14:38:16 +00:00
dependabot[bot]
9dea3a4d4f Chore(deps): Bump react and react-dom (#6380)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-03-04 21:47:32 +00:00
dependabot[bot]
adc042fa8a Chore(deps): Bump next-i18next from 12.1.0 to 15.4.3 (#6376)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-04 13:12:08 -08:00
dependabot[bot]
f16878bca9 Chore(deps): Bump docker/login-action from 3 to 4 (#6385)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-04 13:10:07 -08:00
shamoon
01b951f3ba Create pr-quality.yml 2026-03-04 13:03:25 -08:00
dependabot[bot]
94122ba078 Chore(deps): Bump ical.js from 2.1.0 to 2.2.1 (#6377)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-04 20:54:24 +00:00
dependabot[bot]
fb88da5a5a Chore(deps-dev): Bump jsdom from 26.1.0 to 28.1.0 (#6378)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-04 12:36:09 -08:00
dependabot[bot]
de7e730283 Chore(deps-dev): Bump prettier from 3.7.3 to 3.8.1 (#6379)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-04 19:59:25 +00:00
shamoon
b5b502b433 Enhancement: use lighter endpoints for qbittorrent (#6388) 2026-03-04 11:40:20 -08:00
Hugo CAMPION
db9b2d0245 Chore: add security context, liveness probe and config mount to k8s deployment example (#6375)
Signed-off-by: CAMPION Hugo <h.campion@geco-it.fr>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-03-02 16:22:28 -08:00
shamoon
51d718a21a Fix: small fixes for Omada proxy (#6372) 2026-02-28 11:36:43 -08:00
shamoon
29e2502d74 Fix: Await async proxy handlers (#6371) 2026-02-28 11:22:54 -08:00
shamoon
d529f81cb4 Enhancement: fallback for missing si network stats (#6367) 2026-02-27 10:39:02 -08:00
Erkan
1645c1b8a1 Documentation: clarify array value quoting in Docker label mapping syntax (#6356)
Co-authored-by: shamoon <shamoon@users.noreply.github.com>
2026-02-23 22:16:22 +00:00
shamoon
614a87d768 DRY 2026-02-20 20:25:34 -08:00
shamoon
862c5d9f38 Add missing tracearr to docs 2026-02-20 20:21:27 -08:00
shamoon
d3374dc461 Feature: sparkyfitness service widget (#6346) 2026-02-20 20:20:59 -08:00
shamoon
795e2505ca Fix links in CONTRIBUTING.md for development guidelines 2026-02-20 09:54:23 -08:00
shamoon
cb8421df0b feature request template search reminder 2026-02-16 14:38:34 -08:00
shamoon
152888d611 Enhancement: cover more basic statuses in containers list (#6334) 2026-02-16 08:43:06 -08:00
shamoon
ea527e4fb1 Enhancement: add "Temperature" label to list of possible CPU sensors (#6331) 2026-02-16 00:09:14 -08:00
shamoon
09bab7637e Chore: merge Overseerr into Seerr, add aliases (#6330) 2026-02-15 19:12:15 -08:00
shamoon
597f6ecf16 Enhancement: jellyseer completed (#6329) 2026-02-15 18:44:03 -08:00
shamoon
fe0b214334 Chore: rename Jellyseerr widget to Seerr and update references (#6322) 2026-02-14 16:11:00 -08:00
shamoon
cdc96438cd Adjust process list vertical offset 2026-02-14 07:14:14 -08:00
shamoon
ca7dfb56c8 Improvement: better handle highlighting with units (#6318) 2026-02-13 10:00:46 -08:00
shamoon
95852d23c2 Lower Codecov coverage thresholds 2026-02-09 19:36:33 -08:00
Bothari
84231a1754 Feature: add Tracearr widget for displaying active Plex streams (#6306)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-02-10 03:35:54 +00:00
Matt Popovich
f4f54cea60 Documentation: clarify jellyfin api key location, add ports (#6298)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2026-02-07 09:38:17 +00:00
shamoon
06595ef107 Revise PR template checklist for clarity and links 2026-02-06 07:53:26 -08:00
dependabot[bot]
91b9aa479a Chore(deps): Bump actions/setup-node from 4 to 6 (#6285)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-05 13:48:18 -08:00
dependabot[bot]
08cde2f597 Chore(deps): Bump actions/checkout from 4 to 6 (#6284)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-05 13:40:57 -08:00
shamoon
0ce175cda5 Bump version to 1.10.1 2026-02-05 07:02:59 -08:00
shamoon
7f1de58e71 Fix: safely stringify replacement values 2026-02-05 07:02:07 -08:00
shamoon
f729290e96 Enhancement: better display of Arcane widget errors (#6281) 2026-02-05 00:33:38 -08:00
shamoon
4974cd96b6 Chore: move to Zensical docs (#6279) 2026-02-04 23:05:11 -08:00
shamoon
4450a6e1d0 Merge branch 'main' into dev 2026-02-04 22:12:16 -08:00
shamoon
ac11efc5c7 Fix eslint warnings in test 2026-02-04 22:06:33 -08:00
shamoon
3c005d239e Add Codecov badge to README 2026-02-04 22:03:08 -08:00
290 changed files with 5612 additions and 3345 deletions

View File

@@ -9,11 +9,11 @@ coverage:
project:
default:
target: 100%
threshold: 25%
threshold: 15%
patch:
default:
target: 100%
threshold: 25%
threshold: 10%
comment:
layout: "reach,diff,flags,files"

View File

@@ -1,6 +1,10 @@
title: "[Feature Request] "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
#### ⚠️ Don't forget to search [existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) and [discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions) (including closed ones!).
- type: textarea
id: description
attributes:

View File

@@ -51,7 +51,7 @@ body:
id: troubleshooting
attributes:
label: Troubleshooting
description: Please include output from your [troubleshooting steps](https://gethomepage.dev/more/troubleshooting/#service-widget-errors), if relevant.
description: Please include output from your [troubleshooting steps](https://gethomepage.dev/troubleshooting/#service-widget-errors), if relevant.
validations:
required: true
- type: markdown

View File

@@ -35,8 +35,8 @@ What type of change does your PR introduce to Homepage?
## Checklist:
- [ ] If applicable, I have added corresponding documentation changes.
- [ ] If applicable, I have added or updated tests for new features and bug fixes.
- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting).
- [ ] If applicable, I have added or updated tests for new features and bug fixes (see [testing](https://gethomepage.dev/widgets/authoring/getting-started/#testing)).
- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/widgets/authoring/getting-started/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/widgets/authoring/getting-started/#service-widget-guidelines).
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/widgets/authoring/getting-started/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/widgets/authoring/getting-started/#code-linting).
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
- [ ] In the description above I have disclosed the use of AI tools in the coding of this PR.

View File

@@ -8,8 +8,12 @@ updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
interval: "weekly"
cooldown:
default-days: 7
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "monthly"
cooldown:
default-days: 7

87
.github/release-drafter.yml vendored Normal file
View File

@@ -0,0 +1,87 @@
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
change-title-escapes: '\\<*_&'
version-resolver:
major:
labels:
- 'major'
- 'breaking-change'
minor:
labels:
- 'enhancement'
- 'feature'
patch:
labels:
- 'bug'
- 'fix'
- 'dependencies'
- 'translation'
- 'documentation'
default: patch
categories:
- title: '⚠️ Breaking Changes'
labels:
- 'major'
- 'breaking-change'
- title: '🚀 Features'
labels:
- 'enhancement'
- 'feature'
- title: '🐛 Fixes'
labels:
- 'bug'
- 'fix'
- title: '🧰 Maintenance'
labels:
- 'dependencies'
- 'ci'
- 'chore'
- title: '🌐 Translations'
labels:
- 'translation'
- title: '📚 Documentation'
labels:
- 'documentation'
autolabeler:
- label: 'documentation'
files:
- 'docs/**'
- '*.md'
- '.github/**/*.md'
- label: 'ci'
files:
- '.github/workflows/**'
- label: 'dependencies'
files:
- 'package.json'
- 'pnpm-lock.yaml'
- 'pyproject.toml'
- 'uv.lock'
- label: 'feature'
files:
- 'src/components/**'
- 'src/widgets/**'
- 'src/pages/**'
- 'src/utils/**'
- label: 'chore'
files:
- 'Dockerfile*'
- 'docker-entrypoint.sh'
- 'k3d/**'
- label: 'translation'
files:
- 'public/locales/**'
template: |
## What's Changed
$CHANGES

View File

@@ -17,14 +17,15 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: crowdin action
uses: crowdin/github-action@v2
uses: crowdin/github-action@7ca9c452bfe9197d3bb7fa83a4d7e2b0c9ae835d # v2
with:
upload_translations: false
download_translations: true
crowdin_branch_name: dev
localization_branch_name: l10n_dev
pull_request_labels: translation
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}

View File

@@ -17,44 +17,12 @@ env:
IMAGE_NAME: ${{ github.repository }}
jobs:
pre-commit:
name: Linting Checks
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Check files
uses: pre-commit/action@v3.0.1
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Lint frontend
run: pnpm run lint
build:
name: Docker Build & Push
if: github.repository == 'gethomepage/homepage'
runs-on: self-hosted
needs: [ pre-commit ]
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write
@@ -62,11 +30,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
with:
images: |
${{ env.IMAGE_NAME }}
@@ -84,7 +52,7 @@ jobs:
latest=auto
- name: Next.js build cache
uses: actions/cache@v5
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5
with:
path: .next/cache
key: nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('**/*.js', '**/*.jsx') }}
@@ -92,15 +60,15 @@ jobs:
nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@a8198c4bff370c8506180b035930dea56dbd5288 # v5
with:
version: 10
run_install: false
- name: Setup Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: 20
node-version: 24
cache: 'pnpm'
- name: Install dependencies
@@ -115,7 +83,7 @@ jobs:
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -123,20 +91,20 @@ jobs:
- name: Login to Docker Hub
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Setup QEMU
uses: docker/setup-qemu-action@v3.7.0
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7
with:
context: .
push: ${{ github.event_name != 'pull_request' }}

View File

@@ -9,70 +9,46 @@ on:
workflow_dispatch:
permissions:
contents: write
contents: read
pages: write
id-token: write
jobs:
pre-commit:
name: Linting Checks
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Install python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Check files
uses: pre-commit/action@v3.0.1
test:
name: Test Build Docs
if: github.repository == 'gethomepage/homepage' && github.event_name == 'pull_request'
runs-on: ubuntu-latest
needs:
- pre-commit
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: 3.x
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- uses: actions/cache@v5
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
python-version-file: ".python-version"
- name: Install uv
uses: astral-sh/setup-uv@94527f2e458b27549849d47d273a16bec83a01e9 # v7
- run: sudo apt-get install pngquant
- run: pip install mkdocs-material mkdocs-redirects "mkdocs-material[imaging]"
- name: Test Docs Build
run: MKINSIDERS=false mkdocs build
run: uv run --frozen zensical build --clean
deploy:
name: Build & Deploy Docs
if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs:
- pre-commit
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v6
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v6
- uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: 3.x
- run: echo "cache_id=${{github.sha}}" >> $GITHUB_ENV
- uses: actions/cache@v5
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
python-version-file: ".python-version"
- name: Install uv
uses: astral-sh/setup-uv@94527f2e458b27549849d47d273a16bec83a01e9 # v7
- run: sudo apt-get install pngquant
- run: pip install git+https://${GH_TOKEN}@github.com/benphelps/mkdocs-material-insiders.git
- run: pip install mkdocs-redirects "mkdocs-material[imaging]"
- name: Docs Deploy
run: MKINSIDERS=true mkdocs gh-deploy --force
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Build Docs
run: uv run --frozen zensical build --clean
- uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4
with:
path: site
- uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
id: deployment

41
.github/workflows/lint.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Lint
on:
pull_request:
push:
workflow_dispatch:
merge_group:
jobs:
lint:
name: Linting Checks
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Install python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: 3.x
- name: Check files
uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
- name: Install pnpm
uses: pnpm/action-setup@a8198c4bff370c8506180b035930dea56dbd5288 # v5
with:
version: 10
run_install: false
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: 24
cache: 'pnpm'
- name: Install dependencies
run: pnpm install
- name: Lint frontend
run: pnpm run lint

18
.github/workflows/pr-quality.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: PR Quality
permissions:
contents: read
issues: read
pull-requests: write
on:
pull_request_target:
types: [opened, reopened]
jobs:
anti-slop:
runs-on: ubuntu-latest
steps:
- uses: peakoss/anti-slop@a5a4b2440c9de6f65b64f0718a0136a1fdb04f6f # v0
with:
max-failures: 4

View File

@@ -15,4 +15,4 @@ jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/reaction-comments@v4
- uses: dessant/reaction-comments@e86d247c12bd5c043eec379a1a4453f20cadf913 # v4

54
.github/workflows/release-drafter.yml vendored Normal file
View File

@@ -0,0 +1,54 @@
name: Release Drafter
on:
push:
branches:
- dev
pull_request_target:
types: [opened, reopened, synchronize]
workflow_dispatch:
inputs:
version:
description: "Optional explicit version override (for example: 2.0.0)"
required: false
type: string
permissions:
contents: read
jobs:
update_release_draft:
name: Update Release Draft
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
permissions:
contents: write
pull-requests: read
runs-on: ubuntu-latest
steps:
- if: github.event_name == 'workflow_dispatch' && github.event.inputs.version != ''
uses: release-drafter/release-drafter@a6acf82562eee06318b77ab8cb0b11ed81c677a7 # v7
with:
config-name: release-drafter.yml
version: ${{ github.event.inputs.version }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- if: github.event_name != 'workflow_dispatch' || github.event.inputs.version == ''
uses: release-drafter/release-drafter@a6acf82562eee06318b77ab8cb0b11ed81c677a7 # v7
with:
config-name: release-drafter.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
auto_label:
name: Auto Label PR
if: github.event_name == 'pull_request_target'
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter/autolabeler@ebb69bb56f1b0ebd19897745035726b19bef973e
with:
config-name: release-drafter.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -18,7 +18,7 @@ jobs:
name: 'Stale'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v10
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10
with:
days-before-stale: 7
days-before-close: 14
@@ -32,7 +32,7 @@ jobs:
name: 'Lock Old Threads'
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v6
- uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6
with:
issue-inactive-days: '30'
pr-inactive-days: '30'
@@ -57,7 +57,7 @@ jobs:
name: 'Close Answered Discussions'
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
function sleep(ms) {
@@ -113,7 +113,7 @@ jobs:
name: 'Close Outdated Discussions'
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
function sleep(ms) {
@@ -204,7 +204,7 @@ jobs:
name: 'Close Unsupported Feature Requests'
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v8
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
function sleep(ms) {

View File

@@ -13,13 +13,13 @@ jobs:
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@a8198c4bff370c8506180b035930dea56dbd5288 # v5
with:
version: 9
- uses: actions/setup-node@v4
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version: 20
cache: pnpm
@@ -28,7 +28,7 @@ jobs:
# Run Vitest directly so `--shard` is parsed as an option
- run: pnpm -s exec vitest run --coverage --shard ${{ matrix.shard }}/4 --pool forks
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/lcov.info

2
.gitignore vendored
View File

@@ -46,7 +46,7 @@ next-env.d.ts
# IDEs
/.idea/
# MkDocs documentation
# Zensical documentation
site*/
.cache/

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.13

1
.vscode/launch.json vendored
View File

@@ -3,6 +3,7 @@
{
"name": "Debug homepage",
"type": "node",
"preLaunchTask": "pnpm install",
"request": "launch",
"runtimeExecutable": "pnpm",
"runtimeArgs": ["run", "dev"],

21
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,21 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "pnpm install",
"command": "pnpm install",
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"clear": true,
"panel": "shared",
"showReuseMessage": false
},
"problemMatcher": []
}
]
}

View File

@@ -38,11 +38,11 @@ People _love_ thorough bug reports. I'm not even kidding.
## Development Guidelines
Please see the [documentation regarding development](https://gethomepage.dev/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/more/development/#service-widget-guidelines) if you are considering making one.
Please see the [documentation regarding development](https://gethomepage.dev/widgets/authoring/getting-started/#development) and specifically the [guidelines for new service widgets](https://gethomepage.dev/widgets/authoring/getting-started/#service-widget-guidelines) if you are considering making one.
## Use a Consistent Coding Style
Please see information in the docs regarding [code formatting with pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks).
Please see information in the docs regarding [code formatting with pre-commit hooks](https://gethomepage.dev/widgets/authoring/getting-started/#code-formatting-with-pre-commit-hooks).
## License

View File

@@ -16,6 +16,8 @@
<p align="center">
<a href="https://github.com/gethomepage/homepage/actions/workflows/docker-publish.yml"><img alt="GitHub Workflow Status (with event)" src="https://img.shields.io/github/actions/workflow/status/gethomepage/homepage/docker-publish.yml"></a>
&nbsp;
<a href="https://codecov.io/gh/gethomepage/homepage"><img src="https://codecov.io/gh/gethomepage/homepage/graph/badge.svg?token=7SKFL4D9K7"/></a>
&nbsp;
<a href="https://crowdin.com/project/gethomepage" target="_blank"><img src="https://badges.crowdin.net/gethomepage/localized.svg"></a>
&nbsp;
<a href="https://discord.gg/k4ruYNrudu"><img alt="Discord" src="https://img.shields.io/discord/1019316731635834932"></a>
@@ -25,13 +27,6 @@
<a href="https://paypal.me/phelpsben" title="Donate"><img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/benphelps"></a>
</p>
<p align="center">
<a href="https://www.digitalocean.com/?refcode=df14bcb7c016&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="https://web-platforms.sfo2.cdn.digitaloceanspaces.com/WWW/Badge%201.svg" alt="DigitalOcean Referral Badge" /></a>
</p>
<p align="center">
<em>Homepage builds are kindly powered by DigitalOcean.</em>
</p>
# Features
With features like quick search, bookmarks, weather support, a wide range of integrations and widgets, an elegant and modern design, and a focus on performance, Homepage is your ideal start to the day and a handy companion throughout it.
@@ -154,16 +149,16 @@ This is a [Next.js](https://nextjs.org/) application, see their documentation fo
The homepage documentation is available at [https://gethomepage.dev/](https://gethomepage.dev/).
Homepage uses Material for MkDocs for documentation. To run the documentation locally, first install the dependencies:
Homepage uses Zensical for documentation. To run the documentation locally, first install the dependencies:
```bash
pip install -r requirements.txt
uv sync
```
Then run the development server:
```bash
mkdocs serve # or build, to build the static site
uv run zensical serve # or build, to build the static site
```
# Support & Suggestions

View File

@@ -177,6 +177,16 @@ labels:
- homepage.widget.fields=["field1","field2"] # optional
```
!!! note
If you use mapping syntax (`:`) for labels instead of list syntax (`-`), array values like `fields` must be wrapped in single quotes so they are passed as a string:
```yaml
labels:
...
homepage.widget.fields: '["field1","field2"]'
```
Multiple widgets can be specified by incrementing the index, e.g.
```yaml

View File

@@ -223,13 +223,33 @@ spec:
- name: homepage
image: "ghcr.io/gethomepage/homepage:latest"
imagePullPolicy: Always
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
seccompProfile:
type: RuntimeDefault
env:
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: HOMEPAGE_ALLOWED_HOSTS
value: gethomepage.dev # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
value: "$(MY_POD_IP):3000,gethomepage.dev" # See gethomepage.dev/installation/#homepage_allowed_hosts . Value before the comma is required for the k8s probe
ports:
- name: http
containerPort: 3000
protocol: TCP
livenessProbe:
httpGet:
path: /api/healthcheck
port: http
initialDelaySeconds: 5
periodSeconds: 15
volumeMounts:
- mountPath: /app/config/custom.js
name: homepage-config

View File

@@ -7,13 +7,17 @@ You can include all or some of the available resources. If you do not want to se
The disk path is the path reported by `df` (Mounted On), or the mount point of the disk.
!!! note
Any disk you wish to access must be mounted to your container as a volume.
The cpu and memory resource information are the container's usage while [glances](glances.md) displays statistics for the host machine on which it is installed.
The resources widget primarily relies on a popular tool called [systeminformation](https://systeminformation.io). Thus, any limitiations of that software apply, for example, BRTFS RAID is not supported for the disk usage. In this case users may want to use the [glances widget](glances.md) instead.
_Note: unfortunately, the package used for getting CPU temp ([systeminformation](https://systeminformation.io)) is not compatible with some setups and will not report any value(s) for CPU temp._
!!! warning
**Any disk you wish to access must be mounted to your container as a volume.**
The package used for getting CPU temp ([systeminformation](https://systeminformation.io)) is not compatible with some setups and will not report any value(s) for CPU temp.
```yaml
- resources:
@@ -75,3 +79,10 @@ You can additionally supply an optional `expanded` property set to true in order
```
![194136533-c4238c82-4d67-41a4-b3c8-18bf26d33ac2](https://user-images.githubusercontent.com/3441425/194728642-a9885274-922b-4027-acf5-a746f58fdfce.png)
To monitor a named host network interface in Docker (for example `network: eno1`), mount host `/sys` (read-only):
```yaml
volumes:
- /sys:/sys:ro
```

View File

@@ -67,7 +67,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [Jackett](jackett.md)
- [JDownloader](jdownloader.md)
- [Jellyfin](jellyfin.md)
- [Jellyseerr](jellyseerr.md)
- [Seerr](seerr.md)
- [Jellystat](jellystat.md)
- [Kavita](kavita.md)
- [Komga](komga.md)
@@ -101,7 +101,6 @@ You can also find a list of all available service widgets in the sidebar navigat
- [OpenMediaVault](openmediavault.md)
- [OpenWRT](openwrt.md)
- [OPNsense](opnsense.md)
- [Overseerr](overseerr.md)
- [PaperlessNGX](paperlessngx.md)
- [Peanut](peanut.md)
- [pfSense](pfsense.md)

View File

@@ -5,7 +5,7 @@ description: Jellyfin Widget Configuration
Learn more about [Jellyfin](https://github.com/jellyfin/jellyfin).
You can create an API key from inside Jellyfin at `Settings > Advanced > Api Keys`.
You can create an API key from inside the Jellyfin Administration Dashboard under `Advanced > API Keys`.
As of v0.6.11 the widget supports fields `["movies", "series", "episodes", "songs"]`. These blocks are disabled by default but can be enabled with the `enableBlocks` option, and the "Now Playing" feature (enabled by default) can be disabled with the `enableNowPlaying` option.
@@ -17,7 +17,7 @@ As of v0.6.11 the widget supports fields `["movies", "series", "episodes", "song
```yaml
widget:
type: jellyfin
url: http://jellyfin.host.or.ip
url: http://jellyfin.host.or.ip:port
key: apikeyapikeyapikeyapikeyapikey
version: 2 # optional, default is 1
enableBlocks: true # optional, defaults to false

View File

@@ -1,18 +0,0 @@
---
title: Jellyseerr
description: Jellyseerr Widget Configuration
---
Learn more about [Jellyseerr](https://github.com/Fallenbagel/jellyseerr).
Find your API key under `Settings > General > API Key`.
Allowed fields: `["pending", "approved", "available", "issues"]`.
Default fields: `["pending", "approved", "available"]`.
```yaml
widget:
type: jellyseerr
url: http://jellyseerr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey
```

View File

@@ -1,17 +0,0 @@
---
title: Overseerr
description: Overseerr Widget Configuration
---
Learn more about [Overseerr](https://github.com/sct/overseerr).
Find your API key under `Settings > General`.
Allowed fields: `["pending", "approved", "available", "processing"]`.
```yaml
widget:
type: overseerr
url: http://overseerr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey
```

View File

@@ -12,7 +12,7 @@ Allowed fields: no configurable fields for this widget.
```yaml
widget:
type: tautulli
url: http://tautulli.host.or.ip
url: http://tautulli.host.or.ip:port
key: apikeyapikeyapikeyapikeyapikey
enableUser: true # optional, defaults to false
showEpisodeNumber: true # optional, defaults to false

View File

@@ -0,0 +1,20 @@
---
title: Seerr Widget
description: Seerr Widget Configuration
---
Learn more about [Seerr](https://github.com/seerr-team/seerr).
Find your API key under `Settings > General > API Key`.
_Jellyseerr and Overseerr merged into Seerr. Use `type: seerr` (legacy `type: jellyseerr` and `type: overseerr` are aliased)._
Allowed fields: `["pending", "approved", "available", "completed", "processing", "issues"]`.
Default fields: `["pending", "approved", "completed"]`.
```yaml
widget:
type: seerr
url: http://seerr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey
```

View File

@@ -0,0 +1,15 @@
---
title: SparkyFitness
description: SparkyFitness Widget Configuration
---
Learn more about [SparkyFitness](https://github.com/CodeWithCJ/SparkyFitness).
Allowed fields: `["eaten", "burned", "remaining", "steps"]`.
```yaml
widget:
type: sparkyfitness
url: http://sparkyfitness.host.or.ip
key: apikeyapikeyapikeyapikeyapikey
```

View File

@@ -0,0 +1,21 @@
---
title: Tracearr
description: Tracearr Widget Configuration
---
Learn more about [Tracearr](https://www.tracearr.com/).
Provides detailed information about currently active streams across multiple servers.
Allowed fields (for summary view): `["streams", "transcodes", "directplay", "bitrate"]`.
```yaml
widget:
type: tracearr
url: http://tracearr.host.or.ip:3000
key: apikeyapikeyapikeyapikeyapikey
view: both # optional, "summary", "details", or "both", defaults to "details"
enableUser: true # optional, defaults to false
showEpisodeNumber: true # optional, defaults to false
expandOneStreamToTwoRows: false # optional, defaults to true
```

View File

@@ -0,0 +1,24 @@
---
title: UniFi Drive
description: UniFi Drive Widget Configuration
---
Learn more about [UniFi Drive](https://ui.com/integrations/network-storage).
## Configuration
Displays storage statistics from your UniFi Network Attached Storage (UNAS) device. Requires a local UniFi account with at least read privileges.
Allowed fields: `["total", "used", "available", "status"]`
```yaml
widget:
type: unifi_drive
url: https://unifi.host.or.ip
username: your_username
password: your_password
```
!!! hint
If you enter incorrect credentials and receive an "API Error", you may need to recreate the container or restart the service to clear the cache.

View File

@@ -20,13 +20,13 @@ helm install my-release jameswynn/homepage
Set the `mode` in the `kubernetes.yaml` to `cluster`.
```yaml
mode: default
mode: cluster
```
To enable Kubernetes gateway-api compatibility, set `route` to `gateway`.
To enable Kubernetes gateway-api compatibility, set `gateway` to `true`.
```yaml
route: gateway
gateway: true
```
## Widgets

View File

@@ -91,7 +91,6 @@ nav:
- widgets/services/jackett.md
- widgets/services/jdownloader.md
- widgets/services/jellyfin.md
- widgets/services/jellyseerr.md
- widgets/services/jellystat.md
- widgets/services/kavita.md
- widgets/services/komga.md
@@ -125,7 +124,6 @@ nav:
- widgets/services/openmediavault.md
- widgets/services/opnsense.md
- widgets/services/openwrt.md
- widgets/services/overseerr.md
- widgets/services/pangolin.md
- widgets/services/paperlessngx.md
- widgets/services/peanut.md
@@ -151,8 +149,10 @@ nav:
- widgets/services/rutorrent.md
- widgets/services/sabnzbd.md
- widgets/services/scrutiny.md
- widgets/services/seerr.md
- widgets/services/slskd.md
- widgets/services/sonarr.md
- widgets/services/sparkyfitness.md
- widgets/services/speedtest-tracker.md
- widgets/services/spoolman.md
- widgets/services/stash.md
@@ -165,11 +165,13 @@ nav:
- widgets/services/technitium.md
- widgets/services/tdarr.md
- widgets/services/traefik.md
- widgets/services/tracearr.md
- widgets/services/transmission.md
- widgets/services/trilium.md
- widgets/services/truenas.md
- widgets/services/tubearchivist.md
- widgets/services/unifi-controller.md
- widgets/services/unifi-drive.md
- widgets/services/unmanic.md
- widgets/services/unraid.md
- widgets/services/uptime-kuma.md

View File

@@ -5,7 +5,12 @@ const nextConfig = {
reactStrictMode: true,
output: "standalone",
images: {
domains: ["cdn.jsdelivr.net"],
remotePatterns: [
{
protocol: "https",
hostname: "cdn.jsdelivr.net",
},
],
unoptimized: true,
},
i18n,

View File

@@ -1,11 +1,11 @@
{
"name": "homepage",
"version": "1.10.0",
"version": "1.10.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
"dev": "next dev",
"build": "next build",
"build": "next build --webpack",
"start": "next start",
"lint": "eslint .",
"test": "vitest run",
@@ -22,26 +22,26 @@
"follow-redirects": "^1.15.11",
"gamedig": "^5.3.2",
"i18next": "^25.8.0",
"ical.js": "^2.1.0",
"ical.js": "^2.2.1",
"js-yaml": "^4.1.1",
"json-rpc-2.0": "^1.7.0",
"luxon": "^3.6.1",
"memory-cache": "^0.2.0",
"minecraftstatuspinger": "^1.2.2",
"next": "^15.5.11",
"next-i18next": "^12.1.0",
"next": "^16.1.7",
"next-i18next": "^15.4.3",
"ping": "^0.4.4",
"pretty-bytes": "^7.1.0",
"raw-body": "^3.0.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-i18next": "^15.5.3",
"react-icons": "^5.5.0",
"react-icons": "^5.6.0",
"recharts": "^3.1.2",
"swr": "^2.4.0",
"systeminformation": "^5.27.11",
"swr": "^2.4.1",
"systeminformation": "^5.30.8",
"tough-cookie": "^6.0.0",
"urbackup-server-api": "^0.91.0",
"urbackup-server-api": "^0.92.2",
"winston": "^3.19.0",
"ws": "^8.18.3",
"xml-js": "^1.6.11"
@@ -60,12 +60,12 @@
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.2.0",
"jsdom": "^26.1.0",
"jsdom": "^28.1.0",
"postcss": "^8.5.6",
"prettier": "^3.7.3",
"prettier": "^3.8.1",
"prettier-plugin-organize-imports": "^4.3.0",
"tailwind-scrollbar": "^4.0.2",
"tailwindcss": "^4.1.18",

1252
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -66,6 +66,11 @@
"wait": "Wag asseblief",
"empty_data": "Substelsel status onbekend"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -108,14 +113,14 @@
"songs": "Liedjies"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"playing": "Speel",
"transcoding": "Transkodering",
"bitrate": "Bistempo",
"no_active": "Geen Aktiewe Strome",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"series": "Reekse",
"episodes": "Episode",
"songs": "Liedjies"
},
"esphome": {
"offline": "Vanlyn af",
@@ -184,6 +189,13 @@
"no_active": "Geen aktiewe strome nie",
"plex_connection_error": "Gaan Plex-verbinding Na"
},
"tracearr": {
"no_active": "Geen Aktiewe Strome",
"streams": "Uitsendings",
"transcodes": "Transkodering",
"directplay": "Direkte Speel",
"bitrate": "Bistempo"
},
"omada": {
"connectedAp": "Gekoppelde APs",
"activeUser": "Aktiewe toestelle",
@@ -282,17 +294,13 @@
"approved": "Goedgekeur",
"available": "Beskikbaar"
},
"jellyseerr": {
"seerr": {
"pending": "Afwagtend",
"approved": "Goedgekeur",
"available": "Beskikbaar",
"issues": "Oop Kwessies"
},
"overseerr": {
"pending": "Afwagtend",
"completed": "Afgehandel",
"processing": "Verwerking",
"approved": "Goedgekeur",
"available": "Beskikbaar"
"issues": "Oop Kwessies"
},
"netalertx": {
"total": "Totaal",
@@ -1152,11 +1160,11 @@
"artists": "Kunstenaars"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"containers": "Houers",
"images": "Beelde",
"image_updates": "Beeldopdaterings",
"images_unused": "Ongebruik",
"environment_required": "Omgewings-ID Vereis"
},
"dockhand": {
"running": "Lopend",
@@ -1171,5 +1179,11 @@
"paused": "Onderbreek",
"total": "Totaal",
"environment_not_found": "Omgewing Nie Gevind Nie"
},
"sparkyfitness": {
"eaten": "Geëet",
"burned": "Verbrand",
"remaining": "Oorblywende",
"steps": "Stappe"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "حالة النظام الفرعي غير معروفة"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "استقبال",
"tx": "ارسال",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "تحقق من الاتصال بـ Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "المتصلة APs",
"activeUser": "الأجهزة النشطة",
@@ -282,18 +294,14 @@
"approved": "مصدق",
"available": "متاح"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "معالجة",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Моля изчакайте",
"empty_data": "Неизвестен статус на подсистема"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "ПЧ",
"tx": "ИЗ",
@@ -184,6 +189,13 @@
"no_active": "Няма активни потоци",
"plex_connection_error": "Провери връзка с Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Свързани точки",
"activeUser": "Активни устройства",
@@ -282,17 +294,13 @@
"approved": "Одобрен",
"available": "Наличен"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -61,11 +61,16 @@
"wlan_devices": "Dispositius WLAN",
"lan_users": "Usuaris LAN",
"wlan_users": "Usuaris WLAN",
"up": "UP",
"up": "ACTIU",
"down": "INACTIU",
"wait": "Si us plau espera",
"empty_data": "Estat del subsistema desconegut"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Rebut",
"tx": "Transmès",
@@ -93,8 +98,8 @@
"http_status": "Estat HTTP",
"error": "Error",
"response": "Resposta",
"down": "Down",
"up": "Up",
"down": "Inactiu",
"up": "Actiu",
"not_available": "No disponible"
},
"emby": {
@@ -108,21 +113,21 @@
"songs": "Cançons"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "Reproduïnt",
"transcoding": "Transcodificant",
"bitrate": "Taxa de bits",
"no_active": "Sense reproduccions actives",
"movies": "Pel·lícules",
"series": "Sèries",
"episodes": "Episodis",
"songs": "Cançons"
},
"esphome": {
"offline": "Offline",
"offline_alt": "Offline",
"offline": "Desconnectat",
"offline_alt": "Desconnectat",
"online": "En línia",
"total": "Total",
"unknown": "Unknown"
"unknown": "Desconegut"
},
"evcc": {
"pv_power": "Producció",
@@ -143,7 +148,7 @@
"unread": "Sense llegir"
},
"fritzbox": {
"connectionStatus": "Status",
"connectionStatus": "Estat",
"connectionStatusUnconfigured": "Sense configurar",
"connectionStatusConnecting": "Connectant",
"connectionStatusAuthenticating": "Autenticant",
@@ -151,11 +156,11 @@
"connectionStatusDisconnecting": "Desconnectant",
"connectionStatusDisconnected": "Desconnectat",
"connectionStatusConnected": "Connectat",
"uptime": "Uptime",
"uptime": "Temps en funcionament",
"maxDown": "Màx. Descàrrega",
"maxUp": "Màx. Càrrega",
"down": "Down",
"up": "Up",
"down": "Inactiu",
"up": "Actiu",
"received": "Rebuts",
"sent": "Enviats",
"externalIPAddress": "IP ext.",
@@ -178,17 +183,24 @@
"passes": "Aprovat"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"playing": "Reproduïnt",
"transcoding": "Transcodificant",
"bitrate": "Taxa de bits",
"no_active": "Sense reproduccions actives",
"plex_connection_error": "Comprova la connexió de Plex"
},
"tracearr": {
"no_active": "Sense reproduccions actives",
"streams": "Transmissions",
"transcodes": "Transcodificacions",
"directplay": "Reproducció directa",
"bitrate": "Taxa de bits"
},
"omada": {
"connectedAp": "AP connectats",
"activeUser": "Dispositius actius",
"alerts": "Alertes",
"connectedGateways": "Connected gateways",
"connectedGateways": "Pasarel·les connectades",
"connectedSwitches": "Conmutadors connectats"
},
"nzbget": {
@@ -199,24 +211,24 @@
"plex": {
"streams": "Transmissions actives",
"albums": "Àlbums",
"movies": "Movies",
"movies": "Pel·lícules",
"tv": "Sèries"
},
"sabnzbd": {
"rate": "Rate",
"rate": "Taxa",
"queue": "Cua",
"timeleft": "Temps restant"
},
"rutorrent": {
"active": "Actiu",
"upload": "Upload",
"download": "Download"
"upload": "Pujada",
"download": "Baixada"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Baixada",
"upload": "Pujada",
"leech": "Sangonera",
"seed": "Sembrat"
},
"qbittorrent": {
"download": "Download",
@@ -282,18 +294,14 @@
"approved": "Aprovat",
"available": "Disponible"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Processant",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -323,10 +331,10 @@
"total": "Total"
},
"suwayomi": {
"download": "Downloaded",
"download": "Descarregat",
"nondownload": "No descarregat",
"read": "Read",
"unread": "Unread",
"read": "Llegits",
"unread": "No llegits",
"downloadedread": "Descarregat i llegit",
"downloadedunread": "Descarregat i per llegir",
"nondownloadedread": "No descarregat i llegit",
@@ -347,7 +355,7 @@
"ago": "Fa {{value}}"
},
"technitium": {
"totalQueries": "Queries",
"totalQueries": "Consultes",
"totalNoError": "Èxits",
"totalServerFailure": "Fallades",
"totalNxDomain": "Dominis NX",
@@ -355,12 +363,12 @@
"totalAuthoritative": "Autoritatiu",
"totalRecursive": "Recursiu",
"totalCached": "A la memòria cau",
"totalBlocked": "Blocked",
"totalBlocked": "Bloquejats",
"totalDropped": "Abandonat",
"totalClients": "Clients"
},
"tdarr": {
"queue": "Queue",
"queue": "Cua",
"processed": "Processat",
"errored": "Error",
"saved": "Estalviat"
@@ -371,13 +379,13 @@
"middleware": "Intermediari"
},
"trilium": {
"version": "Version",
"version": "Versió",
"notesCount": "Notes",
"dbSize": "Database Size",
"unknown": "Unknown"
"dbSize": "Tamany de la base de dades",
"unknown": "Desconegut"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"nothing_streaming": "Sense reproduccions actives",
"please_wait": "Espereu si us plau"
},
"npm": {
@@ -400,43 +408,43 @@
"prowlarr": {
"enableIndexers": "Indexadors",
"numberOfGrabs": "Captures",
"numberOfQueries": "Queries",
"numberOfQueries": "Consultes",
"numberOfFailGrabs": "Captures fallides",
"numberOfFailQueries": "Consultes fallides"
},
"jackett": {
"configured": "Configurat",
"errored": "Errored"
"errored": "Errors"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connexions",
"dataRelayed": "Transmès",
"transferRate": "Rate"
"transferRate": "Taxa"
},
"mastodon": {
"user_count": "Users",
"user_count": "Usuaris",
"status_count": "Publicacions",
"domain_count": "Dominis"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "Volguts",
"queued": "Encuat",
"series": "Sèries"
},
"minecraft": {
"players": "Jugadors",
"version": "Versió",
"status": "Status",
"up": "Online",
"down": "Offline"
"status": "Estat",
"up": "En línia",
"down": "Fora de línia"
},
"miniflux": {
"read": "Llegit",
"unread": "Unread"
"unread": "No llegits"
},
"authentik": {
"users": "Users",
"users": "Usuaris",
"loginsLast24H": "Inicis de sessió (24h)",
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
},
@@ -448,19 +456,19 @@
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"load": "Càrrega",
"wait": "Si us plau espera",
"temp": "TEMP",
"_temp": "Temp",
"warn": "Avís",
"uptime": "UP",
"uptime": "ACTIU",
"total": "Total",
"free": "Free",
"used": "Used",
"free": "Lliure",
"used": "Utilitzat",
"days": "d",
"hours": "h",
"crit": "Crític",
"read": "Read",
"read": "Lectura",
"write": "Escriptura",
"gpu": "GPU",
"mem": "Mem",
@@ -481,25 +489,25 @@
"1-day": "Majorment assolellat",
"1-night": "Majorment clar",
"2-day": "Parcialment ennuvolat",
"2-night": "Partly Cloudy",
"2-night": "Parcialment ennuvolat",
"3-day": "Ennuvolat",
"3-night": "Cloudy",
"3-night": "Ennuvolat",
"45-day": "Boirós",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"45-night": "Emboirat",
"48-day": "Boirós",
"48-night": "Emboirat",
"51-day": "Ruixats lleugers",
"51-night": "Light Drizzle",
"51-night": "Plugim lleuger",
"53-day": "Ruixat",
"53-night": "Drizzle",
"53-night": "Plugim",
"55-day": "Ruixat intens",
"55-night": "Heavy Drizzle",
"55-night": "Plovisqueig intens",
"56-day": "Lleuger ruixat gelat",
"56-night": "Light Freezing Drizzle",
"56-night": "Lleuger ruixat gelat",
"57-day": "Ruixat gelat",
"57-night": "Freezing Drizzle",
"57-night": "Plugim gelat",
"61-day": "Pluja lleugera",
"61-night": "Light Rain",
"61-night": "Pluja lleugera",
"63-day": "Pluja",
"63-night": "Rain",
"65-day": "Pluja intensa",
@@ -634,12 +642,12 @@
"mikrotik": {
"cpuLoad": "Càrrega de CPU",
"memoryUsed": "Memoria en ús",
"uptime": "Uptime",
"uptime": "Temps en funcionament",
"numberOfLeases": "IPs assignades"
},
"xteve": {
"streams_all": "Tots els streams",
"streams_active": "Active Streams",
"streams_active": "Transmissions actives",
"streams_xepg": "Canals XEPG"
},
"opendtu": {
@@ -649,7 +657,7 @@
"limit": "Límit"
},
"opnsense": {
"cpu": "CPU Load",
"cpu": "Càrrega de CPU",
"memory": "Memòria activa",
"wanUpload": "Pujada WAN",
"wanDownload": "Baixada WAN"
@@ -661,21 +669,21 @@
"layers": "Capes"
},
"octoprint": {
"printer_state": "Status",
"printer_state": "Estat",
"temp_tool": "Temperatura capçal",
"temp_bed": "Temperatura llit",
"job_completion": "Finalització"
},
"cloudflared": {
"origin_ip": "IP Origen",
"status": "Status"
"status": "Estat"
},
"pfsense": {
"load": "Càrrega mitjana",
"memory": "Ús Memòria",
"wanStatus": "Estat WAN",
"up": "Up",
"down": "Down",
"up": "Actiu",
"down": "Inactiu",
"temp": "Temp",
"disk": "Ús Disc",
"wanIP": "IP WAN"
@@ -687,58 +695,58 @@
"memory_usage": "Memòria"
},
"immich": {
"users": "Users",
"users": "Usuaris",
"photos": "Fotos",
"videos": "Videos",
"videos": "Vídeos",
"storage": "Emmagatzematge"
},
"uptimekuma": {
"up": "Actius",
"down": "Caiguts",
"uptime": "Uptime",
"uptime": "Temps en funcionament",
"incident": "Incidència",
"m": "m"
},
"atsumeru": {
"series": "Series",
"series": "Sèries",
"archives": "Arxius",
"chapters": "Capítols",
"categories": "Categories"
},
"komga": {
"libraries": "Biblioteques",
"series": "Series",
"books": "Books"
"series": "Sèries",
"books": "Llibres"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
"days": "Dies",
"uptime": "Temps en funcionament",
"volumeAvailable": "Disponible"
},
"dispatcharr": {
"channels": "Channels",
"streams": "Streams"
"channels": "Canals",
"streams": "Transmissions"
},
"mylar": {
"series": "Series",
"series": "Sèries",
"issues": "Problemes",
"wanted": "Wanted"
"wanted": "Volguts"
},
"photoprism": {
"albums": "Albums",
"photos": "Photos",
"videos": "Videos",
"albums": "Àlbums",
"photos": "Fotos",
"videos": "Vídeos",
"people": "Gent"
},
"fileflows": {
"queue": "Queue",
"processing": "Processing",
"processed": "Processed",
"queue": "Cua",
"processing": "Processant",
"processed": "Processat",
"time": "Temps"
},
"firefly": {
"networth": "Net Worth",
"budget": "Budget"
"networth": "Valor Net",
"budget": "Pressupost"
},
"grafana": {
"dashboards": "Taulells",
@@ -755,11 +763,11 @@
"numshares": "Elements compartits"
},
"kopia": {
"status": "Status",
"status": "Estat",
"size": "Mida",
"lastrun": "Darrera execució",
"nextrun": "Següent execució",
"failed": "Failed"
"failed": "Error"
},
"unmanic": {
"active_workers": "Treballadors actius",
@@ -776,21 +784,21 @@
"targets_total": "Objectius Totals"
},
"gatus": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime"
"up": "Actius",
"down": "Caiguts",
"uptime": "Temps en funcionament"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_today": "Avui",
"gross_percent_1y": "Un any",
"gross_percent_max": "Sempre",
"net_worth": "Net Worth"
"net_worth": "Valor Net"
},
"audiobookshelf": {
"podcasts": "Pòdcasts",
"books": "Books",
"books": "Llibres",
"podcastsDuration": "Durada",
"booksDuration": "Duration"
"booksDuration": "Durada"
},
"homeassistant": {
"people_home": "Gent a casa",
@@ -799,23 +807,23 @@
},
"whatsupdocker": {
"monitoring": "Supervisió",
"updates": "Updates"
"updates": "Actualitzacions"
},
"calibreweb": {
"books": "Books",
"books": "Llibres",
"authors": "Autors",
"categories": "Categories",
"series": "Series"
"series": "Sèries"
},
"booklore": {
"libraries": "Libraries",
"books": "Books",
"reading": "Reading",
"finished": "Finished"
"libraries": "Biblioteques",
"books": "Llibres",
"reading": "Llegint",
"finished": "Acabats"
},
"jdownloader": {
"downloadCount": "Queue",
"downloadBytesRemaining": "Remaining",
"downloadCount": "Cua",
"downloadBytesRemaining": "Restant",
"downloadTotalBytes": "Size",
"downloadSpeed": "Speed"
},
@@ -987,17 +995,17 @@
},
"frigate": {
"cameras": "Càmeres",
"uptime": "Uptime",
"version": "Version"
"uptime": "Temps en funcionament",
"version": "Versió"
},
"linkwarden": {
"links": "Enllaços",
"collections": "Col·leccions",
"tags": "Tags"
"tags": "Etiquetes"
},
"zabbix": {
"unclassified": "No classificat",
"information": "Information",
"information": "Informació",
"warning": "Avís",
"average": "Mitjana",
"high": "Alt",
@@ -1018,22 +1026,22 @@
"tasksInProgress": "Tasques en marxa"
},
"headscale": {
"name": "Name",
"address": "Address",
"last_seen": "Last Seen",
"status": "Status",
"online": "Online",
"offline": "Offline"
"name": "Nom",
"address": "Adreça",
"last_seen": "Vist per darrera vegada",
"status": "Estat",
"online": "En línia",
"offline": "Desconnectat"
},
"beszel": {
"name": "Name",
"name": "Nom",
"systems": "Sistemes",
"up": "Up",
"down": "Down",
"paused": "Paused",
"pending": "Pending",
"status": "Status",
"updated": "Updated",
"up": "Actiu",
"down": "Inactiu",
"paused": "Pausat",
"pending": "Pendent",
"status": "Estat",
"updated": "Actualitzat",
"cpu": "CPU",
"memory": "MEM",
"disk": "Disc",
@@ -1043,34 +1051,34 @@
"apps": "Apps",
"synced": "Sincronitzats",
"outOfSync": "Dessincronitzats",
"healthy": "Healthy",
"healthy": "Sa",
"degraded": "Degradats",
"progressing": "Progressant",
"missing": "Missing",
"missing": "Falten",
"suspended": "Suspesos"
},
"spoolman": {
"loading": "Loading"
"loading": "Carregant"
},
"gitlab": {
"groups": "Grups",
"issues": "Issues",
"issues": "Problemes",
"merges": "Merge Requests",
"projects": "Projectes"
},
"apcups": {
"status": "Status",
"load": "Load",
"bcharge": "Battery Charge",
"timeleft": "Time Left"
"status": "Estat",
"load": "Càrrega",
"bcharge": "Càrrega de la bateria",
"timeleft": "Temps restant"
},
"karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
"bookmarks": "Marcadors",
"favorites": "Preferits",
"archived": "Arxivats",
"highlights": "Destacats",
"lists": "Llistes",
"tags": "Etiquetes"
},
"slskd": {
"slskStatus": "Network",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status ukendt"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Tjek Plex-forbindelse"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Forbundne APs",
"activeUser": "Aktive enheder",
@@ -282,18 +294,14 @@
"approved": "Godkendt",
"available": "Tilgængelig"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Behandler",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Bitte warten",
"empty_data": "Subsystem-Status unbekannt"
},
"unifi_drive": {
"healthy": "Gesund",
"degraded": "Beeinträchtigt",
"no_data": "Keine Speicherdaten verfügbar"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -108,14 +113,14 @@
"songs": "Songs"
},
"jellyfin": {
"playing": "Playing",
"playing": "Wiedergabe",
"transcoding": "Transkodierung",
"bitrate": "Bitrate",
"no_active": "Keine aktiven Streams",
"movies": "Filme",
"series": "Serien",
"episodes": "Episoden",
"songs": "Songs"
"songs": "Titel"
},
"esphome": {
"offline": "Offline",
@@ -184,6 +189,13 @@
"no_active": "Keine aktiven Streams",
"plex_connection_error": "Prüfe Plex-Verbindung"
},
"tracearr": {
"no_active": "Keine aktiven Streams",
"streams": "Streams",
"transcodes": "Transkodieren",
"directplay": "Direkte Wiedergabe",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Verbundene APs",
"activeUser": "Aktive Geräte",
@@ -282,17 +294,13 @@
"approved": "Genehmigt",
"available": "Verfügbar"
},
"jellyseerr": {
"pending": "Wartend",
"approved": "Genehmigt",
"seerr": {
"pending": "Ausstehend",
"approved": "Bestätigt",
"available": "Verfügbar",
"issues": "Offene Issues"
},
"overseerr": {
"pending": "Wartend",
"completed": "Abgeschlossen",
"processing": "Wird verarbeitet",
"approved": "Genehmigt",
"available": "Verfügbar"
"issues": "Offene Probleme"
},
"netalertx": {
"total": "Total",
@@ -612,7 +620,7 @@
},
"pangolin": {
"orgs": "Orgs",
"sites": "Sites",
"sites": "Seiten",
"resources": "Ressourcen",
"targets": "Ziele",
"traffic": "Traffic",
@@ -716,7 +724,7 @@
"volumeAvailable": "Verfügbar"
},
"dispatcharr": {
"channels": "Channels",
"channels": "Kanäle",
"streams": "Streams"
},
"mylar": {
@@ -808,10 +816,10 @@
"series": "Serien"
},
"booklore": {
"libraries": "Libraries",
"libraries": "Bibliotheken",
"books": "Bücher",
"reading": "Reading",
"finished": "Finished"
"reading": "Am Lesen",
"finished": "Fertig"
},
"jdownloader": {
"downloadCount": "Warteschlange",
@@ -1152,24 +1160,30 @@
"artists": "Künstler"
},
"arcane": {
"containers": "Containers",
"containers": "Container",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"image_updates": "Image-Updates",
"images_unused": "Ungenutzt",
"environment_required": "Umgebungs-ID erforderlich"
},
"dockhand": {
"running": "Running",
"stopped": "Stopped",
"running": "Wird ausgeführt",
"stopped": "Gestoppt",
"cpu": "CPU",
"memory": "Memory",
"memory": "RAM",
"images": "Images",
"volumes": "Volumes",
"events_today": "Heutige Ereignisse",
"pending_updates": "Ausstehende Updates",
"stacks": "Stacks",
"paused": "Pausiert",
"total": "Total",
"total": "Gesamt",
"environment_not_found": "Umgebung nicht gefunden"
},
"sparkyfitness": {
"eaten": "",
"burned": "Verbrannt",
"remaining": "Verbleibend",
"steps": "Schritte"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Άγνωστη κατάσταση υποσυστήματος"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Έλεγχος Σύνδεσης με Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Συνδεδεμένα APs",
"activeUser": "Ενεργές συσκευές",
@@ -282,18 +294,14 @@
"approved": "Εγκρίθηκε",
"available": "Διαθέσιμο"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Σε επεξεργασία",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsistemostatuso nekonata"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Aprobita",
"available": "Havebla"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Espere, por favor",
"empty_data": "Se desconoce el estado del subsistema"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Recibido",
"tx": "Transmitido",
@@ -184,6 +189,13 @@
"no_active": "Sin transmisiones activas",
"plex_connection_error": "Comprueba la conexión a Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "AP conectados",
"activeUser": "Dispositivos activos",
@@ -282,17 +294,13 @@
"approved": "Aprobado",
"available": "Disponible"
},
"jellyseerr": {
"pending": "Pendiente",
"approved": "Aprobado",
"available": "Disponible",
"issues": "Issues Abiertos"
},
"overseerr": {
"pending": "Pendiente",
"processing": "Procesando",
"approved": "Aprobado",
"available": "Disponible"
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "En Pausa",
"total": "Total",
"environment_not_found": "Entorno no encontrado"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Hyväksytty",
"available": "Saatavilla"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Veuillez patienter",
"empty_data": "Statut du sous-système inconnu"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Rx",
"tx": "Tx",
@@ -108,8 +113,8 @@
"songs": "Morceaux"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"playing": "En cours",
"transcoding": "En cours d'encodage",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
@@ -184,6 +189,13 @@
"no_active": "Aucune lecture en cours",
"plex_connection_error": "Vérifier la connexion à Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "APs connectées",
"activeUser": "Périphériques actifs",
@@ -282,17 +294,13 @@
"approved": "Approuvé",
"available": "Disponible"
},
"jellyseerr": {
"pending": "En attente",
"approved": "Approuvé",
"available": "Disponible",
"issues": "Problèmes non résolus"
},
"overseerr": {
"pending": "En attente",
"processing": "En cours de traitement",
"approved": "Approuvé",
"available": "Disponible"
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -613,9 +621,9 @@
"pangolin": {
"orgs": "Orgs",
"sites": "Sites",
"resources": "Resources",
"targets": "Targets",
"traffic": "Traffic",
"resources": "Ressources",
"targets": "Cibles",
"traffic": "Trafique",
"in": "In",
"out": "Out"
},
@@ -712,7 +720,7 @@
},
"diskstation": {
"days": "Jours",
"uptime": "Disponibilité",
"uptime": "Démarré depuis",
"volumeAvailable": "Disponible"
},
"dispatcharr": {
@@ -743,7 +751,7 @@
"grafana": {
"dashboards": "Tableau de bord",
"datasources": "Sources données",
"totalalerts": "Total alertes",
"totalalerts": "Alertes totales",
"alertstriggered": "Alertes déclenchées"
},
"nextcloud": {
@@ -942,7 +950,7 @@
"studios": "Studios",
"movies": "Films",
"tags": "Tags",
"oCount": "0 Compte"
"oCount": "O-mètre"
},
"tandoor": {
"users": "Utilisateurs",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "נא להמתין",
"empty_data": "מצב תת-מערכת לא ידוע"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "אין הזרמות פעילות",
"plex_connection_error": "בדוק חיבור ל-Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "נקודות גישה מחוברות",
"activeUser": "מכשירים פעילים",
@@ -282,18 +294,14 @@
"approved": "מאושר",
"available": "זמין"
},
"jellyseerr": {
"pending": "ממתין לאישור",
"approved": "מאושר",
"available": "זמין",
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "ממתין לאישור",
"processing": "מעבד",
"approved": "מאושר",
"available": "זמין"
},
"netalertx": {
"total": "סה\"כ",
"connected": "מחובר",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Pričekaj",
"empty_data": "Stanje podsustava nepoznato"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -108,14 +113,14 @@
"songs": "Pjesme"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"playing": "Reprodukcija u tijeku",
"transcoding": "Prekodiranje",
"bitrate": "Stopa bitova",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"movies": "Filmovi",
"series": "Serije",
"episodes": "Epizode",
"songs": "Pjesme"
},
"esphome": {
"offline": "Offline",
@@ -184,6 +189,13 @@
"no_active": "Nema aktivnih prijenosa",
"plex_connection_error": "Provjeri Plex vezu"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Prekodiranja",
"directplay": "Izravna reprodukcija",
"bitrate": "Stopa bitova"
},
"omada": {
"connectedAp": "Povezani AP-ovi",
"activeUser": "Aktivni uređaji",
@@ -282,17 +294,13 @@
"approved": "Odobreno",
"available": "Dostupno"
},
"jellyseerr": {
"pending": "U tijeku",
"seerr": {
"pending": "Na čekanju",
"approved": "Odobreno",
"available": "Dostupno",
"issues": "Otvoreni problemi"
},
"overseerr": {
"pending": "U tijeku",
"completed": "Dovršeno",
"processing": "Obrada",
"approved": "Odobreno",
"available": "Dostupno"
"issues": "Otvoreni problemi"
},
"netalertx": {
"total": "Ukupno",
@@ -543,7 +551,7 @@
"up": "Aktivno",
"pending": "U tijeku",
"down": "Neaktivno",
"ok": "Ok"
"ok": "U redu"
},
"healthchecks": {
"new": "Novo",
@@ -611,11 +619,11 @@
"total": "Ukupno"
},
"pangolin": {
"orgs": "Orgs",
"sites": "Sites",
"resources": "Resources",
"targets": "Targets",
"traffic": "Traffic",
"orgs": "Organizacije",
"sites": "Web-stranice",
"resources": "Resursi",
"targets": "Ciljevi",
"traffic": "Promet",
"in": "In",
"out": "Out"
},
@@ -716,7 +724,7 @@
"volumeAvailable": "Dostupno"
},
"dispatcharr": {
"channels": "Channels",
"channels": "Kanali",
"streams": "Streams"
},
"mylar": {
@@ -808,10 +816,10 @@
"series": "Serije"
},
"booklore": {
"libraries": "Libraries",
"books": "Books",
"reading": "Reading",
"finished": "Finished"
"libraries": "Knjižnice",
"books": "Knjige",
"reading": "Čitanje",
"finished": "Završeno"
},
"jdownloader": {
"downloadCount": "Red čekanja",
@@ -1152,24 +1160,30 @@
"artists": "Izvođači"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"containers": "Kontejneri",
"images": "Slike",
"image_updates": "Aktualizirane slike",
"images_unused": "Nekorišteno",
"environment_required": "ID okruženja se mora navesti"
},
"dockhand": {
"running": "Running",
"stopped": "Stopped",
"running": "Pokreće se",
"stopped": "Zaustavljeno",
"cpu": "CPU",
"memory": "Memory",
"images": "Images",
"volumes": "Volumes",
"events_today": "Events Today",
"pending_updates": "Pending Updates",
"memory": "Memorija",
"images": "Slike",
"volumes": "Jedinice memorije",
"events_today": "Događanja danas",
"pending_updates": "Aktualiziranja na čekanju",
"stacks": "Stacks",
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
"paused": "Pauzirano",
"total": "Ukupno",
"environment_not_found": "Okruženje nije pronađeno"
},
"sparkyfitness": {
"eaten": "Pojedeno",
"burned": "Potrošeno",
"remaining": "Preostalo",
"steps": "Koraci"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Kérjük várjon",
"empty_data": "Az alrendszer állapota ismeretlen"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "Nincs aktív lejátszás",
"plex_connection_error": "Plex kapcsolat ellenőrzése"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Csatlakoztatott AP-k",
"activeUser": "Aktív eszközök",
@@ -282,17 +294,13 @@
"approved": "Engedélyezett",
"available": "Elérhető"
},
"jellyseerr": {
"pending": "Függőben lévő",
"approved": "Jóváhagyott",
"available": "Elérhető",
"issues": "Nyitott problémák"
},
"overseerr": {
"pending": "Függőben lévő",
"processing": "Feldolgozás",
"approved": "Jóváhagyott",
"available": "Elérhető"
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"netalertx": {
"total": "Összes",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Status subsistem tdk diketahui"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Cek Koneksi ke Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "AP Tersambung",
"activeUser": "Perangakat yang Aktif",
@@ -282,18 +294,14 @@
"approved": "Tersetujui",
"available": "Tersedia"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Memproses",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Stato del sottosistema sconosciuto"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -113,7 +118,7 @@
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"series": "Serie",
"episodes": "Episodes",
"songs": "Songs"
},
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Controllare la connessione a Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "AP Connessi",
"activeUser": "Dispositivi attivi",
@@ -282,18 +294,14 @@
"approved": "Approvati",
"available": "Disponibili"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "In lavorazione",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -318,7 +326,7 @@
"ping": "Ping"
},
"portainer": {
"running": "Running",
"running": "In esecuzione",
"stopped": "Fermati",
"total": "Total"
},
@@ -713,7 +721,7 @@
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
"volumeAvailable": "Disponibili"
},
"dispatcharr": {
"channels": "Channels",
@@ -1084,9 +1092,9 @@
"sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"songs": "Brani",
"movies": "Film",
"episodes": "Episodi",
"other": "Altro"
},
"checkmk": {
@@ -1110,11 +1118,11 @@
"total": "Total"
},
"wallos": {
"activeSubscriptions": "Subscriptions",
"thisMonthlyCost": "This Month",
"nextMonthlyCost": "Next Month",
"activeSubscriptions": "Abbonamenti",
"thisMonthlyCost": "Questo Mese",
"nextMonthlyCost": "Mese Prossimo",
"previousMonthlyCost": "Prev. Month",
"nextRenewingSubscription": "Next Payment"
"nextRenewingSubscription": ""
},
"unraid": {
"STARTED": "Started",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "お待ちください",
"empty_data": "サブシステムの状態は不明"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "受信済み",
"tx": "送信済み",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Plex接続の確認"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "接続されたAP",
"activeUser": "アクティブデバイス",
@@ -282,18 +294,14 @@
"approved": "承認済",
"available": "利用可"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "処理中",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "잠시만 기다려주세요",
"empty_data": "서브시스템 상태 알 수 없음"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "수신",
"tx": "송신",
@@ -108,14 +113,14 @@
"songs": "음악"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "재생 중",
"transcoding": "트랜스코딩 중",
"bitrate": "비트레이트",
"no_active": "활성 스트림 없음",
"movies": "영상",
"series": "시리즈",
"episodes": "에피소드",
"songs": "음악"
},
"esphome": {
"offline": "오프라인",
@@ -184,6 +189,13 @@
"no_active": "활성 스트림 없음",
"plex_connection_error": "Plex 연결 확인"
},
"tracearr": {
"no_active": "활성 스트림 없음",
"streams": "스트림",
"transcodes": "트랜스코드",
"directplay": "다이렉트 플레이",
"bitrate": "비트레이트"
},
"omada": {
"connectedAp": "연결된 AP",
"activeUser": "활성 장치",
@@ -282,17 +294,13 @@
"approved": "승인됨",
"available": "이용 가능"
},
"jellyseerr": {
"seerr": {
"pending": "대기 중",
"approved": "승인됨",
"available": "용 가능",
"issues": "열린 이슈"
},
"overseerr": {
"pending": "대기 중",
"available": "용 가능",
"completed": "완료됨",
"processing": "처리 중",
"approved": "승인됨",
"available": "이용 가능"
"issues": "열린 이슈"
},
"netalertx": {
"total": "전체",
@@ -543,7 +551,7 @@
"up": "업",
"pending": "대기 중",
"down": "다운",
"ok": "Ok"
"ok": "확인"
},
"healthchecks": {
"new": "신규",
@@ -615,9 +623,9 @@
"sites": "Sites",
"resources": "Resources",
"targets": "Targets",
"traffic": "Traffic",
"in": "In",
"out": "Out"
"traffic": "트래픽",
"in": "수신",
"out": "송신"
},
"peanut": {
"battery_charge": "배터리 충전",
@@ -716,8 +724,8 @@
"volumeAvailable": "사용 가능"
},
"dispatcharr": {
"channels": "Channels",
"streams": "Streams"
"channels": "채널",
"streams": "스트림"
},
"mylar": {
"series": "시리즈",
@@ -784,7 +792,7 @@
"gross_percent_today": "오늘",
"gross_percent_1y": "1년",
"gross_percent_max": "전체 기간",
"net_worth": "Net Worth"
"net_worth": "순자산"
},
"audiobookshelf": {
"podcasts": "팟캐스트",
@@ -808,10 +816,10 @@
"series": "시리즈"
},
"booklore": {
"libraries": "Libraries",
"books": "Books",
"reading": "Reading",
"finished": "Finished"
"libraries": "라이브러리",
"books": "",
"reading": "읽는 중",
"finished": "완료"
},
"jdownloader": {
"downloadCount": "대기열",
@@ -1147,29 +1155,35 @@
"bytes_added_30": "추가된 용량"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
"songs": "음악",
"time": "시간",
"artists": "아티스트"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"containers": "컨테이너",
"images": "이미지",
"image_updates": "이미지 업데이트",
"images_unused": "미사용",
"environment_required": "환경 ID 필요"
},
"dockhand": {
"running": "Running",
"stopped": "Stopped",
"running": "실행 중",
"stopped": "정지됨",
"cpu": "CPU",
"memory": "Memory",
"images": "Images",
"volumes": "Volumes",
"events_today": "Events Today",
"pending_updates": "Pending Updates",
"stacks": "Stacks",
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
"memory": "메모리",
"images": "이미지",
"volumes": "볼륨",
"events_today": "오늘의 이벤트",
"pending_updates": "대기 중인 업데이트",
"stacks": "스택",
"paused": "일시정지됨",
"total": "전체",
"environment_not_found": "환경 없음"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Savienotie piekļuves punkti",
"activeUser": "Aktīvās ierīces",
@@ -282,17 +294,13 @@
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Status subsistem tak diketahui"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Peranti aktif",
@@ -282,17 +294,13 @@
"approved": "Lulus",
"available": "Sudah Ada"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Even geduld",
"empty_data": "Subsysteem status onbekend"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "Geen Actieve Streams",
"plex_connection_error": "Controleer Plex Connectie"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Verbonden APs",
"activeUser": "Actieve apparaten",
@@ -282,18 +294,14 @@
"approved": "Goedgekeurd",
"available": "Beschikbaar"
},
"jellyseerr": {
"pending": "In afwachting",
"approved": "Goedgekeurd",
"available": "Beschikbaar",
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "In afwachting",
"processing": "Verwerken",
"approved": "Goedgekeurd",
"available": "Beschikbaar"
},
"netalertx": {
"total": "Totaal",
"connected": "Verbonden",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Ukjent undersystemstatus"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Kontroller Plex tilkoblingen"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Tilkoblede AP'er",
"activeUser": "Aktive enheter",
@@ -282,18 +294,14 @@
"approved": "Godkjent",
"available": "Tilgjengelig"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Behandler",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Proszę czekać",
"empty_data": "Status podsystemu nieznany"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Rx",
"tx": "Tx",
@@ -108,14 +113,14 @@
"songs": "Piosenki"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"playing": "Odtwarza",
"transcoding": "Transkoduje",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"no_active": "Brak aktywnych strumieni",
"movies": "Filmy",
"series": "Seriale",
"episodes": "Odcinki",
"songs": "Piosenki"
},
"esphome": {
"offline": "Offline",
@@ -184,6 +189,13 @@
"no_active": "Brak aktywnych strumieni",
"plex_connection_error": "Sprawdź połączenie z Plex"
},
"tracearr": {
"no_active": "Brak aktywnych strumieni",
"streams": "Strumienie",
"transcodes": "Transkodowania",
"directplay": "Odtwarzanie bezpośrednie",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Połączone punkty dostępowe",
"activeUser": "Aktywne urządzenia",
@@ -282,17 +294,13 @@
"approved": "Zaakceptowane",
"available": "Dostępne"
},
"jellyseerr": {
"seerr": {
"pending": "Oczekujące",
"approved": "Zaakceptowane",
"available": "Dostępne",
"issues": "Otwarte zgłoszenia"
},
"overseerr": {
"pending": "Oczekujące",
"completed": "Ukończone",
"processing": "Przetwarzane",
"approved": "Zaakceptowane",
"available": "Dostępne"
"issues": "Otwarte zgłoszenia"
},
"netalertx": {
"total": "Razem",
@@ -716,8 +724,8 @@
"volumeAvailable": "Dostępne"
},
"dispatcharr": {
"channels": "Channels",
"streams": "Streams"
"channels": "Kanały",
"streams": "Strumienie"
},
"mylar": {
"series": "Seriale",
@@ -1152,11 +1160,11 @@
"artists": "Wykonawcy"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"containers": "Kontenery",
"images": "Obrazy",
"image_updates": "Aktualizacje obrazów",
"images_unused": "Nieużywane",
"environment_required": "Wymagane ID środowiska"
},
"dockhand": {
"running": "Działające",
@@ -1171,5 +1179,11 @@
"paused": "Wstrzymane",
"total": "Razem",
"environment_not_found": "Środowisko nie znalezione"
},
"sparkyfitness": {
"eaten": "Zjedzone",
"burned": "Spalone",
"remaining": "Pozostało",
"steps": "Kroki"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Status de Subsistema Desconhecido"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Rx",
"tx": "Tx",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Verifique a conexão do Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "APs Ligados",
"activeUser": "Dispositivos activos",
@@ -282,18 +294,14 @@
"approved": "Aprovado",
"available": "Disponível"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "A Processar",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -14,7 +14,7 @@
"date": "{{value, date}}",
"relativeDate": "{{value, relativeDate}}",
"duration": "{{value, duration}}",
"months": "M",
"months": "mo",
"days": "d",
"hours": "h",
"minutes": "m",
@@ -66,9 +66,14 @@
"wait": "Por favor, aguarde",
"empty_data": "Status do Subsistema desconhecido"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Rx",
"tx": "Tx",
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"running": "Executando",
@@ -101,21 +106,21 @@
"playing": "A reproduzir",
"transcoding": "Transcodificação",
"bitrate": "Taxa de bits",
"no_active": "Sem Streams Ativos",
"no_active": "Sem Transmissões Ativas",
"movies": "Filmes",
"series": "Séries",
"episodes": "Episódios",
"songs": "Canções"
},
"jellyfin": {
"playing": "Playing",
"playing": "Jogando",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"movies": "Filmes",
"series": "Séries",
"episodes": "Episódios",
"songs": "Músicas"
},
"esphome": {
"offline": "Offline",
@@ -184,6 +189,13 @@
"no_active": "Sem Streams Ativos",
"plex_connection_error": "Verifique a conexão do Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "APs Ligados",
"activeUser": "Dispositivos ativos",
@@ -282,17 +294,13 @@
"approved": "Aprovada",
"available": "Disponível"
},
"jellyseerr": {
"seerr": {
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível",
"issues": "Incidentes Abertos"
},
"overseerr": {
"pending": "Pendente",
"completed": "Concluído",
"processing": "Processando",
"approved": "Aprovado",
"available": "Disponível"
"issues": "Erros pendentes"
},
"netalertx": {
"total": "Total",
@@ -613,7 +621,7 @@
"pangolin": {
"orgs": "Orgs",
"sites": "Sites",
"resources": "Resources",
"resources": "Recursos",
"targets": "Targets",
"traffic": "Traffic",
"in": "In",
@@ -716,8 +724,8 @@
"volumeAvailable": "Disponível"
},
"dispatcharr": {
"channels": "Channels",
"streams": "Streams"
"channels": "Canais",
"streams": "Transmissões"
},
"mylar": {
"series": "Séries",
@@ -808,10 +816,10 @@
"series": "Séries"
},
"booklore": {
"libraries": "Libraries",
"books": "Books",
"reading": "Reading",
"finished": "Finished"
"libraries": "Bibliotecas",
"books": "Livros",
"reading": "Lendo",
"finished": "Finalizado"
},
"jdownloader": {
"downloadCount": "Fila de espera",
@@ -1152,24 +1160,30 @@
"artists": "Artistas"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"containers": "Recipientes",
"images": "Imagens",
"image_updates": "Atualizações de Imagem",
"images_unused": "Não utilizado",
"environment_required": "Environment ID Required"
},
"dockhand": {
"running": "Running",
"running": "Executando",
"stopped": "Stopped",
"cpu": "CPU",
"memory": "Memory",
"images": "Images",
"volumes": "Volumes",
"events_today": "Events Today",
"pending_updates": "Pending Updates",
"stacks": "Stacks",
"paused": "Paused",
"memory": "Memória",
"images": "Imagens",
"volumes": "Quantidades",
"events_today": "Eventos hoje",
"pending_updates": "Atualizações pendentes",
"stacks": "Pilhas",
"paused": "Pausado",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Starea subsistemului este necunoscut"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Dispozitive active",
@@ -282,18 +294,14 @@
"approved": "Aprobate",
"available": "Disponibile"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Procesare",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Пожалуйста, подождите",
"empty_data": "Статус подсистемы неизвестен"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -108,14 +113,14 @@
"songs": "Песни"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "Воспроизводится",
"transcoding": "Перекодирование",
"bitrate": "Битрейт",
"no_active": "Нет активных потоков",
"movies": "Фильмы",
"series": "Сериалы",
"episodes": "Эпизоды",
"songs": "Песни"
},
"esphome": {
"offline": "Не в сети",
@@ -184,6 +189,13 @@
"no_active": "Нет активных стримов",
"plex_connection_error": "Проверка соединения Plex"
},
"tracearr": {
"no_active": "Нет активных потоков",
"streams": "Потоки",
"transcodes": "Transcodes",
"directplay": "Прямое воспроизведение",
"bitrate": "Битрейт"
},
"omada": {
"connectedAp": "Подключенные точки доступа",
"activeUser": "Активные устройства",
@@ -282,17 +294,13 @@
"approved": "Одобрено",
"available": "Доступно"
},
"jellyseerr": {
"pending": "Ожидают",
"seerr": {
"pending": "Pending",
"approved": "Одобрено",
"available": "Доступно",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Ожидают",
"processing": "В процессе",
"approved": "Одобрено",
"available": "Доступно"
"completed": "Завершено",
"processing": "Обработка",
"issues": "Открытые задачи"
},
"netalertx": {
"total": "Всего",
@@ -1130,8 +1138,8 @@
"NO_DATA_DISKS": "No Data Disks",
"notifications": "Уведомления",
"status": "Статус",
"cpu": "CPU",
"memoryUsed": "Memory Used",
"cpu": "ЦП",
"memoryUsed": "Использовано ОЗУ",
"memoryAvailable": "Memory Available",
"arrayUsed": "Array Used",
"arrayFree": "Array Free",
@@ -1141,14 +1149,14 @@
"backrest": {
"num_plans": "Plans",
"num_success_30": "Successes",
"num_failure_30": "Failures",
"num_failure_30": "Ошибки",
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"time": "Время",
"artists": "Artists"
},
"arcane": {
@@ -1170,6 +1178,12 @@
"stacks": "Stacks",
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
"environment_not_found": "Среда не найдена"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Čakajte, prosím",
"empty_data": "Stav podsystému neznámy"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Prijaté",
"tx": "Odoslané",
@@ -93,7 +98,7 @@
"http_status": "HTTP stavový kód",
"error": "Chyba",
"response": "Odpoveď",
"down": "Down",
"down": "Nedostupné",
"up": "Beží",
"not_available": "Nedostupné"
},
@@ -108,18 +113,18 @@
"songs": "Skladby"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "Prehráva sa",
"transcoding": "Prebieha prekódovanie",
"bitrate": "Prenosová rýchlosť",
"no_active": "Žiadne aktívne vysielania",
"movies": "Filmov",
"series": "Seriálov",
"episodes": "Epizód",
"songs": "Skladieb"
},
"esphome": {
"offline": "Offline",
"offline_alt": "Offline",
"offline": "Nedostupné",
"offline_alt": "Nedostupné",
"online": "Online",
"total": "Celkom",
"unknown": "Neznáme"
@@ -154,7 +159,7 @@
"uptime": "Dostupnosť",
"maxDown": "Max. sťahovanie",
"maxUp": "Max. nahrávanie",
"down": "Down",
"down": "Nedostupné",
"up": "Beží",
"received": "Prijaté",
"sent": "Odoslané",
@@ -178,12 +183,19 @@
"passes": "Odvysielané"
},
"tautulli": {
"playing": "Playing",
"playing": "Prehráva sa",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"bitrate": "Prenosová rýchlosť",
"no_active": "No Active Streams",
"plex_connection_error": "Skontroluj spojenie s Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Prenosová rýchlosť"
},
"omada": {
"connectedAp": "Pripojené prístupové body",
"activeUser": "Aktívne zariadenia",
@@ -282,18 +294,14 @@
"approved": "Schválené",
"available": "Dostupné"
},
"jellyseerr": {
"pending": "Čakajúce",
"approved": "Schválené",
"available": "Dostupné",
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Čakajúce",
"processing": "Spracovávané",
"approved": "Schválené",
"available": "Dostupné"
},
"netalertx": {
"total": "Celkom",
"connected": "Pripojené",
@@ -429,7 +437,7 @@
"version": "Verzia",
"status": "Stav",
"up": "Online",
"down": "Offline"
"down": "Nedostupné"
},
"miniflux": {
"read": "Prečítané",
@@ -450,7 +458,7 @@
"cpu": "CPU",
"load": "Záťaž",
"wait": "Čakajte, prosím",
"temp": "TEMP",
"temp": "TEPL",
"_temp": "Teplota",
"warn": "Upozornení",
"uptime": "BEŽÍ",
@@ -491,13 +499,13 @@
"51-day": "Mierne mrholenie",
"51-night": "Slabé mrholenie",
"53-day": "Mrholenie",
"53-night": "Drizzle",
"53-night": "Mrholenie",
"55-day": "Silné mrholenie",
"55-night": "Silné mrholenie",
"56-day": "Mierne mrazivé mrholenie",
"56-night": "Light Freezing Drizzle",
"56-night": "Jemné mrznúce mrholenie",
"57-day": "Mrazivé mrholenie",
"57-night": "Freezing Drizzle",
"57-night": "Mrznúce mrholenie",
"61-day": "Slabý dážď",
"61-night": "Slabý dážď",
"63-day": "Dážď",
@@ -542,14 +550,14 @@
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Beží",
"pending": "Čakajúce",
"down": "Down",
"down": "Nedostupné",
"ok": "Ok"
},
"healthchecks": {
"new": "Nový",
"up": "Beží",
"grace": "V dodatočnej lehote",
"down": "Down",
"down": "Nedostupné",
"paused": "Pozastavené",
"status": "Stav",
"last_ping": "Poslendný ping",
@@ -675,7 +683,7 @@
"memory": "Využitie pamäte",
"wanStatus": "Stav WAN",
"up": "Beží",
"down": "Down",
"down": "Nedostupné",
"temp": "Temp",
"disk": "Využitie disku",
"wanIP": "IP adresa WAN"
@@ -776,8 +784,8 @@
"targets_total": "Cieľov spolu"
},
"gatus": {
"up": "Sites Up",
"down": "Sites Down",
"up": "Dostupné stránky",
"down": "Nedostupné stránky",
"uptime": "Dostupnosť"
},
"ghostfolio": {
@@ -799,7 +807,7 @@
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
"updates": "Aktualizácie"
},
"calibreweb": {
"books": "Books",
@@ -872,7 +880,7 @@
"uptime": "Dostupnosť",
"cpuLoad": "Záťaž CPU priem. (5m)",
"up": "Beží",
"down": "Down",
"down": "Nedostupné",
"bytesTx": "Prenesených",
"bytesRx": "Prijaté"
},
@@ -881,13 +889,13 @@
"uptime": "Dostupnosť",
"lastDown": "Posledný čas nedostupnosti",
"downDuration": "Trvanie nedostupnosti",
"sitesUp": "Sites Up",
"sitesDown": "Sites Down",
"sitesUp": "Dostupné stránky",
"sitesDown": "Nedostupné stránky",
"paused": "Pozastavené",
"notyetchecked": "Neskontrolované",
"up": "Beží",
"seemsdown": "Javí sa nedostupný",
"down": "Down",
"down": "Nedostupné",
"unknown": "Neznáme"
},
"calendar": {
@@ -1023,17 +1031,17 @@
"last_seen": "Last Seen",
"status": "Stav",
"online": "Online",
"offline": "Offline"
"offline": "Nedostupné"
},
"beszel": {
"name": "Name",
"systems": "Systems",
"up": "Beží",
"down": "Down",
"down": "Nedostupné",
"paused": "Pozastavené",
"pending": "Čakajúce",
"status": "Stav",
"updated": "Updated",
"updated": "Aktualizované",
"cpu": "CPU",
"memory": "RAM",
"disk": "Disk",
@@ -1078,7 +1086,7 @@
"disconnected": "Odpojené",
"updateStatus": "Update",
"update_yes": "Dostupné",
"update_no": "Up to Date",
"update_no": "Aktuálne",
"downloads": "Downloads",
"uploads": "Uploads",
"sharedFiles": "Files"
@@ -1097,7 +1105,7 @@
"total": "Celkom",
"running": "Beží",
"stopped": "Zastavené",
"down": "Down",
"down": "Nedostupné",
"unhealthy": "Nezdravý",
"unknown": "Neznáme",
"servers": "Servery",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Neznani status podsistema"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Preveri Plex povezavo"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Povezanih AP",
"activeUser": "Aktivne naprave",
@@ -282,18 +294,14 @@
"approved": "Odobreno",
"available": "Na voljo"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "Procesiram",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Молим сачекајте",
"empty_data": "Статус подсистема непознат"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -108,14 +113,14 @@
"songs": "Песме"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "Репродукција",
"transcoding": "Транскодирање",
"bitrate": "Проток",
"no_active": "Нема активних стримова",
"movies": "Филмови",
"series": "Серије",
"episodes": "Епизоде",
"songs": "Песме"
},
"esphome": {
"offline": "Није на мрежи",
@@ -184,6 +189,13 @@
"no_active": "Нема активних стримова",
"plex_connection_error": "Провери везу са Plex-ом"
},
"tracearr": {
"no_active": "Нема активних стримова",
"streams": "Стримови",
"transcodes": "Транскодирање",
"directplay": "Директно репродуковање",
"bitrate": "Проток"
},
"omada": {
"connectedAp": "Повезани АПи",
"activeUser": "Активни уређаји",
@@ -282,17 +294,13 @@
"approved": "Одобрено",
"available": "Доступно"
},
"jellyseerr": {
"seerr": {
"pending": "На чекању",
"approved": "Одобрено",
"available": "Доступно",
"issues": "Отворених питања"
},
"overseerr": {
"pending": "На чекању",
"completed": "Завршено",
"processing": "Обрада",
"approved": "Одобрено",
"available": "Доступно"
"issues": "Отворених питања"
},
"netalertx": {
"total": "Укупно",
@@ -543,7 +551,7 @@
"up": "Горе",
"pending": "На чекању",
"down": "Доле",
"ok": "Ok"
"ok": "Ок"
},
"healthchecks": {
"new": "Сада",
@@ -716,8 +724,8 @@
"volumeAvailable": "Доступно"
},
"dispatcharr": {
"channels": "Channels",
"streams": "Streams"
"channels": "Канали",
"streams": "Стримови"
},
"mylar": {
"series": "Серије",
@@ -808,10 +816,10 @@
"series": "Серије"
},
"booklore": {
"libraries": "Libraries",
"books": "Books",
"reading": "Reading",
"finished": "Finished"
"libraries": "Библиотеке",
"books": "Књиге",
"reading": "Читање",
"finished": "Завршено"
},
"jdownloader": {
"downloadCount": "Ред",
@@ -1152,24 +1160,30 @@
"artists": "Извођачи"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"containers": "Контејнера",
"images": "Слике",
"image_updates": "Ажурирања слика",
"images_unused": "Неискоришћено",
"environment_required": "ИД окружења је обавезан"
},
"dockhand": {
"running": "Running",
"stopped": "Stopped",
"cpu": "CPU",
"memory": "Memory",
"images": "Images",
"volumes": "Volumes",
"events_today": "Events Today",
"pending_updates": "Pending Updates",
"stacks": "Stacks",
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
"running": "Покренуто",
"stopped": "Заустављено",
"cpu": "Процесор",
"memory": "Меморија",
"images": "Слике",
"volumes": "Јачине звука",
"events_today": "Данашњи догађаји",
"pending_updates": "Ажурирања на чекању",
"stacks": "Стекови",
"paused": "Паузирано",
"total": "Укупно",
"environment_not_found": "Окружење није пронађено"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Godkända",
"available": "Tillgänglig"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "ఆమోదించబడింది",
"available": "అందుబాటులో వున్నవి"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -40,7 +40,7 @@
},
"resources": {
"cpu": "İşlemci",
"mem": "MEM",
"mem": "Bellek",
"total": "Toplam",
"free": "Boş",
"used": "Kullanımda",
@@ -66,6 +66,11 @@
"wait": "Lütfen bekleyin",
"empty_data": "Alt sistem durumu bilinmiyor"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "Gelen Veri",
"tx": "Giden Veri",
@@ -80,7 +85,7 @@
"unhealthy": "Sağlıksız",
"not_found": "Bulunamadı",
"exited": "Kapandı",
"partial": "Parçalı"
"partial": "Kısmi"
},
"ping": {
"error": "Hata",
@@ -93,29 +98,29 @@
"http_status": "HTTPS durumu",
"error": "Hata",
"response": "Yanıt",
"down": "Çalışmayan",
"down": "İndirme",
"up": "Çalışıyor",
"not_available": "Uygun değil"
},
"emby": {
"playing": "Oynatılıyor",
"transcoding": "Dönüştürülüyor",
"bitrate": "Bit Oranı",
"bitrate": "Bit Hızı",
"no_active": "Etkin akış yok",
"movies": "Filmler",
"series": "Diziler",
"episodes": "Bölümler",
"songs": "Şarkılar"
"movies": "Film",
"series": "Dizi",
"episodes": "Bölüm",
"songs": "Şarkı"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "Oynatılıyor",
"transcoding": "Dönüştürülüyor",
"bitrate": "Bit Hızı",
"no_active": "Aktif Yayın Yok",
"movies": "Film",
"series": "Dizi",
"episodes": "Bölüm",
"songs": "Şarkı"
},
"esphome": {
"offline": "Çevrimdışı",
@@ -135,8 +140,8 @@
"flood": {
"download": "İndirme",
"upload": "Yükleme",
"leech": "Tüketici",
"seed": "Sağlayıcı"
"leech": "İndirilen",
"seed": "Gönderilen"
},
"freshrss": {
"subscriptions": "Abonelikler",
@@ -152,10 +157,10 @@
"connectionStatusDisconnected": "Bağlı değil",
"connectionStatusConnected": "Bağlı",
"uptime": "Çalışma Süresi",
"maxDown": "Max. Indirme",
"maxUp": "Max. Gönderme",
"down": "Çalışmayan",
"up": "Çalışıyor",
"maxDown": "Maks. İndirme",
"maxUp": "Maks. Gönderme",
"down": "İndirme",
"up": "Yükleme",
"received": "Alınan",
"sent": "Gönderilen",
"externalIPAddress": "Harici IP",
@@ -180,10 +185,17 @@
"tautulli": {
"playing": "Oynatılıyor",
"transcoding": "Dönüştürülüyor",
"bitrate": "Bit Oranı",
"bitrate": "Bit Hızı",
"no_active": "Etkin akış yok",
"plex_connection_error": "Plex Bağlantısı Kontrol Ediliyor"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Bağlı AP'ler",
"activeUser": "Etkin aygıtlar",
@@ -199,7 +211,7 @@
"plex": {
"streams": "Etkin akış",
"albums": "Albümler",
"movies": "Filmler",
"movies": "Film",
"tv": "TV Showları"
},
"sabnzbd": {
@@ -209,20 +221,20 @@
},
"rutorrent": {
"active": "Etkin",
"upload": "Yükleme",
"upload": "Gönderme",
"download": "İndirme"
},
"transmission": {
"download": "İndirme",
"upload": "Yükleme",
"leech": "Tüketici",
"seed": "Sağlayıcı"
"upload": "Gönderme",
"leech": "İndirilen",
"seed": "Gönderilen"
},
"qbittorrent": {
"download": "İndirme",
"upload": "Yükleme",
"leech": "Tüketici",
"seed": "Sağlayıcı"
"upload": "Gönderme",
"leech": "İndirilen",
"seed": "Gönderilen"
},
"qnap": {
"cpuUsage": "İşlemci Kullanımı",
@@ -234,9 +246,9 @@
},
"deluge": {
"download": "İndirme",
"upload": "Yükleme",
"leech": "Leech",
"seed": "Seed"
"upload": "Gönderme",
"leech": "İndirilen",
"seed": "Gönderilen"
},
"develancacheui": {
"cachehitbytes": "Önbellek İsabetli Byte",
@@ -244,14 +256,14 @@
},
"downloadstation": {
"download": "İndirme",
"upload": "Yükleme",
"leech": "Tüketici",
"seed": "Sağlayıcı"
"upload": "Gönderme",
"leech": "İndirilen",
"seed": "Gönderilen"
},
"sonarr": {
"wanted": "İstendi",
"queued": "Kuyrukta",
"series": "Seriler",
"series": "Diziler",
"queue": "Kuyruk",
"unknown": "Bilinmeyen"
},
@@ -259,7 +271,7 @@
"wanted": "İstendi",
"missing": "Eksik",
"queued": "Kuyrukta",
"movies": "Filmler",
"movies": "Film",
"queue": "Kuyruk",
"unknown": "Bilinmeyen"
},
@@ -282,17 +294,13 @@
"approved": "Onaylı",
"available": "Kullanılabilir"
},
"jellyseerr": {
"pending": "Bekleyen",
"approved": "Onaylı",
"available": "Uygun",
"issues": "Open Issues"
},
"overseerr": {
"seerr": {
"pending": "Pending",
"processing": "İşleniyor",
"approved": "Onaylı",
"available": "Uygun"
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"netalertx": {
"total": "Toplam",
@@ -307,7 +315,7 @@
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"queries": "Sorgular",
"blocked": "Engellenen",
"filtered": "Filtrelendi",
"latency": "Gecikme"
@@ -448,9 +456,9 @@
},
"glances": {
"cpu": "İşlemci",
"load": "Load",
"load": "Yük",
"wait": "Lütfen bekleyin",
"temp": "TEMP",
"temp": "Sıcaklık",
"_temp": "Sıcaklık",
"warn": "Uyarı",
"uptime": "ÇALIŞIYOR",
@@ -463,7 +471,7 @@
"read": "Okundu",
"write": "Yazma",
"gpu": "GPU",
"mem": "Hafıza",
"mem": "Bellek",
"swap": "Swap"
},
"quicklaunch": {
@@ -543,7 +551,7 @@
"up": "Çalışıyor",
"pending": "Bekleyen",
"down": "Çalışmayan",
"ok": "Ok"
"ok": "Tamam"
},
"healthchecks": {
"new": "Yeni",
@@ -598,7 +606,7 @@
"signalStrength": "Sağlamlık",
"signalQuality": "Kalite",
"symbolQuality": "Kalite",
"networkRate": "Bit Oranı",
"networkRate": "Bit Hızı",
"clientIP": "Alıcı"
},
"scrutiny": {
@@ -611,13 +619,13 @@
"total": "Toplam"
},
"pangolin": {
"orgs": "Orgs",
"sites": "Sites",
"resources": "Resources",
"targets": "Targets",
"traffic": "Traffic",
"in": "In",
"out": "Out"
"orgs": "Kuruluşlar",
"sites": "Siteler",
"resources": "Kaynaklar",
"targets": "Hedefler",
"traffic": "Trafik",
"in": "Gelen",
"out": "Giden"
},
"peanut": {
"battery_charge": "Pil Yüzdesi",
@@ -676,7 +684,7 @@
"wanStatus": "WAN Durumu",
"up": "Çalışıyor",
"down": "Çalışmayan",
"temp": "Temp",
"temp": "Sıcaklık",
"disk": "Disk Kullanımı",
"wanIP": "WAN IP"
},
@@ -697,7 +705,7 @@
"down": "Çalışmayan site",
"uptime": "Çalışma süresi",
"incident": "Olay",
"m": "m"
"m": "dk"
},
"atsumeru": {
"series": "Diziler",
@@ -716,8 +724,8 @@
"volumeAvailable": "Uygun"
},
"dispatcharr": {
"channels": "Channels",
"streams": "Streams"
"channels": "Kanallar",
"streams": "Akışlar"
},
"mylar": {
"series": "Diziler",
@@ -771,12 +779,12 @@
"nodes": "Düğümler"
},
"prometheus": {
"targets_up": "Hedef Çalışıyor",
"targets_up": "Çalışan Hedef",
"targets_down": "Çalışmayan hedef",
"targets_total": "Toplam Hedef"
},
"gatus": {
"up": "Sites Up",
"up": "Çalışan Siteler",
"down": "Çalışmayan site",
"uptime": "Çalışma süresi"
},
@@ -784,7 +792,7 @@
"gross_percent_today": "Bugün",
"gross_percent_1y": "Bir yıl",
"gross_percent_max": "Tüm zaman",
"net_worth": "Net Worth"
"net_worth": "Net Değer"
},
"audiobookshelf": {
"podcasts": "Podcast",
@@ -805,13 +813,13 @@
"books": "Kitaplar",
"authors": "Yazarlar",
"categories": "Kategoriler",
"series": "Seriler"
"series": "Diziler"
},
"booklore": {
"libraries": "Libraries",
"books": "Books",
"reading": "Reading",
"finished": "Finished"
"libraries": "Kütüphaneler",
"books": "Kitaplar",
"reading": "Okunuyor",
"finished": "Bitti"
},
"jdownloader": {
"downloadCount": "Kuyruk",
@@ -820,7 +828,7 @@
"downloadSpeed": "Hız"
},
"kavita": {
"seriesCount": "Seriler",
"seriesCount": "Diziler",
"totalFiles": "Dosyalar"
},
"azuredevops": {
@@ -865,7 +873,7 @@
"total": "Toplam",
"running": "Çalışıyor",
"stopped": "Durdu",
"passed": "Passed",
"passed": "Başarılı",
"failed": "Başarısız"
},
"openwrt": {
@@ -874,7 +882,7 @@
"up": "Çalışıyor",
"down": "Çalışmayan",
"bytesTx": "İletilen",
"bytesRx": "Received"
"bytesRx": "Alınan"
},
"uptimerobot": {
"status": "Durum",
@@ -924,7 +932,7 @@
},
"gitea": {
"notifications": "Bildirimler",
"issues": "Issues",
"issues": "Sorunlar",
"pulls": "Değişiklik İstekleri",
"repositories": "Depolar"
},
@@ -1006,21 +1014,21 @@
"lubelogger": {
"vehicle": "Taşıt",
"vehicles": "Taşıtlar",
"serviceRecords": "Service Records",
"serviceRecords": "Servis Kayıtları",
"reminders": "Hatırlatıcılar",
"nextReminder": "Sonraki hatırlatıcı",
"none": "None"
"none": "Hiçbiri"
},
"vikunja": {
"projects": "Etkin projeler",
"tasks7d": "Bitişi Bu Hafta Olan Görevler",
"tasksOverdue": "Overdue Tasks",
"tasksInProgress": "Tasks In Progress"
"tasksOverdue": "Gecikmiş Görevler",
"tasksInProgress": "Devam Eden Görevler"
},
"headscale": {
"name": "Ad",
"address": "Adres",
"last_seen": "Last Seen",
"last_seen": "Son Görülme",
"status": "Durum",
"online": "Çevrimiçi",
"offline": "Çevrimdışı"
@@ -1031,21 +1039,21 @@
"up": "Çalışıyor",
"down": "Çalışmayan",
"paused": "Durduruldu",
"pending": "Pending",
"pending": "Beklemede",
"status": "Durum",
"updated": "Güncellendi",
"cpu": "İşlemci",
"memory": "Bellek",
"disk": "Disk",
"disk": "Depolama",
"network": "NET"
},
"argocd": {
"apps": "Uygulamalar",
"synced": "Synced",
"outOfSync": "Out Of Sync",
"synced": "Senkron",
"outOfSync": "Senkron Değil",
"healthy": "Sağlıklı",
"degraded": "Degraded",
"progressing": "Progressing",
"degraded": "Sorunlu",
"progressing": "Uygulanıyor",
"missing": "Eksik",
"suspended": "Askıya Alındı"
},
@@ -1053,22 +1061,22 @@
"loading": "Yükleniyor"
},
"gitlab": {
"groups": "Groups",
"issues": "Issues",
"merges": "Merge Requests",
"projects": "Projects"
"groups": "Gruplar",
"issues": "Sorunlar",
"merges": "Birleştirme İstekleri",
"projects": "Projeler"
},
"apcups": {
"status": "Durum",
"load": "Load",
"bcharge": "Battery Charge",
"load": "Yük",
"bcharge": "Pil Yüzdesi",
"timeleft": "Kalan zaman"
},
"karakeep": {
"bookmarks": "Yer imleri",
"favorites": "Gözdeler",
"archived": "Archived",
"highlights": "Highlights",
"archived": "Arşivlenen",
"highlights": "Öne Çıkanlar",
"lists": "Listeler",
"tags": "Etiketler"
},
@@ -1084,14 +1092,14 @@
"sharedFiles": "Dosyalar"
},
"jellystat": {
"songs": "Şarkılar",
"movies": "Filmler",
"episodes": "Bölümler",
"songs": "Şarkı",
"movies": "Film",
"episodes": "Bölüm",
"other": "Diğer"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
"serviceErrors": "Hizmet Sorunları",
"hostErrors": "Sunucu Sorunları"
},
"komodo": {
"total": "Toplam",
@@ -1101,8 +1109,8 @@
"unhealthy": "Sağlıksız",
"unknown": "Bilinmeyen",
"servers": "Sunucular",
"stacks": "Stacks",
"containers": "Containers"
"stacks": "Yığınlar",
"containers": "Konteynerler"
},
"filebrowser": {
"available": "Uygun",
@@ -1120,11 +1128,11 @@
"STARTED": "Başladı",
"STOPPED": "Durdu",
"NEW_ARRAY": "Yeni dizi",
"RECON_DISK": "Reconstructing Disk",
"RECON_DISK": "Disk Yeniden Oluşturuluyor",
"DISABLE_DISK": "Disk devre dışı",
"SWAP_DSBL": "Swap devre dışı",
"INVALID_EXPANSION": "Invalid Expansion",
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
"INVALID_EXPANSION": "Geçersiz Genişletme",
"PARITY_NOT_BIGGEST": "Parity En Büyük Disk Değil",
"TOO_MANY_MISSING_DISKS": "Çok fazla disk eksik",
"NEW_DISK_TOO_SMALL": "Yeni disk çok küçük",
"NO_DATA_DISKS": "Veri diski yok",
@@ -1139,37 +1147,43 @@
"poolFree": "{{pool}} boş"
},
"backrest": {
"num_plans": "Plans",
"num_success_30": "Successes",
"num_failure_30": "Failures",
"num_success_latest": "Succeeding",
"num_failure_latest": "Failing",
"bytes_added_30": "Bytes Added"
"num_plans": "Planlar",
"num_success_30": "Başarılılar",
"num_failure_30": "Başarısızlıklar",
"num_success_latest": "Başarılı",
"num_failure_latest": "Başarısız",
"bytes_added_30": "Eklenen Veri"
},
"yourspotify": {
"songs": "Songs",
"time": "Time",
"artists": "Artists"
"songs": "Şarkılar",
"time": "Zaman",
"artists": "Sanatçılar"
},
"arcane": {
"containers": "Containers",
"images": "Images",
"image_updates": "Image Updates",
"images_unused": "Unused",
"environment_required": "Environment ID Required"
"containers": "Konteynerler",
"images": "İmajlar",
"image_updates": "İmaj Güncellemeleri",
"images_unused": "Kullanılmayan İmajlar",
"environment_required": "Ortam Kimliği Gerekli"
},
"dockhand": {
"running": "Running",
"stopped": "Stopped",
"cpu": "CPU",
"memory": "Memory",
"images": "Images",
"volumes": "Volumes",
"events_today": "Events Today",
"pending_updates": "Pending Updates",
"stacks": "Stacks",
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
"running": "Çalışan",
"stopped": "Durdurulan",
"cpu": "İşlemci",
"memory": "Bellek",
"images": "İmajlar",
"volumes": "Birimler",
"events_today": "Bugünkü Olaylar",
"pending_updates": "Bekleyen Güncellemeler",
"stacks": "Yığınlar",
"paused": "Duraklatılan",
"total": "Toplam",
"environment_not_found": "Ortam Bulunamadı"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Будь ласка, зачекайте",
"empty_data": "Статус підсистеми невідомий"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "Немає активних потоків",
"plex_connection_error": "Перевірте з'єднання Plex"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Підключені точки доступу",
"activeUser": "Активні пристрої",
@@ -282,17 +294,13 @@
"approved": "Затверджено",
"available": "Доступно"
},
"jellyseerr": {
"pending": "Очікує",
"approved": "Схвалено",
"available": "Доступно",
"issues": "Проблеми до усунення"
},
"overseerr": {
"pending": "Очікує",
"processing": "Обробка",
"approved": "Схвалено",
"available": "Доступно"
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"netalertx": {
"total": "Усього",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Vui lòng chờ",
"empty_data": "Trạng thái hệ thống phụ không xác định"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "RX",
"tx": "TX",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
@@ -282,17 +294,13 @@
"approved": "Đã duyệt",
"available": "Available"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"completed": "Completed",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
"issues": "Open Issues"
},
"netalertx": {
"total": "Total",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "子系統狀態未知"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "接收",
"tx": "發送",
@@ -108,14 +113,14 @@
"songs": "曲目"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "正在播放",
"transcoding": "轉碼",
"bitrate": "位元率",
"no_active": "無播放活動",
"movies": "電影",
"series": "系列",
"episodes": "劇集",
"songs": "曲目"
},
"esphome": {
"offline": "Offline",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "檢查Plex的連接狀態"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "已連接的存取點",
"activeUser": "在線裝置",
@@ -282,18 +294,14 @@
"approved": "批准",
"available": "可用"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "處理中",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -318,9 +326,9 @@
"ping": "Ping"
},
"portainer": {
"running": "Running",
"running": "執行中",
"stopped": "暫停",
"total": "Total"
"total": "全部"
},
"suwayomi": {
"download": "Downloaded",
@@ -383,7 +391,7 @@
"npm": {
"enabled": "啟用",
"disabled": "停用咗",
"total": "Total"
"total": "全部"
},
"coinmarketcap": {
"configure": "配置一個或多個加密貨幣以進行跟蹤",
@@ -448,19 +456,19 @@
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"temp": "TEMP",
"load": "負載",
"wait": "請稍候",
"temp": "溫度",
"_temp": "溫度",
"warn": "警告",
"uptime": "UP",
"total": "Total",
"free": "Free",
"used": "Used",
"days": "d",
"hours": "h",
"uptime": "運作時間",
"total": "全部",
"free": "剩餘",
"used": "已使用",
"days": "",
"hours": "",
"crit": "重大的",
"read": "Read",
"read": "已讀",
"write": "寫入",
"gpu": "GPU",
"mem": "記憶體",
@@ -1084,10 +1092,10 @@
"sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
"songs": "曲目",
"movies": "電影",
"episodes": "劇集",
"other": "其它"
},
"checkmk": {
"serviceErrors": "Service issues",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -61,11 +61,16 @@
"wlan_devices": "无线局域网设备",
"lan_users": "局域网用户",
"wlan_users": "无线局域网用户",
"up": "UP",
"up": "在线",
"down": "离线",
"wait": "请稍候",
"empty_data": "子系统状态未知"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "接收",
"tx": "发送",
@@ -108,21 +113,21 @@
"songs": "歌曲"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "播放中",
"transcoding": "转码",
"bitrate": "比特率",
"no_active": "暂无播放",
"movies": "电影",
"series": "系列",
"episodes": "剧集",
"songs": "歌曲"
},
"esphome": {
"offline": "离线",
"offline_alt": "离线",
"online": "在线的",
"total": "Total",
"unknown": "Unknown"
"total": "总计",
"unknown": "未知"
},
"evcc": {
"pv_power": "正式环境",
@@ -143,7 +148,7 @@
"unread": "未读"
},
"fritzbox": {
"connectionStatus": "Status",
"connectionStatus": "状态",
"connectionStatusUnconfigured": "未配置",
"connectionStatusConnecting": "连接中",
"connectionStatusAuthenticating": "认证中",
@@ -151,11 +156,11 @@
"connectionStatusDisconnecting": "正在断开连接",
"connectionStatusDisconnected": "未连接",
"connectionStatusConnected": "已连接",
"uptime": "Uptime",
"uptime": "运行时间",
"maxDown": "最大下载速度",
"maxUp": "最大上传速度",
"down": "Down",
"up": "Up",
"down": "离线",
"up": "在线",
"received": "已接收",
"sent": "已发送",
"externalIPAddress": "外部IP",
@@ -178,17 +183,24 @@
"passes": "通行证"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"playing": "播放中",
"transcoding": "转码",
"bitrate": "比特率",
"no_active": "暂无播放",
"plex_connection_error": "Check Plex Connection"
},
"tracearr": {
"no_active": "暂无播放",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "比特率"
},
"omada": {
"connectedAp": "连接中的AP",
"activeUser": "活跃设备",
"alerts": "警报",
"connectedGateways": "Connected gateways",
"connectedGateways": "已连接网关",
"connectedSwitches": "已连接开关"
},
"nzbget": {
@@ -203,13 +215,13 @@
"tv": "电视节目"
},
"sabnzbd": {
"rate": "Rate",
"rate": "速率",
"queue": "队列",
"timeleft": "剩余时间"
},
"rutorrent": {
"active": "活动中",
"upload": "Upload",
"upload": "上传",
"download": "下载"
},
"transmission": {
@@ -226,7 +238,7 @@
},
"qnap": {
"cpuUsage": "处理器",
"memUsage": "内存",
"memUsage": "内存使用",
"systemTempC": "系统温度",
"poolUsage": "存储池",
"volumeUsage": "Volume Usage",
@@ -245,7 +257,7 @@
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"leech": "",
"seed": "做种"
},
"sonarr": {
@@ -282,18 +294,14 @@
"approved": "已批准",
"available": "可用"
},
"jellyseerr": {
"pending": "待办的",
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "处理中",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -318,9 +326,9 @@
"ping": "Ping"
},
"portainer": {
"running": "Running",
"running": "运行中",
"stopped": "停止",
"total": "Total"
"total": "总计"
},
"suwayomi": {
"download": "Downloaded",
@@ -377,13 +385,13 @@
"unknown": "未知"
},
"navidrome": {
"nothing_streaming": "",
"nothing_streaming": "暂无播放",
"please_wait": "请等待"
},
"npm": {
"enabled": "已启用",
"disabled": "禁用",
"total": "Total"
"total": "总计"
},
"coinmarketcap": {
"configure": "配置一个或多个需要追踪的加密",
@@ -406,7 +414,7 @@
},
"jackett": {
"configured": "已配置",
"errored": "Errored"
"errored": "出错"
},
"strelaysrv": {
"numActiveSessions": "会话",
@@ -420,7 +428,7 @@
"domain_count": "域"
},
"medusa": {
"wanted": "Wanted",
"wanted": "",
"queued": "Queued",
"series": "Series"
},
@@ -441,7 +449,7 @@
"failedLoginsLast24H": "登录失败 (24h)"
},
"proxmox": {
"mem": "MEM",
"mem": "内存",
"cpu": "CPU",
"lxc": "容器",
"vms": "虚拟机"
@@ -450,7 +458,7 @@
"cpu": "CPU",
"load": "负载",
"wait": "请稍候",
"temp": "温度",
"temp": "转速",
"_temp": "Temp",
"warn": "Warn",
"uptime": "运行时间",
@@ -460,7 +468,7 @@
"days": "日",
"hours": "时",
"crit": "Crit",
"read": "Read",
"read": "读取",
"write": "写入",
"gpu": "GPU",
"mem": "Mem",
@@ -481,57 +489,57 @@
"1-day": "主要是晴天",
"1-night": "大部晴朗",
"2-day": "多云",
"2-night": "Partly Cloudy",
"2-night": "多云",
"3-day": "阴天",
"3-night": "Cloudy",
"3-night": "阴天",
"45-day": "有雾",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"45-night": "",
"48-day": "",
"48-night": "",
"51-day": "小雨",
"51-night": "Light Drizzle",
"51-night": "小细雨",
"53-day": "小雨",
"53-night": "Drizzle",
"53-night": "细雨",
"55-day": "毛毛雨",
"55-night": "Heavy Drizzle",
"55-night": "大细雨",
"56-day": "小冻毛雨",
"56-night": "Light Freezing Drizzle",
"56-night": "小冻毛雨",
"57-day": "冻毛雨",
"57-night": "Freezing Drizzle",
"57-night": "冻毛雨",
"61-day": "小雨",
"61-night": "Light Rain",
"61-night": "小雨",
"63-day": "雨",
"63-night": "Rain",
"63-night": "雨天",
"65-day": "大雨",
"65-night": "Heavy Rain",
"65-night": "大雨",
"66-day": "冻雨",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"66-night": "冻雨",
"67-day": "冻雨",
"67-night": "冻雨",
"71-day": "小雪",
"71-night": "Light Snow",
"71-night": "小雪",
"73-day": "中雪",
"73-night": "Snow",
"73-night": "中雪",
"75-day": "大雪",
"75-night": "Heavy Snow",
"75-night": "大雪",
"77-day": "雪粒",
"77-night": "Snow Grains",
"77-night": "雪粒",
"80-day": "微阵雨",
"80-night": "Light Showers",
"80-night": "小阵雨",
"81-day": "阵雨",
"81-night": "Showers",
"81-night": "阵雨",
"82-day": "强阵雨",
"82-night": "Heavy Showers",
"82-night": "强阵雨",
"85-day": "阵雪",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"85-night": "阵雪",
"86-day": "阵雪",
"86-night": "阵雪",
"95-day": "雷雨",
"95-night": "Thunderstorm",
"95-night": "雷雨",
"96-day": "雷雨伴随冰雹",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"96-night": "雷雨伴随冰雹",
"99-day": "雷雨伴随冰雹",
"99-night": "雷雨伴随冰雹"
},
"homebridge": {
"available_update": "System",
@@ -687,9 +695,9 @@
"memory_usage": "内存"
},
"immich": {
"users": "Users",
"users": "用户",
"photos": "照片",
"videos": "Videos",
"videos": "影片",
"storage": "储存空间"
},
"uptimekuma": {
@@ -987,8 +995,8 @@
},
"frigate": {
"cameras": "摄像头",
"uptime": "Uptime",
"version": "Version"
"uptime": "运行时间",
"version": "版本"
},
"linkwarden": {
"links": "链接",
@@ -1035,7 +1043,7 @@
"status": "Status",
"updated": "Updated",
"cpu": "CPU",
"memory": "MEM",
"memory": "内存",
"disk": "磁盘",
"network": "网络"
},
@@ -1059,10 +1067,10 @@
"projects": "项目"
},
"apcups": {
"status": "Status",
"load": "Load",
"bcharge": "Battery Charge",
"timeleft": "Time Left"
"status": "状态",
"load": "负载",
"bcharge": "电池电量",
"timeleft": "剩余供电时间"
},
"karakeep": {
"bookmarks": "书签",
@@ -1084,9 +1092,9 @@
"sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"songs": "歌曲",
"movies": "电影",
"episodes": "剧集",
"other": "其他"
},
"checkmk": {
@@ -1131,8 +1139,8 @@
"notifications": "Notifications",
"status": "Status",
"cpu": "CPU",
"memoryUsed": "Memory Used",
"memoryAvailable": "Memory Available",
"memoryUsed": "已用内存",
"memoryAvailable": "可用内存",
"arrayUsed": "Array Used",
"arrayFree": "Array Free",
"poolUsed": "{{pool}} Used",
@@ -1159,11 +1167,11 @@
"environment_required": "Environment ID Required"
},
"dockhand": {
"running": "Running",
"stopped": "Stopped",
"running": "运行中",
"stopped": "停止",
"cpu": "CPU",
"memory": "Memory",
"images": "Images",
"memory": "内存",
"images": "图片",
"volumes": "Volumes",
"events_today": "Events Today",
"pending_updates": "Pending Updates",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

View File

@@ -66,6 +66,11 @@
"wait": "Please wait",
"empty_data": "子系統狀態未知"
},
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": {
"rx": "接收",
"tx": "傳送",
@@ -108,14 +113,14 @@
"songs": "曲目"
},
"jellyfin": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"playing": "正在播放",
"transcoding": "轉碼",
"bitrate": "位元率",
"no_active": "無播放活動",
"movies": "電影",
"series": "系列",
"episodes": "劇集",
"songs": "曲目"
},
"esphome": {
"offline": "Offline",
@@ -184,6 +189,13 @@
"no_active": "No Active Streams",
"plex_connection_error": "檢查Plex的連線狀態"
},
"tracearr": {
"no_active": "No Active Streams",
"streams": "Streams",
"transcodes": "Transcodes",
"directplay": "Direct Play",
"bitrate": "Bitrate"
},
"omada": {
"connectedAp": "已連線的無線網路",
"activeUser": "上線裝置",
@@ -282,18 +294,14 @@
"approved": "已核准",
"available": "可觀看"
},
"jellyseerr": {
"seerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"completed": "Completed",
"processing": "Processing",
"issues": "Open Issues"
},
"overseerr": {
"pending": "Pending",
"processing": "處理中",
"approved": "Approved",
"available": "Available"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
@@ -318,9 +326,9 @@
"ping": "Ping"
},
"portainer": {
"running": "Running",
"running": "執行中",
"stopped": "已停止",
"total": "Total"
"total": "全部"
},
"suwayomi": {
"download": "Downloaded",
@@ -383,7 +391,7 @@
"npm": {
"enabled": "已啟用",
"disabled": "已停用",
"total": "Total"
"total": "全部"
},
"coinmarketcap": {
"configure": "請設定一個或多個欲追蹤的加密貨幣",
@@ -448,19 +456,19 @@
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"temp": "TEMP",
"load": "負載",
"wait": "請稍候",
"temp": "溫度",
"_temp": "溫度",
"warn": "警告",
"uptime": "UP",
"total": "Total",
"free": "Free",
"used": "Used",
"days": "d",
"hours": "h",
"uptime": "運作時間",
"total": "全部",
"free": "剩餘",
"used": "已使用",
"days": "",
"hours": "",
"crit": "重大的",
"read": "Read",
"read": "已讀",
"write": "寫入",
"gpu": "GPU",
"mem": "記憶體",
@@ -1084,10 +1092,10 @@
"sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
"songs": "曲目",
"movies": "電影",
"episodes": "劇集",
"other": "其它"
},
"checkmk": {
"serviceErrors": "Service issues",
@@ -1171,5 +1179,11 @@
"paused": "Paused",
"total": "Total",
"environment_not_found": "Environment Not Found"
},
"sparkyfitness": {
"eaten": "Eaten",
"burned": "Burned",
"remaining": "Remaining",
"steps": "Steps"
}
}

8
pyproject.toml Normal file
View File

@@ -0,0 +1,8 @@
[project]
name = "homepage-docs"
version = "1.0.0"
description = "Documentation for the Homepage project"
requires-python = ">=3.13"
dependencies = [
"zensical>=0.0.21",
]

View File

@@ -1,47 +0,0 @@
Babel==2.12.1
backrefs==5.9
cairocffi==1.7.1
CairoSVG==2.7.1
certifi==2023.7.22
cffi==1.17.1
cfgv==3.4.0
charset-normalizer==3.2.0
click==8.1.7
colorama==0.4.6
cssselect2==0.7.0
defusedxml==0.7.1
distlib==0.3.9
filelock==3.17.0
ghp-import==2.1.0
identify==2.6.7
idna==3.4
Jinja2==3.1.2
Markdown==3.4.4
MarkupSafe==2.1.3
mergedeep==1.3.4
mkdocs==1.6.0
mkdocs-get-deps==0.2.0
mkdocs-material==9.6.18
mkdocs-material-extensions==1.3.1
mkdocs-redirects==1.2.1
nodeenv==1.9.1
packaging==23.1
paginate==0.5.6
pathspec==0.11.2
pillow==10.4.0
platformdirs==3.10.0
pre-commit==3.5.0
pycparser==2.22
Pygments==2.16.1
pymdown-extensions==10.3
python-dateutil==2.8.2
PyYAML==6.0.1
pyyaml_env_tag==0.1
regex==2023.8.8
requests==2.31.0
six==1.16.0
tinycss2==1.4.0
urllib3==2.0.5
virtualenv==20.29.2
watchdog==3.0.0
webencodings==0.5.1

View File

@@ -344,4 +344,17 @@ describe("pages/api/services/proxy", () => {
expect(res.statusCode).toBe(500);
expect(res.body).toEqual({ error: "Unexpected error" });
});
it("returns 500 when an async proxy handler throws", async () => {
getServiceWidget.mockResolvedValue({ type: "linkwarden" });
handlerFn.handler.mockRejectedValueOnce(new Error("proxy boom"));
const req = { method: "GET", query: { group: "g", service: "s", index: "0" } };
const res = createMockRes();
await servicesProxy(req, res);
expect(res.statusCode).toBe(500);
expect(res.body).toEqual({ error: "Unexpected error" });
});
});

View File

@@ -90,17 +90,74 @@ describe("pages/api/widgets/resources", () => {
});
it("returns 404 when requested network interface does not exist", async () => {
si.networkStats.mockResolvedValueOnce([{ iface: "en0" }]);
si.networkStats.mockResolvedValueOnce([{ iface: "en0" }]).mockResolvedValueOnce([
{
iface: "missing",
operstate: "unknown",
rx_bytes: 0,
rx_dropped: 0,
rx_errors: 0,
tx_bytes: 0,
tx_dropped: 0,
tx_errors: 0,
rx_sec: null,
tx_sec: null,
ms: 0,
},
]);
const req = { query: { type: "network", interfaceName: "missing" } };
const res = createMockRes();
await handler(req, res);
expect(si.networkStats).toHaveBeenNthCalledWith(1, "*");
expect(si.networkStats).toHaveBeenNthCalledWith(2, "missing");
expect(res.statusCode).toBe(404);
expect(res.body).toEqual({ error: "Interface not found" });
});
it("falls back to direct named interface query when wildcard enumeration misses it", async () => {
si.networkStats.mockResolvedValueOnce([{ iface: "eth0", rx_bytes: 1 }]).mockResolvedValueOnce([
{
iface: "eno1",
operstate: "up",
rx_bytes: 1000,
rx_dropped: 0,
rx_errors: 0,
tx_bytes: 500,
tx_dropped: 0,
tx_errors: 0,
rx_sec: null,
tx_sec: null,
ms: 0,
},
]);
const req = { query: { type: "network", interfaceName: "eno1" } };
const res = createMockRes();
await handler(req, res);
expect(si.networkStats).toHaveBeenNthCalledWith(1, "*");
expect(si.networkStats).toHaveBeenNthCalledWith(2, "eno1");
expect(res.statusCode).toBe(200);
expect(res.body.interface).toBe("eno1");
expect(res.body.network).toEqual({
iface: "eno1",
operstate: "up",
rx_bytes: 1000,
rx_dropped: 0,
rx_errors: 0,
tx_bytes: 500,
tx_dropped: 0,
tx_errors: 0,
rx_sec: null,
tx_sec: null,
ms: 0,
});
});
it("returns default interface network stats", async () => {
si.networkStats.mockResolvedValueOnce([{ iface: "en0", rx_bytes: 1 }]);
si.networkInterfaceDefault.mockResolvedValueOnce("en0");

View File

@@ -339,7 +339,7 @@ describe("pages/index Index routing + SWR branches", () => {
localStorage.setItem("hash", "old-hash");
const fetchSpy = vi.fn(async () => ({ ok: true }));
// eslint-disable-next-line no-global-assign
fetch = fetchSpy;
let reloadSpy;

View File

@@ -277,7 +277,7 @@ describe("components/quicklaunch", () => {
const fetchSpy = vi.fn(async () => ({
json: async () => ["test", ["test 1", "test 2", "test 3", "test 4", "test 5"]],
}));
// eslint-disable-next-line no-global-assign
fetch = fetchSpy;
renderWithProviders(<Wrapper />, {
@@ -315,7 +315,6 @@ describe("components/quicklaunch", () => {
expect(input).toHaveValue("test 1");
// eslint-disable-next-line no-global-assign
fetch = originalFetch;
});

View File

@@ -1,6 +1,6 @@
// @vitest-environment jsdom
import { fireEvent, screen } from "@testing-library/react";
import { act, fireEvent, screen } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { renderWithProviders } from "test-utils/render-with-providers";
@@ -188,7 +188,9 @@ describe("components/services/item", () => {
// Still rendered while the close animation runs.
expect(screen.getByTestId("docker-widget")).toBeInTheDocument();
await vi.advanceTimersByTimeAsync(300);
act(() => {
vi.advanceTimersByTime(300);
});
expect(screen.queryByTestId("docker-widget")).not.toBeInTheDocument();
vi.useRealTimers();

View File

@@ -6,7 +6,7 @@ import { BlockHighlightContext } from "./highlight-context";
import { evaluateHighlight, getHighlightClass } from "utils/highlights";
export default function Block({ value, label, field }) {
export default function Block({ value, highlightValue, label, field }) {
const { t } = useTranslation();
const highlightConfig = useContext(BlockHighlightContext);
@@ -20,12 +20,12 @@ export default function Block({ value, label, field }) {
}
for (const candidate of candidates) {
const result = evaluateHighlight(candidate, value, highlightConfig);
const result = evaluateHighlight(candidate, highlightValue ?? value, highlightConfig);
if (result) return result;
}
return null;
}, [field, label, value, highlightConfig]);
}, [field, label, value, highlightValue, highlightConfig]);
const highlightClass = useMemo(() => {
if (!highlight?.level) return undefined;

View File

@@ -38,4 +38,27 @@ describe("components/services/widget/block", () => {
expect(el.getAttribute("data-highlight-level")).toBe("danger");
expect(el.className).toContain("danger-class");
});
it("prefers highlightValue over the rendered value for numeric highlighting", () => {
const highlightConfig = {
levels: { warn: "warn-class" },
fields: {
foo: {
numeric: { when: "gt", value: 5, level: "warn" },
},
},
};
const { container } = renderWithProviders(
<BlockHighlightContext.Provider value={highlightConfig}>
<Block label="foo.label" field="foo" value="5.791 ms" highlightValue={5.791} />
</BlockHighlightContext.Provider>,
{ settings: {} },
);
const el = container.querySelector(".service-block");
expect(el).not.toBeNull();
expect(el.getAttribute("data-highlight-level")).toBe("warn");
expect(el.className).toContain("warn-class");
});
});

View File

@@ -9,6 +9,8 @@ import { buildHighlightConfig } from "utils/highlights";
const ALIASED_WIDGETS = {
pialert: "netalertx",
hoarder: "karakeep",
jellyseerr: "seerr",
overseerr: "seerr",
};
export default function Container({ error = false, children, service }) {

View File

@@ -58,6 +58,26 @@ describe("components/services/widget/container", () => {
expect(screen.getByTestId("karakeep.count")).toBeInTheDocument();
});
it("supports seerr aliases when filtering (jellyseerr/overseerr -> seerr)", () => {
renderWithProviders(
<Container service={{ widget: { type: "jellyseerr", fields: ["pending"] } }}>
<Dummy label="seerr.pending" />
</Container>,
{ settings: {} },
);
expect(screen.getByTestId("seerr.pending")).toBeInTheDocument();
renderWithProviders(
<Container service={{ widget: { type: "overseerr", fields: ["processing"] } }}>
<Dummy label="seerr.processing" />
</Container>,
{ settings: {} },
);
expect(screen.getByTestId("seerr.processing")).toBeInTheDocument();
});
it("returns null when errors are hidden via settings.hideErrors", () => {
const { container } = renderWithProviders(
<Container error="nope" service={{ widget: { type: "omada", hide_errors: false } }}>

View File

@@ -1,6 +1,6 @@
// @vitest-environment jsdom
import { screen } from "@testing-library/react";
import { act, screen } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { renderWithProviders } from "test-utils/render-with-providers";
@@ -21,7 +21,9 @@ describe("components/widgets/datetime", () => {
// `render` wraps in `act`, so effects should flush synchronously.
expect(screen.getByText(expected0)).toBeInTheDocument();
await vi.advanceTimersByTimeAsync(1000);
act(() => {
vi.advanceTimersByTime(1000);
});
const expected1 = new Intl.DateTimeFormat("en-US", format).format(new Date());
expect(screen.getByText(expected1)).toBeInTheDocument();

View File

@@ -11,7 +11,7 @@ import Resource from "../widget/resource";
import Resources from "../widget/resources";
import WidgetLabel from "../widget/widget_label";
const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl"];
const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl", "Temperature"];
function convertToFahrenheit(t) {
return (t * 9) / 5 + 32;

View File

@@ -32,7 +32,13 @@ vi.mock("@headlessui/react", async () => {
const ctx = useContext(ListboxContext);
const content = typeof children === "function" ? children({ active: false }) : children;
return (
<div role="option" data-provider={value?.name} onClick={() => ctx?.onChange?.(value)} {...props}>
<div
role="option"
data-provider={value?.name}
aria-selected={ctx?.value === value}
onClick={() => ctx?.onChange?.(value)}
{...props}
>
{content}
</div>
);
@@ -166,7 +172,7 @@ describe("components/widgets/search", () => {
const fetchSpy = vi.fn(async () => ({
json: async () => ["hel", ["hello", "help", "helm", "helium", "held"]],
}));
// eslint-disable-next-line no-global-assign
fetch = fetchSpy;
renderWithProviders(<Search options={{ provider: ["google"], showSearchSuggestions: true, target: "_self" }} />, {
@@ -192,7 +198,7 @@ describe("components/widgets/search", () => {
expect(openSpy).toHaveBeenCalledWith("https://www.google.com/search?q=hello", "_self");
openSpy.mockRestore();
// eslint-disable-next-line no-global-assign
fetch = originalFetch;
});
});

View File

@@ -29,7 +29,7 @@ export default async function handler(req, res) {
if (serviceProxyHandler instanceof Function) {
// quick return for no endpoint services, calendar is an exception
if (!req.query.endpoint || serviceProxyHandler === calendarProxyHandler) {
return serviceProxyHandler(req, res);
return await serviceProxyHandler(req, res);
}
// map opaque endpoints to their actual endpoint
@@ -90,15 +90,15 @@ export default async function handler(req, res) {
}
if (endpointProxy instanceof Function) {
return endpointProxy(req, res, map);
return await endpointProxy(req, res, map);
}
return serviceProxyHandler(req, res, map);
return await serviceProxyHandler(req, res, map);
}
if (widget.allowedEndpoints instanceof RegExp) {
if (widget.allowedEndpoints.test(req.query.endpoint)) {
return serviceProxyHandler(req, res);
return await serviceProxyHandler(req, res);
}
}

View File

@@ -4,6 +4,21 @@ import createLogger from "utils/logger";
const logger = createLogger("resources");
function isMissingNetworkStat(networkData, interfaceName) {
return (
networkData.operstate === "unknown" &&
networkData.rx_bytes === 0 &&
networkData.rx_dropped === 0 &&
networkData.rx_errors === 0 &&
networkData.tx_bytes === 0 &&
networkData.tx_dropped === 0 &&
networkData.tx_errors === 0 &&
networkData.rx_sec === null &&
networkData.tx_sec === null &&
networkData.ms === 0
);
}
export default async function handler(req, res) {
const { type, target, interfaceName = "default" } = req.query;
@@ -64,6 +79,17 @@ export default async function handler(req, res) {
logger.debug("networkData:", JSON.stringify(networkData));
if (interfaceName && interfaceName !== "default") {
networkData = networkData.filter((network) => network.iface === interfaceName).at(0);
if (!networkData) {
// Fallback for e.g. docker where networkStats("*") may not return stats for host interfaces
const directNetworkData = await si.networkStats(interfaceName);
logger.debug("directNetworkData:", JSON.stringify(directNetworkData));
networkData = Array.isArray(directNetworkData) ? directNetworkData.at(0) : null;
// si returns unknown + zeroes when interface truly does not exist
if (!networkData || isMissingNetworkStat(networkData, interfaceName)) {
networkData = null;
}
}
if (!networkData) {
return res.status(404).json({
error: "Interface not found",

View File

@@ -1,4 +1,12 @@
import { expect } from "vitest";
export function findServiceBlockByLabel(container, label) {
const blocks = Array.from(container.querySelectorAll(".service-block"));
return blocks.find((b) => b.textContent?.includes(label));
}
export function expectBlockValue(container, label, value) {
const block = findServiceBlockByLabel(container, label);
expect(block, `missing block for ${label}`).toBeTruthy();
expect(block.textContent).toContain(String(value));
}

View File

@@ -313,7 +313,7 @@ export function cleanServiceGroups(groups) {
enableNowPlaying,
enableMediaControl,
// emby, jellyfin, tautulli
// emby, jellyfin, tautulli, tracearr
enableUser,
expandOneStreamToTwoRows,
showEpisodeNumber,
@@ -542,12 +542,15 @@ export function cleanServiceGroups(groups) {
if (enableBlocks !== undefined) widget.enableBlocks = JSON.parse(enableBlocks);
if (enableNowPlaying !== undefined) widget.enableNowPlaying = JSON.parse(enableNowPlaying);
}
if (["emby", "jellyfin", "tautulli"].includes(type)) {
if (["emby", "jellyfin", "tautulli", "tracearr"].includes(type)) {
if (expandOneStreamToTwoRows !== undefined)
widget.expandOneStreamToTwoRows = !!JSON.parse(expandOneStreamToTwoRows);
if (showEpisodeNumber !== undefined) widget.showEpisodeNumber = !!JSON.parse(showEpisodeNumber);
if (enableUser !== undefined) widget.enableUser = !!JSON.parse(enableUser);
}
if (type === "tracearr") {
if (view !== undefined) widget.view = view;
}
if (["sonarr", "radarr"].includes(type)) {
if (enableQueue !== undefined) widget.enableQueue = JSON.parse(enableQueue);
}
@@ -616,7 +619,19 @@ export function cleanServiceGroups(groups) {
if (refreshInterval) widget.refreshInterval = refreshInterval;
}
if (type === "calendar") {
if (integrations) widget.integrations = integrations;
if (integrations) {
if (Array.isArray(integrations)) {
widget.integrations = integrations.map((integration) => {
if (!integration || typeof integration !== "object") {
return integration;
}
const { url, ...integrationWithoutUrl } = integration;
return integrationWithoutUrl;
});
} else {
widget.integrations = integrations;
}
}
if (firstDayInWeek) widget.firstDayInWeek = firstDayInWeek;
if (view) widget.view = view;
if (maxEvents) widget.maxEvents = maxEvents;

View File

@@ -312,6 +312,13 @@ describe("utils/config/service-helpers", () => {
{ type: "healthchecks", uuid: "u" },
{ type: "speedtest", bitratePrecision: "3", version: "1" },
{ type: "stocks", watchlist: "AAPL", showUSMarketStatus: true },
{
type: "tracearr",
expandOneStreamToTwoRows: "true",
showEpisodeNumber: "true",
enableUser: "true",
view: "both",
},
{ type: "wgeasy", threshold: "10", version: "1" },
{ type: "technitium", range: "24h" },
{ type: "lubelogger", vehicleID: "12" },
@@ -350,10 +357,59 @@ describe("utils/config/service-helpers", () => {
expect(widgets.find((w) => w.type === "speedtest")).toEqual(
expect.objectContaining({ bitratePrecision: 3, version: 1 }),
);
expect(widgets.find((w) => w.type === "tracearr")).toEqual(
expect.objectContaining({
expandOneStreamToTwoRows: true,
showEpisodeNumber: true,
enableUser: true,
view: "both",
}),
);
expect(widgets.find((w) => w.type === "jellystat")).toEqual(expect.objectContaining({ days: 7 }));
expect(widgets.find((w) => w.type === "lubelogger")).toEqual(expect.objectContaining({ vehicleID: 12 }));
});
it("cleanServiceGroups removes calendar integration urls from frontend widget payload", async () => {
const mod = await import("./service-helpers");
const { cleanServiceGroups } = mod;
const rawGroups = [
{
name: "Core",
services: [
{
name: "Calendar",
weight: 100,
widgets: [
{
type: "calendar",
integrations: [
{
type: "ical",
name: "EPL Fixtures",
url: "https://calendar.google.com/calendar/ical/example/public/basic.ics",
color: "purple",
},
],
},
],
},
],
groups: [],
},
];
const cleaned = cleanServiceGroups(rawGroups);
const calendarWidget = cleaned[0].services[0].widgets[0];
expect(calendarWidget.integrations).toEqual([
{
type: "ical",
name: "EPL Fixtures",
color: "purple",
},
]);
});
it("findGroupByName deep-searches and annotates parent", async () => {
const mod = await import("./service-helpers");
const { findGroupByName } = mod;

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