mirror of
https://github.com/gethomepage/homepage.git
synced 2026-03-30 23:02:39 -07:00
Compare commits
35 Commits
cd34796b9d
...
v1.9.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
1ed2f16cbf | ||
|
|
ba2b3eeb9e | ||
|
|
45ca94eb6d | ||
|
|
a07cc25441 | ||
|
|
0dcd25d5ad |
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@@ -84,7 +84,7 @@ jobs:
|
||||
latest=auto
|
||||
|
||||
- name: Next.js build cache
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: .next/cache
|
||||
key: nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('**/*.js', '**/*.jsx') }}
|
||||
|
||||
4
.github/workflows/docs-publish.yml
vendored
4
.github/workflows/docs-publish.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
with:
|
||||
python-version: 3.x
|
||||
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
with:
|
||||
key: mkdocs-material-${{ env.cache_id }}
|
||||
path: .cache
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
with:
|
||||
python-version: 3.x
|
||||
- run: echo "cache_id=${{github.sha}}" >> $GITHUB_ENV
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v5
|
||||
with:
|
||||
key: mkdocs-material-${{ env.cache_id }}
|
||||
path: .cache
|
||||
|
||||
2
.github/workflows/repo-maintenance.yml
vendored
2
.github/workflows/repo-maintenance.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
name: 'Lock Old Threads'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v5
|
||||
- uses: dessant/lock-threads@v6
|
||||
with:
|
||||
issue-inactive-days: '30'
|
||||
pr-inactive-days: '30'
|
||||
|
||||
@@ -54,7 +54,7 @@ RUN apk add --no-cache su-exec iputils-ping shadow
|
||||
USER root
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV HOSTNAME=0.0.0.0
|
||||
ENV HOSTNAME=::
|
||||
ENV PORT=3000
|
||||
EXPOSE $PORT
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ For configuration options, examples and more, [please check out the homepage doc
|
||||
|
||||
## 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
|
||||
|
||||
|
||||
@@ -12,8 +12,19 @@ export PGID=${PGID:-0}
|
||||
|
||||
export HOMEPAGE_BUILDTIME=$(date +%s)
|
||||
|
||||
# Try IPv6 first (dual stack when available), but fall back to IPv4 if the bind fails
|
||||
export HOSTNAME=${HOSTNAME:-::}
|
||||
if [ "$HOSTNAME" = "::" ]; then
|
||||
if ! node -e "const server = require('http').createServer(() => {}); const host = '::'; const port = process.env.PORT || 3000; server.once('error', (err) => { console.error('IPv6 bind failed:', err.message); process.exit(1); }); server.listen(port, host, () => server.close(() => process.exit(0)));"; then
|
||||
echo "Falling back to IPv4 bind at 0.0.0.0"
|
||||
export HOSTNAME=0.0.0.0
|
||||
fi
|
||||
fi
|
||||
|
||||
# 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_GID=$(stat -c %g /app/config)
|
||||
|
||||
@@ -30,7 +41,9 @@ else
|
||||
fi
|
||||
|
||||
# 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
|
||||
if [ -d /app/config/logs ]; then
|
||||
LOG_UID=$(stat -c %u /app/config/logs)
|
||||
|
||||
@@ -189,6 +189,8 @@ labels: ...
|
||||
- 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:
|
||||
|
||||
```yaml
|
||||
|
||||
@@ -94,6 +94,7 @@ metadata:
|
||||
gethomepage.dev/name: Emby
|
||||
gethomepage.dev/widget.type: "emby"
|
||||
gethomepage.dev/widget.url: "https://emby.example.com"
|
||||
gethomepage.dev/widget.headers.X-Auth-Key: "your-secret-here"
|
||||
gethomepage.dev/pod-selector: ""
|
||||
gethomepage.dev/weight: 10 # 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.
|
||||
|
||||
#### 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
|
||||
|
||||
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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
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.
|
||||
|
||||
@@ -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 the browser error console, this can also sometimes provide useful information.
|
||||
- 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
|
||||
|
||||
@@ -67,29 +66,3 @@ All service widgets work essentially the same, that is, homepage makes a proxied
|
||||
## 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.
|
||||
|
||||
## Enabling IPv6 for the homepage container
|
||||
|
||||
To enable IPv6 support for the homepage container, you can set the `HOSTNAME` environment variable, for example:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
homepage:
|
||||
...
|
||||
environment:
|
||||
- HOSTNAME=::
|
||||
```
|
||||
|
||||
## 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
|
||||
```
|
||||
|
||||
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
|
||||
```
|
||||
@@ -3,6 +3,8 @@ title: Gatus
|
||||
description: Gatus Widget Configuration
|
||||
---
|
||||
|
||||
Learn more about [Gatus](https://github.com/TwiN/gatus).
|
||||
|
||||
Allowed fields: `["up", "down", "uptime"]`.
|
||||
|
||||
```yaml
|
||||
|
||||
@@ -17,6 +17,7 @@ You can also find a list of all available service widgets in the sidebar navigat
|
||||
- [Azure DevOps](azuredevops.md)
|
||||
- [Backrest](backrest.md)
|
||||
- [Bazarr](bazarr.md)
|
||||
- [Booklore](booklore.md)
|
||||
- [Beszel](beszel.md)
|
||||
- [Caddy](caddy.md)
|
||||
- [Calendar](calendar.md)
|
||||
|
||||
@@ -9,11 +9,17 @@ _Note that the project was renamed from PiAlert to NetAlertX._
|
||||
|
||||
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
|
||||
widget:
|
||||
type: netalertx
|
||||
url: http://ip:port
|
||||
key: netalertxsyncapitoken # optional, only if password is enabled
|
||||
key: yournetalertxapitoken
|
||||
version: 2 # optional, default is 1
|
||||
```
|
||||
|
||||
29
docs/widgets/services/pangolin.md
Normal file
29
docs/widgets/services/pangolin.md
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: Pangolin
|
||||
description: Pangolin Widget Configuration
|
||||
---
|
||||
|
||||
Learn more about [Pangolin](https://github.com/fosrl/pangolin).
|
||||
|
||||
This widget shows sites (online/total), resources (healthy/total), targets (healthy/total), and traffic statistics for a Pangolin organization. A resource is considered healthy if at least one of its targets is healthy, or if it has no targets.
|
||||
|
||||
Allowed fields: `["sites", "resources", "targets", "traffic", "in", "out"]` (maximum of 4).
|
||||
|
||||
```yaml
|
||||
widget:
|
||||
type: pangolin
|
||||
url: https://api.pangolin.net
|
||||
key: your-api-key
|
||||
org: your-org-id
|
||||
```
|
||||
|
||||
Find your organization ID in the URL when logged in (e.g., `https://app.pangolin.net/{org-id}/...`).
|
||||
|
||||
## API Key Setup
|
||||
|
||||
Create an API key with the following permissions:
|
||||
|
||||
- **List Sites**
|
||||
- **List Resources**
|
||||
|
||||
**Self-Hosted:** Enable the [Integration API](https://docs.pangolin.net/self-host/advanced/integration-api) in your Pangolin configuration before creating the key.
|
||||
@@ -5,6 +5,11 @@ description: TrueNas Scale Widget Configuration
|
||||
|
||||
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"]`.
|
||||
|
||||
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:
|
||||
type: truenas
|
||||
url: http://truenas.host.or.ip
|
||||
version: 2 # optional, defaults to 1
|
||||
username: user # not required if using api key
|
||||
password: pass # not required if using api key
|
||||
key: yourtruenasapikey # not required if using username / password
|
||||
|
||||
@@ -41,6 +41,7 @@ nav:
|
||||
- widgets/services/azuredevops.md
|
||||
- widgets/services/backrest.md
|
||||
- widgets/services/bazarr.md
|
||||
- widgets/services/booklore.md
|
||||
- widgets/services/beszel.md
|
||||
- widgets/services/caddy.md
|
||||
- widgets/services/calendar.md
|
||||
@@ -122,6 +123,7 @@ nav:
|
||||
- widgets/services/opnsense.md
|
||||
- widgets/services/openwrt.md
|
||||
- widgets/services/overseerr.md
|
||||
- widgets/services/pangolin.md
|
||||
- widgets/services/paperlessngx.md
|
||||
- widgets/services/peanut.md
|
||||
- widgets/services/pfsense.md
|
||||
|
||||
14
package.json
14
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homepage",
|
||||
"version": "1.7.0",
|
||||
"version": "1.9.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
@@ -20,12 +20,12 @@
|
||||
"gamedig": "^5.3.2",
|
||||
"i18next": "^25.5.3",
|
||||
"ical.js": "^2.1.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"js-yaml": "^4.1.1",
|
||||
"json-rpc-2.0": "^1.7.0",
|
||||
"luxon": "^3.6.1",
|
||||
"memory-cache": "^0.2.0",
|
||||
"minecraftstatuspinger": "^1.2.2",
|
||||
"next": "^15.5.7",
|
||||
"next": "^15.5.9",
|
||||
"next-i18next": "^12.1.0",
|
||||
"ping": "^0.4.4",
|
||||
"pretty-bytes": "^7.1.0",
|
||||
@@ -33,18 +33,19 @@
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-i18next": "^15.5.3",
|
||||
"react-icons": "^5.4.0",
|
||||
"react-icons": "^5.5.0",
|
||||
"recharts": "^3.1.2",
|
||||
"swr": "^2.3.3",
|
||||
"systeminformation": "^5.27.11",
|
||||
"tough-cookie": "^6.0.0",
|
||||
"urbackup-server-api": "^0.8.9",
|
||||
"urbackup-server-api": "^0.91.0",
|
||||
"winston": "^3.17.0",
|
||||
"ws": "^8.18.3",
|
||||
"xml-js": "^1.6.11"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/forms": "^0.5.10",
|
||||
"@tailwindcss/postcss": "^4.1.14",
|
||||
"@tailwindcss/postcss": "^4.1.18",
|
||||
"eslint": "^9.25.1",
|
||||
"eslint-config-next": "^15.2.4",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
@@ -65,6 +66,7 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"@tailwindcss/oxide",
|
||||
"osx-temperature-sensor",
|
||||
"sharp"
|
||||
]
|
||||
|
||||
382
pnpm-lock.yaml
generated
382
pnpm-lock.yaml
generated
@@ -36,8 +36,8 @@ importers:
|
||||
specifier: ^2.1.0
|
||||
version: 2.1.0
|
||||
js-yaml:
|
||||
specifier: ^4.1.0
|
||||
version: 4.1.0
|
||||
specifier: ^4.1.1
|
||||
version: 4.1.1
|
||||
json-rpc-2.0:
|
||||
specifier: ^1.7.0
|
||||
version: 1.7.0
|
||||
@@ -51,11 +51,11 @@ importers:
|
||||
specifier: ^1.2.2
|
||||
version: 1.2.2
|
||||
next:
|
||||
specifier: ^15.5.7
|
||||
version: 15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
specifier: ^15.5.9
|
||||
version: 15.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
next-i18next:
|
||||
specifier: ^12.1.0
|
||||
version: 12.1.0(next@15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
version: 12.1.0(next@15.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
ping:
|
||||
specifier: ^0.4.4
|
||||
version: 0.4.4
|
||||
@@ -75,8 +75,8 @@ importers:
|
||||
specifier: ^15.5.3
|
||||
version: 15.5.3(i18next@25.5.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)
|
||||
react-icons:
|
||||
specifier: ^5.4.0
|
||||
version: 5.4.0(react@18.3.1)
|
||||
specifier: ^5.5.0
|
||||
version: 5.5.0(react@18.3.1)
|
||||
recharts:
|
||||
specifier: ^3.1.2
|
||||
version: 3.1.2(@types/react@19.0.10)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(redux@5.0.1)
|
||||
@@ -90,11 +90,14 @@ importers:
|
||||
specifier: ^6.0.0
|
||||
version: 6.0.0
|
||||
urbackup-server-api:
|
||||
specifier: ^0.8.9
|
||||
version: 0.8.9
|
||||
specifier: ^0.91.0
|
||||
version: 0.91.0
|
||||
winston:
|
||||
specifier: ^3.17.0
|
||||
version: 3.17.0
|
||||
ws:
|
||||
specifier: ^8.18.3
|
||||
version: 8.18.3
|
||||
xml-js:
|
||||
specifier: ^1.6.11
|
||||
version: 1.6.11
|
||||
@@ -103,8 +106,8 @@ importers:
|
||||
specifier: ^0.5.10
|
||||
version: 0.5.10(tailwindcss@4.0.9)
|
||||
'@tailwindcss/postcss':
|
||||
specifier: ^4.1.14
|
||||
version: 4.1.14
|
||||
specifier: ^4.1.18
|
||||
version: 4.1.18
|
||||
eslint:
|
||||
specifier: ^9.25.1
|
||||
version: 9.25.1(jiti@2.6.1)
|
||||
@@ -466,8 +469,8 @@ packages:
|
||||
'@napi-rs/wasm-runtime@0.2.8':
|
||||
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
|
||||
|
||||
'@next/env@15.5.7':
|
||||
resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==}
|
||||
'@next/env@15.5.9':
|
||||
resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==}
|
||||
|
||||
'@next/eslint-plugin-next@15.2.4':
|
||||
resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==}
|
||||
@@ -653,65 +656,65 @@ packages:
|
||||
peerDependencies:
|
||||
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1'
|
||||
|
||||
'@tailwindcss/node@4.1.14':
|
||||
resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==}
|
||||
'@tailwindcss/node@4.1.18':
|
||||
resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
|
||||
|
||||
'@tailwindcss/oxide-android-arm64@4.1.14':
|
||||
resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==}
|
||||
'@tailwindcss/oxide-android-arm64@4.1.18':
|
||||
resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@tailwindcss/oxide-darwin-arm64@4.1.14':
|
||||
resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==}
|
||||
'@tailwindcss/oxide-darwin-arm64@4.1.18':
|
||||
resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@tailwindcss/oxide-darwin-x64@4.1.14':
|
||||
resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==}
|
||||
'@tailwindcss/oxide-darwin-x64@4.1.18':
|
||||
resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@tailwindcss/oxide-freebsd-x64@4.1.14':
|
||||
resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==}
|
||||
'@tailwindcss/oxide-freebsd-x64@4.1.18':
|
||||
resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
|
||||
resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==}
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
|
||||
resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
|
||||
resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==}
|
||||
'@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
|
||||
resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-musl@4.1.14':
|
||||
resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==}
|
||||
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
|
||||
resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-gnu@4.1.14':
|
||||
resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==}
|
||||
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
|
||||
resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-musl@4.1.14':
|
||||
resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==}
|
||||
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
|
||||
resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@tailwindcss/oxide-wasm32-wasi@4.1.14':
|
||||
resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==}
|
||||
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
|
||||
resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
cpu: [wasm32]
|
||||
bundledDependencies:
|
||||
@@ -722,24 +725,24 @@ packages:
|
||||
- '@emnapi/wasi-threads'
|
||||
- tslib
|
||||
|
||||
'@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
|
||||
resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==}
|
||||
'@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
|
||||
resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@tailwindcss/oxide-win32-x64-msvc@4.1.14':
|
||||
resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==}
|
||||
'@tailwindcss/oxide-win32-x64-msvc@4.1.18':
|
||||
resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@tailwindcss/oxide@4.1.14':
|
||||
resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==}
|
||||
'@tailwindcss/oxide@4.1.18':
|
||||
resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==}
|
||||
engines: {node: '>= 10'}
|
||||
|
||||
'@tailwindcss/postcss@4.1.14':
|
||||
resolution: {integrity: sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==}
|
||||
'@tailwindcss/postcss@4.1.18':
|
||||
resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
|
||||
|
||||
'@tanstack/react-virtual@3.13.12':
|
||||
resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==}
|
||||
@@ -1035,8 +1038,8 @@ packages:
|
||||
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
async-mutex@0.3.2:
|
||||
resolution: {integrity: sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==}
|
||||
async-mutex@0.5.0:
|
||||
resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==}
|
||||
|
||||
async@3.2.6:
|
||||
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
|
||||
@@ -1120,8 +1123,8 @@ packages:
|
||||
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
caniuse-lite@1.0.30001759:
|
||||
resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==}
|
||||
caniuse-lite@1.0.30001760:
|
||||
resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
|
||||
|
||||
chalk@4.1.2:
|
||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||
@@ -1320,10 +1323,6 @@ packages:
|
||||
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
detect-libc@2.1.1:
|
||||
resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
detect-libc@2.1.2:
|
||||
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -1362,8 +1361,8 @@ packages:
|
||||
end-of-stream@1.4.5:
|
||||
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
|
||||
|
||||
enhanced-resolve@5.18.3:
|
||||
resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
|
||||
enhanced-resolve@5.18.4:
|
||||
resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
|
||||
es-abstract@1.23.9:
|
||||
@@ -1966,8 +1965,8 @@ packages:
|
||||
js-tokens@4.0.0:
|
||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||
|
||||
js-yaml@4.1.0:
|
||||
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
|
||||
js-yaml@4.1.1:
|
||||
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
|
||||
hasBin: true
|
||||
|
||||
jsep@1.4.0:
|
||||
@@ -2016,68 +2015,74 @@ packages:
|
||||
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
lightningcss-darwin-arm64@1.30.1:
|
||||
resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==}
|
||||
lightningcss-android-arm64@1.30.2:
|
||||
resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
lightningcss-darwin-arm64@1.30.2:
|
||||
resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
lightningcss-darwin-x64@1.30.1:
|
||||
resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==}
|
||||
lightningcss-darwin-x64@1.30.2:
|
||||
resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
lightningcss-freebsd-x64@1.30.1:
|
||||
resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==}
|
||||
lightningcss-freebsd-x64@1.30.2:
|
||||
resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
lightningcss-linux-arm-gnueabihf@1.30.1:
|
||||
resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==}
|
||||
lightningcss-linux-arm-gnueabihf@1.30.2:
|
||||
resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-arm64-gnu@1.30.1:
|
||||
resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==}
|
||||
lightningcss-linux-arm64-gnu@1.30.2:
|
||||
resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-arm64-musl@1.30.1:
|
||||
resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
|
||||
lightningcss-linux-arm64-musl@1.30.2:
|
||||
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-x64-gnu@1.30.1:
|
||||
resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
|
||||
lightningcss-linux-x64-gnu@1.30.2:
|
||||
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-x64-musl@1.30.1:
|
||||
resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
|
||||
lightningcss-linux-x64-musl@1.30.2:
|
||||
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-win32-arm64-msvc@1.30.1:
|
||||
resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
|
||||
lightningcss-win32-arm64-msvc@1.30.2:
|
||||
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
lightningcss-win32-x64-msvc@1.30.1:
|
||||
resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==}
|
||||
lightningcss-win32-x64-msvc@1.30.2:
|
||||
resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
lightningcss@1.30.1:
|
||||
resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
|
||||
lightningcss@1.30.2:
|
||||
resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
|
||||
locate-path@6.0.0:
|
||||
@@ -2112,8 +2117,8 @@ packages:
|
||||
resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
magic-string@0.30.19:
|
||||
resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
|
||||
magic-string@0.30.21:
|
||||
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
|
||||
|
||||
math-intrinsics@1.1.0:
|
||||
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
||||
@@ -2176,10 +2181,6 @@ packages:
|
||||
resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
minizlib@3.1.0:
|
||||
resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
mkdirp-classic@0.5.3:
|
||||
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
|
||||
|
||||
@@ -2212,8 +2213,8 @@ packages:
|
||||
next: '>= 10.0.0'
|
||||
react: '>= 16.8.0'
|
||||
|
||||
next@15.5.7:
|
||||
resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==}
|
||||
next@15.5.9:
|
||||
resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==}
|
||||
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@@ -2458,8 +2459,8 @@ packages:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
react-icons@5.4.0:
|
||||
resolution: {integrity: sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==}
|
||||
react-icons@5.5.0:
|
||||
resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==}
|
||||
peerDependencies:
|
||||
react: '*'
|
||||
|
||||
@@ -2805,11 +2806,11 @@ packages:
|
||||
tailwindcss@4.0.9:
|
||||
resolution: {integrity: sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==}
|
||||
|
||||
tailwindcss@4.1.14:
|
||||
resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==}
|
||||
tailwindcss@4.1.18:
|
||||
resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
|
||||
|
||||
tapable@2.2.3:
|
||||
resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==}
|
||||
tapable@2.3.0:
|
||||
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
tar-fs@2.1.3:
|
||||
@@ -2823,10 +2824,6 @@ packages:
|
||||
resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
tar@7.5.1:
|
||||
resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
telnet-client@2.2.6:
|
||||
resolution: {integrity: sha512-ZUYrLsPtQupQww3eSEORDVOb6ztdtKEghya6TVXPo2tg/UQq2pn5rHhvwuUvyYpbnsoqdNY1fyD1GNkXHR8dYA==}
|
||||
|
||||
@@ -2930,8 +2927,8 @@ packages:
|
||||
unrs-resolver@1.3.3:
|
||||
resolution: {integrity: sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==}
|
||||
|
||||
urbackup-server-api@0.8.9:
|
||||
resolution: {integrity: sha512-Igu6A0xSZeMsiN6PWT7zG4aD+iJR5fXT/j5+xwAvnD/vCNfvVrettIsXv6MftxOajvTmtlgaYu8KDoH1EJQ6DQ==}
|
||||
urbackup-server-api@0.91.0:
|
||||
resolution: {integrity: sha512-N1CSnGSCSHjwWfGOp6jE56mHYoZor/p++ii8yPsN9P/3cKLBgCvrAZxAbfi+IgK9FZpQEx/kPX1R8OTJRy+x6A==}
|
||||
|
||||
uri-js@4.4.1:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
@@ -3017,8 +3014,8 @@ packages:
|
||||
wrappy@1.0.2:
|
||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||
|
||||
ws@8.18.0:
|
||||
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
|
||||
ws@8.18.3:
|
||||
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
peerDependencies:
|
||||
bufferutil: ^4.0.1
|
||||
@@ -3128,7 +3125,7 @@ snapshots:
|
||||
globals: 14.0.0
|
||||
ignore: 5.3.2
|
||||
import-fresh: 3.3.1
|
||||
js-yaml: 4.1.0
|
||||
js-yaml: 4.1.1
|
||||
minimatch: 3.1.2
|
||||
strip-json-comments: 3.1.1
|
||||
transitivePeerDependencies:
|
||||
@@ -3351,8 +3348,8 @@ snapshots:
|
||||
'@types/tar': 6.1.13
|
||||
'@types/ws': 8.5.14
|
||||
form-data: 4.0.2
|
||||
isomorphic-ws: 5.0.0(ws@8.18.0)
|
||||
js-yaml: 4.1.0
|
||||
isomorphic-ws: 5.0.0(ws@8.18.3)
|
||||
js-yaml: 4.1.1
|
||||
jsonpath-plus: 10.3.0
|
||||
node-fetch: 2.7.0
|
||||
openid-client: 6.3.0
|
||||
@@ -3361,7 +3358,7 @@ snapshots:
|
||||
tar: 7.4.3
|
||||
tmp-promise: 3.0.3
|
||||
tslib: 2.8.1
|
||||
ws: 8.18.0
|
||||
ws: 8.18.3
|
||||
transitivePeerDependencies:
|
||||
- bufferutil
|
||||
- encoding
|
||||
@@ -3374,7 +3371,7 @@ snapshots:
|
||||
'@tybys/wasm-util': 0.9.0
|
||||
optional: true
|
||||
|
||||
'@next/env@15.5.7': {}
|
||||
'@next/env@15.5.9': {}
|
||||
|
||||
'@next/eslint-plugin-next@15.2.4':
|
||||
dependencies:
|
||||
@@ -3534,77 +3531,74 @@ snapshots:
|
||||
mini-svg-data-uri: 1.4.4
|
||||
tailwindcss: 4.0.9
|
||||
|
||||
'@tailwindcss/node@4.1.14':
|
||||
'@tailwindcss/node@4.1.18':
|
||||
dependencies:
|
||||
'@jridgewell/remapping': 2.3.5
|
||||
enhanced-resolve: 5.18.3
|
||||
enhanced-resolve: 5.18.4
|
||||
jiti: 2.6.1
|
||||
lightningcss: 1.30.1
|
||||
magic-string: 0.30.19
|
||||
lightningcss: 1.30.2
|
||||
magic-string: 0.30.21
|
||||
source-map-js: 1.2.1
|
||||
tailwindcss: 4.1.14
|
||||
tailwindcss: 4.1.18
|
||||
|
||||
'@tailwindcss/oxide-android-arm64@4.1.14':
|
||||
'@tailwindcss/oxide-android-arm64@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-darwin-arm64@4.1.14':
|
||||
'@tailwindcss/oxide-darwin-arm64@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-darwin-x64@4.1.14':
|
||||
'@tailwindcss/oxide-darwin-x64@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-freebsd-x64@4.1.14':
|
||||
'@tailwindcss/oxide-freebsd-x64@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
|
||||
'@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-musl@4.1.14':
|
||||
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-gnu@4.1.14':
|
||||
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-musl@4.1.14':
|
||||
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-wasm32-wasi@4.1.14':
|
||||
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
|
||||
'@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-win32-x64-msvc@4.1.14':
|
||||
'@tailwindcss/oxide-win32-x64-msvc@4.1.18':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide@4.1.14':
|
||||
dependencies:
|
||||
detect-libc: 2.1.1
|
||||
tar: 7.5.1
|
||||
'@tailwindcss/oxide@4.1.18':
|
||||
optionalDependencies:
|
||||
'@tailwindcss/oxide-android-arm64': 4.1.14
|
||||
'@tailwindcss/oxide-darwin-arm64': 4.1.14
|
||||
'@tailwindcss/oxide-darwin-x64': 4.1.14
|
||||
'@tailwindcss/oxide-freebsd-x64': 4.1.14
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14
|
||||
'@tailwindcss/oxide-linux-arm64-gnu': 4.1.14
|
||||
'@tailwindcss/oxide-linux-arm64-musl': 4.1.14
|
||||
'@tailwindcss/oxide-linux-x64-gnu': 4.1.14
|
||||
'@tailwindcss/oxide-linux-x64-musl': 4.1.14
|
||||
'@tailwindcss/oxide-wasm32-wasi': 4.1.14
|
||||
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.14
|
||||
'@tailwindcss/oxide-win32-x64-msvc': 4.1.14
|
||||
'@tailwindcss/oxide-android-arm64': 4.1.18
|
||||
'@tailwindcss/oxide-darwin-arm64': 4.1.18
|
||||
'@tailwindcss/oxide-darwin-x64': 4.1.18
|
||||
'@tailwindcss/oxide-freebsd-x64': 4.1.18
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18
|
||||
'@tailwindcss/oxide-linux-arm64-gnu': 4.1.18
|
||||
'@tailwindcss/oxide-linux-arm64-musl': 4.1.18
|
||||
'@tailwindcss/oxide-linux-x64-gnu': 4.1.18
|
||||
'@tailwindcss/oxide-linux-x64-musl': 4.1.18
|
||||
'@tailwindcss/oxide-wasm32-wasi': 4.1.18
|
||||
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
|
||||
'@tailwindcss/oxide-win32-x64-msvc': 4.1.18
|
||||
|
||||
'@tailwindcss/postcss@4.1.14':
|
||||
'@tailwindcss/postcss@4.1.18':
|
||||
dependencies:
|
||||
'@alloc/quick-lru': 5.2.0
|
||||
'@tailwindcss/node': 4.1.14
|
||||
'@tailwindcss/oxide': 4.1.14
|
||||
'@tailwindcss/node': 4.1.18
|
||||
'@tailwindcss/oxide': 4.1.18
|
||||
postcss: 8.5.6
|
||||
tailwindcss: 4.1.14
|
||||
tailwindcss: 4.1.18
|
||||
|
||||
'@tanstack/react-virtual@3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||
dependencies:
|
||||
@@ -3931,7 +3925,7 @@ snapshots:
|
||||
|
||||
async-function@1.0.0: {}
|
||||
|
||||
async-mutex@0.3.2:
|
||||
async-mutex@0.5.0:
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
@@ -4024,7 +4018,7 @@ snapshots:
|
||||
|
||||
callsites@3.1.0: {}
|
||||
|
||||
caniuse-lite@1.0.30001759: {}
|
||||
caniuse-lite@1.0.30001760: {}
|
||||
|
||||
chalk@4.1.2:
|
||||
dependencies:
|
||||
@@ -4200,10 +4194,7 @@ snapshots:
|
||||
|
||||
dequal@2.0.3: {}
|
||||
|
||||
detect-libc@2.1.1: {}
|
||||
|
||||
detect-libc@2.1.2:
|
||||
optional: true
|
||||
detect-libc@2.1.2: {}
|
||||
|
||||
docker-modem@5.0.6:
|
||||
dependencies:
|
||||
@@ -4250,10 +4241,10 @@ snapshots:
|
||||
dependencies:
|
||||
once: 1.4.0
|
||||
|
||||
enhanced-resolve@5.18.3:
|
||||
enhanced-resolve@5.18.4:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
tapable: 2.2.3
|
||||
tapable: 2.3.0
|
||||
|
||||
es-abstract@1.23.9:
|
||||
dependencies:
|
||||
@@ -5045,9 +5036,9 @@ snapshots:
|
||||
|
||||
isexe@2.0.0: {}
|
||||
|
||||
isomorphic-ws@5.0.0(ws@8.18.0):
|
||||
isomorphic-ws@5.0.0(ws@8.18.3):
|
||||
dependencies:
|
||||
ws: 8.18.0
|
||||
ws: 8.18.3
|
||||
|
||||
iterator.prototype@1.1.5:
|
||||
dependencies:
|
||||
@@ -5070,7 +5061,7 @@ snapshots:
|
||||
|
||||
js-tokens@4.0.0: {}
|
||||
|
||||
js-yaml@4.1.0:
|
||||
js-yaml@4.1.1:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
|
||||
@@ -5118,50 +5109,54 @@ snapshots:
|
||||
prelude-ls: 1.2.1
|
||||
type-check: 0.4.0
|
||||
|
||||
lightningcss-darwin-arm64@1.30.1:
|
||||
lightningcss-android-arm64@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-darwin-x64@1.30.1:
|
||||
lightningcss-darwin-arm64@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-freebsd-x64@1.30.1:
|
||||
lightningcss-darwin-x64@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-arm-gnueabihf@1.30.1:
|
||||
lightningcss-freebsd-x64@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-arm64-gnu@1.30.1:
|
||||
lightningcss-linux-arm-gnueabihf@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-arm64-musl@1.30.1:
|
||||
lightningcss-linux-arm64-gnu@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-x64-gnu@1.30.1:
|
||||
lightningcss-linux-arm64-musl@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-x64-musl@1.30.1:
|
||||
lightningcss-linux-x64-gnu@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-win32-arm64-msvc@1.30.1:
|
||||
lightningcss-linux-x64-musl@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss-win32-x64-msvc@1.30.1:
|
||||
lightningcss-win32-arm64-msvc@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss@1.30.1:
|
||||
lightningcss-win32-x64-msvc@1.30.2:
|
||||
optional: true
|
||||
|
||||
lightningcss@1.30.2:
|
||||
dependencies:
|
||||
detect-libc: 2.1.1
|
||||
detect-libc: 2.1.2
|
||||
optionalDependencies:
|
||||
lightningcss-darwin-arm64: 1.30.1
|
||||
lightningcss-darwin-x64: 1.30.1
|
||||
lightningcss-freebsd-x64: 1.30.1
|
||||
lightningcss-linux-arm-gnueabihf: 1.30.1
|
||||
lightningcss-linux-arm64-gnu: 1.30.1
|
||||
lightningcss-linux-arm64-musl: 1.30.1
|
||||
lightningcss-linux-x64-gnu: 1.30.1
|
||||
lightningcss-linux-x64-musl: 1.30.1
|
||||
lightningcss-win32-arm64-msvc: 1.30.1
|
||||
lightningcss-win32-x64-msvc: 1.30.1
|
||||
lightningcss-android-arm64: 1.30.2
|
||||
lightningcss-darwin-arm64: 1.30.2
|
||||
lightningcss-darwin-x64: 1.30.2
|
||||
lightningcss-freebsd-x64: 1.30.2
|
||||
lightningcss-linux-arm-gnueabihf: 1.30.2
|
||||
lightningcss-linux-arm64-gnu: 1.30.2
|
||||
lightningcss-linux-arm64-musl: 1.30.2
|
||||
lightningcss-linux-x64-gnu: 1.30.2
|
||||
lightningcss-linux-x64-musl: 1.30.2
|
||||
lightningcss-win32-arm64-msvc: 1.30.2
|
||||
lightningcss-win32-x64-msvc: 1.30.2
|
||||
|
||||
locate-path@6.0.0:
|
||||
dependencies:
|
||||
@@ -5192,7 +5187,7 @@ snapshots:
|
||||
|
||||
luxon@3.6.1: {}
|
||||
|
||||
magic-string@0.30.19:
|
||||
magic-string@0.30.21:
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.5.5
|
||||
|
||||
@@ -5240,10 +5235,6 @@ snapshots:
|
||||
minipass: 7.1.2
|
||||
rimraf: 5.0.10
|
||||
|
||||
minizlib@3.1.0:
|
||||
dependencies:
|
||||
minipass: 7.1.2
|
||||
|
||||
mkdirp-classic@0.5.3: {}
|
||||
|
||||
mkdirp@3.0.1: {}
|
||||
@@ -5259,7 +5250,7 @@ snapshots:
|
||||
|
||||
net@1.0.2: {}
|
||||
|
||||
next-i18next@12.1.0(next@15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||
next-i18next@12.1.0(next@15.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.26.9
|
||||
'@types/hoist-non-react-statics': 3.3.6
|
||||
@@ -5267,18 +5258,18 @@ snapshots:
|
||||
hoist-non-react-statics: 3.3.2
|
||||
i18next: 21.10.0
|
||||
i18next-fs-backend: 1.2.0
|
||||
next: 15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
next: 15.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
react: 18.3.1
|
||||
react-i18next: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
transitivePeerDependencies:
|
||||
- react-dom
|
||||
- react-native
|
||||
|
||||
next@15.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||
next@15.5.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||
dependencies:
|
||||
'@next/env': 15.5.7
|
||||
'@next/env': 15.5.9
|
||||
'@swc/helpers': 0.5.15
|
||||
caniuse-lite: 1.0.30001759
|
||||
caniuse-lite: 1.0.30001760
|
||||
postcss: 8.4.31
|
||||
react: 18.3.1
|
||||
react-dom: 18.3.1(react@18.3.1)
|
||||
@@ -5513,7 +5504,7 @@ snapshots:
|
||||
react-dom: 18.3.1(react@18.3.1)
|
||||
typescript: 5.7.3
|
||||
|
||||
react-icons@5.4.0(react@18.3.1):
|
||||
react-icons@5.5.0(react@18.3.1):
|
||||
dependencies:
|
||||
react: 18.3.1
|
||||
|
||||
@@ -5936,9 +5927,9 @@ snapshots:
|
||||
|
||||
tailwindcss@4.0.9: {}
|
||||
|
||||
tailwindcss@4.1.14: {}
|
||||
tailwindcss@4.1.18: {}
|
||||
|
||||
tapable@2.2.3: {}
|
||||
tapable@2.3.0: {}
|
||||
|
||||
tar-fs@2.1.3:
|
||||
dependencies:
|
||||
@@ -5964,14 +5955,6 @@ snapshots:
|
||||
mkdirp: 3.0.1
|
||||
yallist: 5.0.0
|
||||
|
||||
tar@7.5.1:
|
||||
dependencies:
|
||||
'@isaacs/fs-minipass': 4.0.1
|
||||
chownr: 3.0.0
|
||||
minipass: 7.1.2
|
||||
minizlib: 3.1.0
|
||||
yallist: 5.0.0
|
||||
|
||||
telnet-client@2.2.6:
|
||||
dependencies:
|
||||
net: 1.0.2
|
||||
@@ -6097,12 +6080,9 @@ snapshots:
|
||||
'@unrs/resolver-binding-win32-ia32-msvc': 1.3.3
|
||||
'@unrs/resolver-binding-win32-x64-msvc': 1.3.3
|
||||
|
||||
urbackup-server-api@0.8.9:
|
||||
urbackup-server-api@0.91.0:
|
||||
dependencies:
|
||||
async-mutex: 0.3.2
|
||||
node-fetch: 2.7.0
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
async-mutex: 0.5.0
|
||||
|
||||
uri-js@4.4.1:
|
||||
dependencies:
|
||||
@@ -6238,7 +6218,7 @@ snapshots:
|
||||
|
||||
wrappy@1.0.2: {}
|
||||
|
||||
ws@8.18.0: {}
|
||||
ws@8.18.3: {}
|
||||
|
||||
xml-js@1.6.11:
|
||||
dependencies:
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Op",
|
||||
"pending": "Afwagtend",
|
||||
"down": "Af"
|
||||
"down": "Af",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nuut",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inmandjie",
|
||||
"total": "Totaal"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Bronne",
|
||||
"targets": "Teikens",
|
||||
"traffic": "Verkeer",
|
||||
"in": "In",
|
||||
"out": "Uit"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Batterylading",
|
||||
"ups_load": "SVE-lading",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Vandag",
|
||||
"gross_percent_1y": "Een jaar",
|
||||
"gross_percent_max": "Alle tyd"
|
||||
"gross_percent_max": "Alle tyd",
|
||||
"net_worth": "Netto Waarde"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podsendinge",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Kategorieë",
|
||||
"series": "Reekse"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Tou",
|
||||
"downloadBytesRemaining": "Oorblywende",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "جديد(ة)",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "صندوق الوارد",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "شحن البطارية",
|
||||
"ups_load": "حمل UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "سنة",
|
||||
"gross_percent_max": "كل الوقت"
|
||||
"gross_percent_max": "كل الوقت",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "بودكاست",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
"wlan_users": "WLAN Потребители",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait",
|
||||
"wait": "Моля изчакайте",
|
||||
"empty_data": "Неизвестен статус на подсистема"
|
||||
},
|
||||
"docker": {
|
||||
@@ -83,7 +83,7 @@
|
||||
"partial": "Частично"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "Грешка",
|
||||
"ping": "Пинг",
|
||||
"down": "Down",
|
||||
"up": "Up",
|
||||
@@ -91,11 +91,11 @@
|
||||
},
|
||||
"siteMonitor": {
|
||||
"http_status": "HTTP статус",
|
||||
"error": "Error",
|
||||
"error": "Грешка",
|
||||
"response": "Отговор",
|
||||
"down": "Down",
|
||||
"up": "Up",
|
||||
"not_available": "Not Available"
|
||||
"not_available": "Не е налично"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Възпроизвежда",
|
||||
@@ -111,7 +111,7 @@
|
||||
"offline": "Offline",
|
||||
"offline_alt": "Offline",
|
||||
"online": "Онлайн",
|
||||
"total": "Total",
|
||||
"total": "Общо",
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"evcc": {
|
||||
@@ -133,7 +133,7 @@
|
||||
"unread": "Непрочетени"
|
||||
},
|
||||
"fritzbox": {
|
||||
"connectionStatus": "Status",
|
||||
"connectionStatus": "Статус",
|
||||
"connectionStatusUnconfigured": "Неконфигуриран",
|
||||
"connectionStatusConnecting": "Свързване",
|
||||
"connectionStatusAuthenticating": "Удостоверяване",
|
||||
@@ -141,7 +141,7 @@
|
||||
"connectionStatusDisconnecting": "Прекъсване на връзката",
|
||||
"connectionStatusDisconnected": "Не е свързан",
|
||||
"connectionStatusConnected": "Свързан",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Време на работа",
|
||||
"maxDown": "Макс сваляне",
|
||||
"maxUp": "Макс качване",
|
||||
"down": "Down",
|
||||
@@ -170,8 +170,8 @@
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"transcoding": "Transcoding",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams",
|
||||
"bitrate": "Битрейт",
|
||||
"no_active": "Няма активни потоци",
|
||||
"plex_connection_error": "Провери връзка с Plex"
|
||||
},
|
||||
"omada": {
|
||||
@@ -189,7 +189,7 @@
|
||||
"plex": {
|
||||
"streams": "Активни Потоци",
|
||||
"albums": "Албуми",
|
||||
"movies": "Movies",
|
||||
"movies": "Филми",
|
||||
"tv": "Сериали"
|
||||
},
|
||||
"sabnzbd": {
|
||||
@@ -362,8 +362,8 @@
|
||||
},
|
||||
"trilium": {
|
||||
"version": "Version",
|
||||
"notesCount": "Notes",
|
||||
"dbSize": "Database Size",
|
||||
"notesCount": "Бележки",
|
||||
"dbSize": "Размер на базата данни",
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"navidrome": {
|
||||
@@ -373,7 +373,7 @@
|
||||
"npm": {
|
||||
"enabled": "Активирано",
|
||||
"disabled": "Деактивирано",
|
||||
"total": "Total"
|
||||
"total": "Общо"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Настрой за следене една или повече крипто валути",
|
||||
@@ -384,7 +384,7 @@
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Приложения",
|
||||
"clients": "Clients",
|
||||
"clients": "Клиенти",
|
||||
"messages": "Съобщения"
|
||||
},
|
||||
"prowlarr": {
|
||||
@@ -405,7 +405,7 @@
|
||||
"transferRate": "Rate"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Users",
|
||||
"user_count": "Потребители",
|
||||
"status_count": "Posts",
|
||||
"domain_count": "Domains"
|
||||
},
|
||||
@@ -416,17 +416,17 @@
|
||||
},
|
||||
"minecraft": {
|
||||
"players": "Играчи",
|
||||
"version": "Version",
|
||||
"status": "Status",
|
||||
"up": "Online",
|
||||
"down": "Offline"
|
||||
"version": "Версия",
|
||||
"status": "Статус",
|
||||
"up": "Онлайн",
|
||||
"down": "Офлайн"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
"unread": "Unread"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"users": "Потребители",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
},
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Нови",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Входящи",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Заряд на батерията",
|
||||
"ups_load": "Натоварване на UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Една година",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасти",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nou",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Safata d'entrada",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Càrrega de la bateria",
|
||||
"ups_load": "Càrrega del SAI",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Un any",
|
||||
"gross_percent_max": "Sempre"
|
||||
"gross_percent_max": "Sempre",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Pòdcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nové",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Doručená pošta",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Úroveň baterie",
|
||||
"ups_load": "Zítěž UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Jeden rok",
|
||||
"gross_percent_max": "Za celou dobu"
|
||||
"gross_percent_max": "Za celou dobu",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasty",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Ny",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Indbakke",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Batteriniveau",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Et År",
|
||||
"gross_percent_max": "Altid"
|
||||
"gross_percent_max": "Altid",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -45,9 +45,9 @@
|
||||
"free": "Frei",
|
||||
"used": "In Benutzung",
|
||||
"load": "Last",
|
||||
"temp": "TEMP",
|
||||
"temp": "Temp",
|
||||
"max": "Max",
|
||||
"uptime": "BETRIEBSZEIT"
|
||||
"uptime": "Betriebszeit"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Benutzer",
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Online",
|
||||
"pending": "Wartend",
|
||||
"down": "Offline"
|
||||
"down": "Offline",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Neu",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Posteingang",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Ressourcen",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Akkuladung",
|
||||
"ups_load": "USV-Auslastung",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Heute",
|
||||
"gross_percent_1y": "Ein Jahr",
|
||||
"gross_percent_max": "Gesamt"
|
||||
"gross_percent_max": "Gesamt",
|
||||
"net_worth": ""
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Kategorien",
|
||||
"series": "Serien"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Warteschlange",
|
||||
"downloadBytesRemaining": "Verbleibend",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Εισερχόμενα",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Ένας χρόνος",
|
||||
"gross_percent_max": "Διαχρονικά"
|
||||
"gross_percent_max": "Διαχρονικά",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -783,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Activo",
|
||||
"pending": "Pendiente",
|
||||
"down": "Inactivo"
|
||||
"down": "Inactivo",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nuevo",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Bandeja de entrada",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sitios",
|
||||
"resources": "Recursos",
|
||||
"targets": "Destinos",
|
||||
"traffic": "Tráfico",
|
||||
"in": "Entrante",
|
||||
"out": "Saliente"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Carga de la batería",
|
||||
"ups_load": "Carga del UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Hoy",
|
||||
"gross_percent_1y": "Un año",
|
||||
"gross_percent_max": "Todo el tiempo"
|
||||
"gross_percent_max": "Todo el tiempo",
|
||||
"net_worth": "Patrimonio neto"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categorías",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "En cola",
|
||||
"downloadBytesRemaining": "Restante",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -142,8 +142,8 @@
|
||||
"connectionStatusDisconnected": "Déconnecté",
|
||||
"connectionStatusConnected": "Connecté",
|
||||
"uptime": "Démarré depuis",
|
||||
"maxDown": "Réception max.",
|
||||
"maxUp": "Envoi max.",
|
||||
"maxDown": "Réception max",
|
||||
"maxUp": "Envoi max",
|
||||
"down": "Réception",
|
||||
"up": "Envoi",
|
||||
"received": "Reçu",
|
||||
@@ -229,7 +229,7 @@
|
||||
"seed": "En partage"
|
||||
},
|
||||
"develancacheui": {
|
||||
"cachehitbytes": "Cache Hit (B)",
|
||||
"cachehitbytes": "Octets acquis du cache",
|
||||
"cachemissbytes": "Cache Miss (B)"
|
||||
},
|
||||
"downloadstation": {
|
||||
@@ -294,7 +294,7 @@
|
||||
"queries": "Requêtes",
|
||||
"blocked": "Bloqué",
|
||||
"blocked_percent": "% bloqué",
|
||||
"gravity": "Listes dom. bloqués"
|
||||
"gravity": "Listes dom. Bloqués"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Requêtes",
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "En ligne",
|
||||
"pending": "En attente",
|
||||
"down": "Hors ligne"
|
||||
"down": "Hors ligne",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nouveau",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Boîte de réception",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Charge de la batterie",
|
||||
"ups_load": "Charge de l’ASI",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Aujourd'hui",
|
||||
"gross_percent_1y": "Un an",
|
||||
"gross_percent_max": "Depuis le début"
|
||||
"gross_percent_max": "Depuis le début",
|
||||
"net_worth": "Patrimoine net"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Catégories",
|
||||
"series": "Séries"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "File d'attente",
|
||||
"downloadBytesRemaining": "Restant",
|
||||
@@ -1091,7 +1108,7 @@
|
||||
"NEW_ARRAY": "Nouveau tableau",
|
||||
"RECON_DISK": "Reconstruction du disque",
|
||||
"DISABLE_DISK": "Disque désactivé",
|
||||
"SWAP_DSBL": "Swap Disable",
|
||||
"SWAP_DSBL": "Désactiver le swap",
|
||||
"INVALID_EXPANSION": "Extension invalide",
|
||||
"PARITY_NOT_BIGGEST": "La parité n'est pas la plus grande",
|
||||
"TOO_MANY_MISSING_DISKS": "Trop de disques manquants",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "למעלה",
|
||||
"pending": "ממתין",
|
||||
"down": "למטה"
|
||||
"down": "למטה",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "חדש",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "תיבת דואר נכנס",
|
||||
"total": "סה\"כ"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "טעינת סוללה",
|
||||
"ups_load": "עומס UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "היום",
|
||||
"gross_percent_1y": "שנה",
|
||||
"gross_percent_max": "כל הזמן"
|
||||
"gross_percent_max": "כל הזמן",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "פודקאסטים",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "קטגוריות",
|
||||
"series": "סדרות"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "תור",
|
||||
"downloadBytesRemaining": "נותר",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Aktivno",
|
||||
"pending": "U tijeku",
|
||||
"down": "Neaktivno"
|
||||
"down": "Neaktivno",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Novo",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Ulazni sandučić",
|
||||
"total": "Ukupno"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Napunjenost baterije",
|
||||
"ups_load": "UPS opterećenje",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Danas",
|
||||
"gross_percent_1y": "Jedna godina",
|
||||
"gross_percent_max": "Svo vrijeme"
|
||||
"gross_percent_max": "Svo vrijeme",
|
||||
"net_worth": "Neto vrijednost"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasti",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Kategorije",
|
||||
"series": "Serije"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Red čekanja",
|
||||
"downloadBytesRemaining": "Preostalo",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Fut",
|
||||
"pending": "Függőben lévő",
|
||||
"down": "Leállt"
|
||||
"down": "Leállt",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Új",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Beérkezett",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Akku töltöttsége",
|
||||
"ups_load": "UPS terheltsége",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Egy év",
|
||||
"gross_percent_max": "Mindig"
|
||||
"gross_percent_max": "Mindig",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Baru",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Kotak Masuk",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Sisa Baterai",
|
||||
"ups_load": "Beban UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Satu Tahun",
|
||||
"gross_percent_max": "Sepanjang Masa"
|
||||
"gross_percent_max": "Sepanjang Masa",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
"passes": "Tessere"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"playing": "In riproduzione",
|
||||
"transcoding": "Transcoding",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams",
|
||||
@@ -313,7 +313,7 @@
|
||||
"total": "Total"
|
||||
},
|
||||
"suwayomi": {
|
||||
"download": "Downloaded",
|
||||
"download": "Scaricati",
|
||||
"nondownload": "Non Scaricato",
|
||||
"read": "Read",
|
||||
"unread": "Unread",
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nuovo",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "In arrivo",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Carica Batteria",
|
||||
"ups_load": "Carico UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Un anno",
|
||||
"gross_percent_max": "Sempre"
|
||||
"gross_percent_max": "Sempre",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
"docker": {
|
||||
"rx": "受信済み",
|
||||
"tx": "送信済み",
|
||||
"mem": "MEM",
|
||||
"mem": "メモリ",
|
||||
"cpu": "CPU",
|
||||
"running": "起動中",
|
||||
"offline": "オフライン",
|
||||
@@ -83,7 +83,7 @@
|
||||
"partial": "部分的"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "エラー",
|
||||
"ping": "Ping",
|
||||
"down": "下へ",
|
||||
"up": "稼働",
|
||||
@@ -112,7 +112,7 @@
|
||||
"offline_alt": "オフライン",
|
||||
"online": "オンライン",
|
||||
"total": "Total",
|
||||
"unknown": "Unknown"
|
||||
"unknown": "不明"
|
||||
},
|
||||
"evcc": {
|
||||
"pv_power": "発電量",
|
||||
@@ -223,8 +223,8 @@
|
||||
"invalid": "無効"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "ダウンロード",
|
||||
"upload": "アップロード",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -233,8 +233,8 @@
|
||||
"cachemissbytes": "キャッシュミスバイト"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "ダウンロード",
|
||||
"upload": "アップロード",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -251,7 +251,7 @@
|
||||
"queued": "Queued",
|
||||
"movies": "Movies",
|
||||
"queue": "Queue",
|
||||
"unknown": "Unknown"
|
||||
"unknown": "不明"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "新着",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "受信トレイ",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "バッテリー充電",
|
||||
"ups_load": "UPS 負荷",
|
||||
@@ -692,8 +702,8 @@
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
"uptime": "稼働時間",
|
||||
"volumeAvailable": "利用可能"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
@@ -754,12 +764,13 @@
|
||||
"gatus": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime"
|
||||
"uptime": "稼働時間"
|
||||
},
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "1年",
|
||||
"gross_percent_max": "全期間"
|
||||
"gross_percent_max": "全期間",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "ポッドキャスト",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "업",
|
||||
"pending": "대기 중",
|
||||
"down": "다운"
|
||||
"down": "다운",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "신규",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "받은 편지함",
|
||||
"total": "전체"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "배터리 충전",
|
||||
"ups_load": "UPS 부하",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "오늘",
|
||||
"gross_percent_1y": "1년",
|
||||
"gross_percent_max": "전체 기간"
|
||||
"gross_percent_max": "전체 기간",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "팟캐스트",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "카테고리",
|
||||
"series": "시리즈"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "대기열",
|
||||
"downloadBytesRemaining": "남음",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Baharu",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Peti Masuk",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Bateri dicas",
|
||||
"ups_load": "Beban UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Satu tahun",
|
||||
"gross_percent_max": "Sepanjang masa"
|
||||
"gross_percent_max": "Sepanjang masa",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podkas",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Online",
|
||||
"pending": "In afwachting",
|
||||
"down": "Offline"
|
||||
"down": "Offline",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nieuw",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Postvak In",
|
||||
"total": "Totaal"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Batterij opladen",
|
||||
"ups_load": "UPS-belasting",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Vandaag",
|
||||
"gross_percent_1y": "Een jaar",
|
||||
"gross_percent_max": "Altijd"
|
||||
"gross_percent_max": "Altijd",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categorieën",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Wachtrij",
|
||||
"downloadBytesRemaining": "Resterend",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Ny",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Innboks",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Batteriladning",
|
||||
"ups_load": "UPS last",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Ett år",
|
||||
"gross_percent_max": "Gjennom tidene"
|
||||
"gross_percent_max": "Gjennom tidene",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podkaster",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
"wlan_devices": "Urządzenia WLAN",
|
||||
"lan_users": "Użytkownicy LAN",
|
||||
"wlan_users": "Użytkownicy WLAN",
|
||||
"up": "UP",
|
||||
"up": "DZIAŁA",
|
||||
"down": "Pobieranie",
|
||||
"wait": "Proszę czekać",
|
||||
"empty_data": "Status podsystemu nieznany"
|
||||
@@ -69,7 +69,7 @@
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
"tx": "Tx",
|
||||
"mem": "MEM",
|
||||
"mem": "PAM",
|
||||
"cpu": "Procesor",
|
||||
"running": "Działa",
|
||||
"offline": "Nieosiągalny",
|
||||
@@ -93,8 +93,8 @@
|
||||
"http_status": "Status HTTP",
|
||||
"error": "Błąd",
|
||||
"response": "Odpowiedź",
|
||||
"down": "Down",
|
||||
"up": "Up",
|
||||
"down": "Nie działa",
|
||||
"up": "Działa",
|
||||
"not_available": "Niedostępny"
|
||||
},
|
||||
"emby": {
|
||||
@@ -111,8 +111,8 @@
|
||||
"offline": "Offline",
|
||||
"offline_alt": "Offline",
|
||||
"online": "Dostępny",
|
||||
"total": "Total",
|
||||
"unknown": "Unknown"
|
||||
"total": "Razem",
|
||||
"unknown": "Nieznany"
|
||||
},
|
||||
"evcc": {
|
||||
"pv_power": "Produkcja",
|
||||
@@ -141,11 +141,11 @@
|
||||
"connectionStatusDisconnecting": "Rozłączanie",
|
||||
"connectionStatusDisconnected": "Rozłączono",
|
||||
"connectionStatusConnected": "Połączono",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Czas działania",
|
||||
"maxDown": "Maks. Pobieranie",
|
||||
"maxUp": "Maks. Wysyłanie",
|
||||
"down": "Down",
|
||||
"up": "Up",
|
||||
"down": "Nie działa",
|
||||
"up": "Działa",
|
||||
"received": "Odebrane",
|
||||
"sent": "Wysłane",
|
||||
"externalIPAddress": "Pub. IP",
|
||||
@@ -168,10 +168,10 @@
|
||||
"passes": "Przebiegi"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"transcoding": "Transcoding",
|
||||
"playing": "Odtwarza",
|
||||
"transcoding": "Transkoduje",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams",
|
||||
"no_active": "Brak aktywnych strumieni",
|
||||
"plex_connection_error": "Sprawdź połączenie z Plex"
|
||||
},
|
||||
"omada": {
|
||||
@@ -193,24 +193,24 @@
|
||||
"tv": "Seriale"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"rate": "Szybkość",
|
||||
"queue": "Kolejka",
|
||||
"timeleft": "Pozostało"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Aktywny",
|
||||
"upload": "Upload",
|
||||
"upload": "Wysyłanie",
|
||||
"download": "Pobieranie"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Pobieranie",
|
||||
"upload": "Upload",
|
||||
"upload": "Wysyłanie",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Pobieranie",
|
||||
"upload": "Wysyłanie",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -223,8 +223,8 @@
|
||||
"invalid": "Nieprawidłowy"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Pobieranie",
|
||||
"upload": "Wysyłanie",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -233,8 +233,8 @@
|
||||
"cachemissbytes": "Straty cache'u"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Pobieranie",
|
||||
"upload": "Wysyłanie",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -251,16 +251,16 @@
|
||||
"queued": "W kolejce",
|
||||
"movies": "Filmy",
|
||||
"queue": "Kolejka",
|
||||
"unknown": "Unknown"
|
||||
"unknown": "Nieznane"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"wanted": "Poszukiwane",
|
||||
"queued": "W kolejce",
|
||||
"artists": "Artyści"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"wanted": "Poszukiwane",
|
||||
"queued": "W kolejce",
|
||||
"books": "Książki"
|
||||
},
|
||||
"bazarr": {
|
||||
@@ -276,7 +276,7 @@
|
||||
"pending": "Oczekujące",
|
||||
"approved": "Zaakceptowane",
|
||||
"available": "Dostępne",
|
||||
"issues": "Open Issues"
|
||||
"issues": "Otwarte zgłoszenia"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Oczekujące",
|
||||
@@ -285,8 +285,8 @@
|
||||
"available": "Dostępne"
|
||||
},
|
||||
"netalertx": {
|
||||
"total": "Total",
|
||||
"connected": "Connected",
|
||||
"total": "Razem",
|
||||
"connected": "Połączono",
|
||||
"new_devices": "Nowe urządzenia",
|
||||
"down_alerts": "Alerty niedostępności"
|
||||
},
|
||||
@@ -303,20 +303,20 @@
|
||||
"latency": "Opóźnienia"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"upload": "Wysyłanie",
|
||||
"download": "Pobieranie",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Running",
|
||||
"running": "Działa",
|
||||
"stopped": "Zatrzymane",
|
||||
"total": "Total"
|
||||
"total": "Razem"
|
||||
},
|
||||
"suwayomi": {
|
||||
"download": "Pobrano",
|
||||
"nondownload": "Niepobrane",
|
||||
"read": "Read",
|
||||
"unread": "Unread",
|
||||
"read": "Przeczytane",
|
||||
"unread": "Nieprzeczytane",
|
||||
"downloadedread": "Pobrane i przeczytane",
|
||||
"downloadedunread": "Pobrane i nieprzeczytane",
|
||||
"nondownloadedread": "Niepobrane i przeczytane",
|
||||
@@ -337,7 +337,7 @@
|
||||
"ago": "{{value}} temu"
|
||||
},
|
||||
"technitium": {
|
||||
"totalQueries": "Queries",
|
||||
"totalQueries": "Zapytania",
|
||||
"totalNoError": "Sukces",
|
||||
"totalServerFailure": "Porażki",
|
||||
"totalNxDomain": "Domeny NX",
|
||||
@@ -345,12 +345,12 @@
|
||||
"totalAuthoritative": "Autorytatywne",
|
||||
"totalRecursive": "Rekursywne",
|
||||
"totalCached": "Zbuforowane",
|
||||
"totalBlocked": "Blocked",
|
||||
"totalBlocked": "Zablokowane",
|
||||
"totalDropped": "Upuszczone",
|
||||
"totalClients": "Klienci"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"queue": "W kolejce",
|
||||
"processed": "Przetworzone",
|
||||
"errored": "Błędne",
|
||||
"saved": "Zapisane"
|
||||
@@ -364,7 +364,7 @@
|
||||
"version": "Wersja",
|
||||
"notesCount": "Notatki",
|
||||
"dbSize": "Rozmiar bazy danych",
|
||||
"unknown": "Unknown"
|
||||
"unknown": "Nieznane"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "Brak aktywnych strumieni",
|
||||
@@ -373,7 +373,7 @@
|
||||
"npm": {
|
||||
"enabled": "Włączone",
|
||||
"disabled": "Wyłączone",
|
||||
"total": "Total"
|
||||
"total": "Razem"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Wybierz jedną lub więcej kryptowalut do śledzenia",
|
||||
@@ -390,19 +390,19 @@
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indeksery",
|
||||
"numberOfGrabs": "Pochwycenia",
|
||||
"numberOfQueries": "Queries",
|
||||
"numberOfQueries": "Zapytania",
|
||||
"numberOfFailGrabs": "Nieudane pochwycenia",
|
||||
"numberOfFailQueries": "Nieudane zapytania"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Skonfigurowane",
|
||||
"errored": "Errored"
|
||||
"errored": "Z błędami"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sesje",
|
||||
"numConnections": "Połączenia",
|
||||
"dataRelayed": "Przekazane",
|
||||
"transferRate": "Rate"
|
||||
"transferRate": "Szybkość"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Użytkownicy",
|
||||
@@ -410,9 +410,9 @@
|
||||
"domain_count": "Domeny"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
"wanted": "Poszukiwane",
|
||||
"queued": "W kolejce",
|
||||
"series": "Seriale"
|
||||
},
|
||||
"minecraft": {
|
||||
"players": "Gracze",
|
||||
@@ -423,7 +423,7 @@
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Przeczytane",
|
||||
"unread": "Unread"
|
||||
"unread": "Nieprzeczytane"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Użytkownicy",
|
||||
@@ -443,14 +443,14 @@
|
||||
"temp": "TEMP.",
|
||||
"_temp": "Temperatura",
|
||||
"warn": "Ostrzeżenie",
|
||||
"uptime": "UP",
|
||||
"total": "Total",
|
||||
"uptime": "DZIAŁA",
|
||||
"total": "Razem",
|
||||
"free": "Wolne",
|
||||
"used": "Used",
|
||||
"used": "Użyte",
|
||||
"days": "d",
|
||||
"hours": "h",
|
||||
"hours": "godz",
|
||||
"crit": "Krytyczyny",
|
||||
"read": "Read",
|
||||
"read": "Odczyt",
|
||||
"write": "Zapis",
|
||||
"gpu": "GPU",
|
||||
"mem": "Pamięć",
|
||||
@@ -530,15 +530,16 @@
|
||||
"up_to_date": "Aktualny",
|
||||
"child_bridges": "Mostki podrzędne",
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"up": "Działa",
|
||||
"pending": "Oczekujące",
|
||||
"down": "Nie działa",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nowy",
|
||||
"up": "Up",
|
||||
"up": "Działa",
|
||||
"grace": "W okresie karencji",
|
||||
"down": "Down",
|
||||
"down": "Nie działa",
|
||||
"paused": "Wstrzymane",
|
||||
"status": "Status",
|
||||
"last_ping": "Ostatni ping",
|
||||
@@ -550,54 +551,63 @@
|
||||
"containers_failed": "Niepowodzenie"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"approvedPushes": "Zaakceptowane",
|
||||
"rejectedPushes": "Odrzucone",
|
||||
"filters": "Filtry",
|
||||
"indexers": "Indexers"
|
||||
"indexers": "Indeksery"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"downloads": "W kolejce",
|
||||
"videos": "Pliki wideo",
|
||||
"channels": "Kanały",
|
||||
"playlists": "Playlisty"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Obciążenie systemu",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts"
|
||||
"uptime": "Czas działania",
|
||||
"alerts": "Alerty"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Prędkość",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
"active": "Aktywne",
|
||||
"queue": "W kolejce",
|
||||
"total": "Razem"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Adres publiczny",
|
||||
"region": "Region",
|
||||
"country": "Państwo",
|
||||
"port_forwarded": "Port Forwarded"
|
||||
"port_forwarded": "Port otwarty"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"channels": "Kanały",
|
||||
"hd": "HD",
|
||||
"tunerCount": "Tunery",
|
||||
"channelNumber": "Kanał",
|
||||
"channelNetwork": "Sieć",
|
||||
"signalStrength": "Siła sygnału",
|
||||
"signalQuality": "Jakość",
|
||||
"symbolQuality": "Quality",
|
||||
"symbolQuality": "Jakość",
|
||||
"networkRate": "Bitrate",
|
||||
"clientIP": "Klient"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Powodzenie",
|
||||
"failed": "Failed",
|
||||
"unknown": "Unknown"
|
||||
"failed": "Nieudane",
|
||||
"unknown": "Nieznane"
|
||||
},
|
||||
"paperlessngx": {
|
||||
"inbox": "Skrzynka odbiorcza",
|
||||
"total": "Total"
|
||||
"total": "Razem"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Organizacje",
|
||||
"sites": "Strony",
|
||||
"resources": "Zasoby",
|
||||
"targets": "Cele",
|
||||
"traffic": "Ruch",
|
||||
"in": "Do",
|
||||
"out": "Z"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Stan baterii",
|
||||
@@ -608,18 +618,18 @@
|
||||
"low_battery": "Niski poziom baterii"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
"wait": "Proszę czekać",
|
||||
"no_devices": "Nie otrzymano danych urządzenia"
|
||||
},
|
||||
"mikrotik": {
|
||||
"cpuLoad": "Obciążenie procesora",
|
||||
"memoryUsed": "Zużyta pamięć",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Czas działania",
|
||||
"numberOfLeases": "Dzierżawy"
|
||||
},
|
||||
"xteve": {
|
||||
"streams_all": "Wszystkie strumienie",
|
||||
"streams_active": "Active Streams",
|
||||
"streams_active": "Aktywne strumienie",
|
||||
"streams_xepg": "Kanały XEPG"
|
||||
},
|
||||
"opendtu": {
|
||||
@@ -654,9 +664,9 @@
|
||||
"load": "Śr. Obciążenie",
|
||||
"memory": "Użycie pamięci",
|
||||
"wanStatus": "Status WAN",
|
||||
"up": "Up",
|
||||
"down": "Down",
|
||||
"temp": "Temp",
|
||||
"up": "Działa",
|
||||
"down": "Nie działa",
|
||||
"temp": "Temperatura",
|
||||
"disk": "Użycie dysku",
|
||||
"wanIP": "WAN IP"
|
||||
},
|
||||
@@ -667,38 +677,38 @@
|
||||
"memory_usage": "Pamięć"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"users": "Użytkownicy",
|
||||
"photos": "Zdjęcia",
|
||||
"videos": "Videos",
|
||||
"videos": "Filmy",
|
||||
"storage": "Pamięć"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Działające",
|
||||
"down": "Niedziałające",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Czas działania",
|
||||
"incident": "Incydent",
|
||||
"m": "m"
|
||||
"m": "min"
|
||||
},
|
||||
"atsumeru": {
|
||||
"series": "Series",
|
||||
"series": "Serie",
|
||||
"archives": "Archiwa",
|
||||
"chapters": "Rozdziały",
|
||||
"categories": "Kategorie"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Biblioteki",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
"series": "Serie",
|
||||
"books": "Książki"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
"days": "Dni",
|
||||
"uptime": "Czas działania",
|
||||
"volumeAvailable": "Dostępne"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"series": "Seriale",
|
||||
"issues": "Zgłoszenia",
|
||||
"wanted": "Wanted"
|
||||
"wanted": "Poszukiwane"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albumy",
|
||||
@@ -707,9 +717,9 @@
|
||||
"people": "Ludzie"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"queue": "W kolejce",
|
||||
"processing": "Przetwarzane",
|
||||
"processed": "Przetworzone",
|
||||
"time": "Czas"
|
||||
},
|
||||
"firefly": {
|
||||
@@ -735,7 +745,7 @@
|
||||
"size": "Rozmiar",
|
||||
"lastrun": "Ostatnie uruchomienie",
|
||||
"nextrun": "Następne uruchomienie",
|
||||
"failed": "Failed"
|
||||
"failed": "Nieudane"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Aktywni pracownicy",
|
||||
@@ -752,14 +762,15 @@
|
||||
"targets_total": "Wszystkich Celi"
|
||||
},
|
||||
"gatus": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime"
|
||||
"up": "Działające strony",
|
||||
"down": "Niedziałające strony",
|
||||
"uptime": "Czas działania"
|
||||
},
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Dzisiaj",
|
||||
"gross_percent_1y": "Rok",
|
||||
"gross_percent_max": "Od początku"
|
||||
"gross_percent_max": "Od początku",
|
||||
"net_worth": "Wartość netto"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasty",
|
||||
@@ -774,22 +785,28 @@
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"updates": "Aktualizacje"
|
||||
},
|
||||
"calibreweb": {
|
||||
"books": "Książki",
|
||||
"authors": "Autorzy",
|
||||
"categories": "Kategorie",
|
||||
"series": "Series"
|
||||
"series": "Serie"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
"downloadTotalBytes": "Size",
|
||||
"downloadCount": "W kolejce",
|
||||
"downloadBytesRemaining": "Pozostało",
|
||||
"downloadTotalBytes": "Rozmiar",
|
||||
"downloadSpeed": "Prędkość"
|
||||
},
|
||||
"kavita": {
|
||||
"seriesCount": "Series",
|
||||
"seriesCount": "Serie",
|
||||
"totalFiles": "Pliki"
|
||||
},
|
||||
"azuredevops": {
|
||||
@@ -803,7 +820,7 @@
|
||||
"inProgress": "W trakcie",
|
||||
"totalPrs": "Łącznie PRs",
|
||||
"myPrs": "Moje PRs",
|
||||
"approved": "Approved"
|
||||
"approved": "Zaakceptowane"
|
||||
},
|
||||
"gamedig": {
|
||||
"status": "Status",
|
||||
@@ -831,33 +848,33 @@
|
||||
},
|
||||
"openmediavault": {
|
||||
"downloading": "Pobieranie",
|
||||
"total": "Total",
|
||||
"running": "Running",
|
||||
"stopped": "Stopped",
|
||||
"passed": "Passed",
|
||||
"failed": "Failed"
|
||||
"total": "Razem",
|
||||
"running": "Działające",
|
||||
"stopped": "Zatrzymane",
|
||||
"passed": "Zaliczony",
|
||||
"failed": "Nieudany"
|
||||
},
|
||||
"openwrt": {
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Czas działania",
|
||||
"cpuLoad": "Śr. obciążenie CPU (5m)",
|
||||
"up": "Up",
|
||||
"down": "Down",
|
||||
"up": "Działa",
|
||||
"down": "Nie działa",
|
||||
"bytesTx": "Przesłane",
|
||||
"bytesRx": "Received"
|
||||
"bytesRx": "Odebrano"
|
||||
},
|
||||
"uptimerobot": {
|
||||
"status": "Status",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Czas działania",
|
||||
"lastDown": "Ostatni downtime",
|
||||
"downDuration": "Długość downtime'u",
|
||||
"sitesUp": "Sites Up",
|
||||
"sitesDown": "Sites Down",
|
||||
"paused": "Paused",
|
||||
"sitesUp": "Działające strony",
|
||||
"sitesDown": "Niedziałające strony",
|
||||
"paused": "Zatrzymane",
|
||||
"notyetchecked": "Nie sprawdzono",
|
||||
"up": "Up",
|
||||
"up": "Działa",
|
||||
"seemsdown": "Możliwe, że wyłączony",
|
||||
"down": "Down",
|
||||
"unknown": "Unknown"
|
||||
"down": "Nie działa",
|
||||
"unknown": "Nieznane"
|
||||
},
|
||||
"calendar": {
|
||||
"inCinemas": "W kinach",
|
||||
@@ -876,10 +893,10 @@
|
||||
"totalfilesize": "Rozmiar całkowity"
|
||||
},
|
||||
"mailcow": {
|
||||
"domains": "Domains",
|
||||
"domains": "Domeny",
|
||||
"mailboxes": "Skrzynki",
|
||||
"mails": "Poczta",
|
||||
"storage": "Storage"
|
||||
"storage": "Pamięć"
|
||||
},
|
||||
"netdata": {
|
||||
"warnings": "Ostrzeżenia",
|
||||
@@ -888,12 +905,12 @@
|
||||
"plantit": {
|
||||
"events": "Wydarzenia",
|
||||
"plants": "Rośliny",
|
||||
"photos": "Photos",
|
||||
"photos": "Zdjęcia",
|
||||
"species": "Gatunki"
|
||||
},
|
||||
"gitea": {
|
||||
"notifications": "Powiadomienia",
|
||||
"issues": "Issues",
|
||||
"issues": "Zgłoszenia",
|
||||
"pulls": "Żądania Pull",
|
||||
"repositories": "Repozytoria"
|
||||
},
|
||||
@@ -909,13 +926,13 @@
|
||||
"galleries": "Galerie",
|
||||
"performers": "Artyści",
|
||||
"studios": "Studia",
|
||||
"movies": "Movies",
|
||||
"tags": "Tags",
|
||||
"movies": "Filmy",
|
||||
"tags": "Tagi",
|
||||
"oCount": "O Licznik"
|
||||
},
|
||||
"tandoor": {
|
||||
"users": "Users",
|
||||
"recipes": "Recipes",
|
||||
"users": "Użytkownicy",
|
||||
"recipes": "Przepisy",
|
||||
"keywords": "Słowa kluczowe"
|
||||
},
|
||||
"homebox": {
|
||||
@@ -923,18 +940,18 @@
|
||||
"totalWithWarranty": "Z gwarancją",
|
||||
"locations": "Lokalizacje",
|
||||
"labels": "Etykiety",
|
||||
"users": "Users",
|
||||
"users": "Użytkownicy",
|
||||
"totalValue": "Wartość całkowita"
|
||||
},
|
||||
"crowdsec": {
|
||||
"alerts": "Alerts",
|
||||
"alerts": "Alerty",
|
||||
"bans": "Bany"
|
||||
},
|
||||
"wgeasy": {
|
||||
"connected": "Connected",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"total": "Total"
|
||||
"connected": "Połączonych",
|
||||
"enabled": "Włączone",
|
||||
"disabled": "Wyłączone",
|
||||
"total": "Razem"
|
||||
},
|
||||
"swagdashboard": {
|
||||
"proxied": "Proxy",
|
||||
@@ -956,7 +973,7 @@
|
||||
},
|
||||
"frigate": {
|
||||
"cameras": "Kamery",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Czas działania",
|
||||
"version": "Wersja"
|
||||
},
|
||||
"linkwarden": {
|
||||
@@ -966,7 +983,7 @@
|
||||
},
|
||||
"zabbix": {
|
||||
"unclassified": "Niezaklasyfikowane",
|
||||
"information": "Information",
|
||||
"information": "Informacja",
|
||||
"warning": "Ostrzeżenie",
|
||||
"average": "Średnia",
|
||||
"high": "Wysokie",
|
||||
@@ -997,14 +1014,14 @@
|
||||
"beszel": {
|
||||
"name": "Nazwa",
|
||||
"systems": "Systemy",
|
||||
"up": "Up",
|
||||
"down": "Down",
|
||||
"paused": "Paused",
|
||||
"pending": "Pending",
|
||||
"up": "Działa",
|
||||
"down": "Nie działa",
|
||||
"paused": "Wstrzymane",
|
||||
"pending": "Oczekujące",
|
||||
"status": "Status",
|
||||
"updated": "Updated",
|
||||
"updated": "Zaktualizowane",
|
||||
"cpu": "Procesor",
|
||||
"memory": "MEM",
|
||||
"memory": "PAM",
|
||||
"disk": "Dysk",
|
||||
"network": "NET"
|
||||
},
|
||||
@@ -1012,14 +1029,14 @@
|
||||
"apps": "Aplikacje",
|
||||
"synced": "Synchronizowane",
|
||||
"outOfSync": "Bez synchronizacji",
|
||||
"healthy": "Healthy",
|
||||
"healthy": "Zdrowe",
|
||||
"degraded": "Zdegradowane",
|
||||
"progressing": "Postępujące",
|
||||
"missing": "Missing",
|
||||
"missing": "Brakujące",
|
||||
"suspended": "Zawieszone"
|
||||
},
|
||||
"spoolman": {
|
||||
"loading": "Loading"
|
||||
"loading": "Ładowanie"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Grupy",
|
||||
@@ -1029,9 +1046,9 @@
|
||||
},
|
||||
"apcups": {
|
||||
"status": "Status",
|
||||
"load": "Load",
|
||||
"bcharge": "Battery Charge",
|
||||
"timeleft": "Time Left"
|
||||
"load": "Obciążenie",
|
||||
"bcharge": "Naładowanie baterii",
|
||||
"timeleft": "Pozostały czas"
|
||||
},
|
||||
"karakeep": {
|
||||
"bookmarks": "Zakładki",
|
||||
@@ -1042,11 +1059,11 @@
|
||||
"tags": "Tagi"
|
||||
},
|
||||
"slskd": {
|
||||
"slskStatus": "Network",
|
||||
"connected": "Connected",
|
||||
"disconnected": "Disconnected",
|
||||
"slskStatus": "Sieć",
|
||||
"connected": "Połączono",
|
||||
"disconnected": "Rozłączono",
|
||||
"updateStatus": "Aktualizacja",
|
||||
"update_yes": "Available",
|
||||
"update_yes": "Dostępne",
|
||||
"update_no": "Aktualny",
|
||||
"downloads": "Pobieranie",
|
||||
"uploads": "Przesyłanie",
|
||||
@@ -1059,65 +1076,65 @@
|
||||
"other": "Inne"
|
||||
},
|
||||
"checkmk": {
|
||||
"serviceErrors": "Service issues",
|
||||
"hostErrors": "Host issues"
|
||||
"serviceErrors": "Problem z usługą",
|
||||
"hostErrors": "Problemy hosta"
|
||||
},
|
||||
"komodo": {
|
||||
"total": "Total",
|
||||
"running": "Running",
|
||||
"stopped": "Stopped",
|
||||
"down": "Down",
|
||||
"unhealthy": "Unhealthy",
|
||||
"unknown": "Unknown",
|
||||
"total": "Razem",
|
||||
"running": "Działające",
|
||||
"stopped": "Zatrzymane",
|
||||
"down": "Nie działa",
|
||||
"unhealthy": "Uszkodzony",
|
||||
"unknown": "Nieznane",
|
||||
"servers": "Serwery",
|
||||
"stacks": "Stacks",
|
||||
"containers": "Containers"
|
||||
"stacks": "Stosy",
|
||||
"containers": "Kontenery"
|
||||
},
|
||||
"filebrowser": {
|
||||
"available": "Available",
|
||||
"used": "Used",
|
||||
"total": "Total"
|
||||
"available": "Dostępne",
|
||||
"used": "Użyte",
|
||||
"total": "Razem"
|
||||
},
|
||||
"wallos": {
|
||||
"activeSubscriptions": "Subscriptions",
|
||||
"thisMonthlyCost": "This Month",
|
||||
"nextMonthlyCost": "Next Month",
|
||||
"previousMonthlyCost": "Prev. Month",
|
||||
"nextRenewingSubscription": "Next Payment"
|
||||
"activeSubscriptions": "Subskrypcje",
|
||||
"thisMonthlyCost": "Ten Miesiąc",
|
||||
"nextMonthlyCost": "Następny miesiąc",
|
||||
"previousMonthlyCost": "Poprzedni miesiąc",
|
||||
"nextRenewingSubscription": "Następna płatność"
|
||||
},
|
||||
"unraid": {
|
||||
"STARTED": "Started",
|
||||
"STOPPED": "Stopped",
|
||||
"NEW_ARRAY": "New Array",
|
||||
"RECON_DISK": "Reconstructing Disk",
|
||||
"DISABLE_DISK": "Disk Disabled",
|
||||
"SWAP_DSBL": "Swap Disable",
|
||||
"INVALID_EXPANSION": "Invalid Expansion",
|
||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
||||
"NO_DATA_DISKS": "No Data Disks",
|
||||
"notifications": "Notifications",
|
||||
"STARTED": "Rozpoczęte",
|
||||
"STOPPED": "Zatrzymane",
|
||||
"NEW_ARRAY": "Nowa macierz",
|
||||
"RECON_DISK": "Odbudowa dysku",
|
||||
"DISABLE_DISK": "Dysk wyłączony",
|
||||
"SWAP_DSBL": "Przestrzeń wymiany wyłączona",
|
||||
"INVALID_EXPANSION": "Nieprawidłowe rozszerzenie",
|
||||
"PARITY_NOT_BIGGEST": "Parzystość nie największa",
|
||||
"TOO_MANY_MISSING_DISKS": "Zbyt wiele brakujących dysków",
|
||||
"NEW_DISK_TOO_SMALL": "Nowy dysk zbyt mały",
|
||||
"NO_DATA_DISKS": "Brak dysków danych",
|
||||
"notifications": "Powiadomienia",
|
||||
"status": "Status",
|
||||
"cpu": "CPU",
|
||||
"memoryUsed": "Memory Used",
|
||||
"memoryAvailable": "Memory Available",
|
||||
"arrayUsed": "Array Used",
|
||||
"arrayFree": "Array Free",
|
||||
"poolUsed": "{{pool}} Used",
|
||||
"poolFree": "{{pool}} Free"
|
||||
"memoryUsed": "Użyta pamięć",
|
||||
"memoryAvailable": "Dostępna pamięć",
|
||||
"arrayUsed": "Użyto macierzy",
|
||||
"arrayFree": "Wolne na macierzy",
|
||||
"poolUsed": "Użyto {{pool}}",
|
||||
"poolFree": "{{pool}} Wolne"
|
||||
},
|
||||
"backrest": {
|
||||
"num_plans": "Plans",
|
||||
"num_success_30": "Successes",
|
||||
"num_failure_30": "Failures",
|
||||
"num_success_latest": "Succeeding",
|
||||
"num_failure_latest": "Failing",
|
||||
"bytes_added_30": "Bytes Added"
|
||||
"num_plans": "Planowane",
|
||||
"num_success_30": "Powodzenia",
|
||||
"num_failure_30": "Niepowodzenia",
|
||||
"num_success_latest": "Powodzenie",
|
||||
"num_failure_latest": "Niepowodzenie",
|
||||
"bytes_added_30": "Dodane bajty"
|
||||
},
|
||||
"yourspotify": {
|
||||
"songs": "Songs",
|
||||
"time": "Time",
|
||||
"artists": "Artists"
|
||||
"songs": "Piosenki",
|
||||
"time": "Czas",
|
||||
"artists": "Wykonawcy"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Novo",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Caixa de entrada",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Carga da bateria",
|
||||
"ups_load": "Carga da UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Um ano",
|
||||
"gross_percent_max": "Desde Sempre"
|
||||
"gross_percent_max": "Desde Sempre",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Ativo",
|
||||
"pending": "Pendente",
|
||||
"down": "Inativo"
|
||||
"down": "Inativo",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Novo",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Caixa de entrada",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Carga da bateria",
|
||||
"ups_load": "Carga do UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Hoje",
|
||||
"gross_percent_1y": "Um ano",
|
||||
"gross_percent_max": "Todo o tempo"
|
||||
"gross_percent_max": "Todo o tempo",
|
||||
"net_worth": "Patrimônio Líquido"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categorias",
|
||||
"series": "Séries"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Fila de espera",
|
||||
"downloadBytesRemaining": "Restante",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nou",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Încărcare Baterie",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Un an",
|
||||
"gross_percent_max": "Tot timpul"
|
||||
"gross_percent_max": "Tot timpul",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasturi",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
"tv": "Сериалы"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"rate": "",
|
||||
"queue": "Очередь",
|
||||
"timeleft": "Осталось"
|
||||
},
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "В сети",
|
||||
"pending": "Ожидают",
|
||||
"down": "Не в сети"
|
||||
"down": "Не в сети",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Новый",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Входящие",
|
||||
"total": "Всего"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Заряд батареи",
|
||||
"ups_load": "Нагрузка на UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Сегодня",
|
||||
"gross_percent_1y": "Один год",
|
||||
"gross_percent_max": "Все время"
|
||||
"gross_percent_max": "Все время",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасты",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Категории",
|
||||
"series": "Серии"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Очередь",
|
||||
"downloadBytesRemaining": "Осталось",
|
||||
@@ -1088,7 +1105,7 @@
|
||||
"unraid": {
|
||||
"STARTED": "Started",
|
||||
"STOPPED": "Stopped",
|
||||
"NEW_ARRAY": "New Array",
|
||||
"NEW_ARRAY": "Новый массив",
|
||||
"RECON_DISK": "Reconstructing Disk",
|
||||
"DISABLE_DISK": "Disk Disabled",
|
||||
"SWAP_DSBL": "Swap Disable",
|
||||
@@ -1097,8 +1114,8 @@
|
||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
||||
"NO_DATA_DISKS": "No Data Disks",
|
||||
"notifications": "Notifications",
|
||||
"status": "Status",
|
||||
"notifications": "Уведомления",
|
||||
"status": "Статус",
|
||||
"cpu": "CPU",
|
||||
"memoryUsed": "Memory Used",
|
||||
"memoryAvailable": "Memory Available",
|
||||
|
||||
@@ -362,8 +362,8 @@
|
||||
},
|
||||
"trilium": {
|
||||
"version": "Verzia",
|
||||
"notesCount": "Notes",
|
||||
"dbSize": "Database Size",
|
||||
"notesCount": "Poznámky",
|
||||
"dbSize": "Veľkosť databázy",
|
||||
"unknown": "Neznáme"
|
||||
},
|
||||
"navidrome": {
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Beží",
|
||||
"pending": "Čakajúce",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nový",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Schránka správ",
|
||||
"total": "Celkom"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Nabitie batérie",
|
||||
"ups_load": "Záťaž UPS",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Dnes",
|
||||
"gross_percent_1y": "Jeden rok",
|
||||
"gross_percent_max": "Za celý čas"
|
||||
"gross_percent_max": "Za celý čas",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasty",
|
||||
@@ -782,11 +793,17 @@
|
||||
"categories": "Kategórie",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Poradie",
|
||||
"downloadBytesRemaining": "Zostávajúce",
|
||||
"downloadTotalBytes": "Veľkosť",
|
||||
"downloadSpeed": "Speed"
|
||||
"downloadSpeed": "Rýchlosť"
|
||||
},
|
||||
"kavita": {
|
||||
"seriesCount": "Series",
|
||||
@@ -952,7 +969,7 @@
|
||||
"loading": "Načítava sa",
|
||||
"open": "Open - US Market",
|
||||
"closed": "Closed - US Market",
|
||||
"invalidConfiguration": "Invalid Configuration"
|
||||
"invalidConfiguration": "Neplatná konfigurácia"
|
||||
},
|
||||
"frigate": {
|
||||
"cameras": "Kamery",
|
||||
@@ -1022,10 +1039,10 @@
|
||||
"loading": "Načítava sa"
|
||||
},
|
||||
"gitlab": {
|
||||
"groups": "Groups",
|
||||
"issues": "Issues",
|
||||
"groups": "Skupiny",
|
||||
"issues": "Problémy",
|
||||
"merges": "Merge Requests",
|
||||
"projects": "Projects"
|
||||
"projects": "Projekty"
|
||||
},
|
||||
"apcups": {
|
||||
"status": "Stav",
|
||||
@@ -1035,7 +1052,7 @@
|
||||
},
|
||||
"karakeep": {
|
||||
"bookmarks": "Bookmarks",
|
||||
"favorites": "Favorites",
|
||||
"favorites": "Obľúbené",
|
||||
"archived": "Archived",
|
||||
"highlights": "Highlights",
|
||||
"lists": "Zoznamy",
|
||||
@@ -1065,13 +1082,13 @@
|
||||
"komodo": {
|
||||
"total": "Celkom",
|
||||
"running": "Beží",
|
||||
"stopped": "Stopped",
|
||||
"stopped": "Zastavené",
|
||||
"down": "Down",
|
||||
"unhealthy": "Nezdravý",
|
||||
"unknown": "Neznáme",
|
||||
"servers": "Servers",
|
||||
"servers": "Servery",
|
||||
"stacks": "Stacks",
|
||||
"containers": "Containers"
|
||||
"containers": "Kontajnery"
|
||||
},
|
||||
"filebrowser": {
|
||||
"available": "Dostupné",
|
||||
@@ -1080,8 +1097,8 @@
|
||||
},
|
||||
"wallos": {
|
||||
"activeSubscriptions": "Subscriptions",
|
||||
"thisMonthlyCost": "This Month",
|
||||
"nextMonthlyCost": "Next Month",
|
||||
"thisMonthlyCost": "Tento mesiac",
|
||||
"nextMonthlyCost": "Ďalší mesiac",
|
||||
"previousMonthlyCost": "Prev. Month",
|
||||
"nextRenewingSubscription": "Next Payment"
|
||||
},
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nov",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Prejeto",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Napolnjenost baterije",
|
||||
"ups_load": "UPS obremenitev",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Eno leto",
|
||||
"gross_percent_max": "Celoten čas"
|
||||
"gross_percent_max": "Celoten čas",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasti",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Горе",
|
||||
"pending": "На чекању",
|
||||
"down": "Доле"
|
||||
"down": "Доле",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Сада",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Примљено",
|
||||
"total": "Укупно"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Организације",
|
||||
"sites": "Сајтови",
|
||||
"resources": "Ресурси",
|
||||
"targets": "Циљеви",
|
||||
"traffic": "Саобраћај",
|
||||
"in": "Улазак",
|
||||
"out": "Излазак"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Напуњеност батерије",
|
||||
"ups_load": "Оптерећење УПС-а",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Данас",
|
||||
"gross_percent_1y": "Једна година",
|
||||
"gross_percent_max": "Све време"
|
||||
"gross_percent_max": "Све време",
|
||||
"net_worth": "Нето вредност"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасти",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Категорије",
|
||||
"series": "Серије"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Ред",
|
||||
"downloadBytesRemaining": "Преостало",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Çalışıyor",
|
||||
"pending": "Bekleyen",
|
||||
"down": "Çalışmayan"
|
||||
"down": "Çalışmayan",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Yeni",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Gelen Kutusu",
|
||||
"total": "Toplam"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Pil Yüzdesi",
|
||||
"ups_load": "UPS Yükü",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Bugün",
|
||||
"gross_percent_1y": "Bir yıl",
|
||||
"gross_percent_max": "Tüm zaman"
|
||||
"gross_percent_max": "Tüm zaman",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcast",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Kategoriler",
|
||||
"series": "Seriler"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Kuyruk",
|
||||
"downloadBytesRemaining": "Kalan",
|
||||
|
||||
@@ -63,14 +63,14 @@
|
||||
"wlan_users": "WLAN користувачі",
|
||||
"up": "UP",
|
||||
"down": "Завантаження",
|
||||
"wait": "Please wait",
|
||||
"wait": "Будь ласка, зачекайте",
|
||||
"empty_data": "Статус підсистеми невідомий"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"mem": "Пам'ять",
|
||||
"cpu": "Процесор",
|
||||
"running": "Запущено",
|
||||
"offline": "Офлайн",
|
||||
"error": "Помилка",
|
||||
@@ -83,7 +83,7 @@
|
||||
"partial": "Частковий"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "Помилка",
|
||||
"ping": "Пінг",
|
||||
"down": "Офлайн",
|
||||
"up": "Онлайн",
|
||||
@@ -91,11 +91,11 @@
|
||||
},
|
||||
"siteMonitor": {
|
||||
"http_status": "HTTP статус",
|
||||
"error": "Error",
|
||||
"error": "Помилка",
|
||||
"response": "Відповідь",
|
||||
"down": "Down",
|
||||
"up": "Up",
|
||||
"not_available": "Not Available"
|
||||
"down": "Офлайн",
|
||||
"up": "Онлайн",
|
||||
"not_available": "Не доступний"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Відтворення",
|
||||
@@ -108,10 +108,10 @@
|
||||
"songs": "Пісні"
|
||||
},
|
||||
"esphome": {
|
||||
"offline": "Offline",
|
||||
"offline_alt": "Offline",
|
||||
"offline": "Офлайн",
|
||||
"offline_alt": "Офлайн",
|
||||
"online": "Онлайн",
|
||||
"total": "Total",
|
||||
"total": "Усього",
|
||||
"unknown": "Невідомо"
|
||||
},
|
||||
"evcc": {
|
||||
@@ -133,7 +133,7 @@
|
||||
"unread": "Не прочитано"
|
||||
},
|
||||
"fritzbox": {
|
||||
"connectionStatus": "Status",
|
||||
"connectionStatus": "Стан",
|
||||
"connectionStatusUnconfigured": "Не налаштовано",
|
||||
"connectionStatusConnecting": "Підключення",
|
||||
"connectionStatusAuthenticating": "Автентифікація",
|
||||
@@ -141,11 +141,11 @@
|
||||
"connectionStatusDisconnecting": "Відключення",
|
||||
"connectionStatusDisconnected": "Відключено",
|
||||
"connectionStatusConnected": "З'єднано",
|
||||
"uptime": "Uptime",
|
||||
"uptime": "Час роботи",
|
||||
"maxDown": "Макс. завантаження",
|
||||
"maxUp": "Макс. віддача",
|
||||
"down": "Down",
|
||||
"up": "Up",
|
||||
"down": "Офлайн",
|
||||
"up": "Онлайн",
|
||||
"received": "Отримано",
|
||||
"sent": "Надіслано",
|
||||
"externalIPAddress": "Зовнішній IP",
|
||||
@@ -168,10 +168,10 @@
|
||||
"passes": "Пропуски"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"transcoding": "Transcoding",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams",
|
||||
"playing": "Грає",
|
||||
"transcoding": "Транскодування",
|
||||
"bitrate": "Бітрейт",
|
||||
"no_active": "Немає активних потоків",
|
||||
"plex_connection_error": "Перевірте з'єднання Plex"
|
||||
},
|
||||
"omada": {
|
||||
@@ -189,30 +189,30 @@
|
||||
"plex": {
|
||||
"streams": "Активні потоки",
|
||||
"albums": "Альбоми",
|
||||
"movies": "Movies",
|
||||
"movies": "Фільми",
|
||||
"tv": "TБ шоу"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"rate": "Швидкість",
|
||||
"queue": "Черга",
|
||||
"timeleft": "Залишилось"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Активний",
|
||||
"upload": "Upload",
|
||||
"download": "Download"
|
||||
"upload": "Вивантаж.",
|
||||
"download": "Завантажено"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "Завантажено",
|
||||
"upload": "Вивантаж.",
|
||||
"leech": "Ліч",
|
||||
"seed": "Сід"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "Завантажити",
|
||||
"upload": "Вивантаж.",
|
||||
"leech": "Ліч",
|
||||
"seed": "Сід"
|
||||
},
|
||||
"qnap": {
|
||||
"cpuUsage": "Використання CPU",
|
||||
@@ -225,8 +225,8 @@
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"leech": "Ліч",
|
||||
"seed": "Сід"
|
||||
},
|
||||
"develancacheui": {
|
||||
"cachehitbytes": "Кеш-хіт байт",
|
||||
@@ -234,33 +234,33 @@
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"upload": "Вивантаж.",
|
||||
"leech": "Ліч",
|
||||
"seed": "Сід"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Розшукується",
|
||||
"queued": "У черзі",
|
||||
"series": "Series",
|
||||
"queue": "Queue",
|
||||
"unknown": "Unknown"
|
||||
"series": "Серіали",
|
||||
"queue": "Черга",
|
||||
"unknown": "Невідомо"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Wanted",
|
||||
"wanted": "У бажаних",
|
||||
"missing": "Відсутній",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies",
|
||||
"queue": "Queue",
|
||||
"unknown": "Unknown"
|
||||
"queued": "У черзі",
|
||||
"movies": "Фільми",
|
||||
"queue": "Черга",
|
||||
"unknown": "Невідомо"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"wanted": "У бажаних",
|
||||
"queued": "У черзі",
|
||||
"artists": "Виконавці"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"wanted": "У бажаних",
|
||||
"queued": "У черзі",
|
||||
"books": "Книжки"
|
||||
},
|
||||
"bazarr": {
|
||||
@@ -273,20 +273,20 @@
|
||||
"available": "Доступно"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available",
|
||||
"issues": "Open Issues"
|
||||
"pending": "Очікує",
|
||||
"approved": "Схвалено",
|
||||
"available": "Доступно",
|
||||
"issues": "Проблеми до усунення"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Pending",
|
||||
"pending": "Очікує",
|
||||
"processing": "Обробка",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
"approved": "Схвалено",
|
||||
"available": "Доступно"
|
||||
},
|
||||
"netalertx": {
|
||||
"total": "Total",
|
||||
"connected": "Connected",
|
||||
"total": "Усього",
|
||||
"connected": "З'єднано",
|
||||
"new_devices": "Нові пристрої",
|
||||
"down_alerts": "Сповіщення про падіння"
|
||||
},
|
||||
@@ -297,13 +297,13 @@
|
||||
"gravity": "Доменів в списку"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"queries": "Запити",
|
||||
"blocked": "Заблоковано",
|
||||
"filtered": "Відфільтровано",
|
||||
"latency": "Затримка"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Upload",
|
||||
"upload": "Вивантаж.",
|
||||
"download": "Download",
|
||||
"ping": "Ping"
|
||||
},
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Новий",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Вхідні",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Заряд батареї",
|
||||
"ups_load": "UPS завантаження",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "Один рік",
|
||||
"gross_percent_max": "Весь час"
|
||||
"gross_percent_max": "Весь час",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Подкасти",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "Battery Charge",
|
||||
"ups_load": "UPS Load",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_max": "All time",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "新建立",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "收件箱",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "充電",
|
||||
"ups_load": "備用電源負載",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有時間"
|
||||
"gross_percent_max": "所有時間",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "播客",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -364,7 +364,7 @@
|
||||
"version": "版本",
|
||||
"notesCount": "笔记",
|
||||
"dbSize": "数据库大小",
|
||||
"unknown": "Unknown"
|
||||
"unknown": "未知"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "",
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "新建立",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "收件箱",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "充电中",
|
||||
"ups_load": "UPS 负载",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有时间"
|
||||
"gross_percent_max": "所有时间",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "播客",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "分类",
|
||||
"series": "系列"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "队列",
|
||||
"downloadBytesRemaining": "剩余",
|
||||
@@ -790,7 +807,7 @@
|
||||
},
|
||||
"kavita": {
|
||||
"seriesCount": "系列",
|
||||
"totalFiles": "Files"
|
||||
"totalFiles": "文件"
|
||||
},
|
||||
"azuredevops": {
|
||||
"result": "Result",
|
||||
@@ -1087,7 +1104,7 @@
|
||||
},
|
||||
"unraid": {
|
||||
"STARTED": "Started",
|
||||
"STOPPED": "Stopped",
|
||||
"STOPPED": "已停止",
|
||||
"NEW_ARRAY": "New Array",
|
||||
"RECON_DISK": "Reconstructing Disk",
|
||||
"DISABLE_DISK": "Disk Disabled",
|
||||
|
||||
@@ -532,7 +532,8 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"down": "Down",
|
||||
"ok": "Ok"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "新建",
|
||||
@@ -599,6 +600,15 @@
|
||||
"inbox": "收件箱",
|
||||
"total": "Total"
|
||||
},
|
||||
"pangolin": {
|
||||
"orgs": "Orgs",
|
||||
"sites": "Sites",
|
||||
"resources": "Resources",
|
||||
"targets": "Targets",
|
||||
"traffic": "Traffic",
|
||||
"in": "In",
|
||||
"out": "Out"
|
||||
},
|
||||
"peanut": {
|
||||
"battery_charge": "充電",
|
||||
"ups_load": "備用電源負載",
|
||||
@@ -759,7 +769,8 @@
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有時間"
|
||||
"gross_percent_max": "所有時間",
|
||||
"net_worth": "Net Worth"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
@@ -782,6 +793,12 @@
|
||||
"categories": "Categories",
|
||||
"series": "Series"
|
||||
},
|
||||
"booklore": {
|
||||
"libraries": "Libraries",
|
||||
"books": "Books",
|
||||
"reading": "Reading",
|
||||
"finished": "Finished"
|
||||
},
|
||||
"jdownloader": {
|
||||
"downloadCount": "Queue",
|
||||
"downloadBytesRemaining": "Remaining",
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
import { Combobox, Listbox, Transition } from "@headlessui/react";
|
||||
import {
|
||||
Combobox,
|
||||
ComboboxInput,
|
||||
ComboboxOption,
|
||||
ComboboxOptions,
|
||||
Listbox,
|
||||
ListboxButton,
|
||||
ListboxOption,
|
||||
ListboxOptions,
|
||||
Transition,
|
||||
} from "@headlessui/react";
|
||||
import classNames from "classnames";
|
||||
import { useTranslation } from "next-i18next";
|
||||
import { Fragment, useEffect, useState } from "react";
|
||||
@@ -158,7 +168,7 @@ export default function Search({ options }) {
|
||||
<div className="flex-col relative h-8 my-4 min-w-fit z-20">
|
||||
<div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" />
|
||||
<Combobox value={query}>
|
||||
<Combobox.Input
|
||||
<ComboboxInput
|
||||
type="text"
|
||||
className="
|
||||
overflow-hidden w-full h-full rounded-md
|
||||
@@ -189,7 +199,7 @@ export default function Search({ options }) {
|
||||
disabled={availableProviderIds?.length === 1}
|
||||
>
|
||||
<div>
|
||||
<Listbox.Button
|
||||
<ListboxButton
|
||||
className="
|
||||
absolute right-0.5 bottom-0.5 rounded-r-md px-4 py-2
|
||||
text-white font-medium text-sm
|
||||
@@ -198,7 +208,7 @@ export default function Search({ options }) {
|
||||
>
|
||||
<selectedProvider.icon className="text-white w-3 h-3" />
|
||||
<span className="sr-only">{t("search.search")}</span>
|
||||
</Listbox.Button>
|
||||
</ListboxButton>
|
||||
</div>
|
||||
<Transition
|
||||
as={Fragment}
|
||||
@@ -209,7 +219,7 @@ export default function Search({ options }) {
|
||||
leaveFrom="transform opacity-100 scale-100"
|
||||
leaveTo="transform opacity-0 scale-95"
|
||||
>
|
||||
<Listbox.Options
|
||||
<ListboxOptions
|
||||
className="absolute right-0 z-10 mt-1 origin-top-right rounded-md
|
||||
bg-theme-100 dark:bg-theme-600 shadow-lg
|
||||
ring-1 ring-black ring-opacity-5 focus:outline-hidden"
|
||||
@@ -218,7 +228,7 @@ export default function Search({ options }) {
|
||||
{availableProviderIds.map((providerId) => {
|
||||
const p = searchProviders[providerId];
|
||||
return (
|
||||
<Listbox.Option key={providerId} value={p} as={Fragment}>
|
||||
<ListboxOption key={providerId} value={p} as={Fragment}>
|
||||
{({ active }) => (
|
||||
<li
|
||||
className={classNames(
|
||||
@@ -229,23 +239,23 @@ export default function Search({ options }) {
|
||||
<p.icon className="h-4 w-4 mx-4 my-2" />
|
||||
</li>
|
||||
)}
|
||||
</Listbox.Option>
|
||||
</ListboxOption>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</Listbox.Options>
|
||||
</ListboxOptions>
|
||||
</Transition>
|
||||
</Listbox>
|
||||
|
||||
{searchSuggestions[1]?.length > 0 && (
|
||||
<Combobox.Options className="mt-1 rounded-md bg-theme-50 dark:bg-theme-800 border border-theme-300 dark:border-theme-200/30 cursor-pointer shadow-lg">
|
||||
<ComboboxOptions className="mt-1 rounded-md bg-theme-50 dark:bg-theme-800 border border-theme-300 dark:border-theme-200/30 cursor-pointer shadow-lg">
|
||||
<div className="p-1 bg-white/50 dark:bg-white/10 text-theme-900/90 dark:text-white/90 text-xs">
|
||||
<Combobox.Option key={query} value={query} />
|
||||
<ComboboxOption key={query} value={query} />
|
||||
{searchSuggestions[1].map((suggestion) => (
|
||||
<Combobox.Option
|
||||
<ComboboxOption
|
||||
key={suggestion}
|
||||
value={suggestion}
|
||||
onClick={() => {
|
||||
onMouseDown={() => {
|
||||
doSearch(suggestion);
|
||||
}}
|
||||
className="flex w-full"
|
||||
@@ -266,10 +276,10 @@ export default function Search({ options }) {
|
||||
</div>
|
||||
);
|
||||
}}
|
||||
</Combobox.Option>
|
||||
</ComboboxOption>
|
||||
))}
|
||||
</div>
|
||||
</Combobox.Options>
|
||||
</ComboboxOptions>
|
||||
)}
|
||||
</Combobox>
|
||||
</div>
|
||||
|
||||
@@ -24,12 +24,12 @@ export default function Resource({
|
||||
wide ? " min-w-[120px]" : "min-w-[85px]"
|
||||
}`}
|
||||
>
|
||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between gap-2">
|
||||
<div className="pl-0.5">{value}</div>
|
||||
<div className="pr-1">{label}</div>
|
||||
</div>
|
||||
{expanded && (
|
||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
|
||||
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between gap-2">
|
||||
<div className="pl-0.5">{expandedValue}</div>
|
||||
<div className="pr-1">{expandedLabel}</div>
|
||||
</div>
|
||||
|
||||
@@ -4,7 +4,7 @@ export function middleware(req) {
|
||||
// Check the Host header, if HOMEPAGE_ALLOWED_HOSTS is set
|
||||
const host = req.headers.get("host");
|
||||
const port = process.env.PORT || 3000;
|
||||
let allowedHosts = [`localhost:${port}`, `127.0.0.1:${port}`];
|
||||
let allowedHosts = [`localhost:${port}`, `127.0.0.1:${port}`, `[::1]:${port}`];
|
||||
const allowAll = process.env.HOMEPAGE_ALLOWED_HOSTS === "*";
|
||||
if (process.env.HOMEPAGE_ALLOWED_HOSTS) {
|
||||
allowedHosts = allowedHosts.concat(process.env.HOMEPAGE_ALLOWED_HOSTS.split(","));
|
||||
|
||||
@@ -59,7 +59,7 @@ export default async function handler(req, res) {
|
||||
}
|
||||
|
||||
if (type === "network") {
|
||||
let networkData = await si.networkStats();
|
||||
let networkData = await si.networkStats("*");
|
||||
let interfaceDefault;
|
||||
logger.debug("networkData:", JSON.stringify(networkData));
|
||||
if (interfaceName && interfaceName !== "default") {
|
||||
|
||||
@@ -554,48 +554,38 @@ export default function Wrapper({ initialSettings, fallback }) {
|
||||
html.classList.add(desiredThemeClass);
|
||||
}
|
||||
|
||||
if (backgroundImage) {
|
||||
const safeBackgroundImage = backgroundImage.replace(/'/g, "\\'");
|
||||
body.style.backgroundImage = `linear-gradient(rgb(var(--bg-color) / ${opacity}), rgb(var(--bg-color) / ${opacity})), url('${safeBackgroundImage}')`;
|
||||
body.style.backgroundSize = "cover";
|
||||
body.style.backgroundPosition = "center";
|
||||
body.style.backgroundAttachment = "fixed";
|
||||
body.style.backgroundRepeat = "no-repeat";
|
||||
body.style.backgroundColor = "";
|
||||
} else {
|
||||
body.style.backgroundImage = "none";
|
||||
body.style.backgroundColor = "rgb(var(--bg-color))";
|
||||
body.style.backgroundSize = "";
|
||||
body.style.backgroundPosition = "";
|
||||
body.style.backgroundAttachment = "";
|
||||
body.style.backgroundRepeat = "";
|
||||
}
|
||||
|
||||
return () => {
|
||||
body.style.backgroundImage = "";
|
||||
body.style.backgroundColor = "";
|
||||
body.style.backgroundSize = "";
|
||||
body.style.backgroundPosition = "";
|
||||
body.style.backgroundAttachment = "";
|
||||
body.style.backgroundRepeat = "";
|
||||
};
|
||||
// Remove any previously applied inline styles
|
||||
body.style.backgroundImage = "";
|
||||
body.style.backgroundColor = "";
|
||||
body.style.backgroundAttachment = "";
|
||||
}, [backgroundImage, opacity, theme, color, initialSettings.color]);
|
||||
|
||||
return (
|
||||
<div id="page_wrapper" className="relative min-h-screen">
|
||||
<div
|
||||
id="inner_wrapper"
|
||||
tabIndex="-1"
|
||||
className={classNames(
|
||||
"w-full min-h-screen overflow-auto",
|
||||
backgroundBlur &&
|
||||
`backdrop-blur${initialSettings.background.blur?.length ? `-${initialSettings.background.blur}` : ""}`,
|
||||
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
|
||||
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
|
||||
)}
|
||||
>
|
||||
<Index initialSettings={initialSettings} fallback={fallback} />
|
||||
<>
|
||||
{backgroundImage && (
|
||||
<div
|
||||
id="background"
|
||||
aria-hidden="true"
|
||||
style={{
|
||||
backgroundImage: `linear-gradient(rgb(var(--bg-color) / ${opacity}), rgb(var(--bg-color) / ${opacity})), url('${backgroundImage}')`,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<div id="page_wrapper" className="relative h-full">
|
||||
<div
|
||||
id="inner_wrapper"
|
||||
tabIndex="-1"
|
||||
className={classNames(
|
||||
"w-full h-full overflow-auto",
|
||||
backgroundBlur &&
|
||||
`backdrop-blur${initialSettings.background.blur?.length ? `-${initialSettings.background.blur}` : ""}`,
|
||||
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
|
||||
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
|
||||
)}
|
||||
>
|
||||
<Index initialSettings={initialSettings} fallback={fallback} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -30,6 +30,18 @@ body,
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: rgb(var(--bg-color));
|
||||
}
|
||||
|
||||
#background {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 0;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: scroll;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
html,
|
||||
|
||||
@@ -35,7 +35,7 @@ function parseServicesToGroups(services) {
|
||||
serviceGroupServices.push({
|
||||
name: entryName,
|
||||
...entries[entryName],
|
||||
weight: entries[entryName].weight || serviceGroupServices.length * 100, // default weight
|
||||
weight: entries[entryName].weight ?? (serviceGroupServices.length + 1) * 100, // default weight
|
||||
type: "service",
|
||||
});
|
||||
}
|
||||
@@ -107,6 +107,7 @@ export async function servicesFromDocker() {
|
||||
constructedService = {
|
||||
container: containerName.replace(/^\//, ""),
|
||||
server: serverName,
|
||||
weight: 0,
|
||||
type: "service",
|
||||
};
|
||||
}
|
||||
@@ -313,7 +314,7 @@ export function cleanServiceGroups(groups) {
|
||||
// gamedig
|
||||
gameToken,
|
||||
|
||||
// authentik, beszel, glances, immich, komga, mealie, pihole, pfsense, speedtest
|
||||
// authentik, beszel, glances, immich, komga, mealie, netalertx, pihole, pfsense, speedtest
|
||||
version,
|
||||
|
||||
// glances
|
||||
@@ -558,6 +559,7 @@ export function cleanServiceGroups(groups) {
|
||||
"immich",
|
||||
"komga",
|
||||
"mealie",
|
||||
"netalertx",
|
||||
"pfsense",
|
||||
"pihole",
|
||||
"speedtest",
|
||||
|
||||
@@ -27,6 +27,9 @@ export default async function credentialedProxyHandler(req, res, map) {
|
||||
|
||||
const headers = {
|
||||
"Content-Type": "application/json",
|
||||
...(widgets[widget.type].headers ?? {}),
|
||||
...(widget.headers ?? {}),
|
||||
...(req.extraHeaders ?? {}),
|
||||
};
|
||||
|
||||
if (widget.type === "stocks") {
|
||||
@@ -53,6 +56,7 @@ export default async function credentialedProxyHandler(req, res, map) {
|
||||
"linkwarden",
|
||||
"mealie",
|
||||
"netalertx",
|
||||
"pangolin",
|
||||
"tailscale",
|
||||
"tandoor",
|
||||
"pterodactyl",
|
||||
|
||||
@@ -25,7 +25,11 @@ export default async function genericProxyHandler(req, res, map) {
|
||||
}
|
||||
const url = new URL(urlString);
|
||||
|
||||
const headers = req.extraHeaders ?? widget.headers ?? widgets[widget.type].headers ?? {};
|
||||
const headers = {
|
||||
...(widgets[widget.type].headers ?? {}),
|
||||
...(widget.headers ?? {}),
|
||||
...(req.extraHeaders ?? {}),
|
||||
};
|
||||
|
||||
if (widget.username && widget.password) {
|
||||
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
|
||||
|
||||
43
src/widgets/booklore/component.jsx
Normal file
43
src/widgets/booklore/component.jsx
Normal file
@@ -0,0 +1,43 @@
|
||||
import Block from "components/services/widget/block";
|
||||
import Container from "components/services/widget/container";
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
const { data: bookloreData, error: bookloreError } = useWidgetAPI(widget);
|
||||
|
||||
if (bookloreError) {
|
||||
return <Container service={service} error={bookloreError} />;
|
||||
}
|
||||
|
||||
if (!bookloreData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="booklore.libraries" />
|
||||
<Block label="booklore.books" />
|
||||
<Block label="booklore.reading" />
|
||||
<Block label="booklore.finished" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const stats = {
|
||||
libraries: bookloreData.libraries ?? 0,
|
||||
books: bookloreData.books ?? 0,
|
||||
reading: bookloreData.reading ?? 0,
|
||||
finished: bookloreData.finished ?? 0,
|
||||
};
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="booklore.libraries" value={t("common.number", { value: stats.libraries })} />
|
||||
<Block label="booklore.books" value={t("common.number", { value: stats.books })} />
|
||||
<Block label="booklore.reading" value={t("common.number", { value: stats.reading })} />
|
||||
<Block label="booklore.finished" value={t("common.number", { value: stats.finished })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
156
src/widgets/booklore/proxy.js
Normal file
156
src/widgets/booklore/proxy.js
Normal file
@@ -0,0 +1,156 @@
|
||||
import cache from "memory-cache";
|
||||
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import createLogger from "utils/logger";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import widgets from "widgets/widgets";
|
||||
|
||||
const proxyName = "bookloreProxyHandler";
|
||||
const sessionTokenCacheKey = `${proxyName}__sessionToken`;
|
||||
const logger = createLogger(proxyName);
|
||||
|
||||
async function login(widget, service) {
|
||||
if (!widget.username || !widget.password) {
|
||||
logger.debug("Missing credentials for Booklore service '%s'", service);
|
||||
return { accessToken: false };
|
||||
}
|
||||
|
||||
const api = widgets?.[widget.type]?.api;
|
||||
const loginUrl = new URL(formatApiCall(api, { ...widget, endpoint: "auth/login" }));
|
||||
|
||||
const [status, , data] = await httpProxy(loginUrl, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
accept: "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
username: widget.username,
|
||||
password: widget.password,
|
||||
}),
|
||||
});
|
||||
|
||||
if (status !== 200) {
|
||||
logger.debug("Booklore login failed for service '%s' with status %d", service, status);
|
||||
return { accessToken: false };
|
||||
}
|
||||
|
||||
try {
|
||||
const { accessToken } = JSON.parse(data.toString());
|
||||
|
||||
if (accessToken) {
|
||||
// access tokens are valid for ~10 hours; refresh 1 minute early.
|
||||
cache.put(`${sessionTokenCacheKey}.${service}`, accessToken, 10 * 60 * 60 * 1000 - 60 * 1000);
|
||||
return { accessToken };
|
||||
}
|
||||
} catch (e) {
|
||||
logger.error("Unable to login to Booklore API: %s", e);
|
||||
}
|
||||
|
||||
return { accessToken: false };
|
||||
}
|
||||
|
||||
async function apiCall(widget, endpoint, service) {
|
||||
const cacheKey = `${sessionTokenCacheKey}.${service}`;
|
||||
let accessToken = cache.get(cacheKey);
|
||||
|
||||
if (!accessToken) {
|
||||
({ accessToken } = await login(widget, service));
|
||||
}
|
||||
|
||||
if (!accessToken) {
|
||||
return { status: 401, data: null };
|
||||
}
|
||||
|
||||
const headers = {
|
||||
accept: "application/json",
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
};
|
||||
|
||||
const url = new URL(formatApiCall(widgets[widget.type].api, { ...widget, endpoint }));
|
||||
let [status, , data] = await httpProxy(url, {
|
||||
method: "GET",
|
||||
headers,
|
||||
});
|
||||
|
||||
if (status === 401 || status === 403) {
|
||||
logger.debug("Booklore API rejected the request, attempting to obtain new session token");
|
||||
const refreshedToken = (await login(widget, service)).accessToken;
|
||||
if (!refreshedToken) {
|
||||
return { status, data: null };
|
||||
}
|
||||
headers.Authorization = `Bearer ${refreshedToken}`;
|
||||
[status, , data] = await httpProxy(url, {
|
||||
method: "GET",
|
||||
headers,
|
||||
});
|
||||
}
|
||||
|
||||
if (status !== 200) {
|
||||
logger.error("Error getting data from Booklore: %s status %d. Data: %s", url, status, data);
|
||||
return { status, data: null };
|
||||
}
|
||||
|
||||
try {
|
||||
return { status, data: JSON.parse(data.toString()) };
|
||||
} catch (e) {
|
||||
logger.error("Error parsing Booklore response: %s", e);
|
||||
}
|
||||
|
||||
return { status, data: null };
|
||||
}
|
||||
|
||||
function summarizeStatuses(books = []) {
|
||||
return books.reduce(
|
||||
(accumulator, book) => {
|
||||
const status = (book?.readStatus || "").toString().toUpperCase();
|
||||
if (status === "READING") accumulator.reading += 1;
|
||||
else if (status === "READ") accumulator.finished += 1;
|
||||
return accumulator;
|
||||
},
|
||||
{ reading: 0, finished: 0 },
|
||||
);
|
||||
}
|
||||
|
||||
export default async function bookloreProxyHandler(req, res) {
|
||||
const { group, service, index } = req.query;
|
||||
|
||||
if (!group || !service) {
|
||||
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const widget = await getServiceWidget(group, service, index);
|
||||
|
||||
if (!widget) {
|
||||
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
if (!widget.username || !widget.password) {
|
||||
logger.debug("Missing credentials for Booklore widget in service '%s'", service);
|
||||
return res.status(400).json({ error: "Missing Booklore credentials" });
|
||||
}
|
||||
|
||||
const { data: librariesData, status: librariesStatus } = await apiCall(widget, "libraries", service);
|
||||
|
||||
if (librariesStatus !== 200 || !Array.isArray(librariesData)) {
|
||||
return res.status(librariesStatus || 500).send(librariesData || { error: "Error fetching libraries" });
|
||||
}
|
||||
|
||||
const { data: booksData, status: booksStatus } = await apiCall(widget, "books", service);
|
||||
|
||||
if (booksStatus !== 200 || !Array.isArray(booksData)) {
|
||||
return res.status(booksStatus || 500).send(booksData || { error: "Error fetching books" });
|
||||
}
|
||||
|
||||
const { reading, finished } = summarizeStatuses(booksData);
|
||||
|
||||
return res.status(200).send({
|
||||
libraries: librariesData.length,
|
||||
books: booksData.length,
|
||||
reading,
|
||||
finished,
|
||||
});
|
||||
}
|
||||
8
src/widgets/booklore/widget.js
Normal file
8
src/widgets/booklore/widget.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import bookloreProxyHandler from "./proxy";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/v1/{endpoint}",
|
||||
proxyHandler: bookloreProxyHandler,
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -12,6 +12,7 @@ const components = {
|
||||
backrest: dynamic(() => import("./backrest/component")),
|
||||
bazarr: dynamic(() => import("./bazarr/component")),
|
||||
beszel: dynamic(() => import("./beszel/component")),
|
||||
booklore: dynamic(() => import("./booklore/component")),
|
||||
caddy: dynamic(() => import("./caddy/component")),
|
||||
calendar: dynamic(() => import("./calendar/component")),
|
||||
calibreweb: dynamic(() => import("./calibreweb/component")),
|
||||
@@ -97,6 +98,7 @@ const components = {
|
||||
openmediavault: dynamic(() => import("./openmediavault/component")),
|
||||
openwrt: dynamic(() => import("./openwrt/component")),
|
||||
paperlessngx: dynamic(() => import("./paperlessngx/component")),
|
||||
pangolin: dynamic(() => import("./pangolin/component")),
|
||||
pfsense: dynamic(() => import("./pfsense/component")),
|
||||
photoprism: dynamic(() => import("./photoprism/component")),
|
||||
proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")),
|
||||
|
||||
@@ -85,6 +85,9 @@ export default async function fritzboxProxyHandler(req, res) {
|
||||
requestExternalIPv6Prefix ? requestEndpoint(apiBaseUrl, "WANIPConnection", "X_AVM_DE_GetIPv6Prefix") : null,
|
||||
])
|
||||
.then(([statusInfo, linkProperties, addonInfos, externalIPAddress, externalIPv6Address, externalIPv6Prefix]) => {
|
||||
const ipv6Prefix = externalIPv6Prefix?.NewIPv6Prefix;
|
||||
const ipv6Len = externalIPv6Prefix?.NewPrefixLength;
|
||||
|
||||
res.status(200).json({
|
||||
connectionStatus: statusInfo?.NewConnectionStatus || "Unconfigured",
|
||||
uptime: statusInfo?.NewUptime || 0,
|
||||
@@ -96,7 +99,7 @@ export default async function fritzboxProxyHandler(req, res) {
|
||||
sent: addonInfos?.NewX_AVM_DE_TotalBytesSent64 || 0,
|
||||
externalIPAddress: externalIPAddress?.NewExternalIPAddress || null,
|
||||
externalIPv6Address: externalIPv6Address?.NewExternalIPv6Address || null,
|
||||
externalIPv6Prefix: externalIPv6Prefix?.NewIPv6Prefix || null,
|
||||
externalIPv6Prefix: ipv6Prefix && ipv6Len != null ? `${ipv6Prefix}/${ipv6Len}` : (ipv6Prefix ?? null),
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
|
||||
@@ -9,7 +9,9 @@ export default function Component({ service }) {
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: netalertxData, error: netalertxError } = useWidgetAPI(widget, "data");
|
||||
const dataEndpoint = widget?.version > 1 ? "datav2" : "data";
|
||||
|
||||
const { data: netalertxData, error: netalertxError } = useWidgetAPI(widget, dataEndpoint);
|
||||
|
||||
if (netalertxError) {
|
||||
return <Container service={service} error={netalertxError} />;
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/php/server/devices.php?action=getDevicesTotals",
|
||||
api: "{url}/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
data: {
|
||||
endpoint: "data",
|
||||
endpoint: "php/server/devices.php?action=getDevicesTotals",
|
||||
},
|
||||
datav2: {
|
||||
endpoint: "devices/totals",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
70
src/widgets/pangolin/component.jsx
Normal file
70
src/widgets/pangolin/component.jsx
Normal file
@@ -0,0 +1,70 @@
|
||||
import Block from "components/services/widget/block";
|
||||
import Container from "components/services/widget/container";
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
const MAX_ALLOWED_FIELDS = 4;
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
if (!widget.fields) {
|
||||
widget.fields = ["sites", "resources", "targets", "traffic"];
|
||||
} else if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
|
||||
widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
|
||||
}
|
||||
|
||||
const { data: sitesData, error: sitesError } = useWidgetAPI(widget, "sites");
|
||||
const { data: resourcesData, error: resourcesError } = useWidgetAPI(widget, "resources");
|
||||
|
||||
if (sitesError || resourcesError) {
|
||||
return <Container service={service} error={sitesError || resourcesError} />;
|
||||
}
|
||||
|
||||
if (!sitesData || !resourcesData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="pangolin.sites" />
|
||||
<Block label="pangolin.resources" />
|
||||
<Block label="pangolin.targets" />
|
||||
<Block label="pangolin.traffic" />
|
||||
<Block label="pangolin.in" />
|
||||
<Block label="pangolin.out" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const sites = sitesData.data?.sites || [];
|
||||
const resources = resourcesData.data?.resources || [];
|
||||
|
||||
const sitesTotal = sites.length;
|
||||
const sitesOnline = sites.filter((s) => s.online).length;
|
||||
|
||||
const resourcesTotal = resources.length;
|
||||
const resourcesHealthy = resources.filter(
|
||||
(r) => r.targets?.some((t) => t.healthStatus !== "unhealthy") || !r.targets?.length,
|
||||
).length;
|
||||
|
||||
const targetsTotal = resources.reduce((sum, r) => sum + (r.targets?.length || 0), 0);
|
||||
const targetsHealthy = resources.reduce(
|
||||
(sum, r) => sum + (r.targets?.filter((t) => t.healthStatus !== "unhealthy").length || 0),
|
||||
0,
|
||||
);
|
||||
|
||||
const trafficIn = sites.reduce((sum, s) => sum + (s.megabytesIn || 0), 0) * 1_000_000;
|
||||
const trafficOut = sites.reduce((sum, s) => sum + (s.megabytesOut || 0), 0) * 1_000_000;
|
||||
const trafficTotal = trafficIn + trafficOut;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="pangolin.sites" value={`${sitesOnline} / ${sitesTotal}`} />
|
||||
<Block label="pangolin.resources" value={`${resourcesHealthy} / ${resourcesTotal}`} />
|
||||
<Block label="pangolin.targets" value={`${targetsHealthy} / ${targetsTotal}`} />
|
||||
<Block label="pangolin.traffic" value={t("common.bytes", { value: trafficTotal })} />
|
||||
<Block label="pangolin.in" value={t("common.bytes", { value: trafficIn })} />
|
||||
<Block label="pangolin.out" value={t("common.bytes", { value: trafficOut })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
17
src/widgets/pangolin/widget.js
Normal file
17
src/widgets/pangolin/widget.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/v1/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
sites: {
|
||||
endpoint: "org/{org}/sites",
|
||||
},
|
||||
resources: {
|
||||
endpoint: "org/{org}/resources",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -65,7 +65,7 @@ async function fetchFromPlexAPI(endpoint, widget) {
|
||||
export default async function plexProxyHandler(req, res) {
|
||||
const widget = await getWidget(req);
|
||||
|
||||
const { service } = req.query;
|
||||
const { service, index } = req.query;
|
||||
|
||||
if (!widget) {
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
@@ -85,19 +85,19 @@ export default async function plexProxyHandler(req, res) {
|
||||
streams = apiData.MediaContainer._attributes.size;
|
||||
}
|
||||
|
||||
let libraries = cache.get(`${librariesCacheKey}.${service}`);
|
||||
let libraries = cache.get(`${librariesCacheKey}.${service}.${index}`);
|
||||
if (libraries === null) {
|
||||
logger.debug("Getting libraries from Plex API");
|
||||
[status, apiData] = await fetchFromPlexAPI("/library/sections", widget);
|
||||
if (apiData && apiData.MediaContainer) {
|
||||
libraries = [].concat(apiData.MediaContainer.Directory);
|
||||
cache.put(`${librariesCacheKey}.${service}`, libraries, 1000 * 60 * 60 * 6);
|
||||
cache.put(`${librariesCacheKey}.${service}.${index}`, libraries, 1000 * 60 * 60 * 6);
|
||||
}
|
||||
}
|
||||
|
||||
let albums = cache.get(`${albumsCacheKey}.${service}`);
|
||||
let movies = cache.get(`${moviesCacheKey}.${service}`);
|
||||
let tv = cache.get(`${tvCacheKey}.${service}`);
|
||||
let albums = cache.get(`${albumsCacheKey}.${service}.${index}`);
|
||||
let movies = cache.get(`${moviesCacheKey}.${service}.${index}`);
|
||||
let tv = cache.get(`${tvCacheKey}.${service}.${index}`);
|
||||
if (albums === null || movies === null || tv === null) {
|
||||
albums = 0;
|
||||
movies = 0;
|
||||
@@ -123,9 +123,9 @@ export default async function plexProxyHandler(req, res) {
|
||||
}
|
||||
}),
|
||||
);
|
||||
cache.put(`${albumsCacheKey}.${service}`, albums, 1000 * 60 * 10);
|
||||
cache.put(`${tvCacheKey}.${service}`, tv, 1000 * 60 * 10);
|
||||
cache.put(`${moviesCacheKey}.${service}`, movies, 1000 * 60 * 10);
|
||||
cache.put(`${albumsCacheKey}.${service}.${index}`, albums, 1000 * 60 * 10);
|
||||
cache.put(`${tvCacheKey}.${service}.${index}`, tv, 1000 * 60 * 10);
|
||||
cache.put(`${moviesCacheKey}.${service}.${index}`, movies, 1000 * 60 * 10);
|
||||
}
|
||||
|
||||
const data = {
|
||||
|
||||
@@ -11,6 +11,15 @@ const logger = createLogger(proxyName);
|
||||
const sessionCacheKey = `${proxyName}__sessionId`;
|
||||
const isNgCacheKey = `${proxyName}__isNg`;
|
||||
|
||||
function parsePyloadResponse(url, data) {
|
||||
try {
|
||||
return JSON.parse(Buffer.from(data).toString());
|
||||
} catch (e) {
|
||||
logger.error(`Error communicating with pyload API at ${url}, returned: ${JSON.stringify(data)}`);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchFromPyloadAPI(url, sessionId, params, service) {
|
||||
const options = {
|
||||
body: params
|
||||
@@ -33,13 +42,33 @@ async function fetchFromPyloadAPI(url, sessionId, params, service) {
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [status, contentType, data, responseHeaders] = await httpProxy(url, options);
|
||||
let returnData;
|
||||
try {
|
||||
returnData = JSON.parse(Buffer.from(data).toString());
|
||||
} catch (e) {
|
||||
logger.error(`Error communicating with pyload API at ${url}, returned: ${JSON.stringify(data)}`);
|
||||
returnData = data;
|
||||
const returnData = parsePyloadResponse(url, data);
|
||||
return [status, returnData, responseHeaders];
|
||||
}
|
||||
|
||||
async function fetchFromPyloadAPIBasic(url, params, username, password) {
|
||||
const parsedUrl = new URL(url);
|
||||
const isGetRequest = !params || Object.keys(params).length === 0;
|
||||
|
||||
const options = {
|
||||
method: isGetRequest ? "GET" : "POST",
|
||||
headers: {
|
||||
Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`,
|
||||
},
|
||||
};
|
||||
|
||||
if (isGetRequest) {
|
||||
if (params) {
|
||||
Object.keys(params).forEach((key) => parsedUrl.searchParams.append(key, params[key]));
|
||||
}
|
||||
} else {
|
||||
options.headers["Content-Type"] = "application/json";
|
||||
options.body = JSON.stringify(params);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [status, contentType, data, responseHeaders] = await httpProxy(parsedUrl, options);
|
||||
const returnData = parsePyloadResponse(parsedUrl, data);
|
||||
return [status, returnData, responseHeaders];
|
||||
}
|
||||
|
||||
@@ -66,24 +95,43 @@ async function login(loginUrl, service, username, password = "") {
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
export default async function pyloadProxyHandler(req, res) {
|
||||
export default async function pyloadProxyHandler(req, res, map = {}) {
|
||||
const { group, service, endpoint, index } = req.query;
|
||||
const { ngEndpoint } = map;
|
||||
|
||||
try {
|
||||
if (group && service) {
|
||||
const widget = await getServiceWidget(group, service, index);
|
||||
|
||||
if (widget) {
|
||||
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
|
||||
const apiTemplate = widgets[widget.type].api;
|
||||
const url = new URL(formatApiCall(apiTemplate, { endpoint, ...widget }));
|
||||
const ngUrl = ngEndpoint ? new URL(formatApiCall(apiTemplate, { endpoint: ngEndpoint, ...widget })) : url;
|
||||
const loginUrl = `${widget.url}/api/login`;
|
||||
const hasCredentials = widget.username && widget.password;
|
||||
|
||||
if (hasCredentials) {
|
||||
const [status, data] = await fetchFromPyloadAPIBasic(ngUrl, null, widget.username, widget.password);
|
||||
|
||||
if (status === 200 && !data?.error) {
|
||||
cache.put(`${isNgCacheKey}.${service}`, true);
|
||||
return res.json(data);
|
||||
}
|
||||
|
||||
if (status === 401) {
|
||||
return res
|
||||
.status(status)
|
||||
.send({ error: { message: "Invalid credentials communicating with Pyload API", data } });
|
||||
}
|
||||
}
|
||||
|
||||
let sessionId =
|
||||
cache.get(`${sessionCacheKey}.${service}`) ??
|
||||
(await login(loginUrl, service, widget.username, widget.password));
|
||||
let [status, data] = await fetchFromPyloadAPI(url, sessionId, null, service);
|
||||
|
||||
if (status === 403 || status === 401) {
|
||||
logger.info("Failed to retrieve data from Pyload API, trying to login again...");
|
||||
if (status === 403 || status === 401 || (status === 400 && data?.error?.includes("CSRF token"))) {
|
||||
logger.info("Failed to retrieve data from Pyload API with session auth, trying to login again...");
|
||||
cache.del(`${sessionCacheKey}.${service}`);
|
||||
sessionId = await login(loginUrl, service, widget.username, widget.password);
|
||||
[status, data] = await fetchFromPyloadAPI(url, sessionId, null, service);
|
||||
|
||||
@@ -7,6 +7,7 @@ const widget = {
|
||||
mappings: {
|
||||
status: {
|
||||
endpoint: "statusServer",
|
||||
map: { ngEndpoint: "status_server" },
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -12,8 +12,8 @@ export default function Component({ service }) {
|
||||
|
||||
const { data: alertData, error: alertError } = useWidgetAPI(widget, "alerts");
|
||||
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
|
||||
const { data: poolsData, error: poolsError } = useWidgetAPI(widget, widget?.enablePools ? "pools" : null);
|
||||
const { data: datasetData, error: datasetError } = useWidgetAPI(widget, widget?.enablePools ? "dataset" : null);
|
||||
const { data: poolsData, error: poolsError } = useWidgetAPI(widget, widget?.enablePools ? "pools" : "");
|
||||
const { data: datasetData, error: datasetError } = useWidgetAPI(widget, widget?.enablePools ? "dataset" : "");
|
||||
|
||||
if (alertError || statusError || poolsError) {
|
||||
const finalError = alertError ?? statusError ?? poolsError ?? datasetError;
|
||||
|
||||
172
src/widgets/truenas/proxy.js
Normal file
172
src/widgets/truenas/proxy.js
Normal file
@@ -0,0 +1,172 @@
|
||||
import WebSocket from "ws";
|
||||
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import createLogger from "utils/logger";
|
||||
import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
import validateWidgetData from "utils/proxy/validate-widget-data";
|
||||
import widgets from "widgets/widgets";
|
||||
|
||||
const logger = createLogger("truenasProxyHandler");
|
||||
|
||||
function waitForEvent(ws, handler, { event = "message", parseJson = true } = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const timeout = setTimeout(() => {
|
||||
cleanup();
|
||||
reject(new Error("TrueNAS websocket wait timed out"));
|
||||
}, 10000);
|
||||
|
||||
const handleEvent = (payload) => {
|
||||
try {
|
||||
let parsed = payload;
|
||||
if (parseJson) {
|
||||
if (Buffer.isBuffer(payload)) {
|
||||
parsed = JSON.parse(payload.toString());
|
||||
} else if (typeof payload === "string") {
|
||||
parsed = JSON.parse(payload);
|
||||
}
|
||||
logger.info("Received TrueNAS websocket message: %o", parsed);
|
||||
} else {
|
||||
logger.info("Received TrueNAS websocket message: %o", payload);
|
||||
}
|
||||
const handlerResult = handler(parsed);
|
||||
if (handlerResult !== undefined) {
|
||||
cleanup();
|
||||
if (handlerResult instanceof Error) {
|
||||
reject(handlerResult);
|
||||
} else {
|
||||
resolve(handlerResult);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
cleanup();
|
||||
reject(err);
|
||||
}
|
||||
};
|
||||
|
||||
const handleError = (err) => {
|
||||
cleanup();
|
||||
logger.error("TrueNAS websocket error: %s", err?.message ?? err);
|
||||
reject(err);
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
cleanup();
|
||||
logger.error("TrueNAS websocket connection closed unexpectedly");
|
||||
reject(new Error("TrueNAS websocket closed the connection"));
|
||||
};
|
||||
|
||||
function cleanup() {
|
||||
clearTimeout(timeout);
|
||||
ws.off(event, handleEvent);
|
||||
ws.off("error", handleError);
|
||||
ws.off("close", handleClose);
|
||||
}
|
||||
|
||||
ws.on(event, handleEvent);
|
||||
ws.on("error", handleError);
|
||||
ws.on("close", handleClose);
|
||||
});
|
||||
}
|
||||
|
||||
let nextId = 1;
|
||||
async function sendMethod(ws, method, params = []) {
|
||||
const id = nextId++;
|
||||
const payload = { jsonrpc: "2.0", id, method, params };
|
||||
logger.info("Sending TrueNAS websocket method %s with id %d", method, id);
|
||||
ws.send(JSON.stringify(payload));
|
||||
|
||||
return waitForEvent(ws, (message) => {
|
||||
if (message?.id !== id) return undefined;
|
||||
if (message?.error) {
|
||||
return new Error(message.error?.message || JSON.stringify(message.error));
|
||||
}
|
||||
return message?.result ?? message;
|
||||
});
|
||||
}
|
||||
|
||||
async function authenticate(ws, widget) {
|
||||
if (widget?.key) {
|
||||
try {
|
||||
const apiKeyResult = await sendMethod(ws, "auth.login_with_api_key", [widget.key]);
|
||||
if (apiKeyResult === true) return;
|
||||
logger.warn("TrueNAS API key authentication failed, falling back to username/password when available.");
|
||||
} catch (err) {
|
||||
logger.warn("TrueNAS API key authentication failed: %s", err?.message ?? err);
|
||||
}
|
||||
}
|
||||
|
||||
if (widget?.username && widget?.password) {
|
||||
const loginResult = await sendMethod(ws, "auth.login", [widget.username, widget.password]);
|
||||
if (loginResult === true) return;
|
||||
logger.warn("TrueNAS username/password authentication failed.");
|
||||
}
|
||||
|
||||
throw new Error("TrueNAS authentication failed");
|
||||
}
|
||||
|
||||
export default async function truenasProxyHandler(req, res, map) {
|
||||
const { group, service, endpoint, index } = req.query;
|
||||
if (!group || !service) {
|
||||
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const widget = await getServiceWidget(group, service, index);
|
||||
|
||||
if (!widget) {
|
||||
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
if (!endpoint) {
|
||||
return res.status(204).end();
|
||||
}
|
||||
|
||||
const version = Number(widget.version ?? 1);
|
||||
if (Number.isNaN(version) || version < 2) {
|
||||
// Use legacy REST proxy for version 1
|
||||
return credentialedProxyHandler(req, res, map);
|
||||
}
|
||||
|
||||
const mappingEntry = Object.values(widgets[widget.type].mappings).find((mapping) => mapping.endpoint === endpoint);
|
||||
const wsMethod = mappingEntry.wsMethod;
|
||||
|
||||
if (!wsMethod) {
|
||||
logger.debug("Missing wsMethod mapping for TrueNAS endpoint %s", endpoint);
|
||||
return res.status(500).json({ error: "Missing wsMethod mapping." });
|
||||
}
|
||||
|
||||
try {
|
||||
let data;
|
||||
const wsUrl = new URL(formatApiCall(widgets[widget.type].wsAPI, { ...widget }));
|
||||
const useSecure = wsUrl.protocol === "https:" || Boolean(widget.key); // API key requires secure connection
|
||||
if (useSecure && wsUrl.protocol !== "https:")
|
||||
logger.info("Upgrading TrueNAS websocket connection to secure wss://");
|
||||
wsUrl.protocol = useSecure ? "wss:" : "ws:";
|
||||
logger.info("Connecting to TrueNAS websocket at %s", wsUrl);
|
||||
const ws = new WebSocket(wsUrl, { rejectUnauthorized: false });
|
||||
await waitForEvent(ws, () => true, { event: "open", parseJson: false }); // wait for open
|
||||
logger.info("Connected to TrueNAS websocket at %s", wsUrl);
|
||||
try {
|
||||
await authenticate(ws, widget);
|
||||
data = await sendMethod(ws, wsMethod);
|
||||
} finally {
|
||||
ws.close();
|
||||
}
|
||||
|
||||
if (!validateWidgetData(widget, endpoint, data)) {
|
||||
return res.status(500).json({ error: { message: "Invalid data", url: sanitizeErrorURL(widget.url), data } });
|
||||
}
|
||||
|
||||
if (map) data = map(data);
|
||||
|
||||
return res.status(200).json(data);
|
||||
} catch (err) {
|
||||
if (err?.status) {
|
||||
return res.status(err.status).json({ error: err.message });
|
||||
}
|
||||
logger.warn("Websocket call for TrueNAS failed: %s", err?.message ?? err);
|
||||
return res.status(500).json({ error: err?.message ?? "TrueNAS websocket call failed" });
|
||||
}
|
||||
}
|
||||
@@ -1,32 +1,43 @@
|
||||
import truenasProxyHandler from "./proxy";
|
||||
|
||||
import { asJson, jsonArrayFilter } from "utils/proxy/api-helpers";
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/v2.0/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
wsAPI: "{url}/api/current",
|
||||
proxyHandler: truenasProxyHandler,
|
||||
|
||||
mappings: {
|
||||
alerts: {
|
||||
endpoint: "alert/list",
|
||||
map: (data) => ({
|
||||
pending: jsonArrayFilter(data, (item) => item?.dismissed === false).length,
|
||||
}),
|
||||
wsMethod: "alert.list",
|
||||
map: (data) => {
|
||||
if (Array.isArray(data)) {
|
||||
return { pending: data.filter((item) => item?.dismissed === false).length };
|
||||
}
|
||||
return { pending: jsonArrayFilter(data, (item) => item?.dismissed === false).length };
|
||||
},
|
||||
},
|
||||
status: {
|
||||
endpoint: "system/info",
|
||||
wsMethod: "system.info",
|
||||
validate: ["loadavg", "uptime_seconds"],
|
||||
},
|
||||
pools: {
|
||||
endpoint: "pool",
|
||||
map: (data) =>
|
||||
asJson(data).map((entry) => ({
|
||||
wsMethod: "pool.query",
|
||||
map: (data) => {
|
||||
const list = Array.isArray(data) ? data : asJson(data);
|
||||
return list.map((entry) => ({
|
||||
id: entry.name,
|
||||
name: entry.name,
|
||||
healthy: entry.healthy,
|
||||
})),
|
||||
}));
|
||||
},
|
||||
},
|
||||
dataset: {
|
||||
endpoint: "pool/dataset",
|
||||
wsMethod: "pool.dataset.query",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -49,10 +49,12 @@ export default function Component({ service }) {
|
||||
|
||||
// single monitor
|
||||
const monitor = uptimerobotData.monitors[0];
|
||||
const logs = Array.isArray(monitor.logs) ? monitor.logs : [];
|
||||
const lastUpLog = logs.find((log) => log.type === 2);
|
||||
const lastDownLog = logs.find((log) => log.type === 1);
|
||||
|
||||
let status;
|
||||
let uptime = 0;
|
||||
let logIndex = 0;
|
||||
const hasLogs = Array.isArray(monitor.logs) && monitor.logs.length > 0;
|
||||
|
||||
switch (monitor.status) {
|
||||
case 0:
|
||||
@@ -63,8 +65,7 @@ export default function Component({ service }) {
|
||||
break;
|
||||
case 2:
|
||||
status = t("uptimerobot.up");
|
||||
uptime = t("common.duration", { value: hasLogs ? monitor.logs[0].duration : 0 });
|
||||
logIndex = 1;
|
||||
uptime = t("common.duration", { value: lastUpLog?.duration ?? 0 });
|
||||
break;
|
||||
case 8:
|
||||
status = t("uptimerobot.seemsdown");
|
||||
@@ -77,14 +78,14 @@ export default function Component({ service }) {
|
||||
break;
|
||||
}
|
||||
|
||||
const lastDown = hasLogs ? new Date(monitor.logs[logIndex].datetime * 1000).toLocaleString() : "";
|
||||
const downDuration = t("common.duration", { value: hasLogs ? monitor.logs[logIndex].duration : 0 });
|
||||
const hideDown = !hasLogs || (logIndex === 1 && monitor.logs[logIndex].type !== 1);
|
||||
const lastDown = lastDownLog ? new Date(lastDownLog.datetime * 1000).toLocaleString() : "";
|
||||
const downDuration = t("common.duration", { value: lastDownLog?.duration ?? 0 });
|
||||
const hideDown = !lastDownLog;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="uptimerobot.status" value={status} />
|
||||
{hasLogs && <Block label="uptimerobot.uptime" value={uptime} />}
|
||||
<Block label="uptimerobot.uptime" value={uptime} />
|
||||
{!hideDown && <Block label="uptimerobot.lastDown" value={lastDown} />}
|
||||
{!hideDown && <Block label="uptimerobot.downDuration" value={downDuration} />}
|
||||
</Container>
|
||||
|
||||
@@ -6,8 +6,17 @@ import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
const MAX_ALLOWED_FIELDS = 4;
|
||||
|
||||
const todayDate = new Date();
|
||||
function toApiMonthYear(offset = 0) {
|
||||
// API expects 1-indexed months, wrap around if needed
|
||||
const m = todayDate.getMonth() + 1 + offset;
|
||||
return {
|
||||
month: ((m + 11) % 12) + 1,
|
||||
year: todayDate.getFullYear() + Math.floor((m - 1) / 12),
|
||||
};
|
||||
}
|
||||
|
||||
export default function Component({ service }) {
|
||||
const todayDate = new Date();
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
@@ -29,28 +38,19 @@ export default function Component({ service }) {
|
||||
const { data: subscriptionsThisMonthlyCostData, error: subscriptionsThisMonthlyCostError } = useWidgetAPI(
|
||||
widget,
|
||||
subscriptionsThisMonthlyEndpoint,
|
||||
{
|
||||
month: todayDate.getMonth(),
|
||||
year: todayDate.getFullYear(),
|
||||
},
|
||||
toApiMonthYear(), // this month
|
||||
);
|
||||
const subscriptionsNextMonthlyEndpoint = widget.fields.includes("nextMonthlyCost") ? "get_monthly_cost" : "";
|
||||
const { data: subscriptionsNextMonthlyCostData, error: subscriptionsNextMonthlyCostError } = useWidgetAPI(
|
||||
widget,
|
||||
subscriptionsNextMonthlyEndpoint,
|
||||
{
|
||||
month: todayDate.getMonth() + 1,
|
||||
year: todayDate.getFullYear(),
|
||||
},
|
||||
toApiMonthYear(1), // next month
|
||||
);
|
||||
const subscriptionsPreviousMonthlyEndpoint = widget.fields.includes("previousMonthlyCost") ? "get_monthly_cost" : "";
|
||||
const { data: subscriptionsPreviousMonthlyCostData, error: subscriptionsPreviousMonthlyCostError } = useWidgetAPI(
|
||||
widget,
|
||||
subscriptionsPreviousMonthlyEndpoint,
|
||||
{
|
||||
month: todayDate.getMonth() - 1,
|
||||
year: todayDate.getFullYear(),
|
||||
},
|
||||
toApiMonthYear(-1), // previous month
|
||||
);
|
||||
|
||||
if (
|
||||
|
||||
@@ -9,6 +9,7 @@ import azuredevops from "./azuredevops/widget";
|
||||
import backrest from "./backrest/widget";
|
||||
import bazarr from "./bazarr/widget";
|
||||
import beszel from "./beszel/widget";
|
||||
import booklore from "./booklore/widget";
|
||||
import caddy from "./caddy/widget";
|
||||
import calendar from "./calendar/widget";
|
||||
import calibreweb from "./calibreweb/widget";
|
||||
@@ -87,6 +88,7 @@ import openmediavault from "./openmediavault/widget";
|
||||
import openwrt from "./openwrt/widget";
|
||||
import opnsense from "./opnsense/widget";
|
||||
import overseerr from "./overseerr/widget";
|
||||
import pangolin from "./pangolin/widget";
|
||||
import paperlessngx from "./paperlessngx/widget";
|
||||
import peanut from "./peanut/widget";
|
||||
import pfsense from "./pfsense/widget";
|
||||
@@ -155,6 +157,7 @@ const widgets = {
|
||||
azuredevops,
|
||||
backrest,
|
||||
bazarr,
|
||||
booklore,
|
||||
beszel,
|
||||
caddy,
|
||||
calibreweb,
|
||||
@@ -237,6 +240,7 @@ const widgets = {
|
||||
openmediavault,
|
||||
openwrt,
|
||||
paperlessngx,
|
||||
pangolin,
|
||||
peanut,
|
||||
pfsense,
|
||||
photoprism,
|
||||
|
||||
Reference in New Issue
Block a user