Compare commits

..

2 Commits

Author SHA1 Message Date
shamoon
b48d283dc2 Retry Omada login on HTML response; preserve cookies 2026-03-04 11:34:44 -08:00
shamoon
d313e0a124 Add some debug logging for omada 2026-03-02 09:22:39 -08:00
125 changed files with 2499 additions and 3922 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,18 +14,32 @@ permissions:
id-token: write id-token: write
jobs: 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: test:
name: Test Build Docs name: Test Build Docs
if: github.repository == 'gethomepage/homepage' && github.event_name == 'pull_request' if: github.repository == 'gethomepage/homepage' && github.event_name == 'pull_request'
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs:
- pre-commit
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/checkout@v6
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 - uses: actions/setup-python@v6
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@94527f2e458b27549849d47d273a16bec83a01e9 # v7 uses: astral-sh/setup-uv@v7
- run: sudo apt-get install pngquant - run: sudo apt-get install pngquant
- name: Test Docs Build - name: Test Docs Build
run: uv run --frozen zensical build --clean run: uv run --frozen zensical build --clean
@@ -36,19 +50,21 @@ jobs:
environment: environment:
name: github-pages name: github-pages
url: ${{ steps.deployment.outputs.page_url }} url: ${{ steps.deployment.outputs.page_url }}
needs:
- pre-commit
steps: steps:
- uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 - uses: actions/configure-pages@v5
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/checkout@v6
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 - uses: actions/setup-python@v6
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@94527f2e458b27549849d47d273a16bec83a01e9 # v7 uses: astral-sh/setup-uv@v7
- run: sudo apt-get install pngquant - run: sudo apt-get install pngquant
- name: Build Docs - name: Build Docs
run: uv run --frozen zensical build --clean run: uv run --frozen zensical build --clean
- uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4 - uses: actions/upload-pages-artifact@v4
with: with:
path: site path: site
- uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 - uses: actions/deploy-pages@v4
id: deployment id: deployment

View File

@@ -1,41 +0,0 @@
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

View File

@@ -1,18 +0,0 @@
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: action:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: dessant/reaction-comments@e86d247c12bd5c043eec379a1a4453f20cadf913 # v4 - uses: dessant/reaction-comments@v4

View File

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

View File

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

1
.vscode/launch.json vendored
View File

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

21
.vscode/tasks.json vendored
View File

