mirror of
https://github.com/gethomepage/homepage.git
synced 2026-04-03 08:41:21 -07:00
Compare commits
87 Commits
v1.8.0
...
feature/om
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b48d283dc2 | ||
|
|
d313e0a124 | ||
|
|
51d718a21a | ||
|
|
29e2502d74 | ||
|
|
d529f81cb4 | ||
|
|
1645c1b8a1 | ||
|
|
614a87d768 | ||
|
|
862c5d9f38 | ||
|
|
d3374dc461 | ||
|
|
795e2505ca | ||
|
|
cb8421df0b | ||
|
|
152888d611 | ||
|
|
ea527e4fb1 | ||
|
|
09bab7637e | ||
|
|
597f6ecf16 | ||
|
|
fe0b214334 | ||
|
|
cdc96438cd | ||
|
|
ca7dfb56c8 | ||
|
|
95852d23c2 | ||
|
|
84231a1754 | ||
|
|
f4f54cea60 | ||
|
|
06595ef107 | ||
|
|
91b9aa479a | ||
|
|
08cde2f597 | ||
|
|
0ce175cda5 | ||
|
|
7f1de58e71 | ||
|
|
f729290e96 | ||
|
|
4974cd96b6 | ||
|
|
4450a6e1d0 | ||
|
|
ac11efc5c7 | ||
|
|
3c005d239e | ||
|
|
c4e77d4b1d | ||
|
|
9d415ac45d | ||
|
|
8b9720ca93 | ||
|
|
ad4ac465ae | ||
|
|
872a3600aa | ||
|
|
7d019185a3 | ||
|
|
99f1540d8c | ||
|
|
97e909ebf4 | ||
|
|
4d4fab391c | ||
|
|
1233b5e803 | ||
|
|
7e3fa97679 | ||
|
|
64c81615ec | ||
|
|
5c15466ac4 | ||
|
|
9cdb70527b | ||
|
|
062b1bcfbb | ||
|
|
4ebc24a1b4 | ||
|
|
79b63e4099 | ||
|
|
c86a007ed0 | ||
|
|
ca9506e485 | ||
|
|
1aec61811f | ||
|
|
6c945d6573 | ||
|
|
09893343a9 | ||
|
|
6b6090e303 | ||
|
|
d3f1832f70 | ||
|
|
f524531a13 | ||
|
|
d6dde5fc41 | ||
|
|
a08d79b5a9 | ||
|
|
f6584fda41 | ||
|
|
1c504bc350 | ||
|
|
4349f30169 | ||
|
|
9076cfd7e7 | ||
|
|
f9d920a8fb | ||
|
|
a2697bfec0 | ||
|
|
82d4d15622 | ||
|
|
b0bc9b6b2e | ||
|
|
3330954a44 | ||
|
|
392ff3833e | ||
|
|
03dfc964f1 | ||
|
|
e7acd66c6e | ||
|
|
77e67b34c4 | ||
|
|
a4ad00e27c | ||
|
|
0515f891ab | ||
|
|
08da8e66fd | ||
|
|
682e0cbc82 | ||
|
|
f7ad322d4c | ||
|
|
2b31c23b9e | ||
|
|
ae258b8276 | ||
|
|
ff296be4a4 | ||
|
|
51ae55e25e | ||
|
|
31da9ee417 | ||
|
|
be7a00d631 | ||
|
|
0d99a8766f | ||
|
|
e66b58dc53 | ||
|
|
1b32cbbbfd | ||
|
|
681a8a828b | ||
|
|
f8009a7067 |
21
.codecov.yml
Normal file
21
.codecov.yml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
codecov:
|
||||||
|
require_ci_to_pass: true
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
precision: 2
|
||||||
|
round: down
|
||||||
|
range: "0...100"
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
target: 100%
|
||||||
|
threshold: 15%
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: 100%
|
||||||
|
threshold: 10%
|
||||||
|
|
||||||
|
comment:
|
||||||
|
layout: "reach,diff,flags,files"
|
||||||
|
behavior: default
|
||||||
|
require_changes: false
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": [
|
|
||||||
"next/core-web-vitals",
|
|
||||||
"prettier",
|
|
||||||
"plugin:react-hooks/recommended"
|
|
||||||
],
|
|
||||||
"plugins": ["prettier"],
|
|
||||||
"rules": {
|
|
||||||
"import/no-cycle": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"maxDepth": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"import/order": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"newlines-between": "always"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-else-return": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"allowElseIf": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"settings": {
|
|
||||||
"import/resolver": {
|
|
||||||
"node": {
|
|
||||||
"paths": ["src"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 6,
|
|
||||||
"sourceType": "module",
|
|
||||||
"ecmaFeatures": {
|
|
||||||
"modules": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
title: "[Feature Request] "
|
title: "[Feature Request] "
|
||||||
labels: ["enhancement"]
|
labels: ["enhancement"]
|
||||||
body:
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
#### ⚠️ Don't forget to search [existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) and [discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions) (including closed ones!).
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description
|
id: description
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -35,7 +35,8 @@ What type of change does your PR introduce to Homepage?
|
|||||||
## Checklist:
|
## Checklist:
|
||||||
|
|
||||||
- [ ] If applicable, I have added corresponding documentation changes.
|
- [ ] If applicable, I have added corresponding documentation changes.
|
||||||
- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
|
- [ ] If applicable, I have added or updated tests for new features and bug fixes (see [testing](https://gethomepage.dev/widgets/authoring/getting-started/#testing)).
|
||||||
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting).
|
- [ ] If applicable, I have reviewed the [feature / enhancement](https://gethomepage.dev/widgets/authoring/getting-started/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/widgets/authoring/getting-started/#service-widget-guidelines).
|
||||||
|
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/widgets/authoring/getting-started/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/widgets/authoring/getting-started/#code-linting).
|
||||||
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
||||||
- [ ] In the description above I have disclosed the use of AI tools in the coding of this PR.
|
- [ ] In the description above I have disclosed the use of AI tools in the coding of this PR.
|
||||||
|
|||||||
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@@ -84,7 +84,7 @@ jobs:
|
|||||||
latest=auto
|
latest=auto
|
||||||
|
|
||||||
- name: Next.js build cache
|
- name: Next.js build cache
|
||||||
uses: actions/cache@v4
|
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') }}
|
||||||
|
|||||||
50
.github/workflows/docs-publish.yml
vendored
50
.github/workflows/docs-publish.yml
vendored
@@ -9,7 +9,9 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pre-commit:
|
pre-commit:
|
||||||
@@ -35,44 +37,34 @@ jobs:
|
|||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version-file: ".python-version"
|
||||||
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
- name: Install uv
|
||||||
- uses: actions/cache@v4
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
|
||||||
key: mkdocs-material-${{ env.cache_id }}
|
|
||||||
path: .cache
|
|
||||||
restore-keys: |
|
|
||||||
mkdocs-material-
|
|
||||||
- run: sudo apt-get install pngquant
|
- run: sudo apt-get install pngquant
|
||||||
- run: pip install mkdocs-material mkdocs-redirects "mkdocs-material[imaging]"
|
|
||||||
- name: Test Docs Build
|
- name: Test Docs Build
|
||||||
run: MKINSIDERS=false mkdocs build
|
run: uv run --frozen zensical build --clean
|
||||||
deploy:
|
deploy:
|
||||||
name: Build & Deploy Docs
|
name: Build & Deploy Docs
|
||||||
if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
|
if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
needs:
|
needs:
|
||||||
- pre-commit
|
- pre-commit
|
||||||
steps:
|
steps:
|
||||||
|
- uses: actions/configure-pages@v5
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- name: Configure Git Credentials
|
|
||||||
run: |
|
|
||||||
git config user.name github-actions[bot]
|
|
||||||
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version-file: ".python-version"
|
||||||
- run: echo "cache_id=${{github.sha}}" >> $GITHUB_ENV
|
- name: Install uv
|
||||||
- uses: actions/cache@v4
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
|
||||||
key: mkdocs-material-${{ env.cache_id }}
|
|
||||||
path: .cache
|
|
||||||
restore-keys: |
|
|
||||||
mkdocs-material-
|
|
||||||
- run: sudo apt-get install pngquant
|
- run: sudo apt-get install pngquant
|
||||||
- run: pip install git+https://${GH_TOKEN}@github.com/benphelps/mkdocs-material-insiders.git
|
- name: Build Docs
|
||||||
- run: pip install mkdocs-redirects "mkdocs-material[imaging]"
|
run: uv run --frozen zensical build --clean
|
||||||
- name: Docs Deploy
|
- uses: actions/upload-pages-artifact@v4
|
||||||
run: MKINSIDERS=true mkdocs gh-deploy --force
|
with:
|
||||||
env:
|
path: site
|
||||||
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
- uses: actions/deploy-pages@v4
|
||||||
|
id: deployment
|
||||||
|
|||||||
2
.github/workflows/repo-maintenance.yml
vendored
2
.github/workflows/repo-maintenance.yml
vendored
@@ -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@v5
|
- uses: dessant/lock-threads@v6
|
||||||
with:
|
with:
|
||||||
issue-inactive-days: '30'
|
issue-inactive-days: '30'
|
||||||
pr-inactive-days: '30'
|
pr-inactive-days: '30'
|
||||||
|
|||||||
37
.github/workflows/test.yml
vendored
Normal file
37
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
name: Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
vitest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
shard: [1, 2, 3, 4]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 9
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v6
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: pnpm
|
||||||
|
|
||||||
|
- run: pnpm install --frozen-lockfile
|
||||||
|
# Run Vitest directly so `--shard` is parsed as an option
|
||||||
|
- run: pnpm -s exec vitest run --coverage --shard ${{ matrix.shard }}/4 --pool forks
|
||||||
|
- name: Upload coverage reports to Codecov
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
files: ./coverage/lcov.info
|
||||||
|
flags: vitest,shard-${{ matrix.shard }}
|
||||||
|
name: vitest-shard-${{ matrix.shard }}
|
||||||
|
fail_ci_if_error: true
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -46,7 +46,7 @@ next-env.d.ts
|
|||||||
# IDEs
|
# IDEs
|
||||||
/.idea/
|
/.idea/
|
||||||
|
|
||||||
# MkDocs documentation
|
# Zensical documentation
|
||||||
site*/
|
site*/
|
||||||
.cache/
|
.cache/
|
||||||
|
|
||||||
|
|||||||
1
.python-version
Normal file
1
.python-version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3.13
|
||||||
@@ -38,11 +38,11 @@ People _love_ thorough bug reports. I'm not even kidding.
|
|||||||
|
|
||||||
## Development Guidelines
|
## Development Guidelines
|
||||||
|
|
||||||
Please see the [documentation regarding development](https://gethomepage.dev/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/more/development/#service-widget-guidelines) if you are considering making one.
|
Please see the [documentation regarding development](https://gethomepage.dev/widgets/authoring/getting-started/#development) and specifically the [guidelines for new service widgets](https://gethomepage.dev/widgets/authoring/getting-started/#service-widget-guidelines) if you are considering making one.
|
||||||
|
|
||||||
## Use a Consistent Coding Style
|
## Use a Consistent Coding Style
|
||||||
|
|
||||||
Please see information in the docs regarding [code formatting with pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks).
|
Please see information in the docs regarding [code formatting with pre-commit hooks](https://gethomepage.dev/widgets/authoring/getting-started/#code-formatting-with-pre-commit-hooks).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -16,6 +16,8 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/gethomepage/homepage/actions/workflows/docker-publish.yml"><img alt="GitHub Workflow Status (with event)" src="https://img.shields.io/github/actions/workflow/status/gethomepage/homepage/docker-publish.yml"></a>
|
<a href="https://github.com/gethomepage/homepage/actions/workflows/docker-publish.yml"><img alt="GitHub Workflow Status (with event)" src="https://img.shields.io/github/actions/workflow/status/gethomepage/homepage/docker-publish.yml"></a>
|
||||||
|
|
||||||
|
<a href="https://codecov.io/gh/gethomepage/homepage"><img src="https://codecov.io/gh/gethomepage/homepage/graph/badge.svg?token=7SKFL4D9K7"/></a>
|
||||||
|
|
||||||
<a href="https://crowdin.com/project/gethomepage" target="_blank"><img src="https://badges.crowdin.net/gethomepage/localized.svg"></a>
|
<a href="https://crowdin.com/project/gethomepage" target="_blank"><img src="https://badges.crowdin.net/gethomepage/localized.svg"></a>
|
||||||
|
|
||||||
<a href="https://discord.gg/k4ruYNrudu"><img alt="Discord" src="https://img.shields.io/discord/1019316731635834932"></a>
|
<a href="https://discord.gg/k4ruYNrudu"><img alt="Discord" src="https://img.shields.io/discord/1019316731635834932"></a>
|
||||||
@@ -68,7 +70,7 @@ For configuration options, examples and more, [please check out the homepage doc
|
|||||||
|
|
||||||
## Security Notice 🔒
|
## Security Notice 🔒
|
||||||
|
|
||||||
Please note that when using features such as widgets, Homepage can access personal information (for example from your home automation system) and Homepage currently does not (and is not planned to) include any authentication layer itself. Thus, we recommend homepage be deployed behind a reverse proxy including authentication, SSL etc, and / or behind a VPN.
|
Please note that when using features such as widgets, Homepage can access personal information (for example from your home automation system) and Homepage currently does not (and is not planned to) include any authentication layer itself. If Homepage is reachable from any untrusted network, it **must** sit behind a reverse proxy (and/or VPN) that enforces authentication, TLS, and strictly validates Host headers. The built-in host check in Homepage is a best-effort guard and should not be treated as security when exposed publicly.
|
||||||
|
|
||||||
## With Docker
|
## With Docker
|
||||||
|
|
||||||
@@ -154,16 +156,16 @@ This is a [Next.js](https://nextjs.org/) application, see their documentation fo
|
|||||||
|
|
||||||
The homepage documentation is available at [https://gethomepage.dev/](https://gethomepage.dev/).
|
The homepage documentation is available at [https://gethomepage.dev/](https://gethomepage.dev/).
|
||||||
|
|
||||||
Homepage uses Material for MkDocs for documentation. To run the documentation locally, first install the dependencies:
|
Homepage uses Zensical for documentation. To run the documentation locally, first install the dependencies:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pip install -r requirements.txt
|
uv sync
|
||||||
```
|
```
|
||||||
|
|
||||||
Then run the development server:
|
Then run the development server:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdocs serve # or build, to build the static site
|
uv run zensical serve # or build, to build the static site
|
||||||
```
|
```
|
||||||
|
|
||||||
# Support & Suggestions
|
# Support & Suggestions
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ if [ "$HOSTNAME" = "::" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Check ownership before chown
|
# Check ownership before chown
|
||||||
if [ -e /app/config ]; then
|
if [ "$PUID" = "0" ]; then
|
||||||
|
echo "Skipping ownership changes for /app/config"
|
||||||
|
elif [ -e /app/config ]; then
|
||||||
CURRENT_UID=$(stat -c %u /app/config)
|
CURRENT_UID=$(stat -c %u /app/config)
|
||||||
CURRENT_GID=$(stat -c %g /app/config)
|
CURRENT_GID=$(stat -c %g /app/config)
|
||||||
|
|
||||||
@@ -39,7 +41,9 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Ensure /app/config/logs exists and is owned
|
# Ensure /app/config/logs exists and is owned
|
||||||
if [ -n "$PUID" ] && [ -n "$PGID" ]; then
|
if [ "$PUID" = "0" ]; then
|
||||||
|
echo "Skipping ownership changes for /app/config/logs"
|
||||||
|
elif [ -n "$PUID" ] && [ -n "$PGID" ]; then
|
||||||
mkdir -p /app/config/logs 2>/dev/null || true
|
mkdir -p /app/config/logs 2>/dev/null || true
|
||||||
if [ -d /app/config/logs ]; then
|
if [ -d /app/config/logs ]; then
|
||||||
LOG_UID=$(stat -c %u /app/config/logs)
|
LOG_UID=$(stat -c %u /app/config/logs)
|
||||||
|
|||||||
@@ -177,6 +177,16 @@ labels:
|
|||||||
- homepage.widget.fields=["field1","field2"] # optional
|
- homepage.widget.fields=["field1","field2"] # optional
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
|
||||||
|
If you use mapping syntax (`:`) for labels instead of list syntax (`-`), array values like `fields` must be wrapped in single quotes so they are passed as a string:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
labels:
|
||||||
|
...
|
||||||
|
homepage.widget.fields: '["field1","field2"]'
|
||||||
|
```
|
||||||
|
|
||||||
Multiple widgets can be specified by incrementing the index, e.g.
|
Multiple widgets can be specified by incrementing the index, e.g.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@@ -189,6 +199,8 @@ labels: ...
|
|||||||
- homepage.widgets[1].slug=youreventslughere
|
- homepage.widgets[1].slug=youreventslughere
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To pass custom HTTP headers with a widget request when using labels, use the same dot-notation: `homepage.widget.headers.X-Auth-Key=secret` (or `homepage.widgets[0].headers.X-Auth-Key=secret` when multiple widgets are present).
|
||||||
|
|
||||||
You can add specify fields for e.g. the [CustomAPI](../widgets/services/customapi.md) widget by using array-style dot notation:
|
You can add specify fields for e.g. the [CustomAPI](../widgets/services/customapi.md) widget by using array-style dot notation:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ metadata:
|
|||||||
gethomepage.dev/name: Emby
|
gethomepage.dev/name: Emby
|
||||||
gethomepage.dev/widget.type: "emby"
|
gethomepage.dev/widget.type: "emby"
|
||||||
gethomepage.dev/widget.url: "https://emby.example.com"
|
gethomepage.dev/widget.url: "https://emby.example.com"
|
||||||
|
gethomepage.dev/widget.headers.X-Auth-Key: "your-secret-here"
|
||||||
gethomepage.dev/pod-selector: ""
|
gethomepage.dev/pod-selector: ""
|
||||||
gethomepage.dev/weight: 10 # optional
|
gethomepage.dev/weight: 10 # optional
|
||||||
gethomepage.dev/instance: "public" # optional
|
gethomepage.dev/instance: "public" # optional
|
||||||
|
|||||||
@@ -101,6 +101,25 @@ Each service can have multiple widgets attached to it, for example:
|
|||||||
|
|
||||||
Multiple widgets per service are not yet supported with Kubernetes ingress annotations.
|
Multiple widgets per service are not yet supported with Kubernetes ingress annotations.
|
||||||
|
|
||||||
|
#### Custom HTTP headers
|
||||||
|
|
||||||
|
Widgets that make HTTP calls support extra request headers via `headers`. This is useful when a reverse proxy expects a secret header.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- UptimeRobot:
|
||||||
|
icon: uptimekuma.png
|
||||||
|
href: https://uptimerobot.com/
|
||||||
|
widget:
|
||||||
|
type: uptimerobot
|
||||||
|
url: https://api.uptimerobot.com
|
||||||
|
key: ${UPTIMEROBOT_API_KEY}
|
||||||
|
headers:
|
||||||
|
User-Agent: homepage
|
||||||
|
X-Auth-Key: your-secret-here
|
||||||
|
```
|
||||||
|
|
||||||
|
If you define services via Docker labels or Kubernetes annotations, use the same key with dot-notation (for example `homepage.widget.headers.X-Auth-Key=secret` or `gethomepage.dev/widget.headers.X-Auth-Key: "secret"`).
|
||||||
|
|
||||||
#### Field Visibility
|
#### Field Visibility
|
||||||
|
|
||||||
Each widget can optionally provide a list of which fields should be visible via the `fields` widget property. If no fields are specified, then all fields will be displayed. The `fields` property must be a valid YAML array of strings. As an example, here is the entry for Sonarr showing only a couple of fields.
|
Each widget can optionally provide a list of which fields should be visible via the `fields` widget property. If no fields are specified, then all fields will be displayed. The `fields` property must be a valid YAML array of strings. As an example, here is the entry for Sonarr showing only a couple of fields.
|
||||||
|
|||||||
@@ -123,6 +123,58 @@ blockHighlights:
|
|||||||
|
|
||||||
Any unspecified level falls back to the built-in defaults.
|
Any unspecified level falls back to the built-in defaults.
|
||||||
|
|
||||||
|
## Progressive Web App (PWA)
|
||||||
|
|
||||||
|
A progressive web app is an app that can be installed on a device and provide user experience like a native app. Homepage comes with built-in support for PWA with some default configurations, but you can customize them.
|
||||||
|
|
||||||
|
More information on PWAs can be found in [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps).
|
||||||
|
|
||||||
|
## App icons
|
||||||
|
|
||||||
|
You can set custom icons for installable apps. More information about how you can set them can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest/Reference/icons).
|
||||||
|
|
||||||
|
The default value is the Homepage icon in sizes 192x192 and 512x512.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
pwa:
|
||||||
|
icons:
|
||||||
|
- src: https://developer.mozilla.org/favicon-192x192.png
|
||||||
|
type: image/png
|
||||||
|
sizes: 192x192
|
||||||
|
- src: https://developer.mozilla.org/favicon-512x512.png
|
||||||
|
type: image/png
|
||||||
|
sizes: 512x512
|
||||||
|
```
|
||||||
|
|
||||||
|
For icon `src` you can pass either full URL or a local path relative to the `/app/public` directory. See [Background Image](#background-image) for more detailed information on how to provide your own files.
|
||||||
|
|
||||||
|
### Shortcuts
|
||||||
|
|
||||||
|
Shortcuts can e used to specify links to tabs, to be preselected when the homepage is opened as an app.
|
||||||
|
More information about how you can set them can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest/Reference/shortcuts).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
pwa:
|
||||||
|
shortcuts:
|
||||||
|
- name: First
|
||||||
|
url: "/#first" # opens the first tab
|
||||||
|
- name: Second
|
||||||
|
url: "/#second" # opens the second tab
|
||||||
|
- name: Third
|
||||||
|
url: "/#third" # opens the third tab
|
||||||
|
```
|
||||||
|
|
||||||
|
### Other PWA configurations
|
||||||
|
|
||||||
|
Homepage sets few other PWA configurations, that are based on global settings in `settings.yaml`:
|
||||||
|
|
||||||
|
- `name`, `short_name` - Both equal to the [`title`](#title) setting.
|
||||||
|
- `theme_color`, `background_color` - Both based on the [`color`](#color-palette) and [`theme`](#theme) settings.
|
||||||
|
- `display` - It is always set to "standalone".
|
||||||
|
- `start_url` - Equal to the [`startUrl`](#start-url) setting.
|
||||||
|
|
||||||
|
More information for wach of the PWA configurations can be found in the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest/Reference).
|
||||||
|
|
||||||
## Layout
|
## Layout
|
||||||
|
|
||||||
You can configure service and bookmarks sections to be either "column" or "row" based layouts, like so:
|
You can configure service and bookmarks sections to be either "column" or "row" based layouts, like so:
|
||||||
|
|||||||
@@ -37,4 +37,4 @@ The value is a comma-separated (no spaces) list of allowed hosts (sometimes with
|
|||||||
|
|
||||||
If you are seeing errors about host validation, check the homepage logs and ensure that the host exactly as output in the logs is in the `HOMEPAGE_ALLOWED_HOSTS` list.
|
If you are seeing errors about host validation, check the homepage logs and ensure that the host exactly as output in the logs is in the `HOMEPAGE_ALLOWED_HOSTS` list.
|
||||||
|
|
||||||
This can be disabled by setting `HOMEPAGE_ALLOWED_HOSTS` to `*` but this is not recommended.
|
This can be disabled by setting `HOMEPAGE_ALLOWED_HOSTS` to `*` but this is not recommended. Public deployments must rely on a reverse proxy (and/or VPN) that enforces authentication, TLS, and unexpected Host headers; the built-in host check is a best-effort guard for local setups and is not a substitute for edge protections.
|
||||||
|
|||||||
@@ -104,7 +104,7 @@
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
background-image: url("https://raw.githubusercontent.com/gethomepage/homepage/main/docs/assets/blossom_valley.jpg");
|
background-image: url("https://raw.githubusercontent.com/gethomepage/homepage/main/docs/assets/blossom_valley_blur.jpg");
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
@@ -119,20 +119,6 @@ body[data-md-color-scheme="default"] {
|
|||||||
color: rgba(255, 255, 255, 1);
|
color: rgba(255, 255, 255, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.blur-overlay {
|
|
||||||
z-index: -1;
|
|
||||||
position: fixed;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: hsl(0deg 0% 0% / 10%);
|
|
||||||
backdrop-filter: blur(128px);
|
|
||||||
-webkit-backdrop-filter: blur(128px);
|
|
||||||
}
|
|
||||||
|
|
||||||
[data-md-color-scheme="default"] .blur-overlay {
|
|
||||||
background: hsla(0, 0%, 0%, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link,
|
.md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link,
|
||||||
.md-nav--secondary .md-nav__title {
|
.md-nav--secondary .md-nav__title {
|
||||||
background: none;
|
background: none;
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ hide:
|
|||||||
- Check config/logs/homepage.log, on docker simply e.g. `docker logs homepage`. This may provide some insight into the reason for an error.
|
- Check config/logs/homepage.log, on docker simply e.g. `docker logs homepage`. This may provide some insight into the reason for an error.
|
||||||
- Check the browser error console, this can also sometimes provide useful information.
|
- Check the browser error console, this can also sometimes provide useful information.
|
||||||
- Consider setting the `ENV` variable `LOG_LEVEL` to `debug`.
|
- Consider setting the `ENV` variable `LOG_LEVEL` to `debug`.
|
||||||
- If certain widgets are failing when connecting to public APIs, consider [disabling IPv6](#disabling-ipv6).
|
|
||||||
|
|
||||||
## Service Widget Errors
|
## Service Widget Errors
|
||||||
|
|
||||||
@@ -67,17 +66,3 @@ All service widgets work essentially the same, that is, homepage makes a proxied
|
|||||||
## Missing custom icons
|
## Missing custom icons
|
||||||
|
|
||||||
If, after correctly adding and mapping your custom icons via the [Icons](../configs/services.md#icons) instructions, you are still unable to see your icons please try recreating your container.
|
If, after correctly adding and mapping your custom icons via the [Icons](../configs/services.md#icons) instructions, you are still unable to see your icons please try recreating your container.
|
||||||
|
|
||||||
## Disabling IPv6 for http requests {#disabling-ipv6}
|
|
||||||
|
|
||||||
If you are having issues with certain widgets that are unable to reach public APIs (e.g. weather), in certain setups you may need to disable IPv6. You can set the environment variable `HOMEPAGE_PROXY_DISABLE_IPV6` to `true` to disable IPv6 for the homepage proxy.
|
|
||||||
|
|
||||||
Alternatively, you can use the `sysctls` option in your docker-compose file to disable IPv6 for the homepage container completely:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
homepage:
|
|
||||||
...
|
|
||||||
sysctls:
|
|
||||||
- net.ipv6.conf.all.disable_ipv6=1
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -33,6 +33,32 @@ Once dependencies have been installed you can lint your code with
|
|||||||
pnpm lint
|
pnpm lint
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Homepage uses [Vitest](https://vitest.dev/) for unit and component tests.
|
||||||
|
|
||||||
|
Run the test suite:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the test suite with coverage:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test:coverage
|
||||||
|
```
|
||||||
|
|
||||||
|
### What tests to include
|
||||||
|
|
||||||
|
- New or updated widgets should generally include a component test near the widget component (for example `src/widgets/<widget>/component.test.jsx`) that covers realistic behavior: loading/placeholder state, error state, and a representative "happy path" render.
|
||||||
|
- If you add or change a widget definition file (`src/widgets/<widget>/widget.js`), add/update its corresponding unit test (`src/widgets/<widget>/widget.test.js`) to cover the config/mapping behavior.
|
||||||
|
- If your widget requires a custom proxy (`src/widgets/<widget>/proxy.js`), add a proxy unit test (`src/widgets/<widget>/proxy.test.js`) that validates:
|
||||||
|
- request construction (URL, query params, headers/auth)
|
||||||
|
- response mapping (what the widget consumes)
|
||||||
|
- error pathways (upstream error, unexpected payloads)
|
||||||
|
- Avoid placing test files under `src/pages/**` (Next.js treats files there as routes). Page tests should live under `src/__tests__/pages/**`.
|
||||||
|
|
||||||
## Code formatting with pre-commit hooks
|
## Code formatting with pre-commit hooks
|
||||||
|
|
||||||
To ensure a consistent style and formatting across the project source, the project utilizes Git [`pre-commit`](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) hooks to perform some formatting and linting before a commit is allowed.
|
To ensure a consistent style and formatting across the project source, the project utilizes Git [`pre-commit`](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) hooks to perform some formatting and linting before a commit is allowed.
|
||||||
|
|||||||
@@ -201,3 +201,18 @@ export default async function customProxyHandler(req, res, map) {
|
|||||||
```
|
```
|
||||||
|
|
||||||
Proxy handlers are a complex topic and require a good understanding of JavaScript and the Homepage codebase. If you are new to Homepage, we recommend using the built-in proxy handlers.
|
Proxy handlers are a complex topic and require a good understanding of JavaScript and the Homepage codebase. If you are new to Homepage, we recommend using the built-in proxy handlers.
|
||||||
|
|
||||||
|
## Testing proxy handlers
|
||||||
|
|
||||||
|
Proxy handlers are a common source of regressions because they deal with authentication, request formatting, and sometimes odd upstream API behavior.
|
||||||
|
|
||||||
|
When you add a new proxy handler or custom widget proxy, include tests that focus on behavior:
|
||||||
|
|
||||||
|
- **Request construction:** the correct URL/path, query params, headers, and auth (and that secrets are not accidentally logged).
|
||||||
|
- **Response mapping:** the payload shape expected by the widget/component (including optional/missing fields).
|
||||||
|
- **Error handling:** upstream non-200s, invalid JSON, timeouts, and unexpected payloads should produce a predictable result.
|
||||||
|
|
||||||
|
Test locations:
|
||||||
|
|
||||||
|
- Shared handlers live in `src/utils/proxy/handlers/*.js` with tests alongside them (for example `src/utils/proxy/handlers/generic.test.js`).
|
||||||
|
- Widget-specific proxies live in `src/widgets/<widget>/proxy.js` with tests in `src/widgets/<widget>/proxy.test.js`.
|
||||||
|
|||||||
@@ -7,13 +7,17 @@ You can include all or some of the available resources. If you do not want to se
|
|||||||
|
|
||||||
The disk path is the path reported by `df` (Mounted On), or the mount point of the disk.
|
The disk path is the path reported by `df` (Mounted On), or the mount point of the disk.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
|
||||||
|
Any disk you wish to access must be mounted to your container as a volume.
|
||||||
|
|
||||||
The cpu and memory resource information are the container's usage while [glances](glances.md) displays statistics for the host machine on which it is installed.
|
The cpu and memory resource information are the container's usage while [glances](glances.md) displays statistics for the host machine on which it is installed.
|
||||||
|
|
||||||
The resources widget primarily relies on a popular tool called [systeminformation](https://systeminformation.io). Thus, any limitiations of that software apply, for example, BRTFS RAID is not supported for the disk usage. In this case users may want to use the [glances widget](glances.md) instead.
|
The resources widget primarily relies on a popular tool called [systeminformation](https://systeminformation.io). Thus, any limitiations of that software apply, for example, BRTFS RAID is not supported for the disk usage. In this case users may want to use the [glances widget](glances.md) instead.
|
||||||
|
|
||||||
_Note: unfortunately, the package used for getting CPU temp ([systeminformation](https://systeminformation.io)) is not compatible with some setups and will not report any value(s) for CPU temp._
|
!!! warning
|
||||||
|
|
||||||
**Any disk you wish to access must be mounted to your container as a volume.**
|
The package used for getting CPU temp ([systeminformation](https://systeminformation.io)) is not compatible with some setups and will not report any value(s) for CPU temp.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- resources:
|
- resources:
|
||||||
@@ -75,3 +79,10 @@ You can additionally supply an optional `expanded` property set to true in order
|
|||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
To monitor a named host network interface in Docker (for example `network: eno1`), mount host `/sys` (read-only):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
- /sys:/sys:ro
|
||||||
|
```
|
||||||
|
|||||||
18
docs/widgets/services/arcane.md
Normal file
18
docs/widgets/services/arcane.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: Arcane
|
||||||
|
description: Arcane Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Arcane](https://github.com/getarcaneapp/arcane).
|
||||||
|
|
||||||
|
**Allowed fields** (max 4): `running`, `stopped`, `total`, `images`, `images_used`, `images_unused`, `image_updates`.
|
||||||
|
**Default fields**: `running`, `stopped`, `total`, `image_updates`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: arcane
|
||||||
|
url: http://localhost:3552
|
||||||
|
env: 0 # required, 0 is Arcane default local environment
|
||||||
|
key: your-api-key
|
||||||
|
fields: ["running", "stopped", "total", "image_updates"] # optional
|
||||||
|
```
|
||||||
16
docs/widgets/services/booklore.md
Normal file
16
docs/widgets/services/booklore.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
title: Booklore
|
||||||
|
description: Booklore Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Booklore](https://github.com/booklore-app/booklore).
|
||||||
|
|
||||||
|
The widget authenticates with your Booklore credentials to surface total libraries, books, and reading progress counts for your account.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: booklore
|
||||||
|
url: https://booklore.host.or.ip
|
||||||
|
username: username
|
||||||
|
password: password
|
||||||
|
```
|
||||||
17
docs/widgets/services/dispatcharr.md
Normal file
17
docs/widgets/services/dispatcharr.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: Dispatcharr
|
||||||
|
description: Dispatcharr Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Dispatcharr](https://github.com/Dispatcharr/Dispatcharr).
|
||||||
|
|
||||||
|
Allowed fields: `["channels", "streams"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: dispatcharr
|
||||||
|
url: http://dispatcharr.host.or.ip
|
||||||
|
username: username
|
||||||
|
password: password
|
||||||
|
enableActiveStreams: true # optional, defaults to false
|
||||||
|
```
|
||||||
20
docs/widgets/services/dockhand.md
Normal file
20
docs/widgets/services/dockhand.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: Dockhand
|
||||||
|
description: Dockhand Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Dockhand](https://dockhand.pro/).
|
||||||
|
|
||||||
|
Note: The widget currently supports Dockhand's **local** authentication only.
|
||||||
|
|
||||||
|
**Allowed fields:** (max 4): `running`, `stopped`, `paused`, `total`, `cpu`, `memory`, `images`, `volumes`, `events_today`, `pending_updates`, `stacks`.
|
||||||
|
**Default fields:** `running`, `total`, `cpu`, `memory`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: dockhand
|
||||||
|
url: http://localhost:3001
|
||||||
|
environment: local # optional: name or id; aggregates all when omitted
|
||||||
|
username: your-user # required for local auth
|
||||||
|
password: your-pass # required for local auth
|
||||||
|
```
|
||||||
@@ -3,6 +3,8 @@ title: Gatus
|
|||||||
description: Gatus Widget Configuration
|
description: Gatus Widget Configuration
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Learn more about [Gatus](https://github.com/TwiN/gatus).
|
||||||
|
|
||||||
Allowed fields: `["up", "down", "uptime"]`.
|
Allowed fields: `["up", "down", "uptime"]`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
|
|
||||||
- [Adguard Home](adguard-home.md)
|
- [Adguard Home](adguard-home.md)
|
||||||
- [APC UPS](apcups.md)
|
- [APC UPS](apcups.md)
|
||||||
|
- [Arcane](arcane.md)
|
||||||
- [ArgoCD](argocd.md)
|
- [ArgoCD](argocd.md)
|
||||||
- [Atsumeru](atsumeru.md)
|
- [Atsumeru](atsumeru.md)
|
||||||
- [Audiobookshelf](audiobookshelf.md)
|
- [Audiobookshelf](audiobookshelf.md)
|
||||||
@@ -17,6 +18,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [Azure DevOps](azuredevops.md)
|
- [Azure DevOps](azuredevops.md)
|
||||||
- [Backrest](backrest.md)
|
- [Backrest](backrest.md)
|
||||||
- [Bazarr](bazarr.md)
|
- [Bazarr](bazarr.md)
|
||||||
|
- [Booklore](booklore.md)
|
||||||
- [Beszel](beszel.md)
|
- [Beszel](beszel.md)
|
||||||
- [Caddy](caddy.md)
|
- [Caddy](caddy.md)
|
||||||
- [Calendar](calendar.md)
|
- [Calendar](calendar.md)
|
||||||
@@ -31,6 +33,8 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [Deluge](deluge.md)
|
- [Deluge](deluge.md)
|
||||||
- [DeveLanCacheUI](develancacheui.md)
|
- [DeveLanCacheUI](develancacheui.md)
|
||||||
- [DiskStation](diskstation.md)
|
- [DiskStation](diskstation.md)
|
||||||
|
- [Dispatcharr](dispatcharr.md)
|
||||||
|
- [Dockhand](dockhand.md)
|
||||||
- [DownloadStation](downloadstation.md)
|
- [DownloadStation](downloadstation.md)
|
||||||
- [Emby](emby.md)
|
- [Emby](emby.md)
|
||||||
- [ESPHome](esphome.md)
|
- [ESPHome](esphome.md)
|
||||||
@@ -63,7 +67,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [Jackett](jackett.md)
|
- [Jackett](jackett.md)
|
||||||
- [JDownloader](jdownloader.md)
|
- [JDownloader](jdownloader.md)
|
||||||
- [Jellyfin](jellyfin.md)
|
- [Jellyfin](jellyfin.md)
|
||||||
- [Jellyseerr](jellyseerr.md)
|
- [Seerr](seerr.md)
|
||||||
- [Jellystat](jellystat.md)
|
- [Jellystat](jellystat.md)
|
||||||
- [Kavita](kavita.md)
|
- [Kavita](kavita.md)
|
||||||
- [Komga](komga.md)
|
- [Komga](komga.md)
|
||||||
@@ -97,7 +101,6 @@ You can also find a list of all available service widgets in the sidebar navigat
|
|||||||
- [OpenMediaVault](openmediavault.md)
|
- [OpenMediaVault](openmediavault.md)
|
||||||
- [OpenWRT](openwrt.md)
|
- [OpenWRT](openwrt.md)
|
||||||
- [OPNsense](opnsense.md)
|
- [OPNsense](opnsense.md)
|
||||||
- [Overseerr](overseerr.md)
|
|
||||||
- [PaperlessNGX](paperlessngx.md)
|
- [PaperlessNGX](paperlessngx.md)
|
||||||
- [Peanut](peanut.md)
|
- [Peanut](peanut.md)
|
||||||
- [pfSense](pfsense.md)
|
- [pfSense](pfsense.md)
|
||||||
|
|||||||
@@ -5,15 +5,21 @@ description: Jellyfin Widget Configuration
|
|||||||
|
|
||||||
Learn more about [Jellyfin](https://github.com/jellyfin/jellyfin).
|
Learn more about [Jellyfin](https://github.com/jellyfin/jellyfin).
|
||||||
|
|
||||||
You can create an API key from inside Jellyfin at `Settings > Advanced > Api Keys`.
|
You can create an API key from inside the Jellyfin Administration Dashboard under `Advanced > API Keys`.
|
||||||
|
|
||||||
As of v0.6.11 the widget supports fields `["movies", "series", "episodes", "songs"]`. These blocks are disabled by default but can be enabled with the `enableBlocks` option, and the "Now Playing" feature (enabled by default) can be disabled with the `enableNowPlaying` option.
|
As of v0.6.11 the widget supports fields `["movies", "series", "episodes", "songs"]`. These blocks are disabled by default but can be enabled with the `enableBlocks` option, and the "Now Playing" feature (enabled by default) can be disabled with the `enableNowPlaying` option.
|
||||||
|
|
||||||
|
| Jellyfin Version | Homepage Widget Version |
|
||||||
|
| ---------------- | ----------------------- |
|
||||||
|
| < 10.12 | 1 (default) |
|
||||||
|
| >= 10.12 | 2 |
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
type: jellyfin
|
type: jellyfin
|
||||||
url: http://jellyfin.host.or.ip
|
url: http://jellyfin.host.or.ip:port
|
||||||
key: apikeyapikeyapikeyapikeyapikey
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
|
version: 2 # optional, default is 1
|
||||||
enableBlocks: true # optional, defaults to false
|
enableBlocks: true # optional, defaults to false
|
||||||
enableNowPlaying: true # optional, defaults to true
|
enableNowPlaying: true # optional, defaults to true
|
||||||
enableUser: true # optional, defaults to false
|
enableUser: true # optional, defaults to false
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
title: Jellyseerr
|
|
||||||
description: Jellyseerr Widget Configuration
|
|
||||||
---
|
|
||||||
|
|
||||||
Learn more about [Jellyseerr](https://github.com/Fallenbagel/jellyseerr).
|
|
||||||
|
|
||||||
Find your API key under `Settings > General > API Key`.
|
|
||||||
|
|
||||||
Allowed fields: `["pending", "approved", "available", "issues"]`.
|
|
||||||
Default fields: `["pending", "approved", "available"]`.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
widget:
|
|
||||||
type: jellyseerr
|
|
||||||
url: http://jellyseerr.host.or.ip
|
|
||||||
key: apikeyapikeyapikeyapikeyapikey
|
|
||||||
```
|
|
||||||
@@ -9,11 +9,17 @@ _Note that the project was renamed from PiAlert to NetAlertX._
|
|||||||
|
|
||||||
Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`.
|
Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`.
|
||||||
|
|
||||||
If you have enabled a password on your NetAlertX instance, you will need to provide the `SYNC_api_token` as the `key` in your config.
|
Provide the `API_TOKEN` (f.k.a. `SYNC_api_token`) as the `key` in your config.
|
||||||
|
|
||||||
|
| NetAlertX Version | Homepage Widget Version |
|
||||||
|
| ----------------- | ----------------------- |
|
||||||
|
| < v26.1.17 | 1 (default) |
|
||||||
|
| > v26.1.17 | 2 |
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
type: netalertx
|
type: netalertx
|
||||||
url: http://ip:port
|
url: http://ip:port # use backend port for widget version 2+
|
||||||
key: netalertxsyncapitoken # optional, only if password is enabled
|
key: yournetalertxapitoken
|
||||||
|
version: 2 # optional, default is 1
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
title: Overseerr
|
|
||||||
description: Overseerr Widget Configuration
|
|
||||||
---
|
|
||||||
|
|
||||||
Learn more about [Overseerr](https://github.com/sct/overseerr).
|
|
||||||
|
|
||||||
Find your API key under `Settings > General`.
|
|
||||||
|
|
||||||
Allowed fields: `["pending", "approved", "available", "processing"]`.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
widget:
|
|
||||||
type: overseerr
|
|
||||||
url: http://overseerr.host.or.ip
|
|
||||||
key: apikeyapikeyapikeyapikeyapikey
|
|
||||||
```
|
|
||||||
@@ -12,7 +12,7 @@ Allowed fields: no configurable fields for this widget.
|
|||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
type: tautulli
|
type: tautulli
|
||||||
url: http://tautulli.host.or.ip
|
url: http://tautulli.host.or.ip:port
|
||||||
key: apikeyapikeyapikeyapikeyapikey
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
enableUser: true # optional, defaults to false
|
enableUser: true # optional, defaults to false
|
||||||
showEpisodeNumber: true # optional, defaults to false
|
showEpisodeNumber: true # optional, defaults to false
|
||||||
|
|||||||
20
docs/widgets/services/seerr.md
Normal file
20
docs/widgets/services/seerr.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: Seerr Widget
|
||||||
|
description: Seerr Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Seerr](https://github.com/seerr-team/seerr).
|
||||||
|
|
||||||
|
Find your API key under `Settings > General > API Key`.
|
||||||
|
|
||||||
|
_Jellyseerr and Overseerr merged into Seerr. Use `type: seerr` (legacy `type: jellyseerr` and `type: overseerr` are aliased)._
|
||||||
|
|
||||||
|
Allowed fields: `["pending", "approved", "available", "completed", "processing", "issues"]`.
|
||||||
|
Default fields: `["pending", "approved", "completed"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: seerr
|
||||||
|
url: http://seerr.host.or.ip
|
||||||
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
|
```
|
||||||
15
docs/widgets/services/sparkyfitness.md
Normal file
15
docs/widgets/services/sparkyfitness.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: SparkyFitness
|
||||||
|
description: SparkyFitness Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [SparkyFitness](https://github.com/CodeWithCJ/SparkyFitness).
|
||||||
|
|
||||||
|
Allowed fields: `["eaten", "burned", "remaining", "steps"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: sparkyfitness
|
||||||
|
url: http://sparkyfitness.host.or.ip
|
||||||
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
|
```
|
||||||
21
docs/widgets/services/tracearr.md
Normal file
21
docs/widgets/services/tracearr.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: Tracearr
|
||||||
|
description: Tracearr Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Tracearr](https://www.tracearr.com/).
|
||||||
|
|
||||||
|
Provides detailed information about currently active streams across multiple servers.
|
||||||
|
|
||||||
|
Allowed fields (for summary view): `["streams", "transcodes", "directplay", "bitrate"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: tracearr
|
||||||
|
url: http://tracearr.host.or.ip:3000
|
||||||
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
|
view: both # optional, "summary", "details", or "both", defaults to "details"
|
||||||
|
enableUser: true # optional, defaults to false
|
||||||
|
showEpisodeNumber: true # optional, defaults to false
|
||||||
|
expandOneStreamToTwoRows: false # optional, defaults to true
|
||||||
|
```
|
||||||
@@ -5,6 +5,11 @@ description: TrueNas Scale Widget Configuration
|
|||||||
|
|
||||||
Learn more about [TrueNas](https://www.truenas.com/).
|
Learn more about [TrueNas](https://www.truenas.com/).
|
||||||
|
|
||||||
|
| TrueNAS Version | Homepage widget version |
|
||||||
|
| ----------------------- | ----------------------- |
|
||||||
|
| < 26.04 (REST API) | 1 (default) |
|
||||||
|
| > 25.04 (Websocket API) | 2 |
|
||||||
|
|
||||||
Allowed fields: `["load", "uptime", "alerts"]`.
|
Allowed fields: `["load", "uptime", "alerts"]`.
|
||||||
|
|
||||||
To create an API Key, follow [the official TrueNAS documentation](https://www.truenas.com/docs/scale/scaletutorials/toptoolbar/managingapikeys/).
|
To create an API Key, follow [the official TrueNAS documentation](https://www.truenas.com/docs/scale/scaletutorials/toptoolbar/managingapikeys/).
|
||||||
@@ -17,6 +22,7 @@ To use the `enablePools` option with TrueNAS Core, the `nasType` parameter is re
|
|||||||
widget:
|
widget:
|
||||||
type: truenas
|
type: truenas
|
||||||
url: http://truenas.host.or.ip
|
url: http://truenas.host.or.ip
|
||||||
|
version: 2 # optional, defaults to 1
|
||||||
username: user # not required if using api key
|
username: user # not required if using api key
|
||||||
password: pass # not required if using api key
|
password: pass # not required if using api key
|
||||||
key: yourtruenasapikey # not required if using username / password
|
key: yourtruenasapikey # not required if using username / password
|
||||||
|
|||||||
@@ -9,10 +9,16 @@ Allowed fields: `["projects", "tasks7d", "tasksOverdue", "tasksInProgress"]`.
|
|||||||
|
|
||||||
A list of the next 5 tasks ordered by due date is disabled by default, but can be enabled with the `enableTaskList` option.
|
A list of the next 5 tasks ordered by due date is disabled by default, but can be enabled with the `enableTaskList` option.
|
||||||
|
|
||||||
|
| Vikunja Version | Homepage Widget Version |
|
||||||
|
| --------------- | ----------------------- |
|
||||||
|
| < v1.0.0-rc4 | 1 (default) |
|
||||||
|
| >= v1.0.0-rc4 | 2 |
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
type: vikunja
|
type: vikunja
|
||||||
url: http[s]://vikunja.host.or.ip[:port]
|
url: http[s]://vikunja.host.or.ip[:port]
|
||||||
key: vikunjaapikey
|
key: vikunjaapikey
|
||||||
enableTaskList: true # optional, defaults to false
|
enableTaskList: true # optional, defaults to false
|
||||||
|
version: 2 # optional, defaults to 1
|
||||||
```
|
```
|
||||||
|
|||||||
78
eslint.config.mjs
Normal file
78
eslint.config.mjs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import path from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
import { fixupConfigRules } from "@eslint/compat";
|
||||||
|
import { FlatCompat } from "@eslint/eslintrc";
|
||||||
|
import js from "@eslint/js";
|
||||||
|
import prettier from "eslint-plugin-prettier";
|
||||||
|
import { defineConfig, globalIgnores } from "eslint/config";
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = path.dirname(__filename);
|
||||||
|
const compat = new FlatCompat({
|
||||||
|
baseDirectory: __dirname,
|
||||||
|
recommendedConfig: js.configs.recommended,
|
||||||
|
allConfig: js.configs.all,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
{
|
||||||
|
extends: fixupConfigRules(compat.extends("next/core-web-vitals", "prettier", "plugin:react-hooks/recommended")),
|
||||||
|
|
||||||
|
plugins: {
|
||||||
|
prettier,
|
||||||
|
},
|
||||||
|
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 6,
|
||||||
|
sourceType: "module",
|
||||||
|
|
||||||
|
parserOptions: {
|
||||||
|
ecmaFeatures: {
|
||||||
|
modules: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
settings: {
|
||||||
|
"import/resolver": {
|
||||||
|
node: {
|
||||||
|
paths: ["src"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
"import/no-cycle": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
maxDepth: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
"import/order": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"newlines-between": "always",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
"no-else-return": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
allowElseIf: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// Vitest tests often intentionally place imports after `vi.mock(...)` to ensure
|
||||||
|
// modules under test see the mocked dependencies. `import/order` can't safely
|
||||||
|
// auto-fix those cases, so disable it for test files.
|
||||||
|
{
|
||||||
|
files: ["src/**/*.test.{js,jsx}", "src/**/*.spec.{js,jsx}"],
|
||||||
|
rules: {
|
||||||
|
"import/order": "off",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
globalIgnores(["./config/", "./coverage/", "./.venv/", "./.next/", "./site/"]),
|
||||||
|
]);
|
||||||
@@ -33,6 +33,7 @@ nav:
|
|||||||
- widgets/services/index.md
|
- widgets/services/index.md
|
||||||
- widgets/services/adguard-home.md
|
- widgets/services/adguard-home.md
|
||||||
- widgets/services/apcups.md
|
- widgets/services/apcups.md
|
||||||
|
- widgets/services/arcane.md
|
||||||
- widgets/services/argocd.md
|
- widgets/services/argocd.md
|
||||||
- widgets/services/atsumeru.md
|
- widgets/services/atsumeru.md
|
||||||
- widgets/services/audiobookshelf.md
|
- widgets/services/audiobookshelf.md
|
||||||
@@ -41,6 +42,7 @@ nav:
|
|||||||
- widgets/services/azuredevops.md
|
- widgets/services/azuredevops.md
|
||||||
- widgets/services/backrest.md
|
- widgets/services/backrest.md
|
||||||
- widgets/services/bazarr.md
|
- widgets/services/bazarr.md
|
||||||
|
- widgets/services/booklore.md
|
||||||
- widgets/services/beszel.md
|
- widgets/services/beszel.md
|
||||||
- widgets/services/caddy.md
|
- widgets/services/caddy.md
|
||||||
- widgets/services/calendar.md
|
- widgets/services/calendar.md
|
||||||
@@ -55,6 +57,8 @@ nav:
|
|||||||
- widgets/services/deluge.md
|
- widgets/services/deluge.md
|
||||||
- widgets/services/develancacheui.md
|
- widgets/services/develancacheui.md
|
||||||
- widgets/services/diskstation.md
|
- widgets/services/diskstation.md
|
||||||
|
- widgets/services/dispatcharr.md
|
||||||
|
- widgets/services/dockhand.md
|
||||||
- widgets/services/downloadstation.md
|
- widgets/services/downloadstation.md
|
||||||
- widgets/services/emby.md
|
- widgets/services/emby.md
|
||||||
- widgets/services/esphome.md
|
- widgets/services/esphome.md
|
||||||
@@ -87,7 +91,6 @@ nav:
|
|||||||
- widgets/services/jackett.md
|
- widgets/services/jackett.md
|
||||||
- widgets/services/jdownloader.md
|
- widgets/services/jdownloader.md
|
||||||
- widgets/services/jellyfin.md
|
- widgets/services/jellyfin.md
|
||||||
- widgets/services/jellyseerr.md
|
|
||||||
- widgets/services/jellystat.md
|
- widgets/services/jellystat.md
|
||||||
- widgets/services/kavita.md
|
- widgets/services/kavita.md
|
||||||
- widgets/services/komga.md
|
- widgets/services/komga.md
|
||||||
@@ -121,7 +124,6 @@ nav:
|
|||||||
- widgets/services/openmediavault.md
|
- widgets/services/openmediavault.md
|
||||||
- widgets/services/opnsense.md
|
- widgets/services/opnsense.md
|
||||||
- widgets/services/openwrt.md
|
- widgets/services/openwrt.md
|
||||||
- widgets/services/overseerr.md
|
|
||||||
- widgets/services/pangolin.md
|
- widgets/services/pangolin.md
|
||||||
- widgets/services/paperlessngx.md
|
- widgets/services/paperlessngx.md
|
||||||
- widgets/services/peanut.md
|
- widgets/services/peanut.md
|
||||||
@@ -147,8 +149,10 @@ nav:
|
|||||||
- widgets/services/rutorrent.md
|
- widgets/services/rutorrent.md
|
||||||
- widgets/services/sabnzbd.md
|
- widgets/services/sabnzbd.md
|
||||||
- widgets/services/scrutiny.md
|
- widgets/services/scrutiny.md
|
||||||
|
- widgets/services/seerr.md
|
||||||
- widgets/services/slskd.md
|
- widgets/services/slskd.md
|
||||||
- widgets/services/sonarr.md
|
- widgets/services/sonarr.md
|
||||||
|
- widgets/services/sparkyfitness.md
|
||||||
- widgets/services/speedtest-tracker.md
|
- widgets/services/speedtest-tracker.md
|
||||||
- widgets/services/spoolman.md
|
- widgets/services/spoolman.md
|
||||||
- widgets/services/stash.md
|
- widgets/services/stash.md
|
||||||
@@ -161,6 +165,7 @@ nav:
|
|||||||
- widgets/services/technitium.md
|
- widgets/services/technitium.md
|
||||||
- widgets/services/tdarr.md
|
- widgets/services/tdarr.md
|
||||||
- widgets/services/traefik.md
|
- widgets/services/traefik.md
|
||||||
|
- widgets/services/tracearr.md
|
||||||
- widgets/services/transmission.md
|
- widgets/services/transmission.md
|
||||||
- widgets/services/trilium.md
|
- widgets/services/trilium.md
|
||||||
- widgets/services/truenas.md
|
- widgets/services/truenas.md
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
// prettyBytes taken from https://github.com/sindresorhus/pretty-bytes
|
// prettyBytes taken from https://github.com/sindresorhus/pretty-bytes
|
||||||
|
|
||||||
/* eslint-disable no-param-reassign */
|
|
||||||
const BYTE_UNITS = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
const BYTE_UNITS = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||||
|
|
||||||
const BIBYTE_UNITS = ["B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
|
const BIBYTE_UNITS = ["B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
|
||||||
@@ -37,7 +36,6 @@ function prettyBytes(number, options) {
|
|||||||
...options,
|
...options,
|
||||||
};
|
};
|
||||||
|
|
||||||
// eslint-disable-next-line no-nested-ternary
|
|
||||||
const UNITS = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : options.binary ? BIBYTE_UNITS : BYTE_UNITS;
|
const UNITS = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : options.binary ? BIBYTE_UNITS : BYTE_UNITS;
|
||||||
|
|
||||||
if (options.signed && number === 0) {
|
if (options.signed && number === 0) {
|
||||||
@@ -45,7 +43,7 @@ function prettyBytes(number, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isNegative = number < 0;
|
const isNegative = number < 0;
|
||||||
// eslint-disable-next-line no-nested-ternary
|
|
||||||
const prefix = isNegative ? "-" : options.signed ? "+" : "";
|
const prefix = isNegative ? "-" : options.signed ? "+" : "";
|
||||||
|
|
||||||
if (isNegative) {
|
if (isNegative) {
|
||||||
|
|||||||
39
package.json
39
package.json
@@ -1,13 +1,16 @@
|
|||||||
{
|
{
|
||||||
"name": "homepage",
|
"name": "homepage",
|
||||||
"version": "1.7.0",
|
"version": "1.10.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "npx only-allow pnpm",
|
"preinstall": "npx only-allow pnpm",
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint",
|
"lint": "eslint .",
|
||||||
|
"test": "vitest run",
|
||||||
|
"test:coverage": "vitest run --coverage",
|
||||||
|
"test:watch": "vitest",
|
||||||
"telemetry": "next telemetry disable"
|
"telemetry": "next telemetry disable"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -18,14 +21,14 @@
|
|||||||
"dockerode": "^4.0.7",
|
"dockerode": "^4.0.7",
|
||||||
"follow-redirects": "^1.15.11",
|
"follow-redirects": "^1.15.11",
|
||||||
"gamedig": "^5.3.2",
|
"gamedig": "^5.3.2",
|
||||||
"i18next": "^25.5.3",
|
"i18next": "^25.8.0",
|
||||||
"ical.js": "^2.1.0",
|
"ical.js": "^2.1.0",
|
||||||
"js-yaml": "^4.1.0",
|
"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": "^15.5.7",
|
"next": "^15.5.11",
|
||||||
"next-i18next": "^12.1.0",
|
"next-i18next": "^12.1.0",
|
||||||
"ping": "^0.4.4",
|
"ping": "^0.4.4",
|
||||||
"pretty-bytes": "^7.1.0",
|
"pretty-bytes": "^7.1.0",
|
||||||
@@ -33,38 +36,48 @@
|
|||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-i18next": "^15.5.3",
|
"react-i18next": "^15.5.3",
|
||||||
"react-icons": "^5.4.0",
|
"react-icons": "^5.5.0",
|
||||||
"recharts": "^3.1.2",
|
"recharts": "^3.1.2",
|
||||||
"swr": "^2.3.3",
|
"swr": "^2.4.0",
|
||||||
"systeminformation": "^5.27.11",
|
"systeminformation": "^5.27.11",
|
||||||
"tough-cookie": "^6.0.0",
|
"tough-cookie": "^6.0.0",
|
||||||
"urbackup-server-api": "^0.8.9",
|
"urbackup-server-api": "^0.91.0",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.19.0",
|
||||||
|
"ws": "^8.18.3",
|
||||||
"xml-js": "^1.6.11"
|
"xml-js": "^1.6.11"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@eslint/compat": "^2.0.2",
|
||||||
|
"@eslint/eslintrc": "^3.3.3",
|
||||||
|
"@eslint/js": "^9.39.2",
|
||||||
"@tailwindcss/forms": "^0.5.10",
|
"@tailwindcss/forms": "^0.5.10",
|
||||||
"@tailwindcss/postcss": "^4.1.14",
|
"@tailwindcss/postcss": "^4.1.18",
|
||||||
|
"@testing-library/jest-dom": "^6.8.0",
|
||||||
|
"@testing-library/react": "^16.3.0",
|
||||||
|
"@vitest/coverage-v8": "^3.2.4",
|
||||||
"eslint": "^9.25.1",
|
"eslint": "^9.25.1",
|
||||||
"eslint-config-next": "^15.2.4",
|
"eslint-config-next": "^15.5.11",
|
||||||
"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.4",
|
"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": "^26.1.0",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"prettier": "^3.7.3",
|
"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.0.9",
|
"tailwindcss": "^4.1.18",
|
||||||
"typescript": "^5.7.3"
|
"typescript": "^5.7.3",
|
||||||
|
"vitest": "^3.2.4"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"osx-temperature-sensor": "^1.0.8"
|
"osx-temperature-sensor": "^1.0.8"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
|
"@tailwindcss/oxide",
|
||||||
"osx-temperature-sensor",
|
"osx-temperature-sensor",
|
||||||
"sharp"
|
"sharp"
|
||||||
]
|
]
|
||||||
|
|||||||
2121
pnpm-lock.yaml
generated
2121
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Liedjies"
|
"songs": "Liedjies"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Vanlyn af",
|
"offline": "Vanlyn af",
|
||||||
"offline_alt": "Vanlyn af",
|
"offline_alt": "Vanlyn af",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Op",
|
"up": "Op",
|
||||||
"pending": "Afwagtend",
|
"pending": "Afwagtend",
|
||||||
"down": "Af"
|
"down": "Af",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nuut",
|
"new": "Nuut",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Optyd",
|
"uptime": "Optyd",
|
||||||
"volumeAvailable": "Beskikbaar"
|
"volumeAvailable": "Beskikbaar"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Kanale",
|
||||||
|
"streams": "Uitsendings"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Reekse",
|
"series": "Reekse",
|
||||||
"issues": "Kwessies",
|
"issues": "Kwessies",
|
||||||
@@ -769,7 +784,7 @@
|
|||||||
"gross_percent_today": "Vandag",
|
"gross_percent_today": "Vandag",
|
||||||
"gross_percent_1y": "Een jaar",
|
"gross_percent_1y": "Een jaar",
|
||||||
"gross_percent_max": "Alle tyd",
|
"gross_percent_max": "Alle tyd",
|
||||||
"net_worth": "Net Worth"
|
"net_worth": "Netto Waarde"
|
||||||
},
|
},
|
||||||
"audiobookshelf": {
|
"audiobookshelf": {
|
||||||
"podcasts": "Podsendinge",
|
"podcasts": "Podsendinge",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Kategorieë",
|
"categories": "Kategorieë",
|
||||||
"series": "Reekse"
|
"series": "Reekse"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Biblioteke",
|
||||||
|
"books": "Boeke",
|
||||||
|
"reading": "Lees",
|
||||||
|
"finished": "Klaar"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Tou",
|
"downloadCount": "Tou",
|
||||||
"downloadBytesRemaining": "Oorblywende",
|
"downloadBytesRemaining": "Oorblywende",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Liedjies",
|
"songs": "Liedjies",
|
||||||
"time": "Tyd",
|
"time": "Tyd",
|
||||||
"artists": "Kunstenaars"
|
"artists": "Kunstenaars"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Lopend",
|
||||||
|
"stopped": "Gestop",
|
||||||
|
"cpu": "SVE",
|
||||||
|
"memory": "Geheue",
|
||||||
|
"images": "Beelde",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Vandag se byeenkomste",
|
||||||
|
"pending_updates": "Hangende opdaterings",
|
||||||
|
"stacks": "Stapels",
|
||||||
|
"paused": "Onderbreek",
|
||||||
|
"total": "Totaal",
|
||||||
|
"environment_not_found": "Omgewing Nie Gevind Nie"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "حلقات",
|
"episodes": "حلقات",
|
||||||
"songs": "أغاني"
|
"songs": "أغاني"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "جديد(ة)",
|
"new": "جديد(ة)",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "المُشكِلات",
|
"issues": "المُشكِلات",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
"wlan_users": "WLAN Потребители",
|
"wlan_users": "WLAN Потребители",
|
||||||
"up": "UP",
|
"up": "UP",
|
||||||
"down": "DOWN",
|
"down": "DOWN",
|
||||||
"wait": "Please wait",
|
"wait": "Моля изчакайте",
|
||||||
"empty_data": "Неизвестен статус на подсистема"
|
"empty_data": "Неизвестен статус на подсистема"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"partial": "Частично"
|
"partial": "Частично"
|
||||||
},
|
},
|
||||||
"ping": {
|
"ping": {
|
||||||
"error": "Error",
|
"error": "Грешка",
|
||||||
"ping": "Пинг",
|
"ping": "Пинг",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
@@ -91,11 +91,11 @@
|
|||||||
},
|
},
|
||||||
"siteMonitor": {
|
"siteMonitor": {
|
||||||
"http_status": "HTTP статус",
|
"http_status": "HTTP статус",
|
||||||
"error": "Error",
|
"error": "Грешка",
|
||||||
"response": "Отговор",
|
"response": "Отговор",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"not_available": "Not Available"
|
"not_available": "Не е налично"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "Възпроизвежда",
|
"playing": "Възпроизвежда",
|
||||||
@@ -107,11 +107,21 @@
|
|||||||
"episodes": "Епизоди",
|
"episodes": "Епизоди",
|
||||||
"songs": "Песни"
|
"songs": "Песни"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
"online": "Онлайн",
|
"online": "Онлайн",
|
||||||
"total": "Total",
|
"total": "Общо",
|
||||||
"unknown": "Unknown"
|
"unknown": "Unknown"
|
||||||
},
|
},
|
||||||
"evcc": {
|
"evcc": {
|
||||||
@@ -133,7 +143,7 @@
|
|||||||
"unread": "Непрочетени"
|
"unread": "Непрочетени"
|
||||||
},
|
},
|
||||||
"fritzbox": {
|
"fritzbox": {
|
||||||
"connectionStatus": "Status",
|
"connectionStatus": "Статус",
|
||||||
"connectionStatusUnconfigured": "Неконфигуриран",
|
"connectionStatusUnconfigured": "Неконфигуриран",
|
||||||
"connectionStatusConnecting": "Свързване",
|
"connectionStatusConnecting": "Свързване",
|
||||||
"connectionStatusAuthenticating": "Удостоверяване",
|
"connectionStatusAuthenticating": "Удостоверяване",
|
||||||
@@ -141,7 +151,7 @@
|
|||||||
"connectionStatusDisconnecting": "Прекъсване на връзката",
|
"connectionStatusDisconnecting": "Прекъсване на връзката",
|
||||||
"connectionStatusDisconnected": "Не е свързан",
|
"connectionStatusDisconnected": "Не е свързан",
|
||||||
"connectionStatusConnected": "Свързан",
|
"connectionStatusConnected": "Свързан",
|
||||||
"uptime": "Uptime",
|
"uptime": "Време на работа",
|
||||||
"maxDown": "Макс сваляне",
|
"maxDown": "Макс сваляне",
|
||||||
"maxUp": "Макс качване",
|
"maxUp": "Макс качване",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
@@ -170,8 +180,8 @@
|
|||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Playing",
|
"playing": "Playing",
|
||||||
"transcoding": "Transcoding",
|
"transcoding": "Transcoding",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Битрейт",
|
||||||
"no_active": "No Active Streams",
|
"no_active": "Няма активни потоци",
|
||||||
"plex_connection_error": "Провери връзка с Plex"
|
"plex_connection_error": "Провери връзка с Plex"
|
||||||
},
|
},
|
||||||
"omada": {
|
"omada": {
|
||||||
@@ -189,7 +199,7 @@
|
|||||||
"plex": {
|
"plex": {
|
||||||
"streams": "Активни Потоци",
|
"streams": "Активни Потоци",
|
||||||
"albums": "Албуми",
|
"albums": "Албуми",
|
||||||
"movies": "Movies",
|
"movies": "Филми",
|
||||||
"tv": "Сериали"
|
"tv": "Сериали"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
@@ -362,8 +372,8 @@
|
|||||||
},
|
},
|
||||||
"trilium": {
|
"trilium": {
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
"notesCount": "Notes",
|
"notesCount": "Бележки",
|
||||||
"dbSize": "Database Size",
|
"dbSize": "Размер на базата данни",
|
||||||
"unknown": "Unknown"
|
"unknown": "Unknown"
|
||||||
},
|
},
|
||||||
"navidrome": {
|
"navidrome": {
|
||||||
@@ -373,7 +383,7 @@
|
|||||||
"npm": {
|
"npm": {
|
||||||
"enabled": "Активирано",
|
"enabled": "Активирано",
|
||||||
"disabled": "Деактивирано",
|
"disabled": "Деактивирано",
|
||||||
"total": "Total"
|
"total": "Общо"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Настрой за следене една или повече крипто валути",
|
"configure": "Настрой за следене една или повече крипто валути",
|
||||||
@@ -384,7 +394,7 @@
|
|||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Приложения",
|
"apps": "Приложения",
|
||||||
"clients": "Clients",
|
"clients": "Клиенти",
|
||||||
"messages": "Съобщения"
|
"messages": "Съобщения"
|
||||||
},
|
},
|
||||||
"prowlarr": {
|
"prowlarr": {
|
||||||
@@ -405,7 +415,7 @@
|
|||||||
"transferRate": "Rate"
|
"transferRate": "Rate"
|
||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "Users",
|
"user_count": "Потребители",
|
||||||
"status_count": "Posts",
|
"status_count": "Posts",
|
||||||
"domain_count": "Domains"
|
"domain_count": "Domains"
|
||||||
},
|
},
|
||||||
@@ -416,17 +426,17 @@
|
|||||||
},
|
},
|
||||||
"minecraft": {
|
"minecraft": {
|
||||||
"players": "Играчи",
|
"players": "Играчи",
|
||||||
"version": "Version",
|
"version": "Версия",
|
||||||
"status": "Status",
|
"status": "Статус",
|
||||||
"up": "Online",
|
"up": "Онлайн",
|
||||||
"down": "Offline"
|
"down": "Офлайн"
|
||||||
},
|
},
|
||||||
"miniflux": {
|
"miniflux": {
|
||||||
"read": "Read",
|
"read": "Read",
|
||||||
"unread": "Unread"
|
"unread": "Unread"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Потребители",
|
||||||
"loginsLast24H": "Logins (24h)",
|
"loginsLast24H": "Logins (24h)",
|
||||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||||
},
|
},
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Нови",
|
"new": "Нови",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Издания",
|
"issues": "Издания",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodis",
|
"episodes": "Episodis",
|
||||||
"songs": "Cançons"
|
"songs": "Cançons"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nou",
|
"new": "Nou",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problemes",
|
"issues": "Problemes",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Epizody",
|
"episodes": "Epizody",
|
||||||
"songs": "Skladby"
|
"songs": "Skladby"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nové",
|
"new": "Nové",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problémy",
|
"issues": "Problémy",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episoder",
|
"episodes": "Episoder",
|
||||||
"songs": "Sange"
|
"songs": "Sange"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Ny",
|
"new": "Ny",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problemer",
|
"issues": "Problemer",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,9 +45,9 @@
|
|||||||
"free": "Frei",
|
"free": "Frei",
|
||||||
"used": "In Benutzung",
|
"used": "In Benutzung",
|
||||||
"load": "Last",
|
"load": "Last",
|
||||||
"temp": "TEMP",
|
"temp": "Temp",
|
||||||
"max": "Max",
|
"max": "Max",
|
||||||
"uptime": "BETRIEBSZEIT"
|
"uptime": "Betriebszeit"
|
||||||
},
|
},
|
||||||
"unifi": {
|
"unifi": {
|
||||||
"users": "Benutzer",
|
"users": "Benutzer",
|
||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episoden",
|
"episodes": "Episoden",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transkodierung",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "Keine aktiven Streams",
|
||||||
|
"movies": "Filme",
|
||||||
|
"series": "Serien",
|
||||||
|
"episodes": "Episoden",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Online",
|
"up": "Online",
|
||||||
"pending": "Wartend",
|
"pending": "Wartend",
|
||||||
"down": "Offline"
|
"down": "Offline",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Neu",
|
"new": "Neu",
|
||||||
@@ -602,8 +613,8 @@
|
|||||||
"pangolin": {
|
"pangolin": {
|
||||||
"orgs": "Orgs",
|
"orgs": "Orgs",
|
||||||
"sites": "Sites",
|
"sites": "Sites",
|
||||||
"resources": "Resources",
|
"resources": "Ressourcen",
|
||||||
"targets": "Targets",
|
"targets": "Ziele",
|
||||||
"traffic": "Traffic",
|
"traffic": "Traffic",
|
||||||
"in": "In",
|
"in": "In",
|
||||||
"out": "Out"
|
"out": "Out"
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Betriebszeit",
|
"uptime": "Betriebszeit",
|
||||||
"volumeAvailable": "Verfügbar"
|
"volumeAvailable": "Verfügbar"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Serien",
|
"series": "Serien",
|
||||||
"issues": "Probleme",
|
"issues": "Probleme",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Kategorien",
|
"categories": "Kategorien",
|
||||||
"series": "Serien"
|
"series": "Serien"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Bücher",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Warteschlange",
|
"downloadCount": "Warteschlange",
|
||||||
"downloadBytesRemaining": "Verbleibend",
|
"downloadBytesRemaining": "Verbleibend",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Titel",
|
"songs": "Titel",
|
||||||
"time": "Zeit",
|
"time": "Zeit",
|
||||||
"artists": "Künstler"
|
"artists": "Künstler"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Heutige Ereignisse",
|
||||||
|
"pending_updates": "Ausstehende Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Pausiert",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Umgebung nicht gefunden"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Επεισόδια",
|
"episodes": "Επεισόδια",
|
||||||
"songs": "Τραγούδια"
|
"songs": "Τραγούδια"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -174,6 +184,13 @@
|
|||||||
"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",
|
||||||
@@ -272,17 +289,13 @@
|
|||||||
"approved": "Approved",
|
"approved": "Approved",
|
||||||
"available": "Available"
|
"available": "Available"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"seerr": {
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"approved": "Approved",
|
"approved": "Approved",
|
||||||
"available": "Available",
|
"available": "Available",
|
||||||
"issues": "Open Issues"
|
"completed": "Completed",
|
||||||
},
|
|
||||||
"overseerr": {
|
|
||||||
"pending": "Pending",
|
|
||||||
"processing": "Processing",
|
"processing": "Processing",
|
||||||
"approved": "Approved",
|
"issues": "Open Issues"
|
||||||
"available": "Available"
|
|
||||||
},
|
},
|
||||||
"netalertx": {
|
"netalertx": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
@@ -532,7 +545,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +718,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +810,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1153,32 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
|
},
|
||||||
|
"sparkyfitness": {
|
||||||
|
"eaten": "Eaten",
|
||||||
|
"burned": "Burned",
|
||||||
|
"remaining": "Remaining",
|
||||||
|
"steps": "Steps"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Epizodoj",
|
"episodes": "Epizodoj",
|
||||||
"songs": "Kantoj"
|
"songs": "Kantoj"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodios",
|
"episodes": "Episodios",
|
||||||
"songs": "Canciones"
|
"songs": "Canciones"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Reproduciendo",
|
||||||
|
"transcoding": "Convirtiendo",
|
||||||
|
"bitrate": "Tasa de Bits",
|
||||||
|
"no_active": "No hay Streams activos",
|
||||||
|
"movies": "Películas",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodios",
|
||||||
|
"songs": "Canciones"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Fuera de línea",
|
"offline": "Fuera de línea",
|
||||||
"offline_alt": "Fuera de línea",
|
"offline_alt": "Fuera de línea",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Activo",
|
"up": "Activo",
|
||||||
"pending": "Pendiente",
|
"pending": "Pendiente",
|
||||||
"down": "Inactivo"
|
"down": "Inactivo",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nuevo",
|
"new": "Nuevo",
|
||||||
@@ -601,12 +612,12 @@
|
|||||||
},
|
},
|
||||||
"pangolin": {
|
"pangolin": {
|
||||||
"orgs": "Orgs",
|
"orgs": "Orgs",
|
||||||
"sites": "Sites",
|
"sites": "Sitios",
|
||||||
"resources": "Resources",
|
"resources": "Recursos",
|
||||||
"targets": "Targets",
|
"targets": "Destinos",
|
||||||
"traffic": "Traffic",
|
"traffic": "Tráfico",
|
||||||
"in": "In",
|
"in": "Entrante",
|
||||||
"out": "Out"
|
"out": "Saliente"
|
||||||
},
|
},
|
||||||
"peanut": {
|
"peanut": {
|
||||||
"battery_charge": "Carga de la batería",
|
"battery_charge": "Carga de la batería",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Tiempo activo",
|
"uptime": "Tiempo activo",
|
||||||
"volumeAvailable": "Disponible"
|
"volumeAvailable": "Disponible"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Canales",
|
||||||
|
"streams": "Transmisiones"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Números",
|
"issues": "Números",
|
||||||
@@ -769,7 +784,7 @@
|
|||||||
"gross_percent_today": "Hoy",
|
"gross_percent_today": "Hoy",
|
||||||
"gross_percent_1y": "Un año",
|
"gross_percent_1y": "Un año",
|
||||||
"gross_percent_max": "Todo el tiempo",
|
"gross_percent_max": "Todo el tiempo",
|
||||||
"net_worth": "Net Worth"
|
"net_worth": "Patrimonio neto"
|
||||||
},
|
},
|
||||||
"audiobookshelf": {
|
"audiobookshelf": {
|
||||||
"podcasts": "Podcasts",
|
"podcasts": "Podcasts",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categorías",
|
"categories": "Categorías",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Librerías",
|
||||||
|
"books": "Libros",
|
||||||
|
"reading": "Lectura",
|
||||||
|
"finished": "Finalizado"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "En cola",
|
"downloadCount": "En cola",
|
||||||
"downloadBytesRemaining": "Restante",
|
"downloadBytesRemaining": "Restante",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Canciones",
|
"songs": "Canciones",
|
||||||
"time": "Tiempo",
|
"time": "Tiempo",
|
||||||
"artists": "Artistas"
|
"artists": "Artistas"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Activo",
|
||||||
|
"stopped": "Detenido",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memoria",
|
||||||
|
"images": "Imágenes",
|
||||||
|
"volumes": "Volumen",
|
||||||
|
"events_today": "Eventos de hoy",
|
||||||
|
"pending_updates": "Actualizaciones pendientes",
|
||||||
|
"stacks": "Entornos",
|
||||||
|
"paused": "En Pausa",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Entorno no encontrado"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Abestiak"
|
"songs": "Abestiak"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Arazoak",
|
"issues": "Arazoak",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Épisodes",
|
"episodes": "Épisodes",
|
||||||
"songs": "Morceaux"
|
"songs": "Morceaux"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Hors ligne",
|
"offline": "Hors ligne",
|
||||||
"offline_alt": "Hors ligne",
|
"offline_alt": "Hors ligne",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "En ligne",
|
"up": "En ligne",
|
||||||
"pending": "En attente",
|
"pending": "En attente",
|
||||||
"down": "Hors ligne"
|
"down": "Hors ligne",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nouveau",
|
"new": "Nouveau",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Disponibilité",
|
"uptime": "Disponibilité",
|
||||||
"volumeAvailable": "Disponible"
|
"volumeAvailable": "Disponible"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Séries",
|
"series": "Séries",
|
||||||
"issues": "Anomalies",
|
"issues": "Anomalies",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Catégories",
|
"categories": "Catégories",
|
||||||
"series": "Séries"
|
"series": "Séries"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "File d'attente",
|
"downloadCount": "File d'attente",
|
||||||
"downloadBytesRemaining": "Restant",
|
"downloadBytesRemaining": "Restant",
|
||||||
@@ -976,11 +997,11 @@
|
|||||||
},
|
},
|
||||||
"zabbix": {
|
"zabbix": {
|
||||||
"unclassified": "Non classé",
|
"unclassified": "Non classé",
|
||||||
"information": "Informations",
|
"information": "Information",
|
||||||
"warning": "Attention",
|
"warning": "Avertissement",
|
||||||
"average": "Moyenne",
|
"average": "Moyen",
|
||||||
"high": "Élevé",
|
"high": "Haut",
|
||||||
"disaster": ""
|
"disaster": "Désastre"
|
||||||
},
|
},
|
||||||
"lubelogger": {
|
"lubelogger": {
|
||||||
"vehicle": "Véhicule",
|
"vehicle": "Véhicule",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Musiques",
|
"songs": "Musiques",
|
||||||
"time": "Durée",
|
"time": "Durée",
|
||||||
"artists": "Artistes"
|
"artists": "Artistes"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "פרקים",
|
"episodes": "פרקים",
|
||||||
"songs": "שירים"
|
"songs": "שירים"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "מכובה",
|
"offline": "מכובה",
|
||||||
"offline_alt": "מכובה",
|
"offline_alt": "מכובה",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "למעלה",
|
"up": "למעלה",
|
||||||
"pending": "ממתין",
|
"pending": "ממתין",
|
||||||
"down": "למטה"
|
"down": "למטה",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "חדש",
|
"new": "חדש",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "זמן פעילות",
|
"uptime": "זמן פעילות",
|
||||||
"volumeAvailable": "זמין"
|
"volumeAvailable": "זמין"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "סדרות",
|
"series": "סדרות",
|
||||||
"issues": "גיליונות",
|
"issues": "גיליונות",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "קטגוריות",
|
"categories": "קטגוריות",
|
||||||
"series": "סדרות"
|
"series": "סדרות"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "תור",
|
"downloadCount": "תור",
|
||||||
"downloadBytesRemaining": "נותר",
|
"downloadBytesRemaining": "נותר",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Epizode",
|
"episodes": "Epizode",
|
||||||
"songs": "Pjesme"
|
"songs": "Pjesme"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Aktivno",
|
"up": "Aktivno",
|
||||||
"pending": "U tijeku",
|
"pending": "U tijeku",
|
||||||
"down": "Neaktivno"
|
"down": "Neaktivno",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Novo",
|
"new": "Novo",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Vrijeme rada",
|
"uptime": "Vrijeme rada",
|
||||||
"volumeAvailable": "Dostupno"
|
"volumeAvailable": "Dostupno"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Serije",
|
"series": "Serije",
|
||||||
"issues": "Problemi",
|
"issues": "Problemi",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Kategorije",
|
"categories": "Kategorije",
|
||||||
"series": "Serije"
|
"series": "Serije"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Red čekanja",
|
"downloadCount": "Red čekanja",
|
||||||
"downloadBytesRemaining": "Preostalo",
|
"downloadBytesRemaining": "Preostalo",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Pjesme",
|
"songs": "Pjesme",
|
||||||
"time": "Vrijeme",
|
"time": "Vrijeme",
|
||||||
"artists": "Izvođači"
|
"artists": "Izvođači"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Epizód",
|
"episodes": "Epizód",
|
||||||
"songs": "Zeneszám"
|
"songs": "Zeneszám"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Nem elérhető",
|
"offline": "Nem elérhető",
|
||||||
"offline_alt": "Nem elérhető",
|
"offline_alt": "Nem elérhető",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Fut",
|
"up": "Fut",
|
||||||
"pending": "Függőben lévő",
|
"pending": "Függőben lévő",
|
||||||
"down": "Leállt"
|
"down": "Leállt",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Új",
|
"new": "Új",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problémák",
|
"issues": "Problémák",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episode",
|
"episodes": "Episode",
|
||||||
"songs": "Lagu"
|
"songs": "Lagu"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Baru",
|
"new": "Baru",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Isu",
|
"issues": "Isu",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodi",
|
"episodes": "Episodi",
|
||||||
"songs": "Canzoni"
|
"songs": "Canzoni"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nuovo",
|
"new": "Nuovo",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problemi",
|
"issues": "Problemi",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "エピソード",
|
"episodes": "エピソード",
|
||||||
"songs": "曲"
|
"songs": "曲"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "",
|
"offline": "",
|
||||||
"offline_alt": "オフライン",
|
"offline_alt": "オフライン",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "新着",
|
"new": "新着",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "稼働時間",
|
"uptime": "稼働時間",
|
||||||
"volumeAvailable": "利用可能"
|
"volumeAvailable": "利用可能"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "課題",
|
"issues": "課題",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "에피소드",
|
"episodes": "에피소드",
|
||||||
"songs": "음악"
|
"songs": "음악"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "오프라인",
|
"offline": "오프라인",
|
||||||
"offline_alt": "오프라인",
|
"offline_alt": "오프라인",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "업",
|
"up": "업",
|
||||||
"pending": "대기 중",
|
"pending": "대기 중",
|
||||||
"down": "다운"
|
"down": "다운",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "신규",
|
"new": "신규",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "가동 시간",
|
"uptime": "가동 시간",
|
||||||
"volumeAvailable": "사용 가능"
|
"volumeAvailable": "사용 가능"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "시리즈",
|
"series": "시리즈",
|
||||||
"issues": "이슈",
|
"issues": "이슈",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "카테고리",
|
"categories": "카테고리",
|
||||||
"series": "시리즈"
|
"series": "시리즈"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "대기열",
|
"downloadCount": "대기열",
|
||||||
"downloadBytesRemaining": "남음",
|
"downloadBytesRemaining": "남음",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episod",
|
"episodes": "Episod",
|
||||||
"songs": "Lagu"
|
"songs": "Lagu"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Baharu",
|
"new": "Baharu",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Afleveringen",
|
"episodes": "Afleveringen",
|
||||||
"songs": "Nummers"
|
"songs": "Nummers"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Online",
|
"up": "Online",
|
||||||
"pending": "In afwachting",
|
"pending": "In afwachting",
|
||||||
"down": "Offline"
|
"down": "Offline",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nieuw",
|
"new": "Nieuw",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Beschikbaar"
|
"volumeAvailable": "Beschikbaar"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problemen",
|
"issues": "Problemen",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categorieën",
|
"categories": "Categorieën",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Wachtrij",
|
"downloadCount": "Wachtrij",
|
||||||
"downloadBytesRemaining": "Resterend",
|
"downloadBytesRemaining": "Resterend",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Nummers",
|
"songs": "Nummers",
|
||||||
"time": "Tijd",
|
"time": "Tijd",
|
||||||
"artists": "Artiesten"
|
"artists": "Artiesten"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episoder",
|
"episodes": "Episoder",
|
||||||
"songs": "Sanger"
|
"songs": "Sanger"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Ny",
|
"new": "Ny",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
"wlan_devices": "Urządzenia WLAN",
|
"wlan_devices": "Urządzenia WLAN",
|
||||||
"lan_users": "Użytkownicy LAN",
|
"lan_users": "Użytkownicy LAN",
|
||||||
"wlan_users": "Użytkownicy WLAN",
|
"wlan_users": "Użytkownicy WLAN",
|
||||||
"up": "UP",
|
"up": "DZIAŁA",
|
||||||
"down": "Pobieranie",
|
"down": "Pobieranie",
|
||||||
"wait": "Proszę czekać",
|
"wait": "Proszę czekać",
|
||||||
"empty_data": "Status podsystemu nieznany"
|
"empty_data": "Status podsystemu nieznany"
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
"docker": {
|
"docker": {
|
||||||
"rx": "Rx",
|
"rx": "Rx",
|
||||||
"tx": "Tx",
|
"tx": "Tx",
|
||||||
"mem": "MEM",
|
"mem": "PAM",
|
||||||
"cpu": "Procesor",
|
"cpu": "Procesor",
|
||||||
"running": "Działa",
|
"running": "Działa",
|
||||||
"offline": "Nieosiągalny",
|
"offline": "Nieosiągalny",
|
||||||
@@ -93,8 +93,8 @@
|
|||||||
"http_status": "Status HTTP",
|
"http_status": "Status HTTP",
|
||||||
"error": "Błąd",
|
"error": "Błąd",
|
||||||
"response": "Odpowiedź",
|
"response": "Odpowiedź",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"not_available": "Niedostępny"
|
"not_available": "Niedostępny"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@@ -107,12 +107,22 @@
|
|||||||
"episodes": "Odcinki",
|
"episodes": "Odcinki",
|
||||||
"songs": "Piosenki"
|
"songs": "Piosenki"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
"online": "Dostępny",
|
"online": "Dostępny",
|
||||||
"total": "Total",
|
"total": "Razem",
|
||||||
"unknown": "Unknown"
|
"unknown": "Nieznany"
|
||||||
},
|
},
|
||||||
"evcc": {
|
"evcc": {
|
||||||
"pv_power": "Produkcja",
|
"pv_power": "Produkcja",
|
||||||
@@ -141,11 +151,11 @@
|
|||||||
"connectionStatusDisconnecting": "Rozłączanie",
|
"connectionStatusDisconnecting": "Rozłączanie",
|
||||||
"connectionStatusDisconnected": "Rozłączono",
|
"connectionStatusDisconnected": "Rozłączono",
|
||||||
"connectionStatusConnected": "Połączono",
|
"connectionStatusConnected": "Połączono",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"maxDown": "Maks. Pobieranie",
|
"maxDown": "Maks. Pobieranie",
|
||||||
"maxUp": "Maks. Wysyłanie",
|
"maxUp": "Maks. Wysyłanie",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"received": "Odebrane",
|
"received": "Odebrane",
|
||||||
"sent": "Wysłane",
|
"sent": "Wysłane",
|
||||||
"externalIPAddress": "Pub. IP",
|
"externalIPAddress": "Pub. IP",
|
||||||
@@ -168,10 +178,10 @@
|
|||||||
"passes": "Przebiegi"
|
"passes": "Przebiegi"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Playing",
|
"playing": "Odtwarza",
|
||||||
"transcoding": "Transcoding",
|
"transcoding": "Transkoduje",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams",
|
"no_active": "Brak aktywnych strumieni",
|
||||||
"plex_connection_error": "Sprawdź połączenie z Plex"
|
"plex_connection_error": "Sprawdź połączenie z Plex"
|
||||||
},
|
},
|
||||||
"omada": {
|
"omada": {
|
||||||
@@ -193,24 +203,24 @@
|
|||||||
"tv": "Seriale"
|
"tv": "Seriale"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Szybkość",
|
||||||
"queue": "Kolejka",
|
"queue": "Kolejka",
|
||||||
"timeleft": "Pozostało"
|
"timeleft": "Pozostało"
|
||||||
},
|
},
|
||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "Aktywny",
|
"active": "Aktywny",
|
||||||
"upload": "Upload",
|
"upload": "Wysyłanie",
|
||||||
"download": "Pobieranie"
|
"download": "Pobieranie"
|
||||||
},
|
},
|
||||||
"transmission": {
|
"transmission": {
|
||||||
"download": "Pobieranie",
|
"download": "Pobieranie",
|
||||||
"upload": "Upload",
|
"upload": "Wysyłanie",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
"qbittorrent": {
|
"qbittorrent": {
|
||||||
"download": "Download",
|
"download": "Pobieranie",
|
||||||
"upload": "Upload",
|
"upload": "Wysyłanie",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
@@ -223,8 +233,8 @@
|
|||||||
"invalid": "Nieprawidłowy"
|
"invalid": "Nieprawidłowy"
|
||||||
},
|
},
|
||||||
"deluge": {
|
"deluge": {
|
||||||
"download": "Download",
|
"download": "Pobieranie",
|
||||||
"upload": "Upload",
|
"upload": "Wysyłanie",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
@@ -233,8 +243,8 @@
|
|||||||
"cachemissbytes": "Straty cache'u"
|
"cachemissbytes": "Straty cache'u"
|
||||||
},
|
},
|
||||||
"downloadstation": {
|
"downloadstation": {
|
||||||
"download": "Download",
|
"download": "Pobieranie",
|
||||||
"upload": "Upload",
|
"upload": "Wysyłanie",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
@@ -251,16 +261,16 @@
|
|||||||
"queued": "W kolejce",
|
"queued": "W kolejce",
|
||||||
"movies": "Filmy",
|
"movies": "Filmy",
|
||||||
"queue": "Kolejka",
|
"queue": "Kolejka",
|
||||||
"unknown": "Unknown"
|
"unknown": "Nieznane"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Poszukiwane",
|
||||||
"queued": "Queued",
|
"queued": "W kolejce",
|
||||||
"artists": "Artyści"
|
"artists": "Artyści"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Poszukiwane",
|
||||||
"queued": "Queued",
|
"queued": "W kolejce",
|
||||||
"books": "Książki"
|
"books": "Książki"
|
||||||
},
|
},
|
||||||
"bazarr": {
|
"bazarr": {
|
||||||
@@ -276,7 +286,7 @@
|
|||||||
"pending": "Oczekujące",
|
"pending": "Oczekujące",
|
||||||
"approved": "Zaakceptowane",
|
"approved": "Zaakceptowane",
|
||||||
"available": "Dostępne",
|
"available": "Dostępne",
|
||||||
"issues": "Open Issues"
|
"issues": "Otwarte zgłoszenia"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Oczekujące",
|
"pending": "Oczekujące",
|
||||||
@@ -285,8 +295,8 @@
|
|||||||
"available": "Dostępne"
|
"available": "Dostępne"
|
||||||
},
|
},
|
||||||
"netalertx": {
|
"netalertx": {
|
||||||
"total": "Total",
|
"total": "Razem",
|
||||||
"connected": "Connected",
|
"connected": "Połączono",
|
||||||
"new_devices": "Nowe urządzenia",
|
"new_devices": "Nowe urządzenia",
|
||||||
"down_alerts": "Alerty niedostępności"
|
"down_alerts": "Alerty niedostępności"
|
||||||
},
|
},
|
||||||
@@ -303,20 +313,20 @@
|
|||||||
"latency": "Opóźnienia"
|
"latency": "Opóźnienia"
|
||||||
},
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Upload",
|
"upload": "Wysyłanie",
|
||||||
"download": "Download",
|
"download": "Pobieranie",
|
||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "Running",
|
"running": "Działa",
|
||||||
"stopped": "Zatrzymane",
|
"stopped": "Zatrzymane",
|
||||||
"total": "Total"
|
"total": "Razem"
|
||||||
},
|
},
|
||||||
"suwayomi": {
|
"suwayomi": {
|
||||||
"download": "Pobrano",
|
"download": "Pobrano",
|
||||||
"nondownload": "Niepobrane",
|
"nondownload": "Niepobrane",
|
||||||
"read": "Read",
|
"read": "Przeczytane",
|
||||||
"unread": "Unread",
|
"unread": "Nieprzeczytane",
|
||||||
"downloadedread": "Pobrane i przeczytane",
|
"downloadedread": "Pobrane i przeczytane",
|
||||||
"downloadedunread": "Pobrane i nieprzeczytane",
|
"downloadedunread": "Pobrane i nieprzeczytane",
|
||||||
"nondownloadedread": "Niepobrane i przeczytane",
|
"nondownloadedread": "Niepobrane i przeczytane",
|
||||||
@@ -337,7 +347,7 @@
|
|||||||
"ago": "{{value}} temu"
|
"ago": "{{value}} temu"
|
||||||
},
|
},
|
||||||
"technitium": {
|
"technitium": {
|
||||||
"totalQueries": "Queries",
|
"totalQueries": "Zapytania",
|
||||||
"totalNoError": "Sukces",
|
"totalNoError": "Sukces",
|
||||||
"totalServerFailure": "Porażki",
|
"totalServerFailure": "Porażki",
|
||||||
"totalNxDomain": "Domeny NX",
|
"totalNxDomain": "Domeny NX",
|
||||||
@@ -345,12 +355,12 @@
|
|||||||
"totalAuthoritative": "Autorytatywne",
|
"totalAuthoritative": "Autorytatywne",
|
||||||
"totalRecursive": "Rekursywne",
|
"totalRecursive": "Rekursywne",
|
||||||
"totalCached": "Zbuforowane",
|
"totalCached": "Zbuforowane",
|
||||||
"totalBlocked": "Blocked",
|
"totalBlocked": "Zablokowane",
|
||||||
"totalDropped": "Upuszczone",
|
"totalDropped": "Upuszczone",
|
||||||
"totalClients": "Klienci"
|
"totalClients": "Klienci"
|
||||||
},
|
},
|
||||||
"tdarr": {
|
"tdarr": {
|
||||||
"queue": "Queue",
|
"queue": "W kolejce",
|
||||||
"processed": "Przetworzone",
|
"processed": "Przetworzone",
|
||||||
"errored": "Błędne",
|
"errored": "Błędne",
|
||||||
"saved": "Zapisane"
|
"saved": "Zapisane"
|
||||||
@@ -364,7 +374,7 @@
|
|||||||
"version": "Wersja",
|
"version": "Wersja",
|
||||||
"notesCount": "Notatki",
|
"notesCount": "Notatki",
|
||||||
"dbSize": "Rozmiar bazy danych",
|
"dbSize": "Rozmiar bazy danych",
|
||||||
"unknown": "Unknown"
|
"unknown": "Nieznane"
|
||||||
},
|
},
|
||||||
"navidrome": {
|
"navidrome": {
|
||||||
"nothing_streaming": "Brak aktywnych strumieni",
|
"nothing_streaming": "Brak aktywnych strumieni",
|
||||||
@@ -373,7 +383,7 @@
|
|||||||
"npm": {
|
"npm": {
|
||||||
"enabled": "Włączone",
|
"enabled": "Włączone",
|
||||||
"disabled": "Wyłączone",
|
"disabled": "Wyłączone",
|
||||||
"total": "Total"
|
"total": "Razem"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Wybierz jedną lub więcej kryptowalut do śledzenia",
|
"configure": "Wybierz jedną lub więcej kryptowalut do śledzenia",
|
||||||
@@ -390,19 +400,19 @@
|
|||||||
"prowlarr": {
|
"prowlarr": {
|
||||||
"enableIndexers": "Indeksery",
|
"enableIndexers": "Indeksery",
|
||||||
"numberOfGrabs": "Pochwycenia",
|
"numberOfGrabs": "Pochwycenia",
|
||||||
"numberOfQueries": "Queries",
|
"numberOfQueries": "Zapytania",
|
||||||
"numberOfFailGrabs": "Nieudane pochwycenia",
|
"numberOfFailGrabs": "Nieudane pochwycenia",
|
||||||
"numberOfFailQueries": "Nieudane zapytania"
|
"numberOfFailQueries": "Nieudane zapytania"
|
||||||
},
|
},
|
||||||
"jackett": {
|
"jackett": {
|
||||||
"configured": "Skonfigurowane",
|
"configured": "Skonfigurowane",
|
||||||
"errored": "Errored"
|
"errored": "Z błędami"
|
||||||
},
|
},
|
||||||
"strelaysrv": {
|
"strelaysrv": {
|
||||||
"numActiveSessions": "Sesje",
|
"numActiveSessions": "Sesje",
|
||||||
"numConnections": "Połączenia",
|
"numConnections": "Połączenia",
|
||||||
"dataRelayed": "Przekazane",
|
"dataRelayed": "Przekazane",
|
||||||
"transferRate": "Rate"
|
"transferRate": "Szybkość"
|
||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "Użytkownicy",
|
"user_count": "Użytkownicy",
|
||||||
@@ -410,9 +420,9 @@
|
|||||||
"domain_count": "Domeny"
|
"domain_count": "Domeny"
|
||||||
},
|
},
|
||||||
"medusa": {
|
"medusa": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Poszukiwane",
|
||||||
"queued": "Queued",
|
"queued": "W kolejce",
|
||||||
"series": "Series"
|
"series": "Seriale"
|
||||||
},
|
},
|
||||||
"minecraft": {
|
"minecraft": {
|
||||||
"players": "Gracze",
|
"players": "Gracze",
|
||||||
@@ -423,7 +433,7 @@
|
|||||||
},
|
},
|
||||||
"miniflux": {
|
"miniflux": {
|
||||||
"read": "Przeczytane",
|
"read": "Przeczytane",
|
||||||
"unread": "Unread"
|
"unread": "Nieprzeczytane"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Użytkownicy",
|
"users": "Użytkownicy",
|
||||||
@@ -443,14 +453,14 @@
|
|||||||
"temp": "TEMP.",
|
"temp": "TEMP.",
|
||||||
"_temp": "Temperatura",
|
"_temp": "Temperatura",
|
||||||
"warn": "Ostrzeżenie",
|
"warn": "Ostrzeżenie",
|
||||||
"uptime": "UP",
|
"uptime": "DZIAŁA",
|
||||||
"total": "Total",
|
"total": "Razem",
|
||||||
"free": "Wolne",
|
"free": "Wolne",
|
||||||
"used": "Used",
|
"used": "Użyte",
|
||||||
"days": "d",
|
"days": "d",
|
||||||
"hours": "h",
|
"hours": "godz",
|
||||||
"crit": "Krytyczyny",
|
"crit": "Krytyczyny",
|
||||||
"read": "Read",
|
"read": "Odczyt",
|
||||||
"write": "Zapis",
|
"write": "Zapis",
|
||||||
"gpu": "GPU",
|
"gpu": "GPU",
|
||||||
"mem": "Pamięć",
|
"mem": "Pamięć",
|
||||||
@@ -530,15 +540,16 @@
|
|||||||
"up_to_date": "Aktualny",
|
"up_to_date": "Aktualny",
|
||||||
"child_bridges": "Mostki podrzędne",
|
"child_bridges": "Mostki podrzędne",
|
||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"pending": "Pending",
|
"pending": "Oczekujące",
|
||||||
"down": "Down"
|
"down": "Nie działa",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nowy",
|
"new": "Nowy",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"grace": "W okresie karencji",
|
"grace": "W okresie karencji",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"paused": "Wstrzymane",
|
"paused": "Wstrzymane",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"last_ping": "Ostatni ping",
|
"last_ping": "Ostatni ping",
|
||||||
@@ -550,63 +561,63 @@
|
|||||||
"containers_failed": "Niepowodzenie"
|
"containers_failed": "Niepowodzenie"
|
||||||
},
|
},
|
||||||
"autobrr": {
|
"autobrr": {
|
||||||
"approvedPushes": "Approved",
|
"approvedPushes": "Zaakceptowane",
|
||||||
"rejectedPushes": "Odrzucone",
|
"rejectedPushes": "Odrzucone",
|
||||||
"filters": "Filtry",
|
"filters": "Filtry",
|
||||||
"indexers": "Indexers"
|
"indexers": "Indeksery"
|
||||||
},
|
},
|
||||||
"tubearchivist": {
|
"tubearchivist": {
|
||||||
"downloads": "Queue",
|
"downloads": "W kolejce",
|
||||||
"videos": "Pliki wideo",
|
"videos": "Pliki wideo",
|
||||||
"channels": "Kanały",
|
"channels": "Kanały",
|
||||||
"playlists": "Playlisty"
|
"playlists": "Playlisty"
|
||||||
},
|
},
|
||||||
"truenas": {
|
"truenas": {
|
||||||
"load": "Obciążenie systemu",
|
"load": "Obciążenie systemu",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"alerts": "Alerts"
|
"alerts": "Alerty"
|
||||||
},
|
},
|
||||||
"pyload": {
|
"pyload": {
|
||||||
"speed": "Prędkość",
|
"speed": "Prędkość",
|
||||||
"active": "Active",
|
"active": "Aktywne",
|
||||||
"queue": "Queue",
|
"queue": "W kolejce",
|
||||||
"total": "Total"
|
"total": "Razem"
|
||||||
},
|
},
|
||||||
"gluetun": {
|
"gluetun": {
|
||||||
"public_ip": "Adres publiczny",
|
"public_ip": "Adres publiczny",
|
||||||
"region": "Region",
|
"region": "Region",
|
||||||
"country": "Państwo",
|
"country": "Państwo",
|
||||||
"port_forwarded": "Port Forwarded"
|
"port_forwarded": "Port otwarty"
|
||||||
},
|
},
|
||||||
"hdhomerun": {
|
"hdhomerun": {
|
||||||
"channels": "Channels",
|
"channels": "Kanały",
|
||||||
"hd": "HD",
|
"hd": "HD",
|
||||||
"tunerCount": "Tunery",
|
"tunerCount": "Tunery",
|
||||||
"channelNumber": "Kanał",
|
"channelNumber": "Kanał",
|
||||||
"channelNetwork": "Sieć",
|
"channelNetwork": "Sieć",
|
||||||
"signalStrength": "Siła sygnału",
|
"signalStrength": "Siła sygnału",
|
||||||
"signalQuality": "Jakość",
|
"signalQuality": "Jakość",
|
||||||
"symbolQuality": "Quality",
|
"symbolQuality": "Jakość",
|
||||||
"networkRate": "Bitrate",
|
"networkRate": "Bitrate",
|
||||||
"clientIP": "Klient"
|
"clientIP": "Klient"
|
||||||
},
|
},
|
||||||
"scrutiny": {
|
"scrutiny": {
|
||||||
"passed": "Powodzenie",
|
"passed": "Powodzenie",
|
||||||
"failed": "Failed",
|
"failed": "Nieudane",
|
||||||
"unknown": "Unknown"
|
"unknown": "Nieznane"
|
||||||
},
|
},
|
||||||
"paperlessngx": {
|
"paperlessngx": {
|
||||||
"inbox": "Skrzynka odbiorcza",
|
"inbox": "Skrzynka odbiorcza",
|
||||||
"total": "Total"
|
"total": "Razem"
|
||||||
},
|
},
|
||||||
"pangolin": {
|
"pangolin": {
|
||||||
"orgs": "Orgs",
|
"orgs": "Organizacje",
|
||||||
"sites": "Sites",
|
"sites": "Strony",
|
||||||
"resources": "Resources",
|
"resources": "Zasoby",
|
||||||
"targets": "Targets",
|
"targets": "Cele",
|
||||||
"traffic": "Traffic",
|
"traffic": "Ruch",
|
||||||
"in": "In",
|
"in": "Do",
|
||||||
"out": "Out"
|
"out": "Z"
|
||||||
},
|
},
|
||||||
"peanut": {
|
"peanut": {
|
||||||
"battery_charge": "Stan baterii",
|
"battery_charge": "Stan baterii",
|
||||||
@@ -617,18 +628,18 @@
|
|||||||
"low_battery": "Niski poziom baterii"
|
"low_battery": "Niski poziom baterii"
|
||||||
},
|
},
|
||||||
"nextdns": {
|
"nextdns": {
|
||||||
"wait": "Please Wait",
|
"wait": "Proszę czekać",
|
||||||
"no_devices": "Nie otrzymano danych urządzenia"
|
"no_devices": "Nie otrzymano danych urządzenia"
|
||||||
},
|
},
|
||||||
"mikrotik": {
|
"mikrotik": {
|
||||||
"cpuLoad": "Obciążenie procesora",
|
"cpuLoad": "Obciążenie procesora",
|
||||||
"memoryUsed": "Zużyta pamięć",
|
"memoryUsed": "Zużyta pamięć",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"numberOfLeases": "Dzierżawy"
|
"numberOfLeases": "Dzierżawy"
|
||||||
},
|
},
|
||||||
"xteve": {
|
"xteve": {
|
||||||
"streams_all": "Wszystkie strumienie",
|
"streams_all": "Wszystkie strumienie",
|
||||||
"streams_active": "Active Streams",
|
"streams_active": "Aktywne strumienie",
|
||||||
"streams_xepg": "Kanały XEPG"
|
"streams_xepg": "Kanały XEPG"
|
||||||
},
|
},
|
||||||
"opendtu": {
|
"opendtu": {
|
||||||
@@ -663,9 +674,9 @@
|
|||||||
"load": "Śr. Obciążenie",
|
"load": "Śr. Obciążenie",
|
||||||
"memory": "Użycie pamięci",
|
"memory": "Użycie pamięci",
|
||||||
"wanStatus": "Status WAN",
|
"wanStatus": "Status WAN",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"temp": "Temp",
|
"temp": "Temperatura",
|
||||||
"disk": "Użycie dysku",
|
"disk": "Użycie dysku",
|
||||||
"wanIP": "WAN IP"
|
"wanIP": "WAN IP"
|
||||||
},
|
},
|
||||||
@@ -676,38 +687,42 @@
|
|||||||
"memory_usage": "Pamięć"
|
"memory_usage": "Pamięć"
|
||||||
},
|
},
|
||||||
"immich": {
|
"immich": {
|
||||||
"users": "Users",
|
"users": "Użytkownicy",
|
||||||
"photos": "Zdjęcia",
|
"photos": "Zdjęcia",
|
||||||
"videos": "Videos",
|
"videos": "Filmy",
|
||||||
"storage": "Pamięć"
|
"storage": "Pamięć"
|
||||||
},
|
},
|
||||||
"uptimekuma": {
|
"uptimekuma": {
|
||||||
"up": "Działające",
|
"up": "Działające",
|
||||||
"down": "Niedziałające",
|
"down": "Niedziałające",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"incident": "Incydent",
|
"incident": "Incydent",
|
||||||
"m": "m"
|
"m": "min"
|
||||||
},
|
},
|
||||||
"atsumeru": {
|
"atsumeru": {
|
||||||
"series": "Series",
|
"series": "Serie",
|
||||||
"archives": "Archiwa",
|
"archives": "Archiwa",
|
||||||
"chapters": "Rozdziały",
|
"chapters": "Rozdziały",
|
||||||
"categories": "Kategorie"
|
"categories": "Kategorie"
|
||||||
},
|
},
|
||||||
"komga": {
|
"komga": {
|
||||||
"libraries": "Biblioteki",
|
"libraries": "Biblioteki",
|
||||||
"series": "Series",
|
"series": "Serie",
|
||||||
"books": "Books"
|
"books": "Książki"
|
||||||
},
|
},
|
||||||
"diskstation": {
|
"diskstation": {
|
||||||
"days": "Days",
|
"days": "Dni",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Dostępne"
|
||||||
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
},
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Seriale",
|
||||||
"issues": "Zgłoszenia",
|
"issues": "Zgłoszenia",
|
||||||
"wanted": "Wanted"
|
"wanted": "Poszukiwane"
|
||||||
},
|
},
|
||||||
"photoprism": {
|
"photoprism": {
|
||||||
"albums": "Albumy",
|
"albums": "Albumy",
|
||||||
@@ -716,9 +731,9 @@
|
|||||||
"people": "Ludzie"
|
"people": "Ludzie"
|
||||||
},
|
},
|
||||||
"fileflows": {
|
"fileflows": {
|
||||||
"queue": "Queue",
|
"queue": "W kolejce",
|
||||||
"processing": "Processing",
|
"processing": "Przetwarzane",
|
||||||
"processed": "Processed",
|
"processed": "Przetworzone",
|
||||||
"time": "Czas"
|
"time": "Czas"
|
||||||
},
|
},
|
||||||
"firefly": {
|
"firefly": {
|
||||||
@@ -744,7 +759,7 @@
|
|||||||
"size": "Rozmiar",
|
"size": "Rozmiar",
|
||||||
"lastrun": "Ostatnie uruchomienie",
|
"lastrun": "Ostatnie uruchomienie",
|
||||||
"nextrun": "Następne uruchomienie",
|
"nextrun": "Następne uruchomienie",
|
||||||
"failed": "Failed"
|
"failed": "Nieudane"
|
||||||
},
|
},
|
||||||
"unmanic": {
|
"unmanic": {
|
||||||
"active_workers": "Aktywni pracownicy",
|
"active_workers": "Aktywni pracownicy",
|
||||||
@@ -761,15 +776,15 @@
|
|||||||
"targets_total": "Wszystkich Celi"
|
"targets_total": "Wszystkich Celi"
|
||||||
},
|
},
|
||||||
"gatus": {
|
"gatus": {
|
||||||
"up": "Sites Up",
|
"up": "Działające strony",
|
||||||
"down": "Sites Down",
|
"down": "Niedziałające strony",
|
||||||
"uptime": "Uptime"
|
"uptime": "Czas działania"
|
||||||
},
|
},
|
||||||
"ghostfolio": {
|
"ghostfolio": {
|
||||||
"gross_percent_today": "Dzisiaj",
|
"gross_percent_today": "Dzisiaj",
|
||||||
"gross_percent_1y": "Rok",
|
"gross_percent_1y": "Rok",
|
||||||
"gross_percent_max": "Od początku",
|
"gross_percent_max": "Od początku",
|
||||||
"net_worth": "Net Worth"
|
"net_worth": "Wartość netto"
|
||||||
},
|
},
|
||||||
"audiobookshelf": {
|
"audiobookshelf": {
|
||||||
"podcasts": "Podcasty",
|
"podcasts": "Podcasty",
|
||||||
@@ -784,22 +799,28 @@
|
|||||||
},
|
},
|
||||||
"whatsupdocker": {
|
"whatsupdocker": {
|
||||||
"monitoring": "Monitoring",
|
"monitoring": "Monitoring",
|
||||||
"updates": "Updates"
|
"updates": "Aktualizacje"
|
||||||
},
|
},
|
||||||
"calibreweb": {
|
"calibreweb": {
|
||||||
"books": "Książki",
|
"books": "Książki",
|
||||||
"authors": "Autorzy",
|
"authors": "Autorzy",
|
||||||
"categories": "Kategorie",
|
"categories": "Kategorie",
|
||||||
"series": "Series"
|
"series": "Serie"
|
||||||
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Biblioteki",
|
||||||
|
"books": "Książki",
|
||||||
|
"reading": "Czytane",
|
||||||
|
"finished": "Skończone"
|
||||||
},
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "W kolejce",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Pozostało",
|
||||||
"downloadTotalBytes": "Size",
|
"downloadTotalBytes": "Rozmiar",
|
||||||
"downloadSpeed": "Prędkość"
|
"downloadSpeed": "Prędkość"
|
||||||
},
|
},
|
||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Serie",
|
||||||
"totalFiles": "Pliki"
|
"totalFiles": "Pliki"
|
||||||
},
|
},
|
||||||
"azuredevops": {
|
"azuredevops": {
|
||||||
@@ -813,7 +834,7 @@
|
|||||||
"inProgress": "W trakcie",
|
"inProgress": "W trakcie",
|
||||||
"totalPrs": "Łącznie PRs",
|
"totalPrs": "Łącznie PRs",
|
||||||
"myPrs": "Moje PRs",
|
"myPrs": "Moje PRs",
|
||||||
"approved": "Approved"
|
"approved": "Zaakceptowane"
|
||||||
},
|
},
|
||||||
"gamedig": {
|
"gamedig": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
@@ -841,33 +862,33 @@
|
|||||||
},
|
},
|
||||||
"openmediavault": {
|
"openmediavault": {
|
||||||
"downloading": "Pobieranie",
|
"downloading": "Pobieranie",
|
||||||
"total": "Total",
|
"total": "Razem",
|
||||||
"running": "Running",
|
"running": "Działające",
|
||||||
"stopped": "Stopped",
|
"stopped": "Zatrzymane",
|
||||||
"passed": "Passed",
|
"passed": "Zaliczony",
|
||||||
"failed": "Failed"
|
"failed": "Nieudany"
|
||||||
},
|
},
|
||||||
"openwrt": {
|
"openwrt": {
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"cpuLoad": "Śr. obciążenie CPU (5m)",
|
"cpuLoad": "Śr. obciążenie CPU (5m)",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"bytesTx": "Przesłane",
|
"bytesTx": "Przesłane",
|
||||||
"bytesRx": "Received"
|
"bytesRx": "Odebrano"
|
||||||
},
|
},
|
||||||
"uptimerobot": {
|
"uptimerobot": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"lastDown": "Ostatni downtime",
|
"lastDown": "Ostatni downtime",
|
||||||
"downDuration": "Długość downtime'u",
|
"downDuration": "Długość downtime'u",
|
||||||
"sitesUp": "Sites Up",
|
"sitesUp": "Działające strony",
|
||||||
"sitesDown": "Sites Down",
|
"sitesDown": "Niedziałające strony",
|
||||||
"paused": "Paused",
|
"paused": "Zatrzymane",
|
||||||
"notyetchecked": "Nie sprawdzono",
|
"notyetchecked": "Nie sprawdzono",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"seemsdown": "Możliwe, że wyłączony",
|
"seemsdown": "Możliwe, że wyłączony",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"unknown": "Unknown"
|
"unknown": "Nieznane"
|
||||||
},
|
},
|
||||||
"calendar": {
|
"calendar": {
|
||||||
"inCinemas": "W kinach",
|
"inCinemas": "W kinach",
|
||||||
@@ -886,10 +907,10 @@
|
|||||||
"totalfilesize": "Rozmiar całkowity"
|
"totalfilesize": "Rozmiar całkowity"
|
||||||
},
|
},
|
||||||
"mailcow": {
|
"mailcow": {
|
||||||
"domains": "Domains",
|
"domains": "Domeny",
|
||||||
"mailboxes": "Skrzynki",
|
"mailboxes": "Skrzynki",
|
||||||
"mails": "Poczta",
|
"mails": "Poczta",
|
||||||
"storage": "Storage"
|
"storage": "Pamięć"
|
||||||
},
|
},
|
||||||
"netdata": {
|
"netdata": {
|
||||||
"warnings": "Ostrzeżenia",
|
"warnings": "Ostrzeżenia",
|
||||||
@@ -898,12 +919,12 @@
|
|||||||
"plantit": {
|
"plantit": {
|
||||||
"events": "Wydarzenia",
|
"events": "Wydarzenia",
|
||||||
"plants": "Rośliny",
|
"plants": "Rośliny",
|
||||||
"photos": "Photos",
|
"photos": "Zdjęcia",
|
||||||
"species": "Gatunki"
|
"species": "Gatunki"
|
||||||
},
|
},
|
||||||
"gitea": {
|
"gitea": {
|
||||||
"notifications": "Powiadomienia",
|
"notifications": "Powiadomienia",
|
||||||
"issues": "Issues",
|
"issues": "Zgłoszenia",
|
||||||
"pulls": "Żądania Pull",
|
"pulls": "Żądania Pull",
|
||||||
"repositories": "Repozytoria"
|
"repositories": "Repozytoria"
|
||||||
},
|
},
|
||||||
@@ -919,13 +940,13 @@
|
|||||||
"galleries": "Galerie",
|
"galleries": "Galerie",
|
||||||
"performers": "Artyści",
|
"performers": "Artyści",
|
||||||
"studios": "Studia",
|
"studios": "Studia",
|
||||||
"movies": "Movies",
|
"movies": "Filmy",
|
||||||
"tags": "Tags",
|
"tags": "Tagi",
|
||||||
"oCount": "O Licznik"
|
"oCount": "O Licznik"
|
||||||
},
|
},
|
||||||
"tandoor": {
|
"tandoor": {
|
||||||
"users": "Users",
|
"users": "Użytkownicy",
|
||||||
"recipes": "Recipes",
|
"recipes": "Przepisy",
|
||||||
"keywords": "Słowa kluczowe"
|
"keywords": "Słowa kluczowe"
|
||||||
},
|
},
|
||||||
"homebox": {
|
"homebox": {
|
||||||
@@ -933,18 +954,18 @@
|
|||||||
"totalWithWarranty": "Z gwarancją",
|
"totalWithWarranty": "Z gwarancją",
|
||||||
"locations": "Lokalizacje",
|
"locations": "Lokalizacje",
|
||||||
"labels": "Etykiety",
|
"labels": "Etykiety",
|
||||||
"users": "Users",
|
"users": "Użytkownicy",
|
||||||
"totalValue": "Wartość całkowita"
|
"totalValue": "Wartość całkowita"
|
||||||
},
|
},
|
||||||
"crowdsec": {
|
"crowdsec": {
|
||||||
"alerts": "Alerts",
|
"alerts": "Alerty",
|
||||||
"bans": "Bany"
|
"bans": "Bany"
|
||||||
},
|
},
|
||||||
"wgeasy": {
|
"wgeasy": {
|
||||||
"connected": "Connected",
|
"connected": "Połączonych",
|
||||||
"enabled": "Enabled",
|
"enabled": "Włączone",
|
||||||
"disabled": "Disabled",
|
"disabled": "Wyłączone",
|
||||||
"total": "Total"
|
"total": "Razem"
|
||||||
},
|
},
|
||||||
"swagdashboard": {
|
"swagdashboard": {
|
||||||
"proxied": "Proxy",
|
"proxied": "Proxy",
|
||||||
@@ -966,7 +987,7 @@
|
|||||||
},
|
},
|
||||||
"frigate": {
|
"frigate": {
|
||||||
"cameras": "Kamery",
|
"cameras": "Kamery",
|
||||||
"uptime": "Uptime",
|
"uptime": "Czas działania",
|
||||||
"version": "Wersja"
|
"version": "Wersja"
|
||||||
},
|
},
|
||||||
"linkwarden": {
|
"linkwarden": {
|
||||||
@@ -976,7 +997,7 @@
|
|||||||
},
|
},
|
||||||
"zabbix": {
|
"zabbix": {
|
||||||
"unclassified": "Niezaklasyfikowane",
|
"unclassified": "Niezaklasyfikowane",
|
||||||
"information": "Information",
|
"information": "Informacja",
|
||||||
"warning": "Ostrzeżenie",
|
"warning": "Ostrzeżenie",
|
||||||
"average": "Średnia",
|
"average": "Średnia",
|
||||||
"high": "Wysokie",
|
"high": "Wysokie",
|
||||||
@@ -1007,14 +1028,14 @@
|
|||||||
"beszel": {
|
"beszel": {
|
||||||
"name": "Nazwa",
|
"name": "Nazwa",
|
||||||
"systems": "Systemy",
|
"systems": "Systemy",
|
||||||
"up": "Up",
|
"up": "Działa",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"paused": "Paused",
|
"paused": "Wstrzymane",
|
||||||
"pending": "Pending",
|
"pending": "Oczekujące",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"updated": "Updated",
|
"updated": "Zaktualizowane",
|
||||||
"cpu": "Procesor",
|
"cpu": "Procesor",
|
||||||
"memory": "MEM",
|
"memory": "PAM",
|
||||||
"disk": "Dysk",
|
"disk": "Dysk",
|
||||||
"network": "NET"
|
"network": "NET"
|
||||||
},
|
},
|
||||||
@@ -1022,14 +1043,14 @@
|
|||||||
"apps": "Aplikacje",
|
"apps": "Aplikacje",
|
||||||
"synced": "Synchronizowane",
|
"synced": "Synchronizowane",
|
||||||
"outOfSync": "Bez synchronizacji",
|
"outOfSync": "Bez synchronizacji",
|
||||||
"healthy": "Healthy",
|
"healthy": "Zdrowe",
|
||||||
"degraded": "Zdegradowane",
|
"degraded": "Zdegradowane",
|
||||||
"progressing": "Postępujące",
|
"progressing": "Postępujące",
|
||||||
"missing": "Missing",
|
"missing": "Brakujące",
|
||||||
"suspended": "Zawieszone"
|
"suspended": "Zawieszone"
|
||||||
},
|
},
|
||||||
"spoolman": {
|
"spoolman": {
|
||||||
"loading": "Loading"
|
"loading": "Ładowanie"
|
||||||
},
|
},
|
||||||
"gitlab": {
|
"gitlab": {
|
||||||
"groups": "Grupy",
|
"groups": "Grupy",
|
||||||
@@ -1039,9 +1060,9 @@
|
|||||||
},
|
},
|
||||||
"apcups": {
|
"apcups": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"load": "Load",
|
"load": "Obciążenie",
|
||||||
"bcharge": "Battery Charge",
|
"bcharge": "Naładowanie baterii",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Pozostały czas"
|
||||||
},
|
},
|
||||||
"karakeep": {
|
"karakeep": {
|
||||||
"bookmarks": "Zakładki",
|
"bookmarks": "Zakładki",
|
||||||
@@ -1052,11 +1073,11 @@
|
|||||||
"tags": "Tagi"
|
"tags": "Tagi"
|
||||||
},
|
},
|
||||||
"slskd": {
|
"slskd": {
|
||||||
"slskStatus": "Network",
|
"slskStatus": "Sieć",
|
||||||
"connected": "Connected",
|
"connected": "Połączono",
|
||||||
"disconnected": "Disconnected",
|
"disconnected": "Rozłączono",
|
||||||
"updateStatus": "Aktualizacja",
|
"updateStatus": "Aktualizacja",
|
||||||
"update_yes": "Available",
|
"update_yes": "Dostępne",
|
||||||
"update_no": "Aktualny",
|
"update_no": "Aktualny",
|
||||||
"downloads": "Pobieranie",
|
"downloads": "Pobieranie",
|
||||||
"uploads": "Przesyłanie",
|
"uploads": "Przesyłanie",
|
||||||
@@ -1069,65 +1090,86 @@
|
|||||||
"other": "Inne"
|
"other": "Inne"
|
||||||
},
|
},
|
||||||
"checkmk": {
|
"checkmk": {
|
||||||
"serviceErrors": "Service issues",
|
"serviceErrors": "Problem z usługą",
|
||||||
"hostErrors": "Host issues"
|
"hostErrors": "Problemy hosta"
|
||||||
},
|
},
|
||||||
"komodo": {
|
"komodo": {
|
||||||
"total": "Total",
|
"total": "Razem",
|
||||||
"running": "Running",
|
"running": "Działające",
|
||||||
"stopped": "Stopped",
|
"stopped": "Zatrzymane",
|
||||||
"down": "Down",
|
"down": "Nie działa",
|
||||||
"unhealthy": "Unhealthy",
|
"unhealthy": "Uszkodzony",
|
||||||
"unknown": "Unknown",
|
"unknown": "Nieznane",
|
||||||
"servers": "Serwery",
|
"servers": "Serwery",
|
||||||
"stacks": "Stacks",
|
"stacks": "Stosy",
|
||||||
"containers": "Containers"
|
"containers": "Kontenery"
|
||||||
},
|
},
|
||||||
"filebrowser": {
|
"filebrowser": {
|
||||||
"available": "Available",
|
"available": "Dostępne",
|
||||||
"used": "Used",
|
"used": "Użyte",
|
||||||
"total": "Total"
|
"total": "Razem"
|
||||||
},
|
},
|
||||||
"wallos": {
|
"wallos": {
|
||||||
"activeSubscriptions": "Subscriptions",
|
"activeSubscriptions": "Subskrypcje",
|
||||||
"thisMonthlyCost": "This Month",
|
"thisMonthlyCost": "Ten Miesiąc",
|
||||||
"nextMonthlyCost": "Next Month",
|
"nextMonthlyCost": "Następny miesiąc",
|
||||||
"previousMonthlyCost": "Prev. Month",
|
"previousMonthlyCost": "Poprzedni miesiąc",
|
||||||
"nextRenewingSubscription": "Next Payment"
|
"nextRenewingSubscription": "Następna płatność"
|
||||||
},
|
},
|
||||||
"unraid": {
|
"unraid": {
|
||||||
"STARTED": "Started",
|
"STARTED": "Rozpoczęte",
|
||||||
"STOPPED": "Stopped",
|
"STOPPED": "Zatrzymane",
|
||||||
"NEW_ARRAY": "New Array",
|
"NEW_ARRAY": "Nowa macierz",
|
||||||
"RECON_DISK": "Reconstructing Disk",
|
"RECON_DISK": "Odbudowa dysku",
|
||||||
"DISABLE_DISK": "Disk Disabled",
|
"DISABLE_DISK": "Dysk wyłączony",
|
||||||
"SWAP_DSBL": "Swap Disable",
|
"SWAP_DSBL": "Przestrzeń wymiany wyłączona",
|
||||||
"INVALID_EXPANSION": "Invalid Expansion",
|
"INVALID_EXPANSION": "Nieprawidłowe rozszerzenie",
|
||||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
"PARITY_NOT_BIGGEST": "Parzystość nie największa",
|
||||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
"TOO_MANY_MISSING_DISKS": "Zbyt wiele brakujących dysków",
|
||||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
"NEW_DISK_TOO_SMALL": "Nowy dysk zbyt mały",
|
||||||
"NO_DATA_DISKS": "No Data Disks",
|
"NO_DATA_DISKS": "Brak dysków danych",
|
||||||
"notifications": "Notifications",
|
"notifications": "Powiadomienia",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"memoryUsed": "Memory Used",
|
"memoryUsed": "Użyta pamięć",
|
||||||
"memoryAvailable": "Memory Available",
|
"memoryAvailable": "Dostępna pamięć",
|
||||||
"arrayUsed": "Array Used",
|
"arrayUsed": "Użyto macierzy",
|
||||||
"arrayFree": "Array Free",
|
"arrayFree": "Wolne na macierzy",
|
||||||
"poolUsed": "{{pool}} Used",
|
"poolUsed": "Użyto {{pool}}",
|
||||||
"poolFree": "{{pool}} Free"
|
"poolFree": "{{pool}} Wolne"
|
||||||
},
|
},
|
||||||
"backrest": {
|
"backrest": {
|
||||||
"num_plans": "Plans",
|
"num_plans": "Planowane",
|
||||||
"num_success_30": "Successes",
|
"num_success_30": "Powodzenia",
|
||||||
"num_failure_30": "Failures",
|
"num_failure_30": "Niepowodzenia",
|
||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Powodzenie",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Niepowodzenie",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Dodane bajty"
|
||||||
},
|
},
|
||||||
"yourspotify": {
|
"yourspotify": {
|
||||||
"songs": "Songs",
|
"songs": "Piosenki",
|
||||||
"time": "Time",
|
"time": "Czas",
|
||||||
"artists": "Artists"
|
"artists": "Wykonawcy"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Działające",
|
||||||
|
"stopped": "Zatrzymane",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Pamięć",
|
||||||
|
"images": "Obrazy",
|
||||||
|
"volumes": "Woluminy",
|
||||||
|
"events_today": "Zdarzenia dzisiaj",
|
||||||
|
"pending_updates": "Oczekujące aktualizacje",
|
||||||
|
"stacks": "Stosy",
|
||||||
|
"paused": "Wstrzymane",
|
||||||
|
"total": "Razem",
|
||||||
|
"environment_not_found": "Środowisko nie znalezione"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episódios",
|
"episodes": "Episódios",
|
||||||
"songs": "Canções"
|
"songs": "Canções"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Novo",
|
"new": "Novo",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problemas",
|
"issues": "Problemas",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episódios",
|
"episodes": "Episódios",
|
||||||
"songs": "Canções"
|
"songs": "Canções"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Ativo",
|
"up": "Ativo",
|
||||||
"pending": "Pendente",
|
"pending": "Pendente",
|
||||||
"down": "Inativo"
|
"down": "Inativo",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Novo",
|
"new": "Novo",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Tempo ativo",
|
"uptime": "Tempo ativo",
|
||||||
"volumeAvailable": "Disponível"
|
"volumeAvailable": "Disponível"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Séries",
|
"series": "Séries",
|
||||||
"issues": "Problemas",
|
"issues": "Problemas",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categorias",
|
"categories": "Categorias",
|
||||||
"series": "Séries"
|
"series": "Séries"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Fila de espera",
|
"downloadCount": "Fila de espera",
|
||||||
"downloadBytesRemaining": "Restante",
|
"downloadBytesRemaining": "Restante",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Músicas",
|
"songs": "Músicas",
|
||||||
"time": "Tempo",
|
"time": "Tempo",
|
||||||
"artists": "Artistas"
|
"artists": "Artistas"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episoade",
|
"episodes": "Episoade",
|
||||||
"songs": "Melodii"
|
"songs": "Melodii"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nou",
|
"new": "Nou",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Эпизоды",
|
"episodes": "Эпизоды",
|
||||||
"songs": "Песни"
|
"songs": "Песни"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Не в сети",
|
"offline": "Не в сети",
|
||||||
"offline_alt": "Не в сети",
|
"offline_alt": "Не в сети",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "В сети",
|
"up": "В сети",
|
||||||
"pending": "Ожидают",
|
"pending": "Ожидают",
|
||||||
"down": "Не в сети"
|
"down": "Не в сети",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Новый",
|
"new": "Новый",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Время работы",
|
"uptime": "Время работы",
|
||||||
"volumeAvailable": "Доступно"
|
"volumeAvailable": "Доступно"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Серии",
|
"series": "Серии",
|
||||||
"issues": "Вопросы",
|
"issues": "Вопросы",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Категории",
|
"categories": "Категории",
|
||||||
"series": "Серии"
|
"series": "Серии"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Очередь",
|
"downloadCount": "Очередь",
|
||||||
"downloadBytesRemaining": "Осталось",
|
"downloadBytesRemaining": "Осталось",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Epizódy",
|
"episodes": "Epizódy",
|
||||||
"songs": "Skladby"
|
"songs": "Skladby"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Beží",
|
"up": "Beží",
|
||||||
"pending": "Čakajúce",
|
"pending": "Čakajúce",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nový",
|
"new": "Nový",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Dostupnosť",
|
"uptime": "Dostupnosť",
|
||||||
"volumeAvailable": "Dostupné"
|
"volumeAvailable": "Dostupné"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Problémy",
|
"issues": "Problémy",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Kategórie",
|
"categories": "Kategórie",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Poradie",
|
"downloadCount": "Poradie",
|
||||||
"downloadBytesRemaining": "Zostávajúce",
|
"downloadBytesRemaining": "Zostávajúce",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Epizode",
|
"episodes": "Epizode",
|
||||||
"songs": "Pesmi"
|
"songs": "Pesmi"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Nov",
|
"new": "Nov",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Težave",
|
"issues": "Težave",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Епизоде",
|
"episodes": "Епизоде",
|
||||||
"songs": "Песме"
|
"songs": "Песме"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Није на мрежи",
|
"offline": "Није на мрежи",
|
||||||
"offline_alt": "Није на мрежи",
|
"offline_alt": "Није на мрежи",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Горе",
|
"up": "Горе",
|
||||||
"pending": "На чекању",
|
"pending": "На чекању",
|
||||||
"down": "Доле"
|
"down": "Доле",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Сада",
|
"new": "Сада",
|
||||||
@@ -600,13 +611,13 @@
|
|||||||
"total": "Укупно"
|
"total": "Укупно"
|
||||||
},
|
},
|
||||||
"pangolin": {
|
"pangolin": {
|
||||||
"orgs": "Orgs",
|
"orgs": "Организације",
|
||||||
"sites": "Sites",
|
"sites": "Сајтови",
|
||||||
"resources": "Resources",
|
"resources": "Ресурси",
|
||||||
"targets": "Targets",
|
"targets": "Циљеви",
|
||||||
"traffic": "Traffic",
|
"traffic": "Саобраћај",
|
||||||
"in": "In",
|
"in": "Улазак",
|
||||||
"out": "Out"
|
"out": "Излазак"
|
||||||
},
|
},
|
||||||
"peanut": {
|
"peanut": {
|
||||||
"battery_charge": "Напуњеност батерије",
|
"battery_charge": "Напуњеност батерије",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Време рада",
|
"uptime": "Време рада",
|
||||||
"volumeAvailable": "Доступно"
|
"volumeAvailable": "Доступно"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Серије",
|
"series": "Серије",
|
||||||
"issues": "Издања",
|
"issues": "Издања",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Категорије",
|
"categories": "Категорије",
|
||||||
"series": "Серије"
|
"series": "Серије"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Ред",
|
"downloadCount": "Ред",
|
||||||
"downloadBytesRemaining": "Преостало",
|
"downloadBytesRemaining": "Преостало",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Песме",
|
"songs": "Песме",
|
||||||
"time": "Време",
|
"time": "Време",
|
||||||
"artists": "Извођачи"
|
"artists": "Извођачи"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Avsnitt",
|
"episodes": "Avsnitt",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Songs"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Bölümler",
|
"episodes": "Bölümler",
|
||||||
"songs": "Şarkılar"
|
"songs": "Şarkılar"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Çevrimdışı",
|
"offline": "Çevrimdışı",
|
||||||
"offline_alt": "Çevrimdışı",
|
"offline_alt": "Çevrimdışı",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Çalışıyor",
|
"up": "Çalışıyor",
|
||||||
"pending": "Bekleyen",
|
"pending": "Bekleyen",
|
||||||
"down": "Çalışmayan"
|
"down": "Çalışmayan",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Yeni",
|
"new": "Yeni",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Çalışma süresi",
|
"uptime": "Çalışma süresi",
|
||||||
"volumeAvailable": "Uygun"
|
"volumeAvailable": "Uygun"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Diziler",
|
"series": "Diziler",
|
||||||
"issues": "Sorunlar",
|
"issues": "Sorunlar",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Kategoriler",
|
"categories": "Kategoriler",
|
||||||
"series": "Seriler"
|
"series": "Seriler"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Kuyruk",
|
"downloadCount": "Kuyruk",
|
||||||
"downloadBytesRemaining": "Kalan",
|
"downloadBytesRemaining": "Kalan",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Епізоди",
|
"episodes": "Епізоди",
|
||||||
"songs": "Пісні"
|
"songs": "Пісні"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Офлайн",
|
"offline": "Офлайн",
|
||||||
"offline_alt": "Офлайн",
|
"offline_alt": "Офлайн",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Новий",
|
"new": "Новий",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Питання",
|
"issues": "Питання",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Bài hát"
|
"songs": "Bài hát"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "New",
|
"new": "New",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "Issues",
|
"issues": "Issues",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Bài hát",
|
"songs": "Bài hát",
|
||||||
"time": "Thời gian",
|
"time": "Thời gian",
|
||||||
"artists": "Nghệ sĩ"
|
"artists": "Nghệ sĩ"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "集",
|
"episodes": "集",
|
||||||
"songs": "曲目"
|
"songs": "曲目"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "新建立",
|
"new": "新建立",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "出版",
|
"issues": "出版",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "剧集",
|
"episodes": "剧集",
|
||||||
"songs": "歌曲"
|
"songs": "歌曲"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "离线",
|
"offline": "离线",
|
||||||
"offline_alt": "离线",
|
"offline_alt": "离线",
|
||||||
@@ -364,7 +374,7 @@
|
|||||||
"version": "版本",
|
"version": "版本",
|
||||||
"notesCount": "笔记",
|
"notesCount": "笔记",
|
||||||
"dbSize": "数据库大小",
|
"dbSize": "数据库大小",
|
||||||
"unknown": "Unknown"
|
"unknown": "未知"
|
||||||
},
|
},
|
||||||
"navidrome": {
|
"navidrome": {
|
||||||
"nothing_streaming": "",
|
"nothing_streaming": "",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "新建立",
|
"new": "新建立",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "问题",
|
"issues": "问题",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "分类",
|
"categories": "分类",
|
||||||
"series": "系列"
|
"series": "系列"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "队列",
|
"downloadCount": "队列",
|
||||||
"downloadBytesRemaining": "剩余",
|
"downloadBytesRemaining": "剩余",
|
||||||
@@ -800,7 +821,7 @@
|
|||||||
},
|
},
|
||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "系列",
|
"seriesCount": "系列",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "文件"
|
||||||
},
|
},
|
||||||
"azuredevops": {
|
"azuredevops": {
|
||||||
"result": "Result",
|
"result": "Result",
|
||||||
@@ -1097,7 +1118,7 @@
|
|||||||
},
|
},
|
||||||
"unraid": {
|
"unraid": {
|
||||||
"STARTED": "Started",
|
"STARTED": "Started",
|
||||||
"STOPPED": "Stopped",
|
"STOPPED": "已停止",
|
||||||
"NEW_ARRAY": "New Array",
|
"NEW_ARRAY": "New Array",
|
||||||
"RECON_DISK": "Reconstructing Disk",
|
"RECON_DISK": "Reconstructing Disk",
|
||||||
"DISABLE_DISK": "Disk Disabled",
|
"DISABLE_DISK": "Disk Disabled",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,16 @@
|
|||||||
"episodes": "集",
|
"episodes": "集",
|
||||||
"songs": "曲目"
|
"songs": "曲目"
|
||||||
},
|
},
|
||||||
|
"jellyfin": {
|
||||||
|
"playing": "Playing",
|
||||||
|
"transcoding": "Transcoding",
|
||||||
|
"bitrate": "Bitrate",
|
||||||
|
"no_active": "No Active Streams",
|
||||||
|
"movies": "Movies",
|
||||||
|
"series": "Series",
|
||||||
|
"episodes": "Episodes",
|
||||||
|
"songs": "Songs"
|
||||||
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
@@ -532,7 +542,8 @@
|
|||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"down": "Down"
|
"down": "Down",
|
||||||
|
"ok": "Ok"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "新建",
|
"new": "新建",
|
||||||
@@ -704,6 +715,10 @@
|
|||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Available"
|
||||||
},
|
},
|
||||||
|
"dispatcharr": {
|
||||||
|
"channels": "Channels",
|
||||||
|
"streams": "Streams"
|
||||||
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"issues": "問題",
|
"issues": "問題",
|
||||||
@@ -792,6 +807,12 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"series": "Series"
|
"series": "Series"
|
||||||
},
|
},
|
||||||
|
"booklore": {
|
||||||
|
"libraries": "Libraries",
|
||||||
|
"books": "Books",
|
||||||
|
"reading": "Reading",
|
||||||
|
"finished": "Finished"
|
||||||
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Queue",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Remaining",
|
||||||
@@ -1129,5 +1150,26 @@
|
|||||||
"songs": "Songs",
|
"songs": "Songs",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"artists": "Artists"
|
"artists": "Artists"
|
||||||
|
},
|
||||||
|
"arcane": {
|
||||||
|
"containers": "Containers",
|
||||||
|
"images": "Images",
|
||||||
|
"image_updates": "Image Updates",
|
||||||
|
"images_unused": "Unused",
|
||||||
|
"environment_required": "Environment ID Required"
|
||||||
|
},
|
||||||
|
"dockhand": {
|
||||||
|
"running": "Running",
|
||||||
|
"stopped": "Stopped",
|
||||||
|
"cpu": "CPU",
|
||||||
|
"memory": "Memory",
|
||||||
|
"images": "Images",
|
||||||
|
"volumes": "Volumes",
|
||||||
|
"events_today": "Events Today",
|
||||||
|
"pending_updates": "Pending Updates",
|
||||||
|
"stacks": "Stacks",
|
||||||
|
"paused": "Paused",
|
||||||
|
"total": "Total",
|
||||||
|
"environment_not_found": "Environment Not Found"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
8
pyproject.toml
Normal file
8
pyproject.toml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[project]
|
||||||
|
name = "homepage-docs"
|
||||||
|
version = "1.0.0"
|
||||||
|
description = "Documentation for the Homepage project"
|
||||||
|
requires-python = ">=3.13"
|
||||||
|
dependencies = [
|
||||||
|
"zensical>=0.0.21",
|
||||||
|
]
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
Babel==2.12.1
|
|
||||||
backrefs==5.9
|
|
||||||
cairocffi==1.7.1
|
|
||||||
CairoSVG==2.7.1
|
|
||||||
certifi==2023.7.22
|
|
||||||
cffi==1.17.1
|
|
||||||
cfgv==3.4.0
|
|
||||||
charset-normalizer==3.2.0
|
|
||||||
click==8.1.7
|
|
||||||
colorama==0.4.6
|
|
||||||
cssselect2==0.7.0
|
|
||||||
defusedxml==0.7.1
|
|
||||||
distlib==0.3.9
|
|
||||||
filelock==3.17.0
|
|
||||||
ghp-import==2.1.0
|
|
||||||
identify==2.6.7
|
|
||||||
idna==3.4
|
|
||||||
Jinja2==3.1.2
|
|
||||||
Markdown==3.4.4
|
|
||||||
MarkupSafe==2.1.3
|
|
||||||
mergedeep==1.3.4
|
|
||||||
mkdocs==1.6.0
|
|
||||||
mkdocs-get-deps==0.2.0
|
|
||||||
mkdocs-material==9.6.18
|
|
||||||
mkdocs-material-extensions==1.3.1
|
|
||||||
mkdocs-redirects==1.2.1
|
|
||||||
nodeenv==1.9.1
|
|
||||||
packaging==23.1
|
|
||||||
paginate==0.5.6
|
|
||||||
pathspec==0.11.2
|
|
||||||
pillow==10.4.0
|
|
||||||
platformdirs==3.10.0
|
|
||||||
pre-commit==3.5.0
|
|
||||||
pycparser==2.22
|
|
||||||
Pygments==2.16.1
|
|
||||||
pymdown-extensions==10.3
|
|
||||||
python-dateutil==2.8.2
|
|
||||||
PyYAML==6.0.1
|
|
||||||
pyyaml_env_tag==0.1
|
|
||||||
regex==2023.8.8
|
|
||||||
requests==2.31.0
|
|
||||||
six==1.16.0
|
|
||||||
tinycss2==1.4.0
|
|
||||||
urllib3==2.0.5
|
|
||||||
virtualenv==20.29.2
|
|
||||||
watchdog==3.0.0
|
|
||||||
webencodings==0.5.1
|
|
||||||
37
src/__tests__/pages/_app.test.jsx
Normal file
37
src/__tests__/pages/_app.test.jsx
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// @vitest-environment jsdom
|
||||||
|
|
||||||
|
import { render, screen } from "@testing-library/react";
|
||||||
|
import { describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
// Next's Head implementation relies on internal Next contexts; stub it for unit tests.
|
||||||
|
vi.mock("next/head", () => ({
|
||||||
|
default: ({ children }) => <>{children}</>,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/contexts/color", () => ({
|
||||||
|
ColorProvider: ({ children }) => <>{children}</>,
|
||||||
|
}));
|
||||||
|
vi.mock("utils/contexts/theme", () => ({
|
||||||
|
ThemeProvider: ({ children }) => <>{children}</>,
|
||||||
|
}));
|
||||||
|
vi.mock("utils/contexts/settings", () => ({
|
||||||
|
SettingsProvider: ({ children }) => <>{children}</>,
|
||||||
|
}));
|
||||||
|
vi.mock("utils/contexts/tab", () => ({
|
||||||
|
TabProvider: ({ children }) => <>{children}</>,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import App from "pages/_app.jsx";
|
||||||
|
|
||||||
|
describe("pages/_app", () => {
|
||||||
|
it("renders the active page component with pageProps", () => {
|
||||||
|
function Page({ message }) {
|
||||||
|
return <div>msg:{message}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
render(<App Component={Page} pageProps={{ message: "hello" }} />);
|
||||||
|
|
||||||
|
expect(screen.getByText("msg:hello")).toBeInTheDocument();
|
||||||
|
expect(document.querySelector('meta[name="viewport"]')).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
24
src/__tests__/pages/_document.test.jsx
Normal file
24
src/__tests__/pages/_document.test.jsx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { renderToStaticMarkup } from "react-dom/server";
|
||||||
|
import { describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
vi.mock("next/document", () => ({
|
||||||
|
Html: ({ children }) => <div data-testid="html">{children}</div>,
|
||||||
|
Head: ({ children }) => <div data-testid="head">{children}</div>,
|
||||||
|
Main: () => <main data-testid="main" />,
|
||||||
|
NextScript: () => <script data-testid="nextscript" />,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import Document from "pages/_document.jsx";
|
||||||
|
|
||||||
|
describe("pages/_document", () => {
|
||||||
|
it("renders the PWA meta + custom css links", () => {
|
||||||
|
const html = renderToStaticMarkup(<Document />);
|
||||||
|
|
||||||
|
expect(html).toContain('meta name="mobile-web-app-capable" content="yes"');
|
||||||
|
expect(html).toContain('link rel="manifest" href="/site.webmanifest?v=4"');
|
||||||
|
expect(html).toContain('link rel="preload" href="/api/config/custom.css" as="style"');
|
||||||
|
expect(html).toContain('link rel="stylesheet" href="/api/config/custom.css"');
|
||||||
|
expect(html).toContain('data-testid="main"');
|
||||||
|
expect(html).toContain('data-testid="nextscript"');
|
||||||
|
});
|
||||||
|
});
|
||||||
30
src/__tests__/pages/api/bookmarks.test.js
Normal file
30
src/__tests__/pages/api/bookmarks.test.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { bookmarksResponse } = vi.hoisted(() => ({
|
||||||
|
bookmarksResponse: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/api-response", () => ({
|
||||||
|
bookmarksResponse,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/bookmarks";
|
||||||
|
|
||||||
|
describe("pages/api/bookmarks", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns bookmarksResponse()", async () => {
|
||||||
|
bookmarksResponse.mockResolvedValueOnce({ ok: true });
|
||||||
|
|
||||||
|
const req = { query: {} };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.body).toEqual({ ok: true });
|
||||||
|
});
|
||||||
|
});
|
||||||
87
src/__tests__/pages/api/config/[path].test.js
Normal file
87
src/__tests__/pages/api/config/[path].test.js
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { fs, config, logger } = vi.hoisted(() => ({
|
||||||
|
fs: {
|
||||||
|
existsSync: vi.fn(),
|
||||||
|
readFileSync: vi.fn(),
|
||||||
|
},
|
||||||
|
config: {
|
||||||
|
CONF_DIR: "/conf",
|
||||||
|
},
|
||||||
|
logger: {
|
||||||
|
error: vi.fn(),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("fs", () => ({
|
||||||
|
default: fs,
|
||||||
|
...fs,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/config", () => config);
|
||||||
|
|
||||||
|
vi.mock("utils/logger", () => ({
|
||||||
|
default: () => logger,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/config/[path]";
|
||||||
|
|
||||||
|
describe("pages/api/config/[path]", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 422 for unsupported files", async () => {
|
||||||
|
const req = { query: { path: "not-supported.txt" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(422);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns empty content when the file doesn't exist", async () => {
|
||||||
|
fs.existsSync.mockReturnValueOnce(false);
|
||||||
|
|
||||||
|
const req = { query: { path: "custom.css" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.headers["Content-Type"]).toBe("text/css");
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns file content when the file exists", async () => {
|
||||||
|
fs.existsSync.mockReturnValueOnce(true);
|
||||||
|
fs.readFileSync.mockReturnValueOnce("body{}");
|
||||||
|
|
||||||
|
const req = { query: { path: "custom.js" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.headers["Content-Type"]).toBe("text/javascript");
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toBe("body{}");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("logs and returns 500 when reading the file throws", async () => {
|
||||||
|
fs.existsSync.mockReturnValueOnce(true);
|
||||||
|
fs.readFileSync.mockImplementationOnce(() => {
|
||||||
|
throw new Error("boom");
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { path: "custom.css" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toBe("Internal Server Error");
|
||||||
|
expect(logger.error).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
153
src/__tests__/pages/api/docker/stats/[...service].test.js
Normal file
153
src/__tests__/pages/api/docker/stats/[...service].test.js
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { state, DockerCtor, getDockerArguments, logger } = vi.hoisted(() => {
|
||||||
|
const state = {
|
||||||
|
docker: null,
|
||||||
|
dockerArgs: { conn: { socketPath: "/var/run/docker.sock" }, swarm: false },
|
||||||
|
};
|
||||||
|
|
||||||
|
function DockerCtor() {
|
||||||
|
return state.docker;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
state,
|
||||||
|
DockerCtor,
|
||||||
|
getDockerArguments: vi.fn(() => state.dockerArgs),
|
||||||
|
logger: { error: vi.fn() },
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mock("dockerode", () => ({
|
||||||
|
default: DockerCtor,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/docker", () => ({
|
||||||
|
default: getDockerArguments,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/logger", () => ({
|
||||||
|
default: () => logger,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/docker/stats/[...service]";
|
||||||
|
|
||||||
|
describe("pages/api/docker/stats/[...service]", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
state.dockerArgs = { conn: { socketPath: "/var/run/docker.sock" }, swarm: false };
|
||||||
|
state.docker = {
|
||||||
|
listContainers: vi.fn(),
|
||||||
|
getContainer: vi.fn(),
|
||||||
|
listTasks: vi.fn(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when container name/server params are missing", async () => {
|
||||||
|
const req = { query: { service: [] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body).toEqual({ error: "docker query parameters are required" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when docker returns a non-array containers payload", async () => {
|
||||||
|
state.docker.listContainers.mockResolvedValue(Buffer.from("bad"));
|
||||||
|
|
||||||
|
const req = { query: { service: ["c", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "query failed" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns stats for an existing container", async () => {
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/myapp"], Id: "cid1" }]);
|
||||||
|
const containerStats = { cpu_stats: { cpu_usage: { total_usage: 1 } } };
|
||||||
|
state.docker.getContainer.mockReturnValue({
|
||||||
|
stats: vi.fn().mockResolvedValue(containerStats),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["myapp", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ stats: containerStats });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses swarm tasks to locate a container and reports a friendly error when stats cannot be retrieved", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "local1" }]);
|
||||||
|
state.docker.listTasks.mockResolvedValue([
|
||||||
|
{ Status: { ContainerStatus: { ContainerID: "local1" } } },
|
||||||
|
{ Status: { ContainerStatus: { ContainerID: "remote1" } } },
|
||||||
|
]);
|
||||||
|
state.docker.getContainer.mockReturnValue({
|
||||||
|
stats: vi.fn().mockRejectedValue(new Error("nope")),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ error: "Unable to retrieve stats" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns stats for a swarm task container when present locally", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "local1" }]);
|
||||||
|
state.docker.listTasks.mockResolvedValue([{ Status: { ContainerStatus: { ContainerID: "local1" } } }]);
|
||||||
|
|
||||||
|
const containerStats = { cpu_stats: { cpu_usage: { total_usage: 2 } } };
|
||||||
|
state.docker.getContainer.mockReturnValue({
|
||||||
|
stats: vi.fn().mockResolvedValue(containerStats),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ stats: containerStats });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 404 when no container or swarm task is found", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "local1" }]);
|
||||||
|
state.docker.listTasks.mockResolvedValue([]);
|
||||||
|
|
||||||
|
const req = { query: { service: ["missing", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(404);
|
||||||
|
expect(res.body).toEqual({ error: "not found" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("logs and returns 500 when the docker query throws", async () => {
|
||||||
|
getDockerArguments.mockImplementationOnce(() => {
|
||||||
|
throw new Error("boom");
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["myapp", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: { message: "boom" } });
|
||||||
|
expect(logger.error).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
211
src/__tests__/pages/api/docker/status/[...service].test.js
Normal file
211
src/__tests__/pages/api/docker/status/[...service].test.js
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { state, DockerCtor, getDockerArguments, logger } = vi.hoisted(() => {
|
||||||
|
const state = {
|
||||||
|
docker: null,
|
||||||
|
dockerCtorArgs: [],
|
||||||
|
dockerArgs: { conn: { socketPath: "/var/run/docker.sock" }, swarm: false },
|
||||||
|
};
|
||||||
|
|
||||||
|
function DockerCtor(conn) {
|
||||||
|
state.dockerCtorArgs.push(conn);
|
||||||
|
return state.docker;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
state,
|
||||||
|
DockerCtor,
|
||||||
|
getDockerArguments: vi.fn(() => state.dockerArgs),
|
||||||
|
logger: { error: vi.fn() },
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mock("dockerode", () => ({
|
||||||
|
default: DockerCtor,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/docker", () => ({
|
||||||
|
default: getDockerArguments,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/logger", () => ({
|
||||||
|
default: () => logger,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/docker/status/[...service]";
|
||||||
|
|
||||||
|
describe("pages/api/docker/status/[...service]", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
state.dockerCtorArgs.length = 0;
|
||||||
|
state.dockerArgs = { conn: { socketPath: "/var/run/docker.sock" }, swarm: false };
|
||||||
|
state.docker = {
|
||||||
|
listContainers: vi.fn(),
|
||||||
|
getContainer: vi.fn(),
|
||||||
|
getService: vi.fn(),
|
||||||
|
listTasks: vi.fn(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when container name/server params are missing", async () => {
|
||||||
|
const req = { query: { service: [] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body).toEqual({ error: "docker query parameters are required" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when docker returns a non-array containers payload", async () => {
|
||||||
|
state.docker.listContainers.mockResolvedValue(Buffer.from("bad"));
|
||||||
|
|
||||||
|
const req = { query: { service: ["c", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "query failed" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("inspects an existing container and returns status + health", async () => {
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/myapp"], Id: "cid1" }]);
|
||||||
|
state.docker.getContainer.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockResolvedValue({ State: { Status: "running", Health: { Status: "healthy" } } }),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["myapp", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(getDockerArguments).toHaveBeenCalledWith("local");
|
||||||
|
expect(state.dockerCtorArgs).toHaveLength(1);
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "running", health: "healthy" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 404 when container does not exist and swarm is disabled", async () => {
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "cid1" }]);
|
||||||
|
|
||||||
|
const req = { query: { service: ["missing", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(404);
|
||||||
|
expect(res.body).toEqual({ status: "not found" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("reports replicated swarm service status based on desired replicas", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "cid1" }]);
|
||||||
|
state.docker.getService.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockResolvedValue({ Spec: { Mode: { Replicated: { Replicas: "2" } } } }),
|
||||||
|
});
|
||||||
|
state.docker.listTasks.mockResolvedValue([{ Status: {} }, { Status: {} }]);
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "running 2/2" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("reports partial status for replicated services with fewer running tasks", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "cid1" }]);
|
||||||
|
state.docker.getService.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockResolvedValue({ Spec: { Mode: { Replicated: { Replicas: "3" } } } }),
|
||||||
|
});
|
||||||
|
state.docker.listTasks.mockResolvedValue([{ Status: {} }]);
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "partial 1/3" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("handles global services by inspecting a local task container when possible", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "local1" }]);
|
||||||
|
state.docker.getService.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockResolvedValue({ Spec: { Mode: { Global: {} } } }),
|
||||||
|
});
|
||||||
|
state.docker.listTasks.mockResolvedValue([
|
||||||
|
{ Status: { ContainerStatus: { ContainerID: "local1" }, State: "running" } },
|
||||||
|
]);
|
||||||
|
state.docker.getContainer.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockResolvedValue({ State: { Status: "running", Health: { Status: "unhealthy" } } }),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "running", health: "unhealthy" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("falls back to task status when global service container inspect fails", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "local1" }]);
|
||||||
|
state.docker.getService.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockResolvedValue({ Spec: { Mode: { Global: {} } } }),
|
||||||
|
});
|
||||||
|
state.docker.listTasks.mockResolvedValue([
|
||||||
|
{ Status: { ContainerStatus: { ContainerID: "local1" }, State: "pending" } },
|
||||||
|
]);
|
||||||
|
state.docker.getContainer.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockRejectedValue(new Error("nope")),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "pending" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 404 when swarm is enabled but the service does not exist", async () => {
|
||||||
|
state.dockerArgs.swarm = true;
|
||||||
|
state.docker.listContainers.mockResolvedValue([{ Names: ["/other"], Id: "cid1" }]);
|
||||||
|
state.docker.getService.mockReturnValue({
|
||||||
|
inspect: vi.fn().mockRejectedValue(new Error("not found")),
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(404);
|
||||||
|
expect(res.body).toEqual({ status: "not found" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("logs and returns 500 when the docker query throws", async () => {
|
||||||
|
getDockerArguments.mockImplementationOnce(() => {
|
||||||
|
throw new Error("boom");
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["svc", "local"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: { message: "boom" } });
|
||||||
|
expect(logger.error).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
64
src/__tests__/pages/api/hash.test.js
Normal file
64
src/__tests__/pages/api/hash.test.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import { createHash } from "crypto";
|
||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
function sha256(input) {
|
||||||
|
return createHash("sha256").update(input).digest("hex");
|
||||||
|
}
|
||||||
|
|
||||||
|
const { readFileSync, checkAndCopyConfig, CONF_DIR } = vi.hoisted(() => ({
|
||||||
|
readFileSync: vi.fn(),
|
||||||
|
checkAndCopyConfig: vi.fn(),
|
||||||
|
CONF_DIR: "/conf",
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("fs", () => ({
|
||||||
|
readFileSync,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/config", () => ({
|
||||||
|
default: checkAndCopyConfig,
|
||||||
|
CONF_DIR,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/hash";
|
||||||
|
|
||||||
|
describe("pages/api/hash", () => {
|
||||||
|
const originalBuildTime = process.env.HOMEPAGE_BUILDTIME;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
process.env.HOMEPAGE_BUILDTIME = originalBuildTime;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns a combined sha256 hash of known config files and build time", async () => {
|
||||||
|
process.env.HOMEPAGE_BUILDTIME = "build-1";
|
||||||
|
|
||||||
|
// Return deterministic contents based on file name.
|
||||||
|
readFileSync.mockImplementation((filePath) => {
|
||||||
|
const name = filePath.split("/").pop();
|
||||||
|
return `content:${name}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: {} };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
const configs = [
|
||||||
|
"docker.yaml",
|
||||||
|
"settings.yaml",
|
||||||
|
"services.yaml",
|
||||||
|
"bookmarks.yaml",
|
||||||
|
"widgets.yaml",
|
||||||
|
"custom.css",
|
||||||
|
"custom.js",
|
||||||
|
];
|
||||||
|
const hashes = configs.map((c) => sha256(`content:${c}`));
|
||||||
|
const expected = sha256(hashes.join("") + "build-1");
|
||||||
|
|
||||||
|
expect(checkAndCopyConfig).toHaveBeenCalled();
|
||||||
|
expect(res.body).toEqual({ hash: expected });
|
||||||
|
});
|
||||||
|
});
|
||||||
16
src/__tests__/pages/api/healthcheck.test.js
Normal file
16
src/__tests__/pages/api/healthcheck.test.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
import handler from "pages/api/healthcheck";
|
||||||
|
|
||||||
|
describe("pages/api/healthcheck", () => {
|
||||||
|
it("returns 'up'", () => {
|
||||||
|
const req = {};
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
handler(req, res);
|
||||||
|
|
||||||
|
expect(res.body).toBe("up");
|
||||||
|
});
|
||||||
|
});
|
||||||
210
src/__tests__/pages/api/kubernetes/stats/[...service].test.js
Normal file
210
src/__tests__/pages/api/kubernetes/stats/[...service].test.js
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { getKubeConfig, coreApi, metricsApi, MetricsCtor, logger } = vi.hoisted(() => {
|
||||||
|
const metricsApi = {
|
||||||
|
getPodMetrics: vi.fn(),
|
||||||
|
};
|
||||||
|
|
||||||
|
function MetricsCtor() {
|
||||||
|
return metricsApi;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
getKubeConfig: vi.fn(),
|
||||||
|
coreApi: { listNamespacedPod: vi.fn() },
|
||||||
|
metricsApi,
|
||||||
|
MetricsCtor,
|
||||||
|
logger: { error: vi.fn() },
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mock("@kubernetes/client-node", () => ({
|
||||||
|
CoreV1Api: function CoreV1Api() {},
|
||||||
|
Metrics: MetricsCtor,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/logger", () => ({
|
||||||
|
default: () => logger,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/kubernetes", () => ({
|
||||||
|
getKubeConfig,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/kubernetes/stats/[...service]";
|
||||||
|
|
||||||
|
describe("pages/api/kubernetes/stats/[...service]", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
getKubeConfig.mockReturnValue({
|
||||||
|
makeApiClient: () => coreApi,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when namespace/appName params are missing", async () => {
|
||||||
|
const req = { query: { service: [] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body).toEqual({ error: "kubernetes query parameters are required" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when kubernetes is not configured", async () => {
|
||||||
|
getKubeConfig.mockReturnValue(null);
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "No kubernetes configuration" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when listNamespacedPod fails", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockRejectedValue({ statusCode: 500, body: "nope", response: "nope" });
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "Error communicating with kubernetes" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 404 when no pods match the selector", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({ items: [] });
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(404);
|
||||||
|
expect(res.body).toEqual({
|
||||||
|
error: "no pods found with namespace=default and labelSelector=app.kubernetes.io/name=app",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("computes limits even when metrics are missing (404 from metrics server)", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
metadata: { name: "pod-a" },
|
||||||
|
spec: {
|
||||||
|
containers: [
|
||||||
|
{ resources: { limits: { cpu: "500m", memory: "1Gi" } } },
|
||||||
|
{ resources: { limits: { cpu: "250m" } } },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
metricsApi.getPodMetrics.mockRejectedValue({ statusCode: 404, body: "no metrics", response: "no metrics" });
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({
|
||||||
|
stats: {
|
||||||
|
mem: 0,
|
||||||
|
cpu: 0,
|
||||||
|
cpuLimit: 0.75,
|
||||||
|
memLimit: 1000000000,
|
||||||
|
cpuUsage: 0,
|
||||||
|
memUsage: 0,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("logs when metrics lookup fails with a non-404 error and still returns computed limits", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
metadata: { name: "pod-a" },
|
||||||
|
spec: {
|
||||||
|
containers: [{ resources: { limits: { cpu: "500m", memory: "1Gi" } } }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
metricsApi.getPodMetrics.mockRejectedValue({ statusCode: 500, body: "boom", response: "boom" });
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(logger.error).toHaveBeenCalled();
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body.stats.cpuLimit).toBe(0.5);
|
||||||
|
expect(res.body.stats.memLimit).toBe(1000000000);
|
||||||
|
expect(res.body.stats.cpu).toBe(0);
|
||||||
|
expect(res.body.stats.mem).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("aggregates usage for matched pods and reports percent usage", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
metadata: { name: "pod-a" },
|
||||||
|
spec: { containers: [{ resources: { limits: { cpu: "1000m", memory: "2Gi" } } }] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
metadata: { name: "pod-b" },
|
||||||
|
spec: { containers: [{ resources: { limits: { cpu: "500m", memory: "1Gi" } } }] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
metricsApi.getPodMetrics.mockResolvedValue({
|
||||||
|
items: [
|
||||||
|
// includes a non-selected pod, should be ignored
|
||||||
|
{ metadata: { name: "other" }, containers: [{ usage: { cpu: "100m", memory: "10Mi" } }] },
|
||||||
|
{
|
||||||
|
metadata: { name: "pod-a" },
|
||||||
|
containers: [{ usage: { cpu: "250m", memory: "100Mi" } }, { usage: { cpu: "250m", memory: "100Mi" } }],
|
||||||
|
},
|
||||||
|
{ metadata: { name: "pod-b" }, containers: [{ usage: { cpu: "500m", memory: "1Gi" } }] },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"], podSelector: "app=test" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
const { stats } = res.body;
|
||||||
|
expect(stats.cpuLimit).toBe(1.5);
|
||||||
|
expect(stats.memLimit).toBe(3000000000);
|
||||||
|
expect(stats.cpu).toBeCloseTo(1.0, 5);
|
||||||
|
expect(stats.mem).toBe(1200000000);
|
||||||
|
expect(stats.cpuUsage).toBeCloseTo((100 * 1.0) / 1.5, 5);
|
||||||
|
expect(stats.memUsage).toBeCloseTo((100 * 1200000000) / 3000000000, 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when an unexpected error is thrown", async () => {
|
||||||
|
getKubeConfig.mockImplementationOnce(() => {
|
||||||
|
throw new Error("boom");
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "unknown error" });
|
||||||
|
expect(logger.error).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
121
src/__tests__/pages/api/kubernetes/status/[...service].test.js
Normal file
121
src/__tests__/pages/api/kubernetes/status/[...service].test.js
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { getKubeConfig, coreApi, logger } = vi.hoisted(() => ({
|
||||||
|
getKubeConfig: vi.fn(),
|
||||||
|
coreApi: { listNamespacedPod: vi.fn() },
|
||||||
|
logger: { error: vi.fn() },
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/logger", () => ({
|
||||||
|
default: () => logger,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/kubernetes", () => ({
|
||||||
|
getKubeConfig,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/kubernetes/status/[...service]";
|
||||||
|
|
||||||
|
describe("pages/api/kubernetes/status/[...service]", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
getKubeConfig.mockReturnValue({
|
||||||
|
makeApiClient: () => coreApi,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when namespace/appName params are missing", async () => {
|
||||||
|
const req = { query: { service: [] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body).toEqual({ error: "kubernetes query parameters are required" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when kubernetes is not configured", async () => {
|
||||||
|
getKubeConfig.mockReturnValue(null);
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "No kubernetes configuration" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when listNamespacedPod fails", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockRejectedValue({ statusCode: 500, body: "nope", response: "nope" });
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "Error communicating with kubernetes" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 404 when no pods match the selector", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({ items: [] });
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(404);
|
||||||
|
expect(res.body).toEqual({ status: "not found" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns partial when some pods are ready but not all", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({
|
||||||
|
items: [{ status: { phase: "Running" } }, { status: { phase: "Pending" } }],
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "partial" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns running when all pods are ready", async () => {
|
||||||
|
coreApi.listNamespacedPod.mockResolvedValue({
|
||||||
|
items: [{ status: { phase: "Running" } }, { status: { phase: "Succeeded" } }],
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"], podSelector: "app=test" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(coreApi.listNamespacedPod).toHaveBeenCalledWith({
|
||||||
|
namespace: "default",
|
||||||
|
labelSelector: "app=test",
|
||||||
|
});
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ status: "running" });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 500 when an unexpected error is thrown", async () => {
|
||||||
|
getKubeConfig.mockImplementationOnce(() => {
|
||||||
|
throw new Error("boom");
|
||||||
|
});
|
||||||
|
|
||||||
|
const req = { query: { service: ["default", "app"] } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(500);
|
||||||
|
expect(res.body).toEqual({ error: "unknown error" });
|
||||||
|
expect(logger.error).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
80
src/__tests__/pages/api/ping.test.js
Normal file
80
src/__tests__/pages/api/ping.test.js
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import createMockRes from "test-utils/create-mock-res";
|
||||||
|
|
||||||
|
const { getServiceItem, ping, logger } = vi.hoisted(() => ({
|
||||||
|
getServiceItem: vi.fn(),
|
||||||
|
ping: { probe: vi.fn() },
|
||||||
|
logger: { debug: vi.fn() },
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/config/service-helpers", () => ({
|
||||||
|
getServiceItem,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("utils/logger", () => ({
|
||||||
|
default: () => logger,
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("ping", () => ({
|
||||||
|
promise: ping,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import handler from "pages/api/ping";
|
||||||
|
|
||||||
|
describe("pages/api/ping", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when service item isn't found", async () => {
|
||||||
|
getServiceItem.mockResolvedValueOnce(null);
|
||||||
|
|
||||||
|
const req = { query: { groupName: "g", serviceName: "s" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body.error).toContain("Unable to find service");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when ping host isn't configured", async () => {
|
||||||
|
getServiceItem.mockResolvedValueOnce({ ping: "" });
|
||||||
|
|
||||||
|
const req = { query: { groupName: "g", serviceName: "s" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body.error).toBe("No ping host given");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("pings the hostname extracted from a URL", async () => {
|
||||||
|
getServiceItem.mockResolvedValueOnce({ ping: "http://example.com:1234/path" });
|
||||||
|
ping.probe.mockResolvedValueOnce({ alive: true });
|
||||||
|
|
||||||
|
const req = { query: { groupName: "g", serviceName: "s" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(ping.probe).toHaveBeenCalledWith("example.com");
|
||||||
|
expect(res.statusCode).toBe(200);
|
||||||
|
expect(res.body).toEqual({ alive: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("returns 400 when ping throws", async () => {
|
||||||
|
getServiceItem.mockResolvedValueOnce({ ping: "example.com" });
|
||||||
|
ping.probe.mockRejectedValueOnce(new Error("nope"));
|
||||||
|
|
||||||
|
const req = { query: { groupName: "g", serviceName: "s" } };
|
||||||
|
const res = createMockRes();
|
||||||
|
|
||||||
|
await handler(req, res);
|
||||||
|
|
||||||
|
expect(res.statusCode).toBe(400);
|
||||||
|
expect(res.body.error).toContain("Error attempting ping");
|
||||||
|
});
|
||||||
|
});
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user