@@ -1,21 +0,0 @@
{
"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

@@ -27,6 +27,13 @@
<a href="https://paypal.me/phelpsben" title="Donate"><img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/benphelps"></a> <a href="https://paypal.me/phelpsben" title="Donate"><img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/benphelps"></a>
</p> </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 # 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. 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.

View File

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

View File

@@ -1,24 +0,0 @@
---
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`. Set the `mode` in the `kubernetes.yaml` to `cluster`.
```yaml ```yaml
mode: cluster mode: default
``` ```
To enable Kubernetes gateway-api compatibility, set `gateway` to `true`. To enable Kubernetes gateway-api compatibility, set `route` to `gateway`.
```yaml ```yaml
gateway: true route: gateway
``` ```
## Widgets ## Widgets

View File

@@ -171,7 +171,6 @@ nav:
- widgets/services/truenas.md - widgets/services/truenas.md
- widgets/services/tubearchivist.md - widgets/services/tubearchivist.md
- widgets/services/unifi-controller.md - widgets/services/unifi-controller.md
- widgets/services/unifi-drive.md
- widgets/services/unmanic.md - widgets/services/unmanic.md
- widgets/services/unraid.md - widgets/services/unraid.md
- widgets/services/uptime-kuma.md - widgets/services/uptime-kuma.md

View File

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

View File

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

1252
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -66,11 +66,6 @@
"wait": "Please wait", "wait": "Please wait",
"empty_data": "Subsystem status unknown" "empty_data": "Subsystem status unknown"
}, },
"unifi_drive": {
"healthy": "Healthy",
"degraded": "Degraded",
"no_data": "No storage data available"
},
"docker": { "docker": {
"rx": "RX", "rx": "RX",
"tx": "TX", "tx": "TX",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -38,27 +38,4 @@ describe("components/services/widget/block", () => {
expect(el.getAttribute("data-highlight-level")).toBe("danger"); expect(el.getAttribute("data-highlight-level")).toBe("danger");
expect(el.className).toContain("danger-class"); 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

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

View File

@@ -619,19 +619,7 @@ export function cleanServiceGroups(groups) {
if (refreshInterval) widget.refreshInterval = refreshInterval; if (refreshInterval) widget.refreshInterval = refreshInterval;
} }
if (type === "calendar") { if (type === "calendar") {
if (integrations) { if (integrations) widget.integrations = 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 (firstDayInWeek) widget.firstDayInWeek = firstDayInWeek;
if (view) widget.view = view; if (view) widget.view = view;
if (maxEvents) widget.maxEvents = maxEvents; if (maxEvents) widget.maxEvents = maxEvents;

View File

@@ -369,47 +369,6 @@ describe("utils/config/service-helpers", () => {
expect(widgets.find((w) => w.type === "lubelogger")).toEqual(expect.objectContaining({ vehicleID: 12 })); 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 () => { it("findGroupByName deep-searches and annotates parent", async () => {
const mod = await import("./service-helpers"); const mod = await import("./service-helpers");
const { findGroupByName } = mod; const { findGroupByName } = mod;

View File

@@ -1,116 +0,0 @@
import cache from "memory-cache";
import createLogger from "utils/logger";
import { formatApiCall } from "utils/proxy/api-helpers";
import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
function isSuccessfulLoginResponse(data) {
const json = JSON.parse(data.toString());
return json?.meta?.rc === "ok" || json?.login_time || json?.update_time;
}
async function login({ widget, api, endpoint, csrfToken }) {
const loginUrl = new URL(formatApiCall(api.replace("{prefix}", ""), { endpoint, ...widget }));
const headers = { "Content-Type": "application/json" };
if (csrfToken) {
headers["X-CSRF-TOKEN"] = csrfToken;
}
return httpProxy(loginUrl, {
method: "POST",
body: JSON.stringify({ username: widget.username, password: widget.password, remember: true, rememberMe: true }),
headers,
});
}
export default function createUnifiProxyHandler({
proxyName,
resolveWidget,
resolveRequestContext,
getLoginEndpoint = () => "auth/login",
shouldAttemptLogin = ({ widget }) => !widget.key,
}) {
const prefixCacheKey = `${proxyName}__prefix`;
const logger = createLogger(proxyName);
return async function unifiProxyHandler(req, res) {
const widget = await resolveWidget(req, logger);
const { service, endpoint } = req.query;
if (!widget) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
const api = widgets?.[widget.type]?.api;
if (!api) {
return res.status(403).json({ error: "Service does not support API calls" });
}
const cachedPrefix = cache.get(`${prefixCacheKey}.${service}`);
const {
prefix,
headers = {},
csrfToken: initialCsrfToken,
} = await resolveRequestContext({
cachedPrefix,
logger,
req,
service,
widget,
});
let csrfToken = initialCsrfToken;
cache.put(`${prefixCacheKey}.${service}`, prefix);
widget.prefix = prefix;
const url = new URL(formatApiCall(api, { endpoint, ...widget }));
const params = { method: "GET", headers };
setCookieHeader(url, params);
let [status, contentType, data, responseHeaders] = await httpProxy(url, params);
if (status === 401 && shouldAttemptLogin({ widget, req, responseHeaders })) {
logger.debug("UniFi request was rejected, attempting login.");
if (responseHeaders?.["x-csrf-token"]) {
csrfToken = responseHeaders["x-csrf-token"];
}
[status, contentType, data, responseHeaders] = await login({
api,
csrfToken,
endpoint: getLoginEndpoint({ prefix, req, widget }),
widget,
});
if (status !== 200) {
logger.error("HTTP %d logging in to UniFi. Data: %s", status, data);
return res.status(status).json({ error: { message: `HTTP Error ${status}`, url, data } });
}
if (!isSuccessfulLoginResponse(data)) {
logger.error("Error logging in to UniFi: Data: %s", data);
return res.status(401).end(data);
}
addCookieToJar(url, responseHeaders);
setCookieHeader(url, params);
[status, contentType, data, responseHeaders] = await httpProxy(url, params);
}
if (status !== 200) {
logger.error("HTTP %d getting data from UniFi endpoint %s. Data: %s", status, url.href, data);
return res.status(status).json({ error: { message: `HTTP Error ${status}`, url, data } });
}
if (contentType) {
res.setHeader("Content-Type", contentType);
}
return res.status(status).send(data);
};
}

View File

@@ -37,7 +37,6 @@ export default function Component({ service }) {
<Block <Block
label="adguard.latency" label="adguard.latency"
value={t("common.ms", { value: adguardData.avg_processing_time * 1000, style: "unit", unit: "millisecond" })} value={t("common.ms", { value: adguardData.avg_processing_time * 1000, style: "unit", unit: "millisecond" })}
highlightValue={adguardData.avg_processing_time * 1000}
/> />
</Container> </Container>
); );

View File

@@ -51,26 +51,10 @@ export default function Component({ service }) {
<Block label="beszel.name" value={system.name} /> <Block label="beszel.name" value={system.name} />
<Block label="beszel.status" value={t(`beszel.${system.status}`)} /> <Block label="beszel.status" value={t(`beszel.${system.status}`)} />
<Block label="beszel.updated" value={t("common.relativeDate", { value: system.updated })} /> <Block label="beszel.updated" value={t("common.relativeDate", { value: system.updated })} />
<Block <Block label="beszel.cpu" value={t("common.percent", { value: system.info.cpu, maximumFractionDigits: 2 })} />
label="beszel.cpu" <Block label="beszel.memory" value={t("common.percent", { value: system.info.mp, maximumFractionDigits: 2 })} />
value={t("common.percent", { value: system.info.cpu, maximumFractionDigits: 2 })} <Block label="beszel.disk" value={t("common.percent", { value: system.info.dp, maximumFractionDigits: 2 })} />
highlightValue={system.info.cpu} <Block label="beszel.network" value={t("common.percent", { value: system.info.b, maximumFractionDigits: 2 })} />
/>
<Block
label="beszel.memory"
value={t("common.percent", { value: system.info.mp, maximumFractionDigits: 2 })}
highlightValue={system.info.mp}
/>
<Block
label="beszel.disk"
value={t("common.percent", { value: system.info.dp, maximumFractionDigits: 2 })}
highlightValue={system.info.dp}
/>
<Block
label="beszel.network"
value={t("common.byterate", { value: system.info.bb, maximumFractionDigits: 2 })}
highlightValue={system.info.bb}
/>
</Container> </Container>
); );
} }

View File

@@ -76,35 +76,6 @@ describe("widgets/beszel/component", () => {
expect(screen.queryByText("beszel.updated")).toBeNull(); expect(screen.queryByText("beszel.updated")).toBeNull();
}); });
it("renders optional fields", () => {
useWidgetAPI.mockReturnValue({
data: {
totalItems: 1,
items: [
{
id: "sys1",
name: "MySystem",
status: "up",
updated: 123,
info: { cpu: 10, mp: 20, dp: 30, b: 40, bb: 14.5 },
},
],
},
error: undefined,
});
const service = {
widget: { type: "beszel", systemId: "sys1", fields: ["name", "disk", "network"] },
};
const { container } = renderWithProviders(<Component service={service} />, { settings: { hideErrors: false } });
expect(service.widget.fields).toEqual(["name", "disk", "network"]);
expect(container.querySelectorAll(".service-block")).toHaveLength(3);
expectBlockValue(container, "beszel.name", "MySystem");
expectBlockValue(container, "beszel.disk", 30);
expectBlockValue(container, "beszel.network", 14.5);
});
it("renders error when systemId is not found", () => { it("renders error when systemId is not found", () => {
useWidgetAPI.mockReturnValue({ useWidgetAPI.mockReturnValue({
data: { totalItems: 1, items: [{ id: "sys1", name: "MySystem", status: "up", info: {} }] }, data: { totalItems: 1, items: [{ id: "sys1", name: "MySystem", status: "up", info: {} }] },

View File

@@ -73,13 +73,7 @@ export default function Component({ service }) {
?.filter((integration) => integration?.type) ?.filter((integration) => integration?.type)
.map((integration) => ({ .map((integration) => ({
// Include the extension so Vite/Vitest can statically validate the import base. // Include the extension so Vite/Vitest can statically validate the import base.
service: dynamic( service: dynamic(() => import(`./integrations/${integration.type}.jsx`)),
() =>
import(
/* webpackExclude: /\.test\.jsx$/ */
`./integrations/${integration.type}.jsx`
),
),
widget: { ...widget, ...integration }, widget: { ...widget, ...integration },
})) ?? [], })) ?? [],
[widget], [widget],

View File

@@ -147,7 +147,6 @@ const components = {
tubearchivist: dynamic(() => import("./tubearchivist/component")), tubearchivist: dynamic(() => import("./tubearchivist/component")),
truenas: dynamic(() => import("./truenas/component")), truenas: dynamic(() => import("./truenas/component")),
unifi: dynamic(() => import("./unifi/component")), unifi: dynamic(() => import("./unifi/component")),
unifi_drive: dynamic(() => import("./unifi_drive/component")),
unmanic: dynamic(() => import("./unmanic/component")), unmanic: dynamic(() => import("./unmanic/component")),
unraid: dynamic(() => import("./unraid/component")), unraid: dynamic(() => import("./unraid/component")),
uptimekuma: dynamic(() => import("./uptimekuma/component")), uptimekuma: dynamic(() => import("./uptimekuma/component")),

View File

@@ -25,25 +25,13 @@ async function login(widget, service) {
}), }),
}); });
let dataParsed; const dataParsed = JSON.parse(data);
try {
dataParsed = JSON.parse(data);
} catch {
logger.error("Failed to parse Crowdsec login response, status: %d", status);
cache.del(`${sessionTokenCacheKey}.${service}`);
return null;
}
if (status !== 200 || !dataParsed.token) { if (!(status === 200) || !dataParsed.token) {
logger.error("Failed to login to Crowdsec API, status: %d", status); logger.error("Failed to login to Crowdsec API, status: %d", status);
cache.del(`${sessionTokenCacheKey}.${service}`); cache.del(`${sessionTokenCacheKey}.${service}`);
return null;
} }
cache.put(`${sessionTokenCacheKey}.${service}`, dataParsed.token, new Date(dataParsed.expire) - new Date());
const ttl = Math.max(new Date(dataParsed.expire) - new Date(), 1);
cache.put(`${sessionTokenCacheKey}.${service}`, dataParsed.token, ttl);
return dataParsed.token;
} }
export default async function crowdsecProxyHandler(req, res) { export default async function crowdsecProxyHandler(req, res) {
@@ -60,10 +48,11 @@ export default async function crowdsecProxyHandler(req, res) {
return res.status(400).json({ error: "Invalid widget configuration" }); return res.status(400).json({ error: "Invalid widget configuration" });
} }
let token = cache.get(`${sessionTokenCacheKey}.${service}`); if (!cache.get(`${sessionTokenCacheKey}.${service}`)) {
if (!token) { await login(widget, service);
token = await login(widget, service);
} }
const token = cache.get(`${sessionTokenCacheKey}.${service}`);
if (!token) { if (!token) {
return res.status(500).json({ error: "Failed to authenticate with Crowdsec" }); return res.status(500).json({ error: "Failed to authenticate with Crowdsec" });
} }
@@ -82,20 +71,7 @@ export default async function crowdsecProxyHandler(req, res) {
logger.debug("Calling Crowdsec API endpoint: %s", endpoint); logger.debug("Calling Crowdsec API endpoint: %s", endpoint);
let [status, , data] = await httpProxy(url, params); const [status, , data] = await httpProxy(url, params);
if (status === 401) {
logger.debug("Crowdsec API returned 401, refreshing token and retrying request");
cache.del(`${sessionTokenCacheKey}.${service}`);
const refreshedToken = await login(widget, service);
if (!refreshedToken) {
return res.status(500).json({ error: "Failed to authenticate with Crowdsec" });
}
params.headers.Authorization = `Bearer ${refreshedToken}`;
[status, , data] = await httpProxy(url, params);
}
if (status !== 200) { if (status !== 200) {
logger.error("Error calling Crowdsec API: %d. Data: %s", status, data); logger.error("Error calling Crowdsec API: %d. Data: %s", status, data);

View File

@@ -89,76 +89,4 @@ describe("widgets/crowdsec/proxy", () => {
expect(res.statusCode).toBe(500); expect(res.statusCode).toBe(500);
expect(res.body).toEqual({ error: "Failed to authenticate with Crowdsec" }); expect(res.body).toEqual({ error: "Failed to authenticate with Crowdsec" });
}); });
it("re-authenticates and retries once when API returns 401", async () => {
getServiceWidget.mockResolvedValue({
type: "crowdsec",
url: "http://cs",
username: "machine",
password: "pw",
});
httpProxy
.mockResolvedValueOnce([
200,
"application/json",
JSON.stringify({ token: "tok-old", expire: new Date(Date.now() + 60_000).toISOString() }),
])
.mockResolvedValueOnce([401, "application/json", Buffer.from("bad token")])
.mockResolvedValueOnce([
200,
"application/json",
JSON.stringify({ token: "tok-new", expire: new Date(Date.now() + 60_000).toISOString() }),
])
.mockResolvedValueOnce([200, "application/json", Buffer.from("data")]);
const req = { query: { group: "g", service: "svc", endpoint: "alerts", index: "0" } };
const res = createMockRes();
await crowdsecProxyHandler(req, res);
expect(httpProxy).toHaveBeenCalledTimes(4);
expect(httpProxy.mock.calls[3][1].headers.Authorization).toBe("Bearer tok-new");
expect(res.statusCode).toBe(200);
expect(res.body).toEqual(Buffer.from("data"));
});
it("returns 500 when 401 refresh fails to get a new token", async () => {
getServiceWidget.mockResolvedValue({
type: "crowdsec",
url: "http://cs",
username: "machine",
password: "pw",
});
httpProxy
.mockResolvedValueOnce([
200,
"application/json",
JSON.stringify({ token: "tok-old", expire: new Date(Date.now() + 60_000).toISOString() }),
])
.mockResolvedValueOnce([401, "application/json", Buffer.from("bad token")])
.mockResolvedValueOnce([500, "application/json", JSON.stringify({ error: "no token" })]);
const req = { query: { group: "g", service: "svc", endpoint: "alerts", index: "0" } };
const res = createMockRes();
await crowdsecProxyHandler(req, res);
expect(res.statusCode).toBe(500);
expect(res.body).toEqual({ error: "Failed to authenticate with Crowdsec" });
});
it("returns 500 when login response is not JSON", async () => {
getServiceWidget.mockResolvedValue({ type: "crowdsec", url: "http://cs", username: "machine", password: "pw" });
httpProxy.mockResolvedValueOnce([200, "text/plain", "not-json"]);
const req = { query: { group: "g", service: "svc", endpoint: "alerts", index: "0" } };
const res = createMockRes();
await crowdsecProxyHandler(req, res);
expect(res.statusCode).toBe(500);
expect(res.body).toEqual({ error: "Failed to authenticate with Crowdsec" });
});
}); });

View File

@@ -52,9 +52,9 @@ export default function Component({ service }) {
<> <>
<Container service={service}> <Container service={service}>
<Block label="deluge.leech" value={t("common.number", { value: leech })} /> <Block label="deluge.leech" value={t("common.number", { value: leech })} />
<Block label="deluge.download" value={t("common.byterate", { value: rateDl })} highlightValue={rateDl} /> <Block label="deluge.download" value={t("common.byterate", { value: rateDl })} />
<Block label="deluge.seed" value={t("common.number", { value: completed })} /> <Block label="deluge.seed" value={t("common.number", { value: completed })} />
<Block label="deluge.upload" value={t("common.byterate", { value: rateUl })} highlightValue={rateUl} /> <Block label="deluge.upload" value={t("common.byterate", { value: rateUl })} />
</Container> </Container>
{widget?.enableLeechProgress && {widget?.enableLeechProgress &&
leechTorrents.map((queueEntry) => ( leechTorrents.map((queueEntry) => (

View File

@@ -41,19 +41,17 @@ export default function Component({ service }) {
} }
const { rxBytes, txBytes } = calculateThroughput(statsData.stats); const { rxBytes, txBytes } = calculateThroughput(statsData.stats);
const cpuPercent = calculateCPUPercent(statsData.stats);
const usedMemory = calculateUsedMemory(statsData.stats);
return ( return (
<Container service={service}> <Container service={service}>
<Block label="docker.cpu" value={t("common.percent", { value: cpuPercent })} highlightValue={cpuPercent} /> <Block label="docker.cpu" value={t("common.percent", { value: calculateCPUPercent(statsData.stats) })} />
{statsData.stats.memory_stats.usage && ( {statsData.stats.memory_stats.usage && (
<Block label="docker.mem" value={t("common.bytes", { value: usedMemory })} highlightValue={usedMemory} /> <Block label="docker.mem" value={t("common.bytes", { value: calculateUsedMemory(statsData.stats) })} />
)} )}
{statsData.stats.networks && ( {statsData.stats.networks && (
<> <>
<Block label="docker.rx" value={t("common.bytes", { value: rxBytes })} highlightValue={rxBytes} /> <Block label="docker.rx" value={t("common.bytes", { value: rxBytes })} />
<Block label="docker.tx" value={t("common.bytes", { value: txBytes })} highlightValue={txBytes} /> <Block label="docker.tx" value={t("common.bytes", { value: txBytes })} />
</> </>
)} )}
</Container> </Container>

View File

@@ -105,16 +105,8 @@ export default function Component({ service }) {
<Block label="dockhand.paused" value={t("common.number", { value: paused ?? 0 })} /> <Block label="dockhand.paused" value={t("common.number", { value: paused ?? 0 })} />
<Block label="dockhand.pending_updates" value={t("common.number", { value: pendingUpdates ?? 0 })} /> <Block label="dockhand.pending_updates" value={t("common.number", { value: pendingUpdates ?? 0 })} />
<Block label="dockhand.total" value={t("common.number", { value: totalContainers })} /> <Block label="dockhand.total" value={t("common.number", { value: totalContainers })} />
<Block <Block label="dockhand.cpu" value={t("common.percent", { value: cpuPercent, maximumFractionDigits: 1 })} />
label="dockhand.cpu" <Block label="dockhand.memory" value={t("common.percent", { value: memoryPercent, maximumFractionDigits: 1 })} />
value={t("common.percent", { value: cpuPercent, maximumFractionDigits: 1 })}
highlightValue={cpuPercent}
/>
<Block
label="dockhand.memory"
value={t("common.percent", { value: memoryPercent, maximumFractionDigits: 1 })}
highlightValue={memoryPercent}
/>
<Block label="dockhand.images" value={t("common.number", { value: imagesTotal ?? 0 })} /> <Block label="dockhand.images" value={t("common.number", { value: imagesTotal ?? 0 })} />
<Block label="dockhand.volumes" value={t("common.number", { value: volumesTotal ?? 0 })} /> <Block label="dockhand.volumes" value={t("common.number", { value: volumesTotal ?? 0 })} />
<Block <Block

View File

@@ -33,9 +33,9 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="downloadstation.leech" value={t("common.number", { value: leech })} /> <Block label="downloadstation.leech" value={t("common.number", { value: leech })} />
<Block label="downloadstation.download" value={t("common.byterate", { value: rateDl })} highlightValue={rateDl} /> <Block label="downloadstation.download" value={t("common.byterate", { value: rateDl })} />
<Block label="downloadstation.seed" value={t("common.number", { value: completed })} /> <Block label="downloadstation.seed" value={t("common.number", { value: completed })} />
<Block label="downloadstation.upload" value={t("common.byterate", { value: rateUl })} highlightValue={rateUl} /> <Block label="downloadstation.upload" value={t("common.byterate", { value: rateUl })} />
</Container> </Container>
); );
} }

View File

@@ -25,21 +25,14 @@ export default function Component({ service }) {
); );
} }
const available = (usage?.total ?? 0) - (usage?.used ?? 0);
return ( return (
<Container service={service}> <Container service={service}>
<Block label="filebrowser.available" value={t("common.bytes", { value: available })} highlightValue={available} />
<Block <Block
label="filebrowser.used" label="filebrowser.available"
value={t("common.bytes", { value: usage?.used ?? 0 })} value={t("common.bytes", { value: (usage?.total ?? 0) - (usage?.used ?? 0) })}
highlightValue={usage?.used ?? 0}
/>
<Block
label="filebrowser.total"
value={t("common.bytes", { value: usage?.total ?? 0 })}
highlightValue={usage?.total ?? 0}
/> />
<Block label="filebrowser.used" value={t("common.bytes", { value: usage?.used ?? 0 })} />
<Block label="filebrowser.total" value={t("common.bytes", { value: usage?.total ?? 0 })} />
</Container> </Container>
); );
} }

View File

@@ -45,9 +45,9 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="flood.leech" value={t("common.number", { value: leech })} /> <Block label="flood.leech" value={t("common.number", { value: leech })} />
<Block label="flood.download" value={t("common.byterate", { value: rateDl })} highlightValue={rateDl} /> <Block label="flood.download" value={t("common.byterate", { value: rateDl })} />
<Block label="flood.seed" value={t("common.number", { value: completed })} /> <Block label="flood.seed" value={t("common.number", { value: completed })} />
<Block label="flood.upload" value={t("common.byterate", { value: rateUl })} highlightValue={rateUl} /> <Block label="flood.upload" value={t("common.byterate", { value: rateUl })} />
</Container> </Container>
); );
} }

View File

@@ -12,7 +12,7 @@ async function login(widget) {
const loginParams = { const loginParams = {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
body: "{}", body: null,
}; };
if (widget.username && widget.password) { if (widget.username && widget.password) {

View File

@@ -45,7 +45,7 @@ describe("widgets/flood/proxy", () => {
expect(httpProxy).toHaveBeenCalledTimes(3); expect(httpProxy).toHaveBeenCalledTimes(3);
expect(httpProxy.mock.calls[0][0].toString()).toBe("http://flood/api/stats"); expect(httpProxy.mock.calls[0][0].toString()).toBe("http://flood/api/stats");
expect(httpProxy.mock.calls[1][0]).toBe("http://flood/api/auth/authenticate"); expect(httpProxy.mock.calls[1][0]).toBe("http://flood/api/auth/authenticate");
expect(httpProxy.mock.calls[1][1].body).toBe("{}"); expect(httpProxy.mock.calls[1][1].body).toBeNull();
expect(httpProxy.mock.calls[2][0].toString()).toBe("http://flood/api/stats"); expect(httpProxy.mock.calls[2][0].toString()).toBe("http://flood/api/stats");
expect(res.statusCode).toBe(200); expect(res.statusCode).toBe(200);
expect(res.body).toEqual(Buffer.from("data")); expect(res.body).toEqual(Buffer.from("data"));

View File

@@ -47,36 +47,12 @@ export default function Component({ service }) {
<Container service={service}> <Container service={service}>
<Block label="fritzbox.connectionStatus" value={t(`fritzbox.connectionStatus${fritzboxData.connectionStatus}`)} /> <Block label="fritzbox.connectionStatus" value={t(`fritzbox.connectionStatus${fritzboxData.connectionStatus}`)} />
<Block label="fritzbox.uptime" value={t("common.duration", { value: fritzboxData.uptime })} /> <Block label="fritzbox.uptime" value={t("common.duration", { value: fritzboxData.uptime })} />
<Block <Block label="fritzbox.maxDown" value={t("common.byterate", { value: fritzboxData.maxDown / 8, decimals: 1 })} />
label="fritzbox.maxDown" <Block label="fritzbox.maxUp" value={t("common.byterate", { value: fritzboxData.maxUp / 8, decimals: 1 })} />
value={t("common.byterate", { value: fritzboxData.maxDown / 8, decimals: 1 })} <Block label="fritzbox.down" value={t("common.byterate", { value: fritzboxData.down, decimals: 1 })} />
highlightValue={fritzboxData.maxDown / 8} <Block label="fritzbox.up" value={t("common.byterate", { value: fritzboxData.up, decimals: 1 })} />
/> <Block label="fritzbox.received" value={t("common.bytes", { value: fritzboxData.received })} />
<Block <Block label="fritzbox.sent" value={t("common.bytes", { value: fritzboxData.sent })} />
label="fritzbox.maxUp"
value={t("common.byterate", { value: fritzboxData.maxUp / 8, decimals: 1 })}
highlightValue={fritzboxData.maxUp / 8}
/>
<Block
label="fritzbox.down"
value={t("common.byterate", { value: fritzboxData.down, decimals: 1 })}
highlightValue={fritzboxData.down}
/>
<Block
label="fritzbox.up"
value={t("common.byterate", { value: fritzboxData.up, decimals: 1 })}
highlightValue={fritzboxData.up}
/>
<Block
label="fritzbox.received"
value={t("common.bytes", { value: fritzboxData.received })}
highlightValue={fritzboxData.received}
/>
<Block
label="fritzbox.sent"
value={t("common.bytes", { value: fritzboxData.sent })}
highlightValue={fritzboxData.sent}
/>
<Block label="fritzbox.externalIPAddress" value={fritzboxData.externalIPAddress} /> <Block label="fritzbox.externalIPAddress" value={fritzboxData.externalIPAddress} />
<Block label="fritzbox.externalIPv6Address" value={fritzboxData.externalIPv6Address} /> <Block label="fritzbox.externalIPv6Address" value={fritzboxData.externalIPv6Address} />
<Block label="fritzbox.externalIPv6Prefix" value={fritzboxData.externalIPv6Prefix} /> <Block label="fritzbox.externalIPv6Prefix" value={fritzboxData.externalIPv6Prefix} />

View File

@@ -58,7 +58,7 @@ export default function Component({ service }) {
<Block label="gamedig.players" value={players} /> <Block label="gamedig.players" value={players} />
<Block label="gamedig.maxPlayers" value={maxPlayers} /> <Block label="gamedig.maxPlayers" value={maxPlayers} />
<Block label="gamedig.bots" value={bots} /> <Block label="gamedig.bots" value={bots} />
<Block label="gamedig.ping" value={ping} highlightValue={serverData.online ? serverData.ping : undefined} /> <Block label="gamedig.ping" value={ping} />
</Container> </Container>
); );
} }

View File

@@ -45,7 +45,7 @@ export default function Component({ service }) {
<Container service={service}> <Container service={service}>
<Block label="gatus.up" value={t("common.number", { value: sitesUp })} /> <Block label="gatus.up" value={t("common.number", { value: sitesUp })} />
<Block label="gatus.down" value={t("common.number", { value: sitesDown })} /> <Block label="gatus.down" value={t("common.number", { value: sitesDown })} />
<Block label="gatus.uptime" value={t("common.percent", { value: uptime })} highlightValue={Number(uptime)} /> <Block label="gatus.uptime" value={t("common.percent", { value: uptime })} />
</Container> </Container>
); );
} }

View File

@@ -31,21 +31,12 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="jdownloader.downloadCount" value={t("common.number", { value: jdownloaderData.downloadCount })} /> <Block label="jdownloader.downloadCount" value={t("common.number", { value: jdownloaderData.downloadCount })} />
<Block <Block label="jdownloader.downloadTotalBytes" value={t("common.bytes", { value: jdownloaderData.totalBytes })} />
label="jdownloader.downloadTotalBytes"
value={t("common.bytes", { value: jdownloaderData.totalBytes })}
highlightValue={jdownloaderData.totalBytes}
/>
<Block <Block
label="jdownloader.downloadBytesRemaining" label="jdownloader.downloadBytesRemaining"
value={t("common.bytes", { value: jdownloaderData.bytesRemaining })} value={t("common.bytes", { value: jdownloaderData.bytesRemaining })}
highlightValue={jdownloaderData.bytesRemaining}
/>
<Block
label="jdownloader.downloadSpeed"
value={t("common.byterate", { value: jdownloaderData.totalSpeed })}
highlightValue={jdownloaderData.totalSpeed}
/> />
<Block label="jdownloader.downloadSpeed" value={t("common.byterate", { value: jdownloaderData.totalSpeed })} />
</Container> </Container>
); );
} }

View File

@@ -43,23 +43,14 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
{(statsData.stats.cpuLimit && ( {(statsData.stats.cpuLimit && (
<Block <Block label="docker.cpu" value={t("common.percent", { value: statsData.stats.cpuUsage })} />
label="docker.cpu"
value={t("common.percent", { value: statsData.stats.cpuUsage })}
highlightValue={statsData.stats.cpuUsage}
/>
)) || ( )) || (
<Block <Block
label="docker.cpu" label="docker.cpu"
value={t("common.number", { value: statsData.stats.cpu, maximumFractionDigits: 4 })} value={t("common.number", { value: statsData.stats.cpu, maximumFractionDigits: 4 })}
highlightValue={statsData.stats.cpu}
/> />
)} )}
<Block <Block label="docker.mem" value={t("common.bytes", { value: statsData.stats.mem })} />
label="docker.mem"
value={t("common.bytes", { value: statsData.stats.mem })}
highlightValue={statsData.stats.mem}
/>
</Container> </Container>
); );
} }

View File

@@ -35,16 +35,8 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="mikrotik.uptime" value={statsData.uptime} /> <Block label="mikrotik.uptime" value={statsData.uptime} />
<Block <Block label="mikrotik.cpuLoad" value={t("common.percent", { value: statsData["cpu-load"] })} />
label="mikrotik.cpuLoad" <Block label="mikrotik.memoryUsed" value={t("common.percent", { value: memoryUsed })} />
value={t("common.percent", { value: statsData["cpu-load"] })}
highlightValue={statsData["cpu-load"]}
/>
<Block
label="mikrotik.memoryUsed"
value={t("common.percent", { value: memoryUsed })}
highlightValue={memoryUsed}
/>
<Block label="mikrotik.numberOfLeases" value={t("common.number", { value: numberOfLeases })} /> <Block label="mikrotik.numberOfLeases" value={t("common.number", { value: numberOfLeases })} />
</Container> </Container>
); );

View File

@@ -54,7 +54,6 @@ export default function Component({ service }) {
style: "unit", style: "unit",
unit: "millisecond", unit: "millisecond",
})} })}
highlightValue={data[0].ping}
/> />
</Container> </Container>
); );

View File

@@ -56,23 +56,12 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
{showCpuLoad && ( {showCpuLoad && (
<Block <Block label="nextcloud.cpuload" value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })} />
label="nextcloud.cpuload"
value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })}
highlightValue={nextcloudInfo.system.cpuload[0]}
/>
)}
{showMemoryUsage && (
<Block
label="nextcloud.memoryusage"
value={t("common.percent", { value: memoryUsage })}
highlightValue={memoryUsage}
/>
)} )}
{showMemoryUsage && <Block label="nextcloud.memoryusage" value={t("common.percent", { value: memoryUsage })} />}
<Block <Block
label="nextcloud.freespace" label="nextcloud.freespace"
value={t("common.bbytes", { value: nextcloudInfo.system.freespace, maximumFractionDigits: 1 })} value={t("common.bbytes", { value: nextcloudInfo.system.freespace, maximumFractionDigits: 1 })}
highlightValue={nextcloudInfo.system.freespace}
/> />
<Block label="nextcloud.activeusers" value={t("common.number", { value: activeUsers.last24hours })} /> <Block label="nextcloud.activeusers" value={t("common.number", { value: activeUsers.last24hours })} />
<Block label="nextcloud.numfiles" value={t("common.number", { value: nextcloudInfo.storage.num_files })} /> <Block label="nextcloud.numfiles" value={t("common.number", { value: nextcloudInfo.storage.num_files })} />

View File

@@ -27,20 +27,11 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block <Block label="nzbget.rate" value={t("common.byterate", { value: statusData.DownloadRate })} />
label="nzbget.rate" <Block label="nzbget.remaining" value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })} />
value={t("common.byterate", { value: statusData.DownloadRate })}
highlightValue={statusData.DownloadRate}
/>
<Block
label="nzbget.remaining"
value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })}
highlightValue={statusData.RemainingSizeMB * 1024 * 1024}
/>
<Block <Block
label="nzbget.downloaded" label="nzbget.downloaded"
value={t("common.bytes", { value: statusData.DownloadedSizeMB * 1024 * 1024 })} value={t("common.bytes", { value: statusData.DownloadedSizeMB * 1024 * 1024 })}
highlightValue={statusData.DownloadedSizeMB * 1024 * 1024}
/> />
</Container> </Container>
); );

View File

@@ -6,6 +6,40 @@ const proxyName = "omadaProxyHandler";
const logger = createLogger(proxyName); const logger = createLogger(proxyName);
function parseOmadaJson(data, { step, status, contentType, url }) {
const body = Buffer.isBuffer(data) ? data.toString() : String(data ?? "");
try {
return JSON.parse(body);
} catch (error) {
logger.debug(
"Failed parsing Omada %s response as JSON (HTTP %d, content-type: %s, url: %s). Body: %s",
step,
status,
contentType ?? "unknown",
url,
body,
);
throw error;
}
}
function isLikelyHtmlResponse(contentType, data) {
const body = Buffer.isBuffer(data) ? data.toString() : String(data ?? "");
return contentType?.includes("text/html") || body.startsWith("<!DOCTYPE") || body.startsWith("<html");
}
function extractCookieHeader(responseHeaders) {
const setCookieHeader = responseHeaders?.["set-cookie"];
if (!setCookieHeader) return undefined;
if (Array.isArray(setCookieHeader)) {
return setCookieHeader.map((cookie) => cookie.split(";")[0]).join("; ");
}
return String(setCookieHeader).split(";")[0];
}
async function login(loginUrl, username, password, controllerVersionMajor) { async function login(loginUrl, username, password, controllerVersionMajor) {
const params = { const params = {
username, username,
@@ -20,15 +54,17 @@ async function login(loginUrl, username, password, controllerVersionMajor) {
}; };
} }
const [status, contentType, data] = await httpProxy(loginUrl, { const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, {
method: "POST", method: "POST",
cookieHeader: "X-Bypass-Cookie",
body: JSON.stringify(params), body: JSON.stringify(params),
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
Accept: "application/json",
}, },
}); });
return [status, JSON.parse(data.toString())]; return [status, contentType, data, extractCookieHeader(responseHeaders)];
} }
export default async function omadaProxyHandler(req, res) { export default async function omadaProxyHandler(req, res) {
@@ -86,12 +122,18 @@ export default async function omadaProxyHandler(req, res) {
break; break;
} }
const [loginStatus, loginResponseData] = await login( const [loginStatus, loginContentType, loginData, loginCookieHeader] = await login(
loginUrl, loginUrl,
widget.username, widget.username,
widget.password, widget.password,
controllerVersionMajor, controllerVersionMajor,
); );
const loginResponseData = parseOmadaJson(loginData, {
step: "login",
status: loginStatus,
contentType: loginContentType,
url: loginUrl,
});
if (loginStatus !== 200 || loginResponseData.errorCode > 0) { if (loginStatus !== 200 || loginResponseData.errorCode > 0) {
return res return res
@@ -100,11 +142,13 @@ export default async function omadaProxyHandler(req, res) {
} }
const { token } = loginResponseData.result; const { token } = loginResponseData.result;
let omadaCookieHeader = loginCookieHeader;
let sitesUrl; let sitesUrl;
let body = {}; let body = {};
let params = { token }; let params = { token };
let headers = { "Csrf-Token": token }; let headers = { "Csrf-Token": token };
if (omadaCookieHeader) headers.Cookie = omadaCookieHeader;
let method = "GET"; let method = "GET";
switch (controllerVersionMajor) { switch (controllerVersionMajor) {
@@ -134,9 +178,72 @@ export default async function omadaProxyHandler(req, res) {
params, params,
body: JSON.stringify(body), body: JSON.stringify(body),
headers, headers,
cookieHeader: "X-Bypass-Cookie",
}); });
const sitesResponseData = JSON.parse(data); let sitesResponseData;
try {
sitesResponseData = parseOmadaJson(data, {
step: "sites list",
status,
contentType,
url: sitesUrl,
});
} catch (parseError) {
if (!isLikelyHtmlResponse(contentType, data)) {
throw parseError;
}
logger.debug("Received HTML response for Omada sites list; retrying with a fresh login.");
const [retryLoginStatus, retryLoginContentType, retryLoginData, retryLoginCookieHeader] = await login(
loginUrl,
widget.username,
widget.password,
controllerVersionMajor,
);
const retryLoginResponseData = parseOmadaJson(retryLoginData, {
step: "login (retry)",
status: retryLoginStatus,
contentType: retryLoginContentType,
url: loginUrl,
});
if (retryLoginStatus !== 200 || retryLoginResponseData.errorCode > 0) {
return res.status(retryLoginStatus).json({
error: {
message: "Error re-authenticating to Omada controller",
url: loginUrl,
data: retryLoginResponseData,
},
});
}
const retryToken = retryLoginResponseData.result?.token;
omadaCookieHeader = retryLoginCookieHeader;
const retrySitesUrlObj = new URL(sitesUrl);
retrySitesUrlObj.searchParams.set("token", retryToken);
const retrySitesUrl = retrySitesUrlObj.toString();
[status, contentType, data] = await httpProxy(retrySitesUrl, {
method,
params: { token: retryToken },
body: JSON.stringify(body),
headers: {
...headers,
"Csrf-Token": retryToken,
...(omadaCookieHeader ? { Cookie: omadaCookieHeader } : {}),
},
cookieHeader: "X-Bypass-Cookie",
});
sitesResponseData = parseOmadaJson(data, {
step: "sites list (retry)",
status,
contentType,
url: retrySitesUrl,
});
}
if (status !== 200 || sitesResponseData.errorCode > 0) { if (status !== 200 || sitesResponseData.errorCode > 0) {
logger.debug(`HTTP ${status} getting sites list: ${sitesResponseData.msg}`); logger.debug(`HTTP ${status} getting sites list: ${sitesResponseData.msg}`);
@@ -174,6 +281,7 @@ export default async function omadaProxyHandler(req, res) {
}, },
}; };
headers = { "Content-Type": "application/json" }; headers = { "Content-Type": "application/json" };
if (omadaCookieHeader) headers.Cookie = omadaCookieHeader;
params = { token }; params = { token };
[status, contentType, data] = await httpProxy(switchUrl, { [status, contentType, data] = await httpProxy(switchUrl, {
@@ -181,9 +289,15 @@ export default async function omadaProxyHandler(req, res) {
params, params,
body: JSON.stringify(body), body: JSON.stringify(body),
headers, headers,
cookieHeader: "X-Bypass-Cookie",
}); });
const switchResponseData = JSON.parse(data); const switchResponseData = parseOmadaJson(data, {
step: "switch site",
status,
contentType,
url: switchUrl,
});
if (status !== 200 || switchResponseData.errorCode > 0) { if (status !== 200 || switchResponseData.errorCode > 0) {
logger.error(`HTTP ${status} getting sites list: ${data}`); logger.error(`HTTP ${status} getting sites list: ${data}`);
return res.status(status).json({ error: { message: "Error switching site", url: switchUrl, data } }); return res.status(status).json({ error: { message: "Error switching site", url: switchUrl, data } });
@@ -197,9 +311,15 @@ export default async function omadaProxyHandler(req, res) {
method: "getGlobalStat", method: "getGlobalStat",
}), }),
headers, headers,
cookieHeader: "X-Bypass-Cookie",
}); });
siteResponseData = JSON.parse(data); siteResponseData = parseOmadaJson(data, {
step: "global stats",
status,
contentType,
url: statsUrl,
});
if (status !== 200 || siteResponseData.errorCode > 0) { if (status !== 200 || siteResponseData.errorCode > 0) {
return res.status(status).json({ error: { message: "Error getting stats", url: statsUrl, data } }); return res.status(status).json({ error: { message: "Error getting stats", url: statsUrl, data } });
@@ -218,10 +338,17 @@ export default async function omadaProxyHandler(req, res) {
[status, contentType, data] = await httpProxy(siteStatsUrl, { [status, contentType, data] = await httpProxy(siteStatsUrl, {
headers: { headers: {
"Csrf-Token": token, "Csrf-Token": token,
...(omadaCookieHeader ? { Cookie: omadaCookieHeader } : {}),
}, },
cookieHeader: "X-Bypass-Cookie",
}); });
siteResponseData = JSON.parse(data); siteResponseData = parseOmadaJson(data, {
step: "overview stats",
status,
contentType,
url: siteStatsUrl,
});
if (status !== 200 || siteResponseData.errorCode > 0) { if (status !== 200 || siteResponseData.errorCode > 0) {
logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${siteResponseData.msg}`); logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${siteResponseData.msg}`);
@@ -242,9 +369,16 @@ export default async function omadaProxyHandler(req, res) {
[status, contentType, data] = await httpProxy(alertUrl, { [status, contentType, data] = await httpProxy(alertUrl, {
headers: { headers: {
"Csrf-Token": token, "Csrf-Token": token,
...(omadaCookieHeader ? { Cookie: omadaCookieHeader } : {}),
}, },
cookieHeader: "X-Bypass-Cookie",
});
const alertResponseData = parseOmadaJson(data, {
step: "alerts",
status,
contentType,
url: alertUrl,
}); });
const alertResponseData = JSON.parse(data);
activeUser = siteResponseData.result.totalClientNum; activeUser = siteResponseData.result.totalClientNum;
connectedAp = siteResponseData.result.connectedApNum; connectedAp = siteResponseData.result.connectedApNum;

View File

@@ -324,4 +324,73 @@ describe("widgets/omada/proxy", () => {
}, },
}); });
}); });
it("retries login when sites list returns HTML", async () => {
getServiceWidget.mockResolvedValue({ url: "http://omada", username: "u", password: "p", site: "Default" });
httpProxy
.mockResolvedValueOnce([
200,
"application/json",
JSON.stringify({ result: { omadacId: "cid", controllerVer: "5.0.0" } }),
])
// initial login
.mockResolvedValueOnce([
200,
"application/json",
Buffer.from(JSON.stringify({ errorCode: 0, result: { token: "t1" } })),
])
// sites list unexpectedly returns HTML
.mockResolvedValueOnce([200, "text/html;charset=utf-8", "<!DOCTYPE html><html><body>login</body></html>"])
// retry login
.mockResolvedValueOnce([
200,
"application/json",
Buffer.from(JSON.stringify({ errorCode: 0, result: { token: "t2" } })),
])
// retry sites list works
.mockResolvedValueOnce([
200,
"application/json",
JSON.stringify({ errorCode: 0, result: { data: [{ name: "Default", id: "siteid" }] } }),
])
// overview works
.mockResolvedValueOnce([
200,
"application/json",
JSON.stringify({
errorCode: 0,
result: {
totalClientNum: 11,
connectedApNum: 3,
connectedGatewayNum: 1,
connectedSwitchNum: 2,
},
}),
])
// alerts works
.mockResolvedValueOnce([200, "application/json", JSON.stringify({ errorCode: 0, result: { alertNum: 5 } })]);
const req = { query: { group: "g", service: "svc", index: "0" } };
const res = createMockRes();
await omadaProxyHandler(req, res);
expect(logger.debug).toHaveBeenCalledWith(
"Received HTML response for Omada sites list; retrying with a fresh login.",
);
expect(httpProxy.mock.calls[1][1].cookieHeader).toBe("X-Bypass-Cookie");
expect(httpProxy.mock.calls[2][1].cookieHeader).toBe("X-Bypass-Cookie");
expect(httpProxy.mock.calls[3][1].cookieHeader).toBe("X-Bypass-Cookie");
expect(httpProxy.mock.calls[4][1].cookieHeader).toBe("X-Bypass-Cookie");
expect(res.body).toBe(
JSON.stringify({
connectedAp: 3,
activeUser: 11,
alerts: 5,
connectedGateways: 1,
connectedSwitches: 2,
}),
);
});
}); });

View File

@@ -21,8 +21,8 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="widget.status" value={up ? t("openwrt.up") : t("openwrt.down")} /> <Block label="widget.status" value={up ? t("openwrt.up") : t("openwrt.down")} />
<Block label="openwrt.bytesTx" value={t("common.bytes", { value: bytesTx })} highlightValue={bytesTx} /> <Block label="openwrt.bytesTx" value={t("common.bytes", { value: bytesTx })} />
<Block label="openwrt.bytesRx" value={t("common.bytes", { value: bytesRx })} highlightValue={bytesRx} /> <Block label="openwrt.bytesRx" value={t("common.bytes", { value: bytesRx })} />
</Container> </Container>
); );
} }

View File

@@ -36,22 +36,10 @@ export default function Component({ service }) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })} highlightValue={cpu} /> <Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })} />
<Block label="opnsense.memory" value={memory} /> <Block label="opnsense.memory" value={memory} />
{wan && ( {wan && <Block label="opnsense.wanUpload" value={t("common.bytes", { value: wan["bytes transmitted"] })} />}
<Block {wan && <Block label="opnsense.wanDownload" value={t("common.bytes", { value: wan["bytes received"] })} />}
label="opnsense.wanUpload"
value={t("common.bytes", { value: wan["bytes transmitted"] })}
highlightValue={wan["bytes transmitted"]}
/>
)}
{wan && (
<Block
label="opnsense.wanDownload"
value={t("common.bytes", { value: wan["bytes received"] })}
highlightValue={wan["bytes received"]}
/>
)}
</Container> </Container>
); );
} }

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