mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-07 09:35:54 -08:00
Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6b428363c | ||
|
|
e707fa46cf | ||
|
|
3d040362cb | ||
|
|
57b193b037 | ||
|
|
8a75c9b6e3 | ||
|
|
0dafc792f7 | ||
|
|
afc0fe29ee | ||
|
|
817a9bbce5 | ||
|
|
3ef7031eb0 | ||
|
|
6faf32eae9 | ||
|
|
455e86571a | ||
|
|
7d1e0c087a | ||
|
|
d48ef4c038 | ||
|
|
4a2eeaa8b9 | ||
|
|
faa2e6bb36 | ||
|
|
438543d8cd | ||
|
|
5a350cc9ce | ||
|
|
529814cf03 | ||
|
|
9b5275a854 | ||
|
|
e623196ac0 | ||
|
|
973b1f7aaf | ||
|
|
81a322cc99 | ||
|
|
36e82a8b90 | ||
|
|
1383e22acd | ||
|
|
a756a01d63 | ||
|
|
937efc9f1b | ||
|
|
fe6f32f072 | ||
|
|
226603770c | ||
|
|
2f48d21bfd | ||
|
|
4457baffa5 | ||
|
|
91d12c401c | ||
|
|
3f8da51aeb | ||
|
|
837717461f | ||
|
|
effedc28ed | ||
|
|
76b477572e | ||
|
|
6c6660b91b | ||
|
|
6886040798 | ||
|
|
1fb4850bef | ||
|
|
06cf76d724 | ||
|
|
7aeda56af4 | ||
|
|
2058b7fcae | ||
|
|
1e06e93e47 | ||
|
|
8f756d4084 | ||
|
|
02089a35ee | ||
|
|
f7a6b7dbf4 |
8
.github/workflows/docker-publish.yml
vendored
8
.github/workflows/docker-publish.yml
vendored
@@ -35,10 +35,11 @@ jobs:
|
|||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
|
version: 10
|
||||||
run_install: false
|
run_install: false
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
@@ -93,10 +94,11 @@ jobs:
|
|||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
|
version: 10
|
||||||
run_install: false
|
run_install: false
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
@@ -127,7 +129,7 @@ jobs:
|
|||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Setup QEMU
|
- name: Setup QEMU
|
||||||
uses: docker/setup-qemu-action@v3.6.0
|
uses: docker/setup-qemu-action@v3.7.0
|
||||||
|
|
||||||
- name: Setup Docker buildx
|
- name: Setup Docker buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
|
|||||||
|
|
||||||
RUN apk add --no-cache su-exec iputils-ping shadow
|
RUN apk add --no-cache su-exec iputils-ping shadow
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV HOSTNAME=0.0.0.0
|
ENV HOSTNAME=0.0.0.0
|
||||||
ENV PORT=3000
|
ENV PORT=3000
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ if [ -d /app/.next ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Drop privileges (when asked to) if root, otherwise run as current user
|
# Drop privileges (when asked to) if root, otherwise run as current user
|
||||||
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
|
if [ "$(id -u)" = "0" ] && [ "${PUID}" != "0" ]; then
|
||||||
su-exec ${PUID}:${PGID} "$@"
|
exec su-exec ${PUID}:${PGID} "$@"
|
||||||
else
|
else
|
||||||
exec "$@"
|
exec "$@"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -271,4 +271,4 @@ You can show the docker stats by clicking the status indicator but this can also
|
|||||||
showStats: true
|
showStats: true
|
||||||
```
|
```
|
||||||
|
|
||||||
Also see the settings for [show docker stats](settings.md#show-docker-stats).
|
Also see the settings for [show docker stats](settings.md#show-container-stats).
|
||||||
|
|||||||
@@ -178,3 +178,32 @@ See [ClusterRole and ClusterRoleBinding](../installation/k8s.md#clusterrole-and-
|
|||||||
## Caveats
|
## Caveats
|
||||||
|
|
||||||
Similarly to Docker service discovery, there currently is no rigid ordering to discovered services and discovered services will be displayed above those specified in the `services.yaml`.
|
Similarly to Docker service discovery, there currently is no rigid ordering to discovered services and discovered services will be displayed above those specified in the `services.yaml`.
|
||||||
|
|
||||||
|
## Adding extra configuration files
|
||||||
|
|
||||||
|
Some Homepage features (for example, [Proxmox](../configs/proxmox.md)) require additional configuration files such as `proxmox.yaml`.
|
||||||
|
When running Homepage on Kubernetes, these files must be provided via a `ConfigMap` and mounted into the container at `/app/config`.
|
||||||
|
|
||||||
|
### ConfigMap example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: homepage
|
||||||
|
data:
|
||||||
|
proxmox.yaml: |
|
||||||
|
pve:
|
||||||
|
url: https://proxmox.host.or.ip:8006
|
||||||
|
token: username@pam!Token ID
|
||||||
|
secret: secret
|
||||||
|
```
|
||||||
|
|
||||||
|
Mount the file into `/app/config` by updating the `Deployment`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /app/config/proxmox.yaml
|
||||||
|
name: homepage-config
|
||||||
|
subPath: proxmox.yaml
|
||||||
|
```
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ description: Proxmox Configuration
|
|||||||
---
|
---
|
||||||
|
|
||||||
The Proxmox connection is configured in the `proxmox.yaml` file. See [Create token](#create-token) section below for details on how to generate the required API token.
|
The Proxmox connection is configured in the `proxmox.yaml` file. See [Create token](#create-token) section below for details on how to generate the required API token.
|
||||||
You can configure multiple nodes - be sure to use the exact `proxmoxNode` identifier!
|
To configure multiple nodes, ensure the key name in the `proxmox.yaml` matches the `proxmoxNode` field used in your service configuration.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
pve:
|
pve: # must match your actual Proxmox node name
|
||||||
url: https://proxmox.host.or.ip:8006
|
url: https://proxmox.host.or.ip:8006
|
||||||
token: username@pam!Token ID
|
token: username@pam!Token ID
|
||||||
secret: secret
|
secret: secret
|
||||||
|
|||||||
@@ -118,6 +118,47 @@ Each widget can optionally provide a list of which fields should be visible via
|
|||||||
key: apikeyapikeyapikeyapikeyapikey
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Block Highlighting
|
||||||
|
|
||||||
|
Widgets can tint their metric block text automatically based on rules defined alongside the service. Attach a `highlight` section to the widget configuration and map each block to one or more numeric or string rules using the field key (for example, `queued`, `lan_users`).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- Sonarr:
|
||||||
|
icon: sonarr.png
|
||||||
|
href: http://sonarr.host.or.ip
|
||||||
|
widget:
|
||||||
|
type: sonarr
|
||||||
|
url: http://sonarr.host.or.ip
|
||||||
|
key: ${SONARR_API_KEY}
|
||||||
|
highlight:
|
||||||
|
queued:
|
||||||
|
numeric:
|
||||||
|
- level: danger
|
||||||
|
when: gte
|
||||||
|
value: 20
|
||||||
|
- level: warn
|
||||||
|
when: gte
|
||||||
|
value: 5
|
||||||
|
- level: good
|
||||||
|
when: eq
|
||||||
|
value: 0
|
||||||
|
status:
|
||||||
|
string:
|
||||||
|
- level: danger
|
||||||
|
when: regex
|
||||||
|
value: "(failed|import) pending"
|
||||||
|
- level: good
|
||||||
|
when: equals
|
||||||
|
value: "All good"
|
||||||
|
status_code:
|
||||||
|
string:
|
||||||
|
- level: warn
|
||||||
|
when: regex
|
||||||
|
value: "^5\\d{2}$"
|
||||||
|
```
|
||||||
|
|
||||||
|
Supported numeric operators for the `when` property are `gt`, `gte`, `lt`, `lte`, `eq`, `ne`, `between`, and `outside`. String rules support `equals`, `includes`, `startsWith`, `endsWith`, and `regex`. Each rule can be inverted with `negate: true`, and string rules may pass `caseSensitive: true` or custom regex `flags`. The highlight engine does its best to coerce formatted values, but you will get the most reliable results when you pass plain numbers or strings into `<Block>`.
|
||||||
|
|
||||||
## Descriptions
|
## Descriptions
|
||||||
|
|
||||||
Services may have descriptions,
|
Services may have descriptions,
|
||||||
|
|||||||
@@ -109,6 +109,20 @@ color: slate
|
|||||||
|
|
||||||
Supported colors are: `slate`, `gray`, `zinc`, `neutral`, `stone`, `amber`, `yellow`, `lime`, `green`, `emerald`, `teal`, `cyan`, `sky`, `blue`, `indigo`, `violet`, `purple`, `fuchsia`, `pink`, `rose`, `red`, `white`
|
Supported colors are: `slate`, `gray`, `zinc`, `neutral`, `stone`, `amber`, `yellow`, `lime`, `green`, `emerald`, `teal`, `cyan`, `sky`, `blue`, `indigo`, `violet`, `purple`, `fuchsia`, `pink`, `rose`, `red`, `white`
|
||||||
|
|
||||||
|
## Block Highlight Levels
|
||||||
|
|
||||||
|
You can override the default Tailwind classes applied when a widget highlight rule resolves to the `good`, `warn`, or `danger` level.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
blockHighlights:
|
||||||
|
levels:
|
||||||
|
good: "bg-emerald-500/40 text-emerald-950 dark:bg-emerald-900/60 dark:text-emerald-400"
|
||||||
|
warn: "bg-amber-300/30 text-amber-900 dark:bg-amber-900/30 dark:text-amber-200"
|
||||||
|
danger: "bg-rose-700/45 text-rose-200 dark:bg-rose-950/70 dark:text-rose-400"
|
||||||
|
```
|
||||||
|
|
||||||
|
Any unspecified level falls back to the built-in defaults.
|
||||||
|
|
||||||
## Layout
|
## Layout
|
||||||
|
|
||||||
You can configure service and bookmarks sections to be either "column" or "row" based layouts, like so:
|
You can configure service and bookmarks sections to be either "column" or "row" based layouts, like so:
|
||||||
@@ -486,9 +500,9 @@ logpath: /logfile/path
|
|||||||
|
|
||||||
By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`.
|
By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`.
|
||||||
|
|
||||||
## Show Docker Stats
|
## Show Container Stats
|
||||||
|
|
||||||
You can show all docker stats expanded in `settings.yaml`:
|
You can show all docker or proxmox stats expanded in `settings.yaml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
showStats: true
|
showStats: true
|
||||||
|
|||||||
@@ -62,3 +62,4 @@ To ensure cohesiveness of various widgets, the following should be used as a gui
|
|||||||
- Minimize the number of API calls
|
- Minimize the number of API calls
|
||||||
- Avoid the use of custom proxy unless absolutely necessary
|
- Avoid the use of custom proxy unless absolutely necessary
|
||||||
- Widgets should be 'read-only', as in they should not make write changes using the relevant tool's API. Homepage widgets are designed to surface information, not to be a (usually worse) replacement for the tool itself.
|
- Widgets should be 'read-only', as in they should not make write changes using the relevant tool's API. Homepage widgets are designed to surface information, not to be a (usually worse) replacement for the tool itself.
|
||||||
|
- Widgets should not allow manually overriding the "refresh interval" setting, as misconfigured refresh intervals can easily lead to performance issues for users.
|
||||||
|
|||||||
@@ -17,6 +17,6 @@ widget:
|
|||||||
url: http://komodo.hostname.or.ip:port
|
url: http://komodo.hostname.or.ip:port
|
||||||
key: K-xxxxxx...
|
key: K-xxxxxx...
|
||||||
secret: S-xxxxxx...
|
secret: S-xxxxxx...
|
||||||
showSummary: true # optional, default: false
|
showSummary: true # optional, default: false. Takes precedence over showStacks
|
||||||
showStacks: true # optional, default: false
|
showStacks: true # optional, default: false
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ title: Omada
|
|||||||
description: Omada Widget Configuration
|
description: Omada Widget Configuration
|
||||||
---
|
---
|
||||||
|
|
||||||
The widget supports controller versions 3, 4 and 5.
|
The widget supports controller versions 3, 4, 5 and 6.
|
||||||
|
|
||||||
Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`.
|
Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "connectedSwitches"]`.
|
||||||
|
|
||||||
|
|||||||
@@ -16,4 +16,5 @@ widget:
|
|||||||
username: username
|
username: username
|
||||||
password: password
|
password: password
|
||||||
enableLeechProgress: true # optional, defaults to false
|
enableLeechProgress: true # optional, defaults to false
|
||||||
|
enableLeechSize: true # optional, defaults to false
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ The Unraid widget allows you to monitor the resources of an Unraid server.
|
|||||||
**Minimum Requirements:**
|
**Minimum Requirements:**
|
||||||
|
|
||||||
- Unraid 7.2 -or- Unraid Connect plugin 2025.08.19.1850
|
- Unraid 7.2 -or- Unraid Connect plugin 2025.08.19.1850
|
||||||
- API key with the **GUEST** (read only) role: [Managing API Keys](https://docs.unraid.net/go/managing-api-keys)
|
- API key with the **ADMIN** role: [Managing API Keys](https://docs.unraid.net/go/managing-api-keys)
|
||||||
|
|
||||||
The widget can display metrics for selected Unraid pools. If using one of the "pool" fields, you must also add the pool name to the settings.
|
The widget can display metrics for selected Unraid pools. If using one of the "pool" fields, you must also add the pool name to the settings.
|
||||||
|
|
||||||
**Allowed fields:** `["cpu","memoryPercent","memoryAvailable","memoryUsed","notifications","arrayFreeSpace","arrayUsedSpace","arrayUsedPercent","status","pool1UsedSpace","pool1FreeSpace","pool1UsedPercent","pool2UsedSpace","pool2FreeSpace","pool2UsedPercent","pool3UsedSpace","pool3FreeSpace","pool3UsedPercent","pool4UsedSpace","pool4FreeSpace","pool4UsedPercent"]`
|
**Allowed fields:** `["cpu","memoryPercent","memoryAvailable","memoryUsed","notifications","arrayFree","arrayUsedSpace","arrayUsedPercent","status","pool1UsedSpace","pool1FreeSpace","pool1UsedPercent","pool2UsedSpace","pool2FreeSpace","pool2UsedPercent","pool3UsedSpace","pool3FreeSpace","pool3UsedPercent","pool4UsedSpace","pool4FreeSpace","pool4UsedPercent"]`
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
widget:
|
widget:
|
||||||
|
|||||||
28
docs/widgets/services/yourspotify.md
Normal file
28
docs/widgets/services/yourspotify.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
title: Your Spotify
|
||||||
|
description: Your Spotify Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Your Spotify](https://github.com/Yooooomi/your_spotify).
|
||||||
|
|
||||||
|
Find your API key under `Settings > Account > Public token`, click `Generate` if not yet generated, copy key after
|
||||||
|
`?token=`.
|
||||||
|
|
||||||
|
Allowed fields: `["songs", "time", "artists"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: yourspotify
|
||||||
|
url: http://your-spotify-server.host.or.ip # if using lsio image, add /api/
|
||||||
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
|
interval: month # optional, defaults to week
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Interval
|
||||||
|
|
||||||
|
Allowed values for `interval`: `day`, `week`, `month`, `year`, `all`.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
|
||||||
|
`interval` is different from predefined intervals you see in `Your Spotify`'s UI.
|
||||||
|
For example, `This week` in UI means _from the start of this week_, here `week` means _past 7 days_.
|
||||||
@@ -176,6 +176,7 @@ nav:
|
|||||||
- widgets/services/wgeasy.md
|
- widgets/services/wgeasy.md
|
||||||
- widgets/services/whatsupdocker.md
|
- widgets/services/whatsupdocker.md
|
||||||
- widgets/services/xteve.md
|
- widgets/services/xteve.md
|
||||||
|
- widgets/services/yourspotify.md
|
||||||
- widgets/services/zabbix.md
|
- widgets/services/zabbix.md
|
||||||
- "Information Widgets":
|
- "Information Widgets":
|
||||||
- widgets/info/index.md
|
- widgets/info/index.md
|
||||||
|
|||||||
27
package.json
27
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "homepage",
|
"name": "homepage",
|
||||||
"version": "1.5.0",
|
"version": "1.7.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "npx only-allow pnpm",
|
"preinstall": "npx only-allow pnpm",
|
||||||
@@ -11,14 +11,14 @@
|
|||||||
"telemetry": "next telemetry disable"
|
"telemetry": "next telemetry disable"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/react": "^2.2.7",
|
"@headlessui/react": "^2.2.9",
|
||||||
"@kubernetes/client-node": "^1.0.0",
|
"@kubernetes/client-node": "^1.0.0",
|
||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"compare-versions": "^6.1.1",
|
"compare-versions": "^6.1.1",
|
||||||
"dockerode": "^4.0.7",
|
"dockerode": "^4.0.7",
|
||||||
"follow-redirects": "^1.15.11",
|
"follow-redirects": "^1.15.11",
|
||||||
"gamedig": "^5.3.1",
|
"gamedig": "^5.3.2",
|
||||||
"i18next": "^24.2.3",
|
"i18next": "^25.5.3",
|
||||||
"ical.js": "^2.1.0",
|
"ical.js": "^2.1.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"json-rpc-2.0": "^1.7.0",
|
"json-rpc-2.0": "^1.7.0",
|
||||||
@@ -28,8 +28,8 @@
|
|||||||
"next": "^15.5.2",
|
"next": "^15.5.2",
|
||||||
"next-i18next": "^12.1.0",
|
"next-i18next": "^12.1.0",
|
||||||
"ping": "^0.4.4",
|
"ping": "^0.4.4",
|
||||||
"pretty-bytes": "^6.1.1",
|
"pretty-bytes": "^7.1.0",
|
||||||
"raw-body": "^3.0.0",
|
"raw-body": "^3.0.1",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"react-i18next": "^15.5.3",
|
"react-i18next": "^15.5.3",
|
||||||
@@ -44,18 +44,18 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/forms": "^0.5.10",
|
"@tailwindcss/forms": "^0.5.10",
|
||||||
"@tailwindcss/postcss": "^4.0.9",
|
"@tailwindcss/postcss": "^4.1.14",
|
||||||
"eslint": "^9.25.1",
|
"eslint": "^9.25.1",
|
||||||
"eslint-config-next": "^15.2.4",
|
"eslint-config-next": "^15.2.4",
|
||||||
"eslint-config-prettier": "^10.1.1",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-import": "^2.32.0",
|
"eslint-plugin-import": "^2.32.0",
|
||||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||||
"eslint-plugin-prettier": "^5.5.1",
|
"eslint-plugin-prettier": "^5.5.4",
|
||||||
"eslint-plugin-react": "^7.37.4",
|
"eslint-plugin-react": "^7.37.4",
|
||||||
"eslint-plugin-react-hooks": "^5.2.0",
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"prettier": "^3.6.2",
|
"prettier": "^3.6.2",
|
||||||
"prettier-plugin-organize-imports": "^4.1.0",
|
"prettier-plugin-organize-imports": "^4.3.0",
|
||||||
"tailwind-scrollbar": "^4.0.2",
|
"tailwind-scrollbar": "^4.0.2",
|
||||||
"tailwindcss": "^4.0.9",
|
"tailwindcss": "^4.0.9",
|
||||||
"typescript": "^5.7.3"
|
"typescript": "^5.7.3"
|
||||||
@@ -63,13 +63,6 @@
|
|||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"osx-temperature-sensor": "^1.0.8"
|
"osx-temperature-sensor": "^1.0.8"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.8.1",
|
|
||||||
"devEngines": {
|
|
||||||
"packageManager": {
|
|
||||||
"name": "pnpm",
|
|
||||||
"version": "10.8.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
"osx-temperature-sensor",
|
"osx-temperature-sensor",
|
||||||
|
|||||||
663
pnpm-lock.yaml
generated
663
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1093,7 +1093,7 @@
|
|||||||
"DISABLE_DISK": "Skyf Gedeaktiveer",
|
"DISABLE_DISK": "Skyf Gedeaktiveer",
|
||||||
"SWAP_DSBL": "Ruil Gedeaktiveer",
|
"SWAP_DSBL": "Ruil Gedeaktiveer",
|
||||||
"INVALID_EXPANSION": "Ongeldige Uitbreiding",
|
"INVALID_EXPANSION": "Ongeldige Uitbreiding",
|
||||||
"PARITY_NOT_BIGGEST": "Pariteit nie die grootste nie",
|
"PARITY_NOT_BIGGEST": "Pariteit nie die Grootste nie",
|
||||||
"TOO_MANY_MISSING_DISKS": "Te Veel Ontbrekende Skywe",
|
"TOO_MANY_MISSING_DISKS": "Te Veel Ontbrekende Skywe",
|
||||||
"NEW_DISK_TOO_SMALL": "Nuwe Skyf te Klein",
|
"NEW_DISK_TOO_SMALL": "Nuwe Skyf te Klein",
|
||||||
"NO_DATA_DISKS": "Geen Data Skywe",
|
"NO_DATA_DISKS": "Geen Data Skywe",
|
||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Slaag",
|
"num_success_latest": "Slaag",
|
||||||
"num_failure_latest": "Mislukking",
|
"num_failure_latest": "Mislukking",
|
||||||
"bytes_added_30": "Grepe bygevoeg"
|
"bytes_added_30": "Grepe bygevoeg"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Liedjies",
|
||||||
|
"time": "Tyd",
|
||||||
|
"artists": "Kunstenaars"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,8 +93,8 @@
|
|||||||
"http_status": "HTTP-Status",
|
"http_status": "HTTP-Status",
|
||||||
"error": "Fehler",
|
"error": "Fehler",
|
||||||
"response": "Antwort",
|
"response": "Antwort",
|
||||||
"down": "Online",
|
"down": "Offline",
|
||||||
"up": "Offline",
|
"up": "Online",
|
||||||
"not_available": "Nicht verfügbar"
|
"not_available": "Nicht verfügbar"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
"pending": "Wartend",
|
"pending": "Wartend",
|
||||||
"approved": "Genehmigt",
|
"approved": "Genehmigt",
|
||||||
"available": "Verfügbar",
|
"available": "Verfügbar",
|
||||||
"issues": "Open Issues"
|
"issues": "Offene Issues"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Wartend",
|
"pending": "Wartend",
|
||||||
@@ -1086,33 +1086,38 @@
|
|||||||
"nextRenewingSubscription": "Nächste Zahlung"
|
"nextRenewingSubscription": "Nächste Zahlung"
|
||||||
},
|
},
|
||||||
"unraid": {
|
"unraid": {
|
||||||
"STARTED": "Started",
|
"STARTED": "Gestartet",
|
||||||
"STOPPED": "Stopped",
|
"STOPPED": "Angehalten",
|
||||||
"NEW_ARRAY": "New Array",
|
"NEW_ARRAY": "Neues Array",
|
||||||
"RECON_DISK": "Reconstructing Disk",
|
"RECON_DISK": "Festplatte wird neu aufgebaut",
|
||||||
"DISABLE_DISK": "Disk Disabled",
|
"DISABLE_DISK": "Festplatte deaktiviert",
|
||||||
"SWAP_DSBL": "Swap Disable",
|
"SWAP_DSBL": "Swap deaktivieren",
|
||||||
"INVALID_EXPANSION": "Invalid Expansion",
|
"INVALID_EXPANSION": "Üngültige Erweiterung",
|
||||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
||||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
"TOO_MANY_MISSING_DISKS": "Zu viele fehlende Festplatten",
|
||||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
"NEW_DISK_TOO_SMALL": "Neue Festplatte zu klein",
|
||||||
"NO_DATA_DISKS": "No Data Disks",
|
"NO_DATA_DISKS": "Keine Datenträger",
|
||||||
"notifications": "Notifications",
|
"notifications": "Mitteilungen",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"memoryUsed": "Memory Used",
|
"memoryUsed": "Speichernutzung",
|
||||||
"memoryAvailable": "Memory Available",
|
"memoryAvailable": "Verfügbarer Speicher",
|
||||||
"arrayUsed": "Array Used",
|
"arrayUsed": "Array verwendet",
|
||||||
"arrayFree": "Array Free",
|
"arrayFree": "Array frei",
|
||||||
"poolUsed": "{{pool}} Used",
|
"poolUsed": "{{pool}} verwendet",
|
||||||
"poolFree": "{{pool}} Free"
|
"poolFree": "{{pool}} frei"
|
||||||
},
|
},
|
||||||
"backrest": {
|
"backrest": {
|
||||||
"num_plans": "Plans",
|
"num_plans": "Pläne",
|
||||||
"num_success_30": "Successes",
|
"num_success_30": "Erfolgreich",
|
||||||
"num_failure_30": "Failures",
|
"num_failure_30": "Fehlerhaft",
|
||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Erfolgreich",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Fehlgeschlagen",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes hinzugefügt"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Titel",
|
||||||
|
"time": "Zeit",
|
||||||
|
"artists": "Künstler"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,7 +276,7 @@
|
|||||||
"pending": "Pendiente",
|
"pending": "Pendiente",
|
||||||
"approved": "Aprobado",
|
"approved": "Aprobado",
|
||||||
"available": "Disponible",
|
"available": "Disponible",
|
||||||
"issues": "Open Issues"
|
"issues": "Issues Abiertos"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pendiente",
|
"pending": "Pendiente",
|
||||||
@@ -1108,11 +1108,16 @@
|
|||||||
"poolFree": "{{pool}} Libre"
|
"poolFree": "{{pool}} Libre"
|
||||||
},
|
},
|
||||||
"backrest": {
|
"backrest": {
|
||||||
"num_plans": "Plans",
|
"num_plans": "Planes",
|
||||||
"num_success_30": "Successes",
|
"num_success_30": "Éxitos",
|
||||||
"num_failure_30": "Failures",
|
"num_failure_30": "Fallos",
|
||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Exitosa",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Fallida",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Añadidos"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Canciones",
|
||||||
|
"time": "Tiempo",
|
||||||
|
"artists": "Artistas"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,7 +276,7 @@
|
|||||||
"pending": "En attente",
|
"pending": "En attente",
|
||||||
"approved": "Approuvé",
|
"approved": "Approuvé",
|
||||||
"available": "Disponible",
|
"available": "Disponible",
|
||||||
"issues": "Open Issues"
|
"issues": "Problèmes non résolus"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "En attente",
|
"pending": "En attente",
|
||||||
@@ -1086,33 +1086,38 @@
|
|||||||
"nextRenewingSubscription": "Prochain paiement"
|
"nextRenewingSubscription": "Prochain paiement"
|
||||||
},
|
},
|
||||||
"unraid": {
|
"unraid": {
|
||||||
"STARTED": "Started",
|
"STARTED": "Commencé",
|
||||||
"STOPPED": "Stopped",
|
"STOPPED": "Arrêté",
|
||||||
"NEW_ARRAY": "New Array",
|
"NEW_ARRAY": "Nouveau tableau",
|
||||||
"RECON_DISK": "Reconstructing Disk",
|
"RECON_DISK": "Reconstruction du disque",
|
||||||
"DISABLE_DISK": "Disk Disabled",
|
"DISABLE_DISK": "Disque désactivé",
|
||||||
"SWAP_DSBL": "Swap Disable",
|
"SWAP_DSBL": "Swap Disable",
|
||||||
"INVALID_EXPANSION": "Invalid Expansion",
|
"INVALID_EXPANSION": "Extension invalide",
|
||||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
"PARITY_NOT_BIGGEST": "La parité n'est pas la plus grande",
|
||||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
"TOO_MANY_MISSING_DISKS": "Trop de disques manquants",
|
||||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
"NEW_DISK_TOO_SMALL": "Nouveau disque trop petit",
|
||||||
"NO_DATA_DISKS": "No Data Disks",
|
"NO_DATA_DISKS": "Aucun disque de données",
|
||||||
"notifications": "Notifications",
|
"notifications": "Notifications",
|
||||||
"status": "Status",
|
"status": "État",
|
||||||
"cpu": "CPU",
|
"cpu": "UCT",
|
||||||
"memoryUsed": "Memory Used",
|
"memoryUsed": "Mémoire Utilisé",
|
||||||
"memoryAvailable": "Memory Available",
|
"memoryAvailable": "Mémoire Disponible",
|
||||||
"arrayUsed": "Array Used",
|
"arrayUsed": "RAID utilisé",
|
||||||
"arrayFree": "Array Free",
|
"arrayFree": "RAID libre",
|
||||||
"poolUsed": "{{pool}} Used",
|
"poolUsed": "{{pool}} Utilisé",
|
||||||
"poolFree": "{{pool}} Free"
|
"poolFree": "{{pool}} Libre"
|
||||||
},
|
},
|
||||||
"backrest": {
|
"backrest": {
|
||||||
"num_plans": "Plans",
|
"num_plans": "Abonnements",
|
||||||
"num_success_30": "Successes",
|
"num_success_30": "Succès",
|
||||||
"num_failure_30": "Failures",
|
"num_failure_30": "Échecs",
|
||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Réussi",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Échoué",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Octets ajoutés"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Musiques",
|
||||||
|
"time": "Durée",
|
||||||
|
"artists": "Artistes"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -61,16 +61,16 @@
|
|||||||
"wlan_devices": "WLAN Eszközök",
|
"wlan_devices": "WLAN Eszközök",
|
||||||
"lan_users": "LAN Felhasználók",
|
"lan_users": "LAN Felhasználók",
|
||||||
"wlan_users": "WLAN Felhasználók",
|
"wlan_users": "WLAN Felhasználók",
|
||||||
"up": "UP",
|
"up": "FUT",
|
||||||
"down": "ÁLL",
|
"down": "ÁLL",
|
||||||
"wait": "Please wait",
|
"wait": "Kérjük várjon",
|
||||||
"empty_data": "Az alrendszer állapota ismeretlen"
|
"empty_data": "Az alrendszer állapota ismeretlen"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
"tx": "TX",
|
"tx": "TX",
|
||||||
"mem": "MEM",
|
"mem": "MEM",
|
||||||
"cpu": "CPU",
|
"cpu": "Processzor",
|
||||||
"running": "Futó",
|
"running": "Futó",
|
||||||
"offline": "Nem elérhető",
|
"offline": "Nem elérhető",
|
||||||
"error": "Hiba",
|
"error": "Hiba",
|
||||||
@@ -93,8 +93,8 @@
|
|||||||
"http_status": "HTTP állapot",
|
"http_status": "HTTP állapot",
|
||||||
"error": "Hiba",
|
"error": "Hiba",
|
||||||
"response": "Válasz",
|
"response": "Válasz",
|
||||||
"down": "Down",
|
"down": "Leállt",
|
||||||
"up": "Up",
|
"up": "Fut",
|
||||||
"not_available": "Nem elérhető"
|
"not_available": "Nem elérhető"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
@@ -108,10 +108,10 @@
|
|||||||
"songs": "Zeneszám"
|
"songs": "Zeneszám"
|
||||||
},
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Nem elérhető",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Nem elérhető",
|
||||||
"online": "Csatlakozva",
|
"online": "Csatlakozva",
|
||||||
"total": "Total",
|
"total": "Összes",
|
||||||
"unknown": "Ismeretlen"
|
"unknown": "Ismeretlen"
|
||||||
},
|
},
|
||||||
"evcc": {
|
"evcc": {
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
"unread": "Olvasatlan"
|
"unread": "Olvasatlan"
|
||||||
},
|
},
|
||||||
"fritzbox": {
|
"fritzbox": {
|
||||||
"connectionStatus": "Status",
|
"connectionStatus": "Státusz",
|
||||||
"connectionStatusUnconfigured": "Nem beállított",
|
"connectionStatusUnconfigured": "Nem beállított",
|
||||||
"connectionStatusConnecting": "Kapcsolódás",
|
"connectionStatusConnecting": "Kapcsolódás",
|
||||||
"connectionStatusAuthenticating": "Hitelesítés",
|
"connectionStatusAuthenticating": "Hitelesítés",
|
||||||
@@ -141,16 +141,16 @@
|
|||||||
"connectionStatusDisconnecting": "Kapcsolat bontása",
|
"connectionStatusDisconnecting": "Kapcsolat bontása",
|
||||||
"connectionStatusDisconnected": "Kapcsolat bontva",
|
"connectionStatusDisconnected": "Kapcsolat bontva",
|
||||||
"connectionStatusConnected": "Csatlakozva",
|
"connectionStatusConnected": "Csatlakozva",
|
||||||
"uptime": "Uptime",
|
"uptime": "Működési idő",
|
||||||
"maxDown": "Max let.",
|
"maxDown": "Max let.",
|
||||||
"maxUp": "Max felt.",
|
"maxUp": "Max felt.",
|
||||||
"down": "Down",
|
"down": "Leállt",
|
||||||
"up": "Up",
|
"up": "Fut",
|
||||||
"received": "Fogadott",
|
"received": "Fogadott",
|
||||||
"sent": "Küldött",
|
"sent": "Küldött",
|
||||||
"externalIPAddress": "Külső IP cím",
|
"externalIPAddress": "Külső IP cím",
|
||||||
"externalIPv6Address": "Ext. IPv6",
|
"externalIPv6Address": "Küls. IPv6",
|
||||||
"externalIPv6Prefix": "Ext. IPv6-Prefix"
|
"externalIPv6Prefix": "Küls. IPv6-Prefix"
|
||||||
},
|
},
|
||||||
"caddy": {
|
"caddy": {
|
||||||
"upstreams": "Upstreamek",
|
"upstreams": "Upstreamek",
|
||||||
@@ -168,17 +168,17 @@
|
|||||||
"passes": "Engedélyek"
|
"passes": "Engedélyek"
|
||||||
},
|
},
|
||||||
"tautulli": {
|
"tautulli": {
|
||||||
"playing": "Playing",
|
"playing": "Lejátszás",
|
||||||
"transcoding": "Transcoding",
|
"transcoding": "Transzkódolás",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitráta",
|
||||||
"no_active": "No Active Streams",
|
"no_active": "Nincs aktív lejátszás",
|
||||||
"plex_connection_error": "Plex kapcsolat ellenőrzése"
|
"plex_connection_error": "Plex kapcsolat ellenőrzése"
|
||||||
},
|
},
|
||||||
"omada": {
|
"omada": {
|
||||||
"connectedAp": "Csatlakoztatott AP-k",
|
"connectedAp": "Csatlakoztatott AP-k",
|
||||||
"activeUser": "Aktív eszközök",
|
"activeUser": "Aktív eszközök",
|
||||||
"alerts": "Riasztások",
|
"alerts": "Riasztások",
|
||||||
"connectedGateways": "Connected gateways",
|
"connectedGateways": "Csatlakoztatott gateway-ek",
|
||||||
"connectedSwitches": "Csatlakoztatott switch-ek"
|
"connectedSwitches": "Csatlakoztatott switch-ek"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
@@ -189,11 +189,11 @@
|
|||||||
"plex": {
|
"plex": {
|
||||||
"streams": "Aktív Stream-ek",
|
"streams": "Aktív Stream-ek",
|
||||||
"albums": "Albumok",
|
"albums": "Albumok",
|
||||||
"movies": "Movies",
|
"movies": "Filmek",
|
||||||
"tv": "TV műsorok"
|
"tv": "TV műsorok"
|
||||||
},
|
},
|
||||||
"sabnzbd": {
|
"sabnzbd": {
|
||||||
"rate": "Rate",
|
"rate": "Ráta",
|
||||||
"queue": "Sor",
|
"queue": "Sor",
|
||||||
"timeleft": "Hátralévő idő"
|
"timeleft": "Hátralévő idő"
|
||||||
},
|
},
|
||||||
@@ -233,34 +233,34 @@
|
|||||||
"cachemissbytes": "Gyorsítótárban Hibás Bitek"
|
"cachemissbytes": "Gyorsítótárban Hibás Bitek"
|
||||||
},
|
},
|
||||||
"downloadstation": {
|
"downloadstation": {
|
||||||
"download": "Download",
|
"download": "Letöltés",
|
||||||
"upload": "Upload",
|
"upload": "Feltöltés",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
"sonarr": {
|
"sonarr": {
|
||||||
"wanted": "Keresett",
|
"wanted": "Keresett",
|
||||||
"queued": "Sorban áll",
|
"queued": "Sorban áll",
|
||||||
"series": "Series",
|
"series": "Sorozatok",
|
||||||
"queue": "Queue",
|
"queue": "Várólista",
|
||||||
"unknown": "Unknown"
|
"unknown": "Ismeretlen"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Keresett",
|
||||||
"missing": "Hiányzik",
|
"missing": "Hiányzik",
|
||||||
"queued": "Queued",
|
"queued": "Sorban áll",
|
||||||
"movies": "Movies",
|
"movies": "Filmek",
|
||||||
"queue": "Queue",
|
"queue": "Várólista",
|
||||||
"unknown": "Unknown"
|
"unknown": "Ismeretlen"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Keresett",
|
||||||
"queued": "Queued",
|
"queued": "Sorban áll",
|
||||||
"artists": "Előadók"
|
"artists": "Előadók"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Keresett",
|
||||||
"queued": "Queued",
|
"queued": "Sorban áll",
|
||||||
"books": "Könyvek"
|
"books": "Könyvek"
|
||||||
},
|
},
|
||||||
"bazarr": {
|
"bazarr": {
|
||||||
@@ -273,20 +273,20 @@
|
|||||||
"available": "Elérhető"
|
"available": "Elérhető"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Függőben lévő",
|
||||||
"approved": "Approved",
|
"approved": "Jóváhagyott",
|
||||||
"available": "Available",
|
"available": "Elérhető",
|
||||||
"issues": "Open Issues"
|
"issues": "Nyitott problémák"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Függőben lévő",
|
||||||
"processing": "Feldolgozás",
|
"processing": "Feldolgozás",
|
||||||
"approved": "Approved",
|
"approved": "Jóváhagyott",
|
||||||
"available": "Available"
|
"available": "Elérhető"
|
||||||
},
|
},
|
||||||
"netalertx": {
|
"netalertx": {
|
||||||
"total": "Total",
|
"total": "Összes",
|
||||||
"connected": "Connected",
|
"connected": "Csatlakoztatott",
|
||||||
"new_devices": "Új eszközök",
|
"new_devices": "Új eszközök",
|
||||||
"down_alerts": "Leállási riasztások"
|
"down_alerts": "Leállási riasztások"
|
||||||
},
|
},
|
||||||
@@ -297,26 +297,26 @@
|
|||||||
"gravity": "Gravitáció"
|
"gravity": "Gravitáció"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"queries": "Queries",
|
"queries": "Lekérdezések",
|
||||||
"blocked": "Blocked",
|
"blocked": "Blokkolt",
|
||||||
"filtered": "Szűrt",
|
"filtered": "Szűrt",
|
||||||
"latency": "Késleltetés"
|
"latency": "Késleltetés"
|
||||||
},
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Upload",
|
"upload": "Feltöltés",
|
||||||
"download": "Download",
|
"download": "Letöltés",
|
||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "Running",
|
"running": "Folyamatban",
|
||||||
"stopped": "Megállított",
|
"stopped": "Megállított",
|
||||||
"total": "Total"
|
"total": "Összes"
|
||||||
},
|
},
|
||||||
"suwayomi": {
|
"suwayomi": {
|
||||||
"download": "Downloaded",
|
"download": "Letöltött",
|
||||||
"nondownload": "Nem Letöltött",
|
"nondownload": "Nem Letöltött",
|
||||||
"read": "Read",
|
"read": "Olvasott",
|
||||||
"unread": "Unread",
|
"unread": "Olvasatlan",
|
||||||
"downloadedread": "Letöltött & Olvasott",
|
"downloadedread": "Letöltött & Olvasott",
|
||||||
"downloadedunread": "Letöltött & Olvasatlan",
|
"downloadedunread": "Letöltött & Olvasatlan",
|
||||||
"nondownloadedread": "Nem Letöltött & Olvasatlan",
|
"nondownloadedread": "Nem Letöltött & Olvasatlan",
|
||||||
@@ -337,7 +337,7 @@
|
|||||||
"ago": "{{value}} Ezelőtt"
|
"ago": "{{value}} Ezelőtt"
|
||||||
},
|
},
|
||||||
"technitium": {
|
"technitium": {
|
||||||
"totalQueries": "Queries",
|
"totalQueries": "Lekérdezések",
|
||||||
"totalNoError": "Sikerek",
|
"totalNoError": "Sikerek",
|
||||||
"totalServerFailure": "Hibák",
|
"totalServerFailure": "Hibák",
|
||||||
"totalNxDomain": "NX Domainek",
|
"totalNxDomain": "NX Domainek",
|
||||||
@@ -345,12 +345,12 @@
|
|||||||
"totalAuthoritative": "Irányadó",
|
"totalAuthoritative": "Irányadó",
|
||||||
"totalRecursive": "Rekurzív",
|
"totalRecursive": "Rekurzív",
|
||||||
"totalCached": "Gyorsítótárazott",
|
"totalCached": "Gyorsítótárazott",
|
||||||
"totalBlocked": "Blocked",
|
"totalBlocked": "Blokkolt",
|
||||||
"totalDropped": "Eldobott",
|
"totalDropped": "Eldobott",
|
||||||
"totalClients": "Kliensek"
|
"totalClients": "Kliensek"
|
||||||
},
|
},
|
||||||
"tdarr": {
|
"tdarr": {
|
||||||
"queue": "Queue",
|
"queue": "Várólista",
|
||||||
"processed": "Feldolgozott",
|
"processed": "Feldolgozott",
|
||||||
"errored": "Hibás",
|
"errored": "Hibás",
|
||||||
"saved": "Mentett"
|
"saved": "Mentett"
|
||||||
@@ -361,19 +361,19 @@
|
|||||||
"middleware": "Közvetítő"
|
"middleware": "Közvetítő"
|
||||||
},
|
},
|
||||||
"trilium": {
|
"trilium": {
|
||||||
"version": "Version",
|
"version": "Verzió",
|
||||||
"notesCount": "Notes",
|
"notesCount": "Jegyzetek",
|
||||||
"dbSize": "Database Size",
|
"dbSize": "Adatbázis mérete",
|
||||||
"unknown": "Unknown"
|
"unknown": "Ismeretlen"
|
||||||
},
|
},
|
||||||
"navidrome": {
|
"navidrome": {
|
||||||
"nothing_streaming": "No Active Streams",
|
"nothing_streaming": "Nincs aktív lejátszás",
|
||||||
"please_wait": "Kérjük Várjon"
|
"please_wait": "Kérjük Várjon"
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
"enabled": "Bekapcsolva",
|
"enabled": "Bekapcsolva",
|
||||||
"disabled": "Kikapcsolva",
|
"disabled": "Kikapcsolva",
|
||||||
"total": "Total"
|
"total": "Összes"
|
||||||
},
|
},
|
||||||
"coinmarketcap": {
|
"coinmarketcap": {
|
||||||
"configure": "Állíts be egy vagy több Cryptovalutát a követéshez",
|
"configure": "Állíts be egy vagy több Cryptovalutát a követéshez",
|
||||||
@@ -384,73 +384,73 @@
|
|||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Applikációk",
|
"apps": "Applikációk",
|
||||||
"clients": "Clients",
|
"clients": "Kliensek",
|
||||||
"messages": "Üzenetek"
|
"messages": "Üzenetek"
|
||||||
},
|
},
|
||||||
"prowlarr": {
|
"prowlarr": {
|
||||||
"enableIndexers": "Indexerek",
|
"enableIndexers": "Indexerek",
|
||||||
"numberOfGrabs": "Fogott",
|
"numberOfGrabs": "Fogott",
|
||||||
"numberOfQueries": "Queries",
|
"numberOfQueries": "Lekérdezések",
|
||||||
"numberOfFailGrabs": "Hibás fogások",
|
"numberOfFailGrabs": "Hibás fogások",
|
||||||
"numberOfFailQueries": "Hibás lekérdezések"
|
"numberOfFailQueries": "Hibás lekérdezések"
|
||||||
},
|
},
|
||||||
"jackett": {
|
"jackett": {
|
||||||
"configured": "Beállított",
|
"configured": "Beállított",
|
||||||
"errored": "Errored"
|
"errored": "Hibák"
|
||||||
},
|
},
|
||||||
"strelaysrv": {
|
"strelaysrv": {
|
||||||
"numActiveSessions": "Munkamenetek",
|
"numActiveSessions": "Munkamenetek",
|
||||||
"numConnections": "Csatlakozások",
|
"numConnections": "Csatlakozások",
|
||||||
"dataRelayed": "Átirányított",
|
"dataRelayed": "Átirányított",
|
||||||
"transferRate": "Rate"
|
"transferRate": "Ráta"
|
||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "Users",
|
"user_count": "Felhasználók",
|
||||||
"status_count": "Posztok",
|
"status_count": "Posztok",
|
||||||
"domain_count": "Domainek"
|
"domain_count": "Domainek"
|
||||||
},
|
},
|
||||||
"medusa": {
|
"medusa": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Keresett",
|
||||||
"queued": "Queued",
|
"queued": "Sorban áll",
|
||||||
"series": "Series"
|
"series": "Sorozatok"
|
||||||
},
|
},
|
||||||
"minecraft": {
|
"minecraft": {
|
||||||
"players": "Lejátszók",
|
"players": "Lejátszók",
|
||||||
"version": "Verzió",
|
"version": "Verzió",
|
||||||
"status": "Status",
|
"status": "Státusz",
|
||||||
"up": "Online",
|
"up": "Kapcsolódva",
|
||||||
"down": "Offline"
|
"down": "Nem elérhető"
|
||||||
},
|
},
|
||||||
"miniflux": {
|
"miniflux": {
|
||||||
"read": "Olvasott",
|
"read": "Olvasott",
|
||||||
"unread": "Unread"
|
"unread": "Olvasatlan"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Felhasználók",
|
||||||
"loginsLast24H": "Bejelentkezések (24 óra)",
|
"loginsLast24H": "Bejelentkezések (24 óra)",
|
||||||
"failedLoginsLast24H": "Sikertelen bejelentkezések (24h)"
|
"failedLoginsLast24H": "Sikertelen bejelentkezések (24h)"
|
||||||
},
|
},
|
||||||
"proxmox": {
|
"proxmox": {
|
||||||
"mem": "MEM",
|
"mem": "MEM",
|
||||||
"cpu": "CPU",
|
"cpu": "Processzor",
|
||||||
"lxc": "LXC-k",
|
"lxc": "LXC-k",
|
||||||
"vms": "VM-ek"
|
"vms": "VM-ek"
|
||||||
},
|
},
|
||||||
"glances": {
|
"glances": {
|
||||||
"cpu": "CPU",
|
"cpu": "Processzor",
|
||||||
"load": "Load",
|
"load": "Terhelés",
|
||||||
"wait": "Please wait",
|
"wait": "Kérem várjon",
|
||||||
"temp": "TEMP",
|
"temp": "HŐM",
|
||||||
"_temp": "Hőmérséklet",
|
"_temp": "Hőmérséklet",
|
||||||
"warn": "Figyelmeztet",
|
"warn": "Figyelmeztet",
|
||||||
"uptime": "UP",
|
"uptime": "FUT",
|
||||||
"total": "Total",
|
"total": "Összes",
|
||||||
"free": "Free",
|
"free": "Szabad",
|
||||||
"used": "Used",
|
"used": "Felhasznált",
|
||||||
"days": "d",
|
"days": "n",
|
||||||
"hours": "h",
|
"hours": "ó",
|
||||||
"crit": "Kritikus",
|
"crit": "Kritikus",
|
||||||
"read": "Read",
|
"read": "Olvasott",
|
||||||
"write": "Írás",
|
"write": "Írás",
|
||||||
"gpu": "GPU",
|
"gpu": "GPU",
|
||||||
"mem": "Memória",
|
"mem": "Memória",
|
||||||
@@ -471,57 +471,57 @@
|
|||||||
"1-day": "Többnyire napos",
|
"1-day": "Többnyire napos",
|
||||||
"1-night": "Többnyire derült",
|
"1-night": "Többnyire derült",
|
||||||
"2-day": "Részben felhős",
|
"2-day": "Részben felhős",
|
||||||
"2-night": "Partly Cloudy",
|
"2-night": "Részben felhős",
|
||||||
"3-day": "Felhős",
|
"3-day": "Felhős",
|
||||||
"3-night": "Cloudy",
|
"3-night": "Felhős",
|
||||||
"45-day": "Ködös",
|
"45-day": "Ködös",
|
||||||
"45-night": "Foggy",
|
"45-night": "Ködös",
|
||||||
"48-day": "Foggy",
|
"48-day": "Ködös",
|
||||||
"48-night": "Foggy",
|
"48-night": "Ködös",
|
||||||
"51-day": "Enyhe szitálás",
|
"51-day": "Enyhe szitálás",
|
||||||
"51-night": "Light Drizzle",
|
"51-night": "Enyhe szitálás",
|
||||||
"53-day": "Szitálás",
|
"53-day": "Szitálás",
|
||||||
"53-night": "Drizzle",
|
"53-night": "Szitálás",
|
||||||
"55-day": "Erős szitálás",
|
"55-day": "Erős szitálás",
|
||||||
"55-night": "Heavy Drizzle",
|
"55-night": "Erős szitálás",
|
||||||
"56-day": "Enyhe fagyos szitálás",
|
"56-day": "Enyhe fagyos szitálás",
|
||||||
"56-night": "Light Freezing Drizzle",
|
"56-night": "Enyhe fagyos szitálás",
|
||||||
"57-day": "Fagyos szitálás",
|
"57-day": "Fagyos szitálás",
|
||||||
"57-night": "Freezing Drizzle",
|
"57-night": "Fagyos szitálás",
|
||||||
"61-day": "Enyhe eső",
|
"61-day": "Enyhe eső",
|
||||||
"61-night": "Light Rain",
|
"61-night": "Enyhe eső",
|
||||||
"63-day": "Eső",
|
"63-day": "Eső",
|
||||||
"63-night": "Rain",
|
"63-night": "Eső",
|
||||||
"65-day": "Heves eső",
|
"65-day": "Heves eső",
|
||||||
"65-night": "Heavy Rain",
|
"65-night": "Heves eső",
|
||||||
"66-day": "Ónos eső",
|
"66-day": "Ónos eső",
|
||||||
"66-night": "Freezing Rain",
|
"66-night": "Ónos eső",
|
||||||
"67-day": "Freezing Rain",
|
"67-day": "Ónos eső",
|
||||||
"67-night": "Freezing Rain",
|
"67-night": "Ónos eső",
|
||||||
"71-day": "Enyhe havazás",
|
"71-day": "Enyhe havazás",
|
||||||
"71-night": "Light Snow",
|
"71-night": "Enyhe havazás",
|
||||||
"73-day": "Hó",
|
"73-day": "Hó",
|
||||||
"73-night": "Snow",
|
"73-night": "Havazás",
|
||||||
"75-day": "Erős havazás",
|
"75-day": "Erős havazás",
|
||||||
"75-night": "Heavy Snow",
|
"75-night": "Erős havazás",
|
||||||
"77-day": "Hódara",
|
"77-day": "Hódara",
|
||||||
"77-night": "Snow Grains",
|
"77-night": "Hódara",
|
||||||
"80-day": "Enyhe záporok",
|
"80-day": "Enyhe záporok",
|
||||||
"80-night": "Light Showers",
|
"80-night": "Enyhe záporok",
|
||||||
"81-day": "Záporok",
|
"81-day": "Záporok",
|
||||||
"81-night": "Showers",
|
"81-night": "Záporok",
|
||||||
"82-day": "Heves záporok",
|
"82-day": "Heves záporok",
|
||||||
"82-night": "Heavy Showers",
|
"82-night": "Heves záporok",
|
||||||
"85-day": "Hózáporok",
|
"85-day": "Hózáporok",
|
||||||
"85-night": "Snow Showers",
|
"85-night": "Hózáporok",
|
||||||
"86-day": "Snow Showers",
|
"86-day": "Hózáporok",
|
||||||
"86-night": "Snow Showers",
|
"86-night": "Hózáporok",
|
||||||
"95-day": "Zivatar",
|
"95-day": "Zivatar",
|
||||||
"95-night": "Thunderstorm",
|
"95-night": "Vihar",
|
||||||
"96-day": "Zivatar jégesővel",
|
"96-day": "Zivatar jégesővel",
|
||||||
"96-night": "Thunderstorm With Hail",
|
"96-night": "Zivatar jégesővel",
|
||||||
"99-day": "Thunderstorm With Hail",
|
"99-day": "Zivatar jégesővel",
|
||||||
"99-night": "Thunderstorm With Hail"
|
"99-night": "Zivatar jégesővel"
|
||||||
},
|
},
|
||||||
"homebridge": {
|
"homebridge": {
|
||||||
"available_update": "Rendszer",
|
"available_update": "Rendszer",
|
||||||
@@ -530,17 +530,17 @@
|
|||||||
"up_to_date": "Naprakész",
|
"up_to_date": "Naprakész",
|
||||||
"child_bridges": "Gyerek Hidak",
|
"child_bridges": "Gyerek Hidak",
|
||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Fut",
|
||||||
"pending": "Pending",
|
"pending": "Függőben lévő",
|
||||||
"down": "Down"
|
"down": "Leállt"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Új",
|
"new": "Új",
|
||||||
"up": "Up",
|
"up": "Fut",
|
||||||
"grace": "Türelmi idő alatt",
|
"grace": "Türelmi idő alatt",
|
||||||
"down": "Down",
|
"down": "Leállt",
|
||||||
"paused": "Szünetel",
|
"paused": "Szünetel",
|
||||||
"status": "Status",
|
"status": "Státusz",
|
||||||
"last_ping": "Legutóbbi Ping",
|
"last_ping": "Legutóbbi Ping",
|
||||||
"never": "Még nincsenek ping-ek"
|
"never": "Még nincsenek ping-ek"
|
||||||
},
|
},
|
||||||
@@ -550,21 +550,21 @@
|
|||||||
"containers_failed": "Sikertelen"
|
"containers_failed": "Sikertelen"
|
||||||
},
|
},
|
||||||
"autobrr": {
|
"autobrr": {
|
||||||
"approvedPushes": "Approved",
|
"approvedPushes": "Jóváhagyott",
|
||||||
"rejectedPushes": "Elutasított",
|
"rejectedPushes": "Elutasított",
|
||||||
"filters": "Szűrők",
|
"filters": "Szűrők",
|
||||||
"indexers": "Indexers"
|
"indexers": "Indexerek"
|
||||||
},
|
},
|
||||||
"tubearchivist": {
|
"tubearchivist": {
|
||||||
"downloads": "Queue",
|
"downloads": "Várólista",
|
||||||
"videos": "Videók",
|
"videos": "Videók",
|
||||||
"channels": "Csatornák",
|
"channels": "Csatornák",
|
||||||
"playlists": "Lejátszási listák"
|
"playlists": "Lejátszási listák"
|
||||||
},
|
},
|
||||||
"truenas": {
|
"truenas": {
|
||||||
"load": "Rendszerterhelés",
|
"load": "Rendszerterhelés",
|
||||||
"uptime": "Uptime",
|
"uptime": "Működési idő",
|
||||||
"alerts": "Alerts"
|
"alerts": "Figyelmeztetések"
|
||||||
},
|
},
|
||||||
"pyload": {
|
"pyload": {
|
||||||
"speed": "Sebesség",
|
"speed": "Sebesség",
|
||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "성공 중",
|
"num_success_latest": "성공 중",
|
||||||
"num_failure_latest": "실패 중",
|
"num_failure_latest": "실패 중",
|
||||||
"bytes_added_30": "추가된 용량"
|
"bytes_added_30": "추가된 용량"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
"wlan_devices": "Dispositivos WLAN",
|
"wlan_devices": "Dispositivos WLAN",
|
||||||
"lan_users": "Usuários de LAN",
|
"lan_users": "Usuários de LAN",
|
||||||
"wlan_users": "Usuários de WLAN",
|
"wlan_users": "Usuários de WLAN",
|
||||||
"up": "UP",
|
"up": "ATIVO",
|
||||||
"down": "Desligado",
|
"down": "Desligado",
|
||||||
"wait": "Por favor, aguarde",
|
"wait": "Por favor, aguarde",
|
||||||
"empty_data": "Status do Subsistema desconhecido"
|
"empty_data": "Status do Subsistema desconhecido"
|
||||||
@@ -246,7 +246,7 @@
|
|||||||
"unknown": "Desconhecido"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"radarr": {
|
"radarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Desejado",
|
||||||
"missing": "Faltando",
|
"missing": "Faltando",
|
||||||
"queued": "Em fila",
|
"queued": "Em fila",
|
||||||
"movies": "Filmes",
|
"movies": "Filmes",
|
||||||
@@ -254,13 +254,13 @@
|
|||||||
"unknown": "Desconhecido"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"lidarr": {
|
"lidarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Desejado",
|
||||||
"queued": "Queued",
|
"queued": "Na fila",
|
||||||
"artists": "Artistas"
|
"artists": "Artistas"
|
||||||
},
|
},
|
||||||
"readarr": {
|
"readarr": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Desejado",
|
||||||
"queued": "Queued",
|
"queued": "Na fila",
|
||||||
"books": "Livros"
|
"books": "Livros"
|
||||||
},
|
},
|
||||||
"bazarr": {
|
"bazarr": {
|
||||||
@@ -273,20 +273,20 @@
|
|||||||
"available": "Disponível"
|
"available": "Disponível"
|
||||||
},
|
},
|
||||||
"jellyseerr": {
|
"jellyseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Pendente",
|
||||||
"approved": "Approved",
|
"approved": "Aprovado",
|
||||||
"available": "Available",
|
"available": "Disponível",
|
||||||
"issues": "Open Issues"
|
"issues": "Incidentes Abertos"
|
||||||
},
|
},
|
||||||
"overseerr": {
|
"overseerr": {
|
||||||
"pending": "Pending",
|
"pending": "Pendente",
|
||||||
"processing": "Processando",
|
"processing": "Processando",
|
||||||
"approved": "Approved",
|
"approved": "Aprovado",
|
||||||
"available": "Available"
|
"available": "Disponível"
|
||||||
},
|
},
|
||||||
"netalertx": {
|
"netalertx": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"connected": "Connected",
|
"connected": "Conectado",
|
||||||
"new_devices": "Novos dispositivos",
|
"new_devices": "Novos dispositivos",
|
||||||
"down_alerts": "Alertas de Inatividade"
|
"down_alerts": "Alertas de Inatividade"
|
||||||
},
|
},
|
||||||
@@ -297,26 +297,26 @@
|
|||||||
"gravity": "Gravidade"
|
"gravity": "Gravidade"
|
||||||
},
|
},
|
||||||
"adguard": {
|
"adguard": {
|
||||||
"queries": "Queries",
|
"queries": "Consultas",
|
||||||
"blocked": "Blocked",
|
"blocked": "Bloqueado",
|
||||||
"filtered": "Filtrado",
|
"filtered": "Filtrado",
|
||||||
"latency": "Latência"
|
"latency": "Latência"
|
||||||
},
|
},
|
||||||
"speedtest": {
|
"speedtest": {
|
||||||
"upload": "Upload",
|
"upload": "Enviar",
|
||||||
"download": "Download",
|
"download": "Baixar",
|
||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
},
|
},
|
||||||
"portainer": {
|
"portainer": {
|
||||||
"running": "Running",
|
"running": "Executando",
|
||||||
"stopped": "Parado",
|
"stopped": "Parado",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"suwayomi": {
|
"suwayomi": {
|
||||||
"download": "Downloaded",
|
"download": "Baixado",
|
||||||
"nondownload": "Não Baixado",
|
"nondownload": "Não Baixado",
|
||||||
"read": "Read",
|
"read": "Lido",
|
||||||
"unread": "Unread",
|
"unread": "Não lido",
|
||||||
"downloadedread": "Baixado e Lido",
|
"downloadedread": "Baixado e Lido",
|
||||||
"downloadedunread": "Baixado e Não Lido",
|
"downloadedunread": "Baixado e Não Lido",
|
||||||
"nondownloadedread": "Não Baixado e Lido",
|
"nondownloadedread": "Não Baixado e Lido",
|
||||||
@@ -337,7 +337,7 @@
|
|||||||
"ago": "{{value}} Atrás"
|
"ago": "{{value}} Atrás"
|
||||||
},
|
},
|
||||||
"technitium": {
|
"technitium": {
|
||||||
"totalQueries": "Queries",
|
"totalQueries": "Consultas",
|
||||||
"totalNoError": "Sucesso",
|
"totalNoError": "Sucesso",
|
||||||
"totalServerFailure": "Falhas",
|
"totalServerFailure": "Falhas",
|
||||||
"totalNxDomain": "Domínios NX",
|
"totalNxDomain": "Domínios NX",
|
||||||
@@ -345,12 +345,12 @@
|
|||||||
"totalAuthoritative": "Autoritativo",
|
"totalAuthoritative": "Autoritativo",
|
||||||
"totalRecursive": "Recursivo",
|
"totalRecursive": "Recursivo",
|
||||||
"totalCached": "Em cache",
|
"totalCached": "Em cache",
|
||||||
"totalBlocked": "Blocked",
|
"totalBlocked": "Bloqueado",
|
||||||
"totalDropped": "Perdidos",
|
"totalDropped": "Perdidos",
|
||||||
"totalClients": "Clientes"
|
"totalClients": "Clientes"
|
||||||
},
|
},
|
||||||
"tdarr": {
|
"tdarr": {
|
||||||
"queue": "Queue",
|
"queue": "Fila de espera",
|
||||||
"processed": "Processado",
|
"processed": "Processado",
|
||||||
"errored": "Erro",
|
"errored": "Erro",
|
||||||
"saved": "Guardado"
|
"saved": "Guardado"
|
||||||
@@ -361,13 +361,13 @@
|
|||||||
"middleware": ""
|
"middleware": ""
|
||||||
},
|
},
|
||||||
"trilium": {
|
"trilium": {
|
||||||
"version": "Version",
|
"version": "Versão",
|
||||||
"notesCount": "Notas",
|
"notesCount": "Notas",
|
||||||
"dbSize": "Tamanho do banco de dados",
|
"dbSize": "Tamanho do banco de dados",
|
||||||
"unknown": "Unknown"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"navidrome": {
|
"navidrome": {
|
||||||
"nothing_streaming": "No Active Streams",
|
"nothing_streaming": "Sem Streams Ativos",
|
||||||
"please_wait": "Por favor, aguarde"
|
"please_wait": "Por favor, aguarde"
|
||||||
},
|
},
|
||||||
"npm": {
|
"npm": {
|
||||||
@@ -384,49 +384,49 @@
|
|||||||
},
|
},
|
||||||
"gotify": {
|
"gotify": {
|
||||||
"apps": "Aplicações",
|
"apps": "Aplicações",
|
||||||
"clients": "Clients",
|
"clients": "Clientes",
|
||||||
"messages": "Mensagens"
|
"messages": "Mensagens"
|
||||||
},
|
},
|
||||||
"prowlarr": {
|
"prowlarr": {
|
||||||
"enableIndexers": "Indexadores",
|
"enableIndexers": "Indexadores",
|
||||||
"numberOfGrabs": "Agarrados",
|
"numberOfGrabs": "Agarrados",
|
||||||
"numberOfQueries": "Queries",
|
"numberOfQueries": "Consultas",
|
||||||
"numberOfFailGrabs": "Falhados",
|
"numberOfFailGrabs": "Falhados",
|
||||||
"numberOfFailQueries": "Pesquisas falhadas"
|
"numberOfFailQueries": "Pesquisas falhadas"
|
||||||
},
|
},
|
||||||
"jackett": {
|
"jackett": {
|
||||||
"configured": "Configurado",
|
"configured": "Configurado",
|
||||||
"errored": "Errored"
|
"errored": "Falhou"
|
||||||
},
|
},
|
||||||
"strelaysrv": {
|
"strelaysrv": {
|
||||||
"numActiveSessions": "Sessões",
|
"numActiveSessions": "Sessões",
|
||||||
"numConnections": "Conexões",
|
"numConnections": "Conexões",
|
||||||
"dataRelayed": "Retransmitido",
|
"dataRelayed": "Retransmitido",
|
||||||
"transferRate": "Rate"
|
"transferRate": "Taxa"
|
||||||
},
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"user_count": "Users",
|
"user_count": "Usuários",
|
||||||
"status_count": "Postagens",
|
"status_count": "Postagens",
|
||||||
"domain_count": "Domínios"
|
"domain_count": "Domínios"
|
||||||
},
|
},
|
||||||
"medusa": {
|
"medusa": {
|
||||||
"wanted": "Wanted",
|
"wanted": "Desejado",
|
||||||
"queued": "Queued",
|
"queued": "Na fila",
|
||||||
"series": "Series"
|
"series": "Séries"
|
||||||
},
|
},
|
||||||
"minecraft": {
|
"minecraft": {
|
||||||
"players": "Reprodutores",
|
"players": "Reprodutores",
|
||||||
"version": "Versão",
|
"version": "Versão",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"up": "Online",
|
"up": "Online",
|
||||||
"down": "Offline"
|
"down": "Desconectado"
|
||||||
},
|
},
|
||||||
"miniflux": {
|
"miniflux": {
|
||||||
"read": "Lido",
|
"read": "Lido",
|
||||||
"unread": "Unread"
|
"unread": "Não lido"
|
||||||
},
|
},
|
||||||
"authentik": {
|
"authentik": {
|
||||||
"users": "Users",
|
"users": "Usuários",
|
||||||
"loginsLast24H": "Inícios de sessão (24h)",
|
"loginsLast24H": "Inícios de sessão (24h)",
|
||||||
"failedLoginsLast24H": "Inícios de sessão falhados (24h)"
|
"failedLoginsLast24H": "Inícios de sessão falhados (24h)"
|
||||||
},
|
},
|
||||||
@@ -438,19 +438,19 @@
|
|||||||
},
|
},
|
||||||
"glances": {
|
"glances": {
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"load": "Load",
|
"load": "Carga",
|
||||||
"wait": "Please wait",
|
"wait": "Por favor, aguarde",
|
||||||
"temp": "TEMP",
|
"temp": "TEMPERATURA",
|
||||||
"_temp": "Temperatura",
|
"_temp": "Temperatura",
|
||||||
"warn": "Aviso",
|
"warn": "Aviso",
|
||||||
"uptime": "UP",
|
"uptime": "ATIVO",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"free": "Free",
|
"free": "Livre",
|
||||||
"used": "Used",
|
"used": "Utilizado",
|
||||||
"days": "d",
|
"days": "d",
|
||||||
"hours": "h",
|
"hours": "h",
|
||||||
"crit": "Crítico",
|
"crit": "Crítico",
|
||||||
"read": "Read",
|
"read": "Leitura",
|
||||||
"write": "Escrita",
|
"write": "Escrita",
|
||||||
"gpu": "GPU",
|
"gpu": "GPU",
|
||||||
"mem": "Memória",
|
"mem": "Memória",
|
||||||
@@ -471,57 +471,57 @@
|
|||||||
"1-day": "Maioritariamente ensolarado",
|
"1-day": "Maioritariamente ensolarado",
|
||||||
"1-night": "Maioritariamente Limpo",
|
"1-night": "Maioritariamente Limpo",
|
||||||
"2-day": "Parcialmente Nublado",
|
"2-day": "Parcialmente Nublado",
|
||||||
"2-night": "Partly Cloudy",
|
"2-night": "Parcialmente Nublado",
|
||||||
"3-day": "Nublado",
|
"3-day": "Nublado",
|
||||||
"3-night": "Cloudy",
|
"3-night": "Nublado",
|
||||||
"45-day": "Nevoeiro",
|
"45-day": "Nevoeiro",
|
||||||
"45-night": "Foggy",
|
"45-night": "Nevoeiro",
|
||||||
"48-day": "Foggy",
|
"48-day": "Nevoeiro",
|
||||||
"48-night": "Foggy",
|
"48-night": "Nevoeiro",
|
||||||
"51-day": "Aguaceiros",
|
"51-day": "Aguaceiros",
|
||||||
"51-night": "Light Drizzle",
|
"51-night": "Leve Garoa",
|
||||||
"53-day": "Chuvisco",
|
"53-day": "Chuvisco",
|
||||||
"53-night": "Drizzle",
|
"53-night": "Garoa",
|
||||||
"55-day": "Aguaceiro Forte",
|
"55-day": "Aguaceiro Forte",
|
||||||
"55-night": "Heavy Drizzle",
|
"55-night": "Garoa Forte",
|
||||||
"56-day": "Leve Garoa Congelante",
|
"56-day": "Leve Garoa Congelante",
|
||||||
"56-night": "Light Freezing Drizzle",
|
"56-night": "Garoa Congelante Fraca",
|
||||||
"57-day": "Garoa Congelante",
|
"57-day": "Garoa Congelante",
|
||||||
"57-night": "Freezing Drizzle",
|
"57-night": "Garoa Congelante",
|
||||||
"61-day": "Chuva fraca",
|
"61-day": "Chuva fraca",
|
||||||
"61-night": "Light Rain",
|
"61-night": "Chuva Fraca",
|
||||||
"63-day": "Chuva",
|
"63-day": "Chuva",
|
||||||
"63-night": "Rain",
|
"63-night": "Chuva",
|
||||||
"65-day": "Chuva forte",
|
"65-day": "Chuva forte",
|
||||||
"65-night": "Heavy Rain",
|
"65-night": "Chuva Forte",
|
||||||
"66-day": "Chuva Congelante",
|
"66-day": "Chuva Congelante",
|
||||||
"66-night": "Freezing Rain",
|
"66-night": "Chuva Congelante",
|
||||||
"67-day": "Freezing Rain",
|
"67-day": "Chuva Congelante",
|
||||||
"67-night": "Freezing Rain",
|
"67-night": "Chuva Congelante",
|
||||||
"71-day": "Neve fraca",
|
"71-day": "Neve fraca",
|
||||||
"71-night": "Light Snow",
|
"71-night": "Neve Fraca",
|
||||||
"73-day": "Neve",
|
"73-day": "Neve",
|
||||||
"73-night": "Snow",
|
"73-night": "Neve",
|
||||||
"75-day": "Neve forte",
|
"75-day": "Neve forte",
|
||||||
"75-night": "Heavy Snow",
|
"75-night": "Neve Forte",
|
||||||
"77-day": "Grãos de Neve",
|
"77-day": "Grãos de Neve",
|
||||||
"77-night": "Snow Grains",
|
"77-night": "Grãos de Neve",
|
||||||
"80-day": "Neve fraca",
|
"80-day": "Neve fraca",
|
||||||
"80-night": "Light Showers",
|
"80-night": "Pancadas de Chuva Leves",
|
||||||
"81-day": "Chuviscos",
|
"81-day": "Chuviscos",
|
||||||
"81-night": "Showers",
|
"81-night": "Pancadas de Chuva",
|
||||||
"82-day": "Chuviscos fortes",
|
"82-day": "Chuviscos fortes",
|
||||||
"82-night": "Heavy Showers",
|
"82-night": "Pancadas de Chuva Forte",
|
||||||
"85-day": "Precipitação de Neve",
|
"85-day": "Precipitação de Neve",
|
||||||
"85-night": "Snow Showers",
|
"85-night": "Pancadas de Neve",
|
||||||
"86-day": "Snow Showers",
|
"86-day": "Pancadas de Neve",
|
||||||
"86-night": "Snow Showers",
|
"86-night": "Pancadas de Neve",
|
||||||
"95-day": "Trovoada",
|
"95-day": "Trovoada",
|
||||||
"95-night": "Thunderstorm",
|
"95-night": "Tempestade Com Raios",
|
||||||
"96-day": "Trovoada com granizo",
|
"96-day": "Trovoada com granizo",
|
||||||
"96-night": "Thunderstorm With Hail",
|
"96-night": "Tempestade Com Raios e Granizo",
|
||||||
"99-day": "Thunderstorm With Hail",
|
"99-day": "Tempestade Com Raios e Granizo",
|
||||||
"99-night": "Thunderstorm With Hail"
|
"99-night": "Tempestade Com Raios e Granizo"
|
||||||
},
|
},
|
||||||
"homebridge": {
|
"homebridge": {
|
||||||
"available_update": "Sistema",
|
"available_update": "Sistema",
|
||||||
@@ -530,15 +530,15 @@
|
|||||||
"up_to_date": "Atualizado",
|
"up_to_date": "Atualizado",
|
||||||
"child_bridges": "Pontes Filhas",
|
"child_bridges": "Pontes Filhas",
|
||||||
"child_bridges_status": "{{ok}}/{{total}}",
|
"child_bridges_status": "{{ok}}/{{total}}",
|
||||||
"up": "Up",
|
"up": "Ativo",
|
||||||
"pending": "Pending",
|
"pending": "Pendente",
|
||||||
"down": "Down"
|
"down": "Inativo"
|
||||||
},
|
},
|
||||||
"healthchecks": {
|
"healthchecks": {
|
||||||
"new": "Novo",
|
"new": "Novo",
|
||||||
"up": "Up",
|
"up": "Ativo",
|
||||||
"grace": "Em Período Gratuito",
|
"grace": "Em Período Gratuito",
|
||||||
"down": "Down",
|
"down": "Inativo",
|
||||||
"paused": "Pausado",
|
"paused": "Pausado",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"last_ping": "Ultimo Ping",
|
"last_ping": "Ultimo Ping",
|
||||||
@@ -550,26 +550,26 @@
|
|||||||
"containers_failed": "Falhou"
|
"containers_failed": "Falhou"
|
||||||
},
|
},
|
||||||
"autobrr": {
|
"autobrr": {
|
||||||
"approvedPushes": "Approved",
|
"approvedPushes": "Aprovado",
|
||||||
"rejectedPushes": "Rejeitado",
|
"rejectedPushes": "Rejeitado",
|
||||||
"filters": "Filtros",
|
"filters": "Filtros",
|
||||||
"indexers": "Indexers"
|
"indexers": "Indexadores"
|
||||||
},
|
},
|
||||||
"tubearchivist": {
|
"tubearchivist": {
|
||||||
"downloads": "Queue",
|
"downloads": "Fila de espera",
|
||||||
"videos": "Vídeos",
|
"videos": "Vídeos",
|
||||||
"channels": "Canais",
|
"channels": "Canais",
|
||||||
"playlists": "Listas"
|
"playlists": "Listas"
|
||||||
},
|
},
|
||||||
"truenas": {
|
"truenas": {
|
||||||
"load": "Carga do sistema",
|
"load": "Carga do sistema",
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"alerts": "Alerts"
|
"alerts": "Alertas"
|
||||||
},
|
},
|
||||||
"pyload": {
|
"pyload": {
|
||||||
"speed": "Velocidade",
|
"speed": "Velocidade",
|
||||||
"active": "Active",
|
"active": "Ativo",
|
||||||
"queue": "Queue",
|
"queue": "Fila de espera",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"gluetun": {
|
"gluetun": {
|
||||||
@@ -579,21 +579,21 @@
|
|||||||
"port_forwarded": "Porta Encaminhada"
|
"port_forwarded": "Porta Encaminhada"
|
||||||
},
|
},
|
||||||
"hdhomerun": {
|
"hdhomerun": {
|
||||||
"channels": "Channels",
|
"channels": "Canais",
|
||||||
"hd": "HD",
|
"hd": "HD",
|
||||||
"tunerCount": "Sintonizadores",
|
"tunerCount": "Sintonizadores",
|
||||||
"channelNumber": "Canal",
|
"channelNumber": "Canal",
|
||||||
"channelNetwork": "Rede",
|
"channelNetwork": "Rede",
|
||||||
"signalStrength": "Potência",
|
"signalStrength": "Potência",
|
||||||
"signalQuality": "Qualidade",
|
"signalQuality": "Qualidade",
|
||||||
"symbolQuality": "Quality",
|
"symbolQuality": "Qualidade",
|
||||||
"networkRate": "Bitrate",
|
"networkRate": "Bitrate",
|
||||||
"clientIP": "Cliente"
|
"clientIP": "Cliente"
|
||||||
},
|
},
|
||||||
"scrutiny": {
|
"scrutiny": {
|
||||||
"passed": "Aprovado",
|
"passed": "Aprovado",
|
||||||
"failed": "Failed",
|
"failed": "Falhou",
|
||||||
"unknown": "Unknown"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"paperlessngx": {
|
"paperlessngx": {
|
||||||
"inbox": "Caixa de entrada",
|
"inbox": "Caixa de entrada",
|
||||||
@@ -608,18 +608,18 @@
|
|||||||
"low_battery": "Bateria Fraca"
|
"low_battery": "Bateria Fraca"
|
||||||
},
|
},
|
||||||
"nextdns": {
|
"nextdns": {
|
||||||
"wait": "Please Wait",
|
"wait": "Por favor, aguarde",
|
||||||
"no_devices": "Nenhum dado do dispositivo recebido"
|
"no_devices": "Nenhum dado do dispositivo recebido"
|
||||||
},
|
},
|
||||||
"mikrotik": {
|
"mikrotik": {
|
||||||
"cpuLoad": "Carga do CPU",
|
"cpuLoad": "Carga do CPU",
|
||||||
"memoryUsed": "Memória Utilizada",
|
"memoryUsed": "Memória Utilizada",
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"numberOfLeases": "Concessões"
|
"numberOfLeases": "Concessões"
|
||||||
},
|
},
|
||||||
"xteve": {
|
"xteve": {
|
||||||
"streams_all": "Todos os Streams",
|
"streams_all": "Todos os Streams",
|
||||||
"streams_active": "Active Streams",
|
"streams_active": "Streams Ativas",
|
||||||
"streams_xepg": "Canais XEPG"
|
"streams_xepg": "Canais XEPG"
|
||||||
},
|
},
|
||||||
"opendtu": {
|
"opendtu": {
|
||||||
@@ -629,7 +629,7 @@
|
|||||||
"limit": "Limite"
|
"limit": "Limite"
|
||||||
},
|
},
|
||||||
"opnsense": {
|
"opnsense": {
|
||||||
"cpu": "CPU Load",
|
"cpu": "Carga do CPU",
|
||||||
"memory": "Memória Ativa",
|
"memory": "Memória Ativa",
|
||||||
"wanUpload": "Envio WAN",
|
"wanUpload": "Envio WAN",
|
||||||
"wanDownload": "WAN Descarga"
|
"wanDownload": "WAN Descarga"
|
||||||
@@ -654,9 +654,9 @@
|
|||||||
"load": "Carga Média",
|
"load": "Carga Média",
|
||||||
"memory": "Uso de memória",
|
"memory": "Uso de memória",
|
||||||
"wanStatus": "Estado WAN",
|
"wanStatus": "Estado WAN",
|
||||||
"up": "Up",
|
"up": "Ativo",
|
||||||
"down": "Down",
|
"down": "Inativo",
|
||||||
"temp": "Temp",
|
"temp": "Temp.",
|
||||||
"disk": "Uso do disco",
|
"disk": "Uso do disco",
|
||||||
"wanIP": "IP WAN"
|
"wanIP": "IP WAN"
|
||||||
},
|
},
|
||||||
@@ -667,49 +667,49 @@
|
|||||||
"memory_usage": "Memória"
|
"memory_usage": "Memória"
|
||||||
},
|
},
|
||||||
"immich": {
|
"immich": {
|
||||||
"users": "Users",
|
"users": "Usuários",
|
||||||
"photos": "Fotos",
|
"photos": "Fotos",
|
||||||
"videos": "Videos",
|
"videos": "Vídeos",
|
||||||
"storage": "Armazenamento"
|
"storage": "Armazenamento"
|
||||||
},
|
},
|
||||||
"uptimekuma": {
|
"uptimekuma": {
|
||||||
"up": "Sites no Ar",
|
"up": "Sites no Ar",
|
||||||
"down": "Sites Fora do Ar",
|
"down": "Sites Fora do Ar",
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"incident": "Incidente",
|
"incident": "Incidente",
|
||||||
"m": "m"
|
"m": "m"
|
||||||
},
|
},
|
||||||
"atsumeru": {
|
"atsumeru": {
|
||||||
"series": "Series",
|
"series": "Séries",
|
||||||
"archives": "Arquivos",
|
"archives": "Arquivos",
|
||||||
"chapters": "Capítulos",
|
"chapters": "Capítulos",
|
||||||
"categories": "Categorias"
|
"categories": "Categorias"
|
||||||
},
|
},
|
||||||
"komga": {
|
"komga": {
|
||||||
"libraries": "Bibliotecas",
|
"libraries": "Bibliotecas",
|
||||||
"series": "Series",
|
"series": "Séries",
|
||||||
"books": "Books"
|
"books": "Livros"
|
||||||
},
|
},
|
||||||
"diskstation": {
|
"diskstation": {
|
||||||
"days": "Days",
|
"days": "Dias",
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"volumeAvailable": "Available"
|
"volumeAvailable": "Disponível"
|
||||||
},
|
},
|
||||||
"mylar": {
|
"mylar": {
|
||||||
"series": "Series",
|
"series": "Séries",
|
||||||
"issues": "Problemas",
|
"issues": "Problemas",
|
||||||
"wanted": "Wanted"
|
"wanted": "Desejado"
|
||||||
},
|
},
|
||||||
"photoprism": {
|
"photoprism": {
|
||||||
"albums": "Albums",
|
"albums": "Álbuns",
|
||||||
"photos": "Photos",
|
"photos": "Fotos",
|
||||||
"videos": "Videos",
|
"videos": "Vídeos",
|
||||||
"people": "Pessoa"
|
"people": "Pessoa"
|
||||||
},
|
},
|
||||||
"fileflows": {
|
"fileflows": {
|
||||||
"queue": "Queue",
|
"queue": "Fila de espera",
|
||||||
"processing": "Processing",
|
"processing": "Processando",
|
||||||
"processed": "Processed",
|
"processed": "Processado",
|
||||||
"time": "Hora"
|
"time": "Hora"
|
||||||
},
|
},
|
||||||
"firefly": {
|
"firefly": {
|
||||||
@@ -735,7 +735,7 @@
|
|||||||
"size": "Tamanho",
|
"size": "Tamanho",
|
||||||
"lastrun": "Ultima Execução",
|
"lastrun": "Ultima Execução",
|
||||||
"nextrun": "Próxima Execução",
|
"nextrun": "Próxima Execução",
|
||||||
"failed": "Failed"
|
"failed": "Falhou"
|
||||||
},
|
},
|
||||||
"unmanic": {
|
"unmanic": {
|
||||||
"active_workers": "Workers Ativos",
|
"active_workers": "Workers Ativos",
|
||||||
@@ -752,20 +752,20 @@
|
|||||||
"targets_total": "Total de Alvos"
|
"targets_total": "Total de Alvos"
|
||||||
},
|
},
|
||||||
"gatus": {
|
"gatus": {
|
||||||
"up": "Sites Up",
|
"up": "Sites no Ar",
|
||||||
"down": "Sites Down",
|
"down": "Sites Fora do Ar",
|
||||||
"uptime": "Uptime"
|
"uptime": "Tempo ativo"
|
||||||
},
|
},
|
||||||
"ghostfolio": {
|
"ghostfolio": {
|
||||||
"gross_percent_today": "Today",
|
"gross_percent_today": "Hoje",
|
||||||
"gross_percent_1y": "Um ano",
|
"gross_percent_1y": "Um ano",
|
||||||
"gross_percent_max": "Todo o tempo"
|
"gross_percent_max": "Todo o tempo"
|
||||||
},
|
},
|
||||||
"audiobookshelf": {
|
"audiobookshelf": {
|
||||||
"podcasts": "Podcasts",
|
"podcasts": "Podcasts",
|
||||||
"books": "Books",
|
"books": "Livros",
|
||||||
"podcastsDuration": "Duração",
|
"podcastsDuration": "Duração",
|
||||||
"booksDuration": "Duration"
|
"booksDuration": "Duração"
|
||||||
},
|
},
|
||||||
"homeassistant": {
|
"homeassistant": {
|
||||||
"people_home": "Pessoas em Casa",
|
"people_home": "Pessoas em Casa",
|
||||||
@@ -774,23 +774,23 @@
|
|||||||
},
|
},
|
||||||
"whatsupdocker": {
|
"whatsupdocker": {
|
||||||
"monitoring": "Monitorando",
|
"monitoring": "Monitorando",
|
||||||
"updates": "Updates"
|
"updates": "Atualizações"
|
||||||
},
|
},
|
||||||
"calibreweb": {
|
"calibreweb": {
|
||||||
"books": "Books",
|
"books": "Livros",
|
||||||
"authors": "Autores",
|
"authors": "Autores",
|
||||||
"categories": "Categories",
|
"categories": "Categorias",
|
||||||
"series": "Series"
|
"series": "Séries"
|
||||||
},
|
},
|
||||||
"jdownloader": {
|
"jdownloader": {
|
||||||
"downloadCount": "Queue",
|
"downloadCount": "Fila de espera",
|
||||||
"downloadBytesRemaining": "Remaining",
|
"downloadBytesRemaining": "Restante",
|
||||||
"downloadTotalBytes": "Size",
|
"downloadTotalBytes": "Tamanho",
|
||||||
"downloadSpeed": "Speed"
|
"downloadSpeed": "Velocidade"
|
||||||
},
|
},
|
||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Séries",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Arquivos"
|
||||||
},
|
},
|
||||||
"azuredevops": {
|
"azuredevops": {
|
||||||
"result": "Resultado",
|
"result": "Resultado",
|
||||||
@@ -798,21 +798,21 @@
|
|||||||
"buildId": "ID Compilação",
|
"buildId": "ID Compilação",
|
||||||
"succeeded": "Bem-sucedido",
|
"succeeded": "Bem-sucedido",
|
||||||
"notStarted": "Não iniciado",
|
"notStarted": "Não iniciado",
|
||||||
"failed": "Failed",
|
"failed": "Falhou",
|
||||||
"canceled": "Cancelado",
|
"canceled": "Cancelado",
|
||||||
"inProgress": "Em Progresso",
|
"inProgress": "Em Progresso",
|
||||||
"totalPrs": "Total de PRs",
|
"totalPrs": "Total de PRs",
|
||||||
"myPrs": "Minhas PRs",
|
"myPrs": "Minhas PRs",
|
||||||
"approved": "Approved"
|
"approved": "Aprovado"
|
||||||
},
|
},
|
||||||
"gamedig": {
|
"gamedig": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"online": "Online",
|
"online": "Online",
|
||||||
"offline": "Offline",
|
"offline": "Desconectado",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"map": "Mapa",
|
"map": "Mapa",
|
||||||
"currentPlayers": "Jogadores atuais",
|
"currentPlayers": "Jogadores atuais",
|
||||||
"players": "Players",
|
"players": "Jogadores",
|
||||||
"maxPlayers": "Número Máximo de Jogadores",
|
"maxPlayers": "Número Máximo de Jogadores",
|
||||||
"bots": "Robôs",
|
"bots": "Robôs",
|
||||||
"ping": "Ping"
|
"ping": "Ping"
|
||||||
@@ -825,39 +825,39 @@
|
|||||||
},
|
},
|
||||||
"mealie": {
|
"mealie": {
|
||||||
"recipes": "Receitas",
|
"recipes": "Receitas",
|
||||||
"users": "Users",
|
"users": "Usuários",
|
||||||
"categories": "Categories",
|
"categories": "Categorias",
|
||||||
"tags": "Marcadores"
|
"tags": "Marcadores"
|
||||||
},
|
},
|
||||||
"openmediavault": {
|
"openmediavault": {
|
||||||
"downloading": "Baixando",
|
"downloading": "Baixando",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"running": "Running",
|
"running": "Executando",
|
||||||
"stopped": "Stopped",
|
"stopped": "Parado",
|
||||||
"passed": "Passed",
|
"passed": "Aprovado",
|
||||||
"failed": "Failed"
|
"failed": "Falhou"
|
||||||
},
|
},
|
||||||
"openwrt": {
|
"openwrt": {
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"cpuLoad": "Carga da CPU média (5m)",
|
"cpuLoad": "Carga da CPU média (5m)",
|
||||||
"up": "Up",
|
"up": "Ativo",
|
||||||
"down": "Down",
|
"down": "Inativo",
|
||||||
"bytesTx": "Transmitido",
|
"bytesTx": "Transmitido",
|
||||||
"bytesRx": "Received"
|
"bytesRx": "Recebido"
|
||||||
},
|
},
|
||||||
"uptimerobot": {
|
"uptimerobot": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"lastDown": "Última inatividade",
|
"lastDown": "Última inatividade",
|
||||||
"downDuration": "Duração de inatividade",
|
"downDuration": "Duração de inatividade",
|
||||||
"sitesUp": "Sites Up",
|
"sitesUp": "Sites no Ar",
|
||||||
"sitesDown": "Sites Down",
|
"sitesDown": "Sites Fora do Ar",
|
||||||
"paused": "Paused",
|
"paused": "Pausado",
|
||||||
"notyetchecked": "Não conferidos ainda",
|
"notyetchecked": "Não conferidos ainda",
|
||||||
"up": "Up",
|
"up": "Ativo",
|
||||||
"seemsdown": "Parece Desconectado",
|
"seemsdown": "Parece Desconectado",
|
||||||
"down": "Down",
|
"down": "Inativo",
|
||||||
"unknown": "Unknown"
|
"unknown": "Desconhecido"
|
||||||
},
|
},
|
||||||
"calendar": {
|
"calendar": {
|
||||||
"inCinemas": "Nos cinemas",
|
"inCinemas": "Nos cinemas",
|
||||||
@@ -876,10 +876,10 @@
|
|||||||
"totalfilesize": "Tamanho total"
|
"totalfilesize": "Tamanho total"
|
||||||
},
|
},
|
||||||
"mailcow": {
|
"mailcow": {
|
||||||
"domains": "Domains",
|
"domains": "Domínios",
|
||||||
"mailboxes": "Caixas de e-mail",
|
"mailboxes": "Caixas de e-mail",
|
||||||
"mails": "Mensagens",
|
"mails": "Mensagens",
|
||||||
"storage": "Storage"
|
"storage": "Armazenamento"
|
||||||
},
|
},
|
||||||
"netdata": {
|
"netdata": {
|
||||||
"warnings": "Alertas",
|
"warnings": "Alertas",
|
||||||
@@ -888,12 +888,12 @@
|
|||||||
"plantit": {
|
"plantit": {
|
||||||
"events": "Eventos",
|
"events": "Eventos",
|
||||||
"plants": "Plantas",
|
"plants": "Plantas",
|
||||||
"photos": "Photos",
|
"photos": "Fotos",
|
||||||
"species": "Espécies"
|
"species": "Espécies"
|
||||||
},
|
},
|
||||||
"gitea": {
|
"gitea": {
|
||||||
"notifications": "Notificações",
|
"notifications": "Notificações",
|
||||||
"issues": "Issues",
|
"issues": "Problemas",
|
||||||
"pulls": "Solicitações de Envio",
|
"pulls": "Solicitações de Envio",
|
||||||
"repositories": "Repositórios"
|
"repositories": "Repositórios"
|
||||||
},
|
},
|
||||||
@@ -909,13 +909,13 @@
|
|||||||
"galleries": "Galerias",
|
"galleries": "Galerias",
|
||||||
"performers": "Atores",
|
"performers": "Atores",
|
||||||
"studios": "Estúdios",
|
"studios": "Estúdios",
|
||||||
"movies": "Movies",
|
"movies": "Filmes",
|
||||||
"tags": "Tags",
|
"tags": "Etiquetas",
|
||||||
"oCount": "Contagem 0"
|
"oCount": "Contagem 0"
|
||||||
},
|
},
|
||||||
"tandoor": {
|
"tandoor": {
|
||||||
"users": "Users",
|
"users": "Usuários",
|
||||||
"recipes": "Recipes",
|
"recipes": "Receitas",
|
||||||
"keywords": "Palavras-chave"
|
"keywords": "Palavras-chave"
|
||||||
},
|
},
|
||||||
"homebox": {
|
"homebox": {
|
||||||
@@ -923,17 +923,17 @@
|
|||||||
"totalWithWarranty": "Com Garantia",
|
"totalWithWarranty": "Com Garantia",
|
||||||
"locations": "Localização",
|
"locations": "Localização",
|
||||||
"labels": "Rótulos",
|
"labels": "Rótulos",
|
||||||
"users": "Users",
|
"users": "Usuários",
|
||||||
"totalValue": "Valor Total"
|
"totalValue": "Valor Total"
|
||||||
},
|
},
|
||||||
"crowdsec": {
|
"crowdsec": {
|
||||||
"alerts": "Alerts",
|
"alerts": "Alertas",
|
||||||
"bans": "Banimentos"
|
"bans": "Banimentos"
|
||||||
},
|
},
|
||||||
"wgeasy": {
|
"wgeasy": {
|
||||||
"connected": "Connected",
|
"connected": "Conectado",
|
||||||
"enabled": "Enabled",
|
"enabled": "Ativo",
|
||||||
"disabled": "Disabled",
|
"disabled": "Desativado",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"swagdashboard": {
|
"swagdashboard": {
|
||||||
@@ -944,8 +944,8 @@
|
|||||||
},
|
},
|
||||||
"myspeed": {
|
"myspeed": {
|
||||||
"ping": "Ping",
|
"ping": "Ping",
|
||||||
"download": "Download",
|
"download": "Baixar",
|
||||||
"upload": "Upload"
|
"upload": "Enviar"
|
||||||
},
|
},
|
||||||
"stocks": {
|
"stocks": {
|
||||||
"stocks": "Ações",
|
"stocks": "Ações",
|
||||||
@@ -956,17 +956,17 @@
|
|||||||
},
|
},
|
||||||
"frigate": {
|
"frigate": {
|
||||||
"cameras": "Câmeras",
|
"cameras": "Câmeras",
|
||||||
"uptime": "Uptime",
|
"uptime": "Tempo ativo",
|
||||||
"version": "Version"
|
"version": "Versão"
|
||||||
},
|
},
|
||||||
"linkwarden": {
|
"linkwarden": {
|
||||||
"links": "Links",
|
"links": "Links",
|
||||||
"collections": "Coleções",
|
"collections": "Coleções",
|
||||||
"tags": "Tags"
|
"tags": "Etiquetas"
|
||||||
},
|
},
|
||||||
"zabbix": {
|
"zabbix": {
|
||||||
"unclassified": "Não classificado",
|
"unclassified": "Não classificado",
|
||||||
"information": "Information",
|
"information": "Informação",
|
||||||
"warning": "Aviso",
|
"warning": "Aviso",
|
||||||
"average": "Médio",
|
"average": "Médio",
|
||||||
"high": "Alto",
|
"high": "Alto",
|
||||||
@@ -987,24 +987,24 @@
|
|||||||
"tasksInProgress": "Tarefas em Andamento"
|
"tasksInProgress": "Tarefas em Andamento"
|
||||||
},
|
},
|
||||||
"headscale": {
|
"headscale": {
|
||||||
"name": "Name",
|
"name": "Nome",
|
||||||
"address": "Address",
|
"address": "Endereço",
|
||||||
"last_seen": "Last Seen",
|
"last_seen": "Visto por último",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"online": "Online",
|
"online": "Online",
|
||||||
"offline": "Offline"
|
"offline": "Desconectado"
|
||||||
},
|
},
|
||||||
"beszel": {
|
"beszel": {
|
||||||
"name": "Name",
|
"name": "Nome",
|
||||||
"systems": "Sistemas",
|
"systems": "Sistemas",
|
||||||
"up": "Up",
|
"up": "Ativo",
|
||||||
"down": "Down",
|
"down": "Inativo",
|
||||||
"paused": "Paused",
|
"paused": "Pausado",
|
||||||
"pending": "Pending",
|
"pending": "Pendente",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"updated": "Updated",
|
"updated": "Atualizado",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"memory": "MEM",
|
"memory": "MEM.",
|
||||||
"disk": "Disco",
|
"disk": "Disco",
|
||||||
"network": "Rede"
|
"network": "Rede"
|
||||||
},
|
},
|
||||||
@@ -1012,26 +1012,26 @@
|
|||||||
"apps": "Aplicativos",
|
"apps": "Aplicativos",
|
||||||
"synced": "Sincronizado",
|
"synced": "Sincronizado",
|
||||||
"outOfSync": "Fora de sincronia",
|
"outOfSync": "Fora de sincronia",
|
||||||
"healthy": "Healthy",
|
"healthy": "Saudável",
|
||||||
"degraded": "Degradado",
|
"degraded": "Degradado",
|
||||||
"progressing": "Progredindo",
|
"progressing": "Progredindo",
|
||||||
"missing": "Missing",
|
"missing": "Faltando",
|
||||||
"suspended": "Suspenso"
|
"suspended": "Suspenso"
|
||||||
},
|
},
|
||||||
"spoolman": {
|
"spoolman": {
|
||||||
"loading": "Loading"
|
"loading": "Carregando"
|
||||||
},
|
},
|
||||||
"gitlab": {
|
"gitlab": {
|
||||||
"groups": "Grupos",
|
"groups": "Grupos",
|
||||||
"issues": "Issues",
|
"issues": "Problemas",
|
||||||
"merges": "Solicitações de mesclagem",
|
"merges": "Solicitações de mesclagem",
|
||||||
"projects": "Projetos"
|
"projects": "Projetos"
|
||||||
},
|
},
|
||||||
"apcups": {
|
"apcups": {
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"load": "Load",
|
"load": "Carga",
|
||||||
"bcharge": "Battery Charge",
|
"bcharge": "Carga da Bateria",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Tempo Restante"
|
||||||
},
|
},
|
||||||
"karakeep": {
|
"karakeep": {
|
||||||
"bookmarks": "Marcadores",
|
"bookmarks": "Marcadores",
|
||||||
@@ -1039,23 +1039,23 @@
|
|||||||
"archived": "Arquivados",
|
"archived": "Arquivados",
|
||||||
"highlights": "Destaques",
|
"highlights": "Destaques",
|
||||||
"lists": "Listas",
|
"lists": "Listas",
|
||||||
"tags": "Tags"
|
"tags": "Etiquetas"
|
||||||
},
|
},
|
||||||
"slskd": {
|
"slskd": {
|
||||||
"slskStatus": "Network",
|
"slskStatus": "Rede",
|
||||||
"connected": "Connected",
|
"connected": "Conectado",
|
||||||
"disconnected": "Disconnected",
|
"disconnected": "Desconectado",
|
||||||
"updateStatus": "Atualize",
|
"updateStatus": "Atualize",
|
||||||
"update_yes": "Available",
|
"update_yes": "Disponível",
|
||||||
"update_no": "Up to Date",
|
"update_no": "Atualizado",
|
||||||
"downloads": "Transferências",
|
"downloads": "Transferências",
|
||||||
"uploads": "Envios",
|
"uploads": "Envios",
|
||||||
"sharedFiles": "Files"
|
"sharedFiles": "Arquivos"
|
||||||
},
|
},
|
||||||
"jellystat": {
|
"jellystat": {
|
||||||
"songs": "Songs",
|
"songs": "Músicas",
|
||||||
"movies": "Movies",
|
"movies": "Filmes",
|
||||||
"episodes": "Episodes",
|
"episodes": "Episódios",
|
||||||
"other": "Outro"
|
"other": "Outro"
|
||||||
},
|
},
|
||||||
"checkmk": {
|
"checkmk": {
|
||||||
@@ -1064,55 +1064,60 @@
|
|||||||
},
|
},
|
||||||
"komodo": {
|
"komodo": {
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"running": "Running",
|
"running": "Executando",
|
||||||
"stopped": "Stopped",
|
"stopped": "Parado",
|
||||||
"down": "Down",
|
"down": "Inativo",
|
||||||
"unhealthy": "Unhealthy",
|
"unhealthy": "Não-saudável",
|
||||||
"unknown": "Unknown",
|
"unknown": "Desconhecido",
|
||||||
"servers": "Servers",
|
"servers": "Servidores",
|
||||||
"stacks": "Stacks",
|
"stacks": "Pilhas",
|
||||||
"containers": "Containers"
|
"containers": "Contêineres"
|
||||||
},
|
},
|
||||||
"filebrowser": {
|
"filebrowser": {
|
||||||
"available": "Available",
|
"available": "Disponível",
|
||||||
"used": "Used",
|
"used": "Utilizado",
|
||||||
"total": "Total"
|
"total": "Total"
|
||||||
},
|
},
|
||||||
"wallos": {
|
"wallos": {
|
||||||
"activeSubscriptions": "Subscriptions",
|
"activeSubscriptions": "Assinaturas",
|
||||||
"thisMonthlyCost": "This Month",
|
"thisMonthlyCost": "Este Mês",
|
||||||
"nextMonthlyCost": "Next Month",
|
"nextMonthlyCost": "Próximo Mês",
|
||||||
"previousMonthlyCost": "Prev. Month",
|
"previousMonthlyCost": "Mês Anterior",
|
||||||
"nextRenewingSubscription": "Next Payment"
|
"nextRenewingSubscription": "Próximo Pagamento"
|
||||||
},
|
},
|
||||||
"unraid": {
|
"unraid": {
|
||||||
"STARTED": "Started",
|
"STARTED": "Iniciado",
|
||||||
"STOPPED": "Stopped",
|
"STOPPED": "Parado",
|
||||||
"NEW_ARRAY": "New Array",
|
"NEW_ARRAY": "Nova Array",
|
||||||
"RECON_DISK": "Reconstructing Disk",
|
"RECON_DISK": "Reconstruindo Disco",
|
||||||
"DISABLE_DISK": "Disk Disabled",
|
"DISABLE_DISK": "Disco Desativado",
|
||||||
"SWAP_DSBL": "Swap Disable",
|
"SWAP_DSBL": "Swap Desabilitado",
|
||||||
"INVALID_EXPANSION": "Invalid Expansion",
|
"INVALID_EXPANSION": "Expansão Inválida",
|
||||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
"PARITY_NOT_BIGGEST": "Paridade Não É O Maior Disco",
|
||||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
"TOO_MANY_MISSING_DISKS": "Muitos Discos Ausentes",
|
||||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
"NEW_DISK_TOO_SMALL": "Novo Disco É Muito Pequeno",
|
||||||
"NO_DATA_DISKS": "No Data Disks",
|
"NO_DATA_DISKS": "Sem Discos de Dados",
|
||||||
"notifications": "Notifications",
|
"notifications": "Notificações",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"memoryUsed": "Memory Used",
|
"memoryUsed": "Memória Utilizada",
|
||||||
"memoryAvailable": "Memory Available",
|
"memoryAvailable": "Memória Disponível",
|
||||||
"arrayUsed": "Array Used",
|
"arrayUsed": "Array Utilizado",
|
||||||
"arrayFree": "Array Free",
|
"arrayFree": "Array Disponível",
|
||||||
"poolUsed": "{{pool}} Used",
|
"poolUsed": "{{pool}} Utilizado",
|
||||||
"poolFree": "{{pool}} Free"
|
"poolFree": "{{pool}} Livre"
|
||||||
},
|
},
|
||||||
"backrest": {
|
"backrest": {
|
||||||
"num_plans": "Plans",
|
"num_plans": "Planos",
|
||||||
"num_success_30": "Successes",
|
"num_success_30": "Sucessos",
|
||||||
"num_failure_30": "Failures",
|
"num_failure_30": "Falhas",
|
||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Executando com sucesso",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Falhando",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Adicionados"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Músicas",
|
||||||
|
"time": "Tempo",
|
||||||
|
"artists": "Artistas"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -955,7 +955,7 @@
|
|||||||
"invalidConfiguration": "Invalid Configuration"
|
"invalidConfiguration": "Invalid Configuration"
|
||||||
},
|
},
|
||||||
"frigate": {
|
"frigate": {
|
||||||
"cameras": "Cameras",
|
"cameras": "Kamery",
|
||||||
"uptime": "Dostupnosť",
|
"uptime": "Dostupnosť",
|
||||||
"version": "Verzia"
|
"version": "Verzia"
|
||||||
},
|
},
|
||||||
@@ -966,7 +966,7 @@
|
|||||||
},
|
},
|
||||||
"zabbix": {
|
"zabbix": {
|
||||||
"unclassified": "Not classified",
|
"unclassified": "Not classified",
|
||||||
"information": "Information",
|
"information": "Informácie",
|
||||||
"warning": "Warning",
|
"warning": "Warning",
|
||||||
"average": "Average",
|
"average": "Average",
|
||||||
"high": "High",
|
"high": "High",
|
||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Успевајући",
|
"num_success_latest": "Успевајући",
|
||||||
"num_failure_latest": "Неуспешно",
|
"num_failure_latest": "Неуспешно",
|
||||||
"bytes_added_30": "Додати бајтови"
|
"bytes_added_30": "Додати бајтови"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Песме",
|
||||||
|
"time": "Време",
|
||||||
|
"artists": "Извођачи"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -735,7 +735,7 @@
|
|||||||
"size": "Boyut",
|
"size": "Boyut",
|
||||||
"lastrun": "Son Çalışma",
|
"lastrun": "Son Çalışma",
|
||||||
"nextrun": "Sonraki Çalışma",
|
"nextrun": "Sonraki Çalışma",
|
||||||
"failed": "Failed"
|
"failed": "Başarısız"
|
||||||
},
|
},
|
||||||
"unmanic": {
|
"unmanic": {
|
||||||
"active_workers": "Etkin kullanıcılar",
|
"active_workers": "Etkin kullanıcılar",
|
||||||
@@ -798,7 +798,7 @@
|
|||||||
"buildId": "Yapı Kimliği",
|
"buildId": "Yapı Kimliği",
|
||||||
"succeeded": "Başarılı",
|
"succeeded": "Başarılı",
|
||||||
"notStarted": "Henüz Başlamadı",
|
"notStarted": "Henüz Başlamadı",
|
||||||
"failed": "Failed",
|
"failed": "Başarısız",
|
||||||
"canceled": "İptal edildi",
|
"canceled": "İptal edildi",
|
||||||
"inProgress": "Sürüyor",
|
"inProgress": "Sürüyor",
|
||||||
"totalPrs": "Toplam Çekme İstekleri",
|
"totalPrs": "Toplam Çekme İstekleri",
|
||||||
@@ -835,7 +835,7 @@
|
|||||||
"running": "Çalışıyor",
|
"running": "Çalışıyor",
|
||||||
"stopped": "Durdu",
|
"stopped": "Durdu",
|
||||||
"passed": "Passed",
|
"passed": "Passed",
|
||||||
"failed": "Failed"
|
"failed": "Başarısız"
|
||||||
},
|
},
|
||||||
"openwrt": {
|
"openwrt": {
|
||||||
"uptime": "Çalışma süresi",
|
"uptime": "Çalışma süresi",
|
||||||
@@ -876,7 +876,7 @@
|
|||||||
"totalfilesize": "Toplam Kapasite"
|
"totalfilesize": "Toplam Kapasite"
|
||||||
},
|
},
|
||||||
"mailcow": {
|
"mailcow": {
|
||||||
"domains": "Domains",
|
"domains": "Alan Adları",
|
||||||
"mailboxes": "Posta kutuları",
|
"mailboxes": "Posta kutuları",
|
||||||
"mails": "Postalar",
|
"mails": "Postalar",
|
||||||
"storage": "Depolama"
|
"storage": "Depolama"
|
||||||
@@ -988,7 +988,7 @@
|
|||||||
},
|
},
|
||||||
"headscale": {
|
"headscale": {
|
||||||
"name": "Ad",
|
"name": "Ad",
|
||||||
"address": "Address",
|
"address": "Adres",
|
||||||
"last_seen": "Last Seen",
|
"last_seen": "Last Seen",
|
||||||
"status": "Durum",
|
"status": "Durum",
|
||||||
"online": "Çevrimiçi",
|
"online": "Çevrimiçi",
|
||||||
@@ -1002,21 +1002,21 @@
|
|||||||
"paused": "Durduruldu",
|
"paused": "Durduruldu",
|
||||||
"pending": "Pending",
|
"pending": "Pending",
|
||||||
"status": "Durum",
|
"status": "Durum",
|
||||||
"updated": "Updated",
|
"updated": "Güncellendi",
|
||||||
"cpu": "İşlemci",
|
"cpu": "İşlemci",
|
||||||
"memory": "Bellek",
|
"memory": "Bellek",
|
||||||
"disk": "Disk",
|
"disk": "Disk",
|
||||||
"network": "NET"
|
"network": "NET"
|
||||||
},
|
},
|
||||||
"argocd": {
|
"argocd": {
|
||||||
"apps": "Apps",
|
"apps": "Uygulamalar",
|
||||||
"synced": "Synced",
|
"synced": "Synced",
|
||||||
"outOfSync": "Out Of Sync",
|
"outOfSync": "Out Of Sync",
|
||||||
"healthy": "Sağlıklı",
|
"healthy": "Sağlıklı",
|
||||||
"degraded": "Degraded",
|
"degraded": "Degraded",
|
||||||
"progressing": "Progressing",
|
"progressing": "Progressing",
|
||||||
"missing": "Eksik",
|
"missing": "Eksik",
|
||||||
"suspended": "Suspended"
|
"suspended": "Askıya Alındı"
|
||||||
},
|
},
|
||||||
"spoolman": {
|
"spoolman": {
|
||||||
"loading": "Yükleniyor"
|
"loading": "Yükleniyor"
|
||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,20 +14,20 @@
|
|||||||
"date": "{{value, date}}",
|
"date": "{{value, date}}",
|
||||||
"relativeDate": "{{value, relativeDate}}",
|
"relativeDate": "{{value, relativeDate}}",
|
||||||
"duration": "{{value, duration}}",
|
"duration": "{{value, duration}}",
|
||||||
"months": "mo",
|
"months": "tháng",
|
||||||
"days": "d",
|
"days": "ngày",
|
||||||
"hours": "h",
|
"hours": "giờ",
|
||||||
"minutes": "m",
|
"minutes": "phút",
|
||||||
"seconds": "s"
|
"seconds": "giây"
|
||||||
},
|
},
|
||||||
"widget": {
|
"widget": {
|
||||||
"missing_type": "Thiếu loại Widget: {{type}}",
|
"missing_type": "Thiếu loại Widget: {{type}}",
|
||||||
"api_error": "Lỗi API",
|
"api_error": "Lỗi API",
|
||||||
"information": "Information",
|
"information": "Thông tin",
|
||||||
"status": "Trạng thái",
|
"status": "Trạng thái",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"raw_error": "Raw Error",
|
"raw_error": "Lỗi thô",
|
||||||
"response_data": "Response Data"
|
"response_data": "Dữ liệu phản hồi"
|
||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"current": "Vị trí hiện tại",
|
"current": "Vị trí hiện tại",
|
||||||
@@ -44,106 +44,106 @@
|
|||||||
"total": "Tổng",
|
"total": "Tổng",
|
||||||
"free": "Dư",
|
"free": "Dư",
|
||||||
"used": "Đã dùng",
|
"used": "Đã dùng",
|
||||||
"load": "Load",
|
"load": "\n",
|
||||||
"temp": "TEMP",
|
"temp": "TEMP",
|
||||||
"max": "Max",
|
"max": "Tối đa",
|
||||||
"uptime": "UP"
|
"uptime": "UP"
|
||||||
},
|
},
|
||||||
"unifi": {
|
"unifi": {
|
||||||
"users": "Users",
|
"users": "Người dùng",
|
||||||
"uptime": "Uptime",
|
"uptime": "Thời gian hoạt động",
|
||||||
"days": "Days",
|
"days": "Ngày",
|
||||||
"wan": "WAN",
|
"wan": "WAN",
|
||||||
"lan": "LAN",
|
"lan": "LAN",
|
||||||
"wlan": "WLAN",
|
"wlan": "WLAN",
|
||||||
"devices": "Devices",
|
"devices": "Thiết bị",
|
||||||
"lan_devices": "LAN Devices",
|
"lan_devices": "Thiết bị trong mạng LAN",
|
||||||
"wlan_devices": "WLAN Devices",
|
"wlan_devices": "Thiết bị trong mạng WLAN",
|
||||||
"lan_users": "LAN Users",
|
"lan_users": "Người dùng mạng LAN",
|
||||||
"wlan_users": "WLAN Users",
|
"wlan_users": "Người dùng mạng WLAN",
|
||||||
"up": "UP",
|
"up": "UP",
|
||||||
"down": "DOWN",
|
"down": "DOWN",
|
||||||
"wait": "Please wait",
|
"wait": "Vui lòng chờ",
|
||||||
"empty_data": "Subsystem status unknown"
|
"empty_data": "Trạng thái hệ thống phụ không xác định"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"rx": "RX",
|
"rx": "RX",
|
||||||
"tx": "TX",
|
"tx": "TX",
|
||||||
"mem": "MEM",
|
"mem": "Bộ nhớ",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"running": "Running",
|
"running": "Đang hoạt động",
|
||||||
"offline": "Ngoại tuyến",
|
"offline": "Ngoại tuyến",
|
||||||
"error": "Error",
|
"error": "Lỗi",
|
||||||
"unknown": "Unknown",
|
"unknown": "Không xác định",
|
||||||
"healthy": "Healthy",
|
"healthy": "Ổn định",
|
||||||
"starting": "Starting",
|
"starting": "Đang bắt đầu",
|
||||||
"unhealthy": "Unhealthy",
|
"unhealthy": "Bất thường",
|
||||||
"not_found": "Not Found",
|
"not_found": "Không tìm thấy",
|
||||||
"exited": "Exited",
|
"exited": "Exited",
|
||||||
"partial": "Partial"
|
"partial": "Partial"
|
||||||
},
|
},
|
||||||
"ping": {
|
"ping": {
|
||||||
"error": "Error",
|
"error": "Lỗi",
|
||||||
"ping": "Ping",
|
"ping": "Ping",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"not_available": "Không khả dụng"
|
"not_available": "Không khả dụng"
|
||||||
},
|
},
|
||||||
"siteMonitor": {
|
"siteMonitor": {
|
||||||
"http_status": "HTTP status",
|
"http_status": "Trạng thái HTTP",
|
||||||
"error": "Error",
|
"error": "Lỗi",
|
||||||
"response": "Response",
|
"response": "Phản hồi",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"not_available": "Not Available"
|
"not_available": "Không có sẵn"
|
||||||
},
|
},
|
||||||
"emby": {
|
"emby": {
|
||||||
"playing": "Đang chơi",
|
"playing": "Đang chơi",
|
||||||
"transcoding": "Chuyển định dạng",
|
"transcoding": "Chuyển định dạng",
|
||||||
"bitrate": "Bitrate",
|
"bitrate": "Bitrate",
|
||||||
"no_active": "No Active Streams",
|
"no_active": "No Active Streams",
|
||||||
"movies": "Movies",
|
"movies": "Phim ảnh",
|
||||||
"series": "Series",
|
"series": "Series",
|
||||||
"episodes": "Episodes",
|
"episodes": "Episodes",
|
||||||
"songs": "Songs"
|
"songs": "Bài hát"
|
||||||
},
|
},
|
||||||
"esphome": {
|
"esphome": {
|
||||||
"offline": "Offline",
|
"offline": "Offline",
|
||||||
"offline_alt": "Offline",
|
"offline_alt": "Offline",
|
||||||
"online": "Online",
|
"online": "Online",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"unknown": "Unknown"
|
"unknown": "Không xác định"
|
||||||
},
|
},
|
||||||
"evcc": {
|
"evcc": {
|
||||||
"pv_power": "Production",
|
"pv_power": "Production",
|
||||||
"battery_soc": "Battery",
|
"battery_soc": "Pin",
|
||||||
"grid_power": "Grid",
|
"grid_power": "Lưới",
|
||||||
"home_power": "Consumption",
|
"home_power": "Consumption",
|
||||||
"charge_power": "Charger",
|
"charge_power": "Bộ sạc",
|
||||||
"kilowatt": "kW"
|
"kilowatt": "kW"
|
||||||
},
|
},
|
||||||
"flood": {
|
"flood": {
|
||||||
"download": "Download",
|
"download": "Tải xuống",
|
||||||
"upload": "Upload",
|
"upload": "Tải lên",
|
||||||
"leech": "Leech",
|
"leech": "",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
"freshrss": {
|
"freshrss": {
|
||||||
"subscriptions": "Subscriptions",
|
"subscriptions": "Đăng ký",
|
||||||
"unread": "Unread"
|
"unread": "Chưa đọc"
|
||||||
},
|
},
|
||||||
"fritzbox": {
|
"fritzbox": {
|
||||||
"connectionStatus": "Status",
|
"connectionStatus": "Trạng thái",
|
||||||
"connectionStatusUnconfigured": "Unconfigured",
|
"connectionStatusUnconfigured": "Chưa được cấu hình",
|
||||||
"connectionStatusConnecting": "Connecting",
|
"connectionStatusConnecting": "Đang kết nối",
|
||||||
"connectionStatusAuthenticating": "Authenticating",
|
"connectionStatusAuthenticating": "Đang uỷ quyền",
|
||||||
"connectionStatusPendingDisconnect": "Pending Disconnect",
|
"connectionStatusPendingDisconnect": "Đang chờ ngắt kết nối",
|
||||||
"connectionStatusDisconnecting": "Disconnecting",
|
"connectionStatusDisconnecting": "Đang ngắt kết nối",
|
||||||
"connectionStatusDisconnected": "Disconnected",
|
"connectionStatusDisconnected": "Đã ngắt kết nối",
|
||||||
"connectionStatusConnected": "Connected",
|
"connectionStatusConnected": "Đã kết nối",
|
||||||
"uptime": "Uptime",
|
"uptime": "Thời gian hoạt động",
|
||||||
"maxDown": "Max. Down",
|
"maxDown": "Tải xuống tối đa",
|
||||||
"maxUp": "Max. Up",
|
"maxUp": "Tải lên tối đa",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"received": "Received",
|
"received": "Received",
|
||||||
@@ -999,64 +999,64 @@
|
|||||||
"systems": "Systems",
|
"systems": "Systems",
|
||||||
"up": "Up",
|
"up": "Up",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"paused": "Paused",
|
"paused": "Đã tạm dừng",
|
||||||
"pending": "Pending",
|
"pending": "Đang xử lý",
|
||||||
"status": "Status",
|
"status": "Trạng thái",
|
||||||
"updated": "Updated",
|
"updated": "Đã cập nhật",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"memory": "MEM",
|
"memory": "MEM",
|
||||||
"disk": "Disk",
|
"disk": "Ổ đĩa",
|
||||||
"network": "NET"
|
"network": "NET"
|
||||||
},
|
},
|
||||||
"argocd": {
|
"argocd": {
|
||||||
"apps": "Apps",
|
"apps": "Ứng dụng",
|
||||||
"synced": "Synced",
|
"synced": "Synced",
|
||||||
"outOfSync": "Out Of Sync",
|
"outOfSync": "Out Of Sync",
|
||||||
"healthy": "Healthy",
|
"healthy": "Ổn định",
|
||||||
"degraded": "Degraded",
|
"degraded": "Degraded",
|
||||||
"progressing": "Progressing",
|
"progressing": "Progressing",
|
||||||
"missing": "Missing",
|
"missing": "Bị thiếu",
|
||||||
"suspended": "Suspended"
|
"suspended": "Suspended"
|
||||||
},
|
},
|
||||||
"spoolman": {
|
"spoolman": {
|
||||||
"loading": "Loading"
|
"loading": "Đang tải"
|
||||||
},
|
},
|
||||||
"gitlab": {
|
"gitlab": {
|
||||||
"groups": "Groups",
|
"groups": "Nhóm",
|
||||||
"issues": "Issues",
|
"issues": "Vấn đề",
|
||||||
"merges": "Merge Requests",
|
"merges": "Yêu cầu Hợp nhất",
|
||||||
"projects": "Projects"
|
"projects": "Dự án"
|
||||||
},
|
},
|
||||||
"apcups": {
|
"apcups": {
|
||||||
"status": "Status",
|
"status": "Trạng thái",
|
||||||
"load": "Load",
|
"load": "Đang tải\n",
|
||||||
"bcharge": "Battery Charge",
|
"bcharge": "Sạc pin",
|
||||||
"timeleft": "Time Left"
|
"timeleft": "Thời gian còn lại"
|
||||||
},
|
},
|
||||||
"karakeep": {
|
"karakeep": {
|
||||||
"bookmarks": "Bookmarks",
|
"bookmarks": "Dấu trang",
|
||||||
"favorites": "Favorites",
|
"favorites": "Mục yêu thích",
|
||||||
"archived": "Archived",
|
"archived": "Đã lưu trữ",
|
||||||
"highlights": "Highlights",
|
"highlights": "Tâm điểm",
|
||||||
"lists": "Lists",
|
"lists": "Danh sách",
|
||||||
"tags": "Tags"
|
"tags": "Thẻ"
|
||||||
},
|
},
|
||||||
"slskd": {
|
"slskd": {
|
||||||
"slskStatus": "Network",
|
"slskStatus": "Mạng",
|
||||||
"connected": "Connected",
|
"connected": "Đã kết nối",
|
||||||
"disconnected": "Disconnected",
|
"disconnected": "Mất kết nối",
|
||||||
"updateStatus": "Update",
|
"updateStatus": "Cập nhật",
|
||||||
"update_yes": "Available",
|
"update_yes": "Khả dụng",
|
||||||
"update_no": "Up to Date",
|
"update_no": "Đã cập nhật",
|
||||||
"downloads": "Downloads",
|
"downloads": "Tải xuống",
|
||||||
"uploads": "Uploads",
|
"uploads": "Tải lên",
|
||||||
"sharedFiles": "Files"
|
"sharedFiles": "Tập tin"
|
||||||
},
|
},
|
||||||
"jellystat": {
|
"jellystat": {
|
||||||
"songs": "Songs",
|
"songs": "Bài hát",
|
||||||
"movies": "Movies",
|
"movies": "Phim ảnh",
|
||||||
"episodes": "Episodes",
|
"episodes": "Tập",
|
||||||
"other": "Other"
|
"other": "Khác"
|
||||||
},
|
},
|
||||||
"checkmk": {
|
"checkmk": {
|
||||||
"serviceErrors": "Service issues",
|
"serviceErrors": "Service issues",
|
||||||
@@ -1067,8 +1067,8 @@
|
|||||||
"running": "Running",
|
"running": "Running",
|
||||||
"stopped": "Stopped",
|
"stopped": "Stopped",
|
||||||
"down": "Down",
|
"down": "Down",
|
||||||
"unhealthy": "Unhealthy",
|
"unhealthy": "Không ổn định",
|
||||||
"unknown": "Unknown",
|
"unknown": "Không xác định",
|
||||||
"servers": "Servers",
|
"servers": "Servers",
|
||||||
"stacks": "Stacks",
|
"stacks": "Stacks",
|
||||||
"containers": "Containers"
|
"containers": "Containers"
|
||||||
@@ -1076,18 +1076,18 @@
|
|||||||
"filebrowser": {
|
"filebrowser": {
|
||||||
"available": "Available",
|
"available": "Available",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"total": "Total"
|
"total": "Tổng"
|
||||||
},
|
},
|
||||||
"wallos": {
|
"wallos": {
|
||||||
"activeSubscriptions": "Subscriptions",
|
"activeSubscriptions": "Đăng ký",
|
||||||
"thisMonthlyCost": "This Month",
|
"thisMonthlyCost": "Tháng này",
|
||||||
"nextMonthlyCost": "Next Month",
|
"nextMonthlyCost": "Tháng sau",
|
||||||
"previousMonthlyCost": "Prev. Month",
|
"previousMonthlyCost": "Tháng trước",
|
||||||
"nextRenewingSubscription": "Next Payment"
|
"nextRenewingSubscription": "Lần thanh toán kế tiếp"
|
||||||
},
|
},
|
||||||
"unraid": {
|
"unraid": {
|
||||||
"STARTED": "Started",
|
"STARTED": "Đã bắt đầu",
|
||||||
"STOPPED": "Stopped",
|
"STOPPED": "Đã dừng",
|
||||||
"NEW_ARRAY": "New Array",
|
"NEW_ARRAY": "New Array",
|
||||||
"RECON_DISK": "Reconstructing Disk",
|
"RECON_DISK": "Reconstructing Disk",
|
||||||
"DISABLE_DISK": "Disk Disabled",
|
"DISABLE_DISK": "Disk Disabled",
|
||||||
@@ -1096,9 +1096,9 @@
|
|||||||
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
|
||||||
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
|
||||||
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
|
||||||
"NO_DATA_DISKS": "No Data Disks",
|
"NO_DATA_DISKS": "Không có dữ liệu ổ đĩa",
|
||||||
"notifications": "Notifications",
|
"notifications": "Thông báo",
|
||||||
"status": "Status",
|
"status": "Trạng thái",
|
||||||
"cpu": "CPU",
|
"cpu": "CPU",
|
||||||
"memoryUsed": "Memory Used",
|
"memoryUsed": "Memory Used",
|
||||||
"memoryAvailable": "Memory Available",
|
"memoryAvailable": "Memory Available",
|
||||||
@@ -1108,11 +1108,16 @@
|
|||||||
"poolFree": "{{pool}} Free"
|
"poolFree": "{{pool}} Free"
|
||||||
},
|
},
|
||||||
"backrest": {
|
"backrest": {
|
||||||
"num_plans": "Plans",
|
"num_plans": "Các kế hoạch",
|
||||||
"num_success_30": "Successes",
|
"num_success_30": "Thành công",
|
||||||
"num_failure_30": "Failures",
|
"num_failure_30": "Thất bại",
|
||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Bài hát",
|
||||||
|
"time": "Thời gian",
|
||||||
|
"artists": "Nghệ sĩ"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,10 +200,10 @@
|
|||||||
"rutorrent": {
|
"rutorrent": {
|
||||||
"active": "活动中",
|
"active": "活动中",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"download": "Download"
|
"download": "下载"
|
||||||
},
|
},
|
||||||
"transmission": {
|
"transmission": {
|
||||||
"download": "Download",
|
"download": "下载",
|
||||||
"upload": "",
|
"upload": "",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
@@ -223,8 +223,8 @@
|
|||||||
"invalid": "Invalid"
|
"invalid": "Invalid"
|
||||||
},
|
},
|
||||||
"deluge": {
|
"deluge": {
|
||||||
"download": "Download",
|
"download": "下载",
|
||||||
"upload": "Upload",
|
"upload": "上传",
|
||||||
"leech": "Leech",
|
"leech": "Leech",
|
||||||
"seed": "Seed"
|
"seed": "Seed"
|
||||||
},
|
},
|
||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,47 @@
|
|||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { useTranslation } from "next-i18next";
|
import { useTranslation } from "next-i18next";
|
||||||
|
import { useContext, useMemo } from "react";
|
||||||
|
|
||||||
export default function Block({ value, label }) {
|
import { BlockHighlightContext } from "./highlight-context";
|
||||||
|
|
||||||
|
import { evaluateHighlight, getHighlightClass } from "utils/highlights";
|
||||||
|
|
||||||
|
export default function Block({ value, label, field }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const highlightConfig = useContext(BlockHighlightContext);
|
||||||
|
|
||||||
|
const highlight = useMemo(() => {
|
||||||
|
if (!highlightConfig) return null;
|
||||||
|
const labels = Array.isArray(label) ? label : [label];
|
||||||
|
const candidates = [];
|
||||||
|
if (typeof field === "string") candidates.push(field);
|
||||||
|
for (const candidateLabel of labels) {
|
||||||
|
if (typeof candidateLabel === "string") candidates.push(candidateLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const candidate of candidates) {
|
||||||
|
const result = evaluateHighlight(candidate, value, highlightConfig);
|
||||||
|
if (result) return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}, [field, label, value, highlightConfig]);
|
||||||
|
|
||||||
|
const highlightClass = useMemo(() => {
|
||||||
|
if (!highlight?.level) return undefined;
|
||||||
|
return getHighlightClass(highlight.level, highlightConfig);
|
||||||
|
}, [highlight, highlightConfig]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={classNames(
|
className={classNames(
|
||||||
"bg-theme-200/50 dark:bg-theme-900/20 rounded-sm m-1 flex-1 flex flex-col items-center justify-center text-center p-1",
|
"bg-theme-200/50 dark:bg-theme-900/20 rounded-sm m-1 flex-1 flex flex-col items-center justify-center text-center p-1",
|
||||||
value === undefined ? "animate-pulse" : "",
|
value === undefined ? "animate-pulse" : "",
|
||||||
|
highlightClass,
|
||||||
"service-block",
|
"service-block",
|
||||||
)}
|
)}
|
||||||
|
data-highlight-level={highlight?.level}
|
||||||
|
data-highlight-source={highlight?.source}
|
||||||
>
|
>
|
||||||
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
|
||||||
<div className="font-bold text-xs uppercase">{t(label)}</div>
|
<div className="font-bold text-xs uppercase">{t(label)}</div>
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
import { useContext } from "react";
|
import { useContext, useMemo } from "react";
|
||||||
import { SettingsContext } from "utils/contexts/settings";
|
import { SettingsContext } from "utils/contexts/settings";
|
||||||
|
|
||||||
import Error from "./error";
|
import Error from "./error";
|
||||||
|
import { BlockHighlightContext } from "./highlight-context";
|
||||||
|
|
||||||
|
import { buildHighlightConfig } from "utils/highlights";
|
||||||
|
|
||||||
const ALIASED_WIDGETS = {
|
const ALIASED_WIDGETS = {
|
||||||
pialert: "netalertx",
|
pialert: "netalertx",
|
||||||
@@ -11,6 +14,11 @@ const ALIASED_WIDGETS = {
|
|||||||
export default function Container({ error = false, children, service }) {
|
export default function Container({ error = false, children, service }) {
|
||||||
const { settings } = useContext(SettingsContext);
|
const { settings } = useContext(SettingsContext);
|
||||||
|
|
||||||
|
const highlightConfig = useMemo(
|
||||||
|
() => buildHighlightConfig(settings?.blockHighlights, service?.widget?.highlight, service?.widget?.type),
|
||||||
|
[settings?.blockHighlights, service?.widget?.highlight, service?.widget?.type],
|
||||||
|
);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
if (settings.hideErrors || service.widget.hide_errors) {
|
if (settings.hideErrors || service.widget.hide_errors) {
|
||||||
return null;
|
return null;
|
||||||
@@ -51,6 +59,11 @@ export default function Container({ error = false, children, service }) {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
const content = <div className="relative flex flex-row w-full service-container">{visibleChildren}</div>;
|
||||||
|
|
||||||
return <div className="relative flex flex-row w-full service-container">{visibleChildren}</div>;
|
if (!highlightConfig) {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <BlockHighlightContext.Provider value={highlightConfig}>{content}</BlockHighlightContext.Provider>;
|
||||||
}
|
}
|
||||||
|
|||||||
3
src/components/services/widget/highlight-context.jsx
Normal file
3
src/components/services/widget/highlight-context.jsx
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { createContext } from "react";
|
||||||
|
|
||||||
|
export const BlockHighlightContext = createContext(null);
|
||||||
@@ -55,8 +55,7 @@ export default function Version({ disableUpdateCheck = false }) {
|
|||||||
</span>
|
</span>
|
||||||
{!validate(version)
|
{!validate(version)
|
||||||
? null
|
? null
|
||||||
: releaseData &&
|
: latestRelease &&
|
||||||
latestRelease &&
|
|
||||||
compareVersions(latestRelease.tag_name, version) > 0 && (
|
compareVersions(latestRelease.tag_name, version) > 0 && (
|
||||||
<a
|
<a
|
||||||
href={latestRelease.html_url}
|
href={latestRelease.html_url}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ export default function Widget({ options }) {
|
|||||||
<Resource
|
<Resource
|
||||||
icon={FaMemory}
|
icon={FaMemory}
|
||||||
value={t("common.bytes", {
|
value={t("common.bytes", {
|
||||||
value: data.mem.free,
|
value: data.mem.available,
|
||||||
maximumFractionDigits: 1,
|
maximumFractionDigits: 1,
|
||||||
binary: true,
|
binary: true,
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
export default function QueueEntry({ title, activity, timeLeft, progress }) {
|
export default function QueueEntry({ title, activity, timeLeft, progress, size }) {
|
||||||
return (
|
return (
|
||||||
<div className="text-theme-700 dark:text-theme-200 relative h-5 rounded-md bg-theme-200/50 dark:bg-theme-900/20 m-1 px-1 flex">
|
<div className="text-theme-700 dark:text-theme-200 relative h-5 rounded-md bg-theme-200/50 dark:bg-theme-900/20 m-1 px-1 flex">
|
||||||
<div
|
<div
|
||||||
@@ -11,6 +11,7 @@ export default function QueueEntry({ title, activity, timeLeft, progress }) {
|
|||||||
<div className="absolute w-full whitespace-nowrap text-ellipsis overflow-hidden text-left">{title}</div>
|
<div className="absolute w-full whitespace-nowrap text-ellipsis overflow-hidden text-left">{title}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
|
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
|
||||||
|
{size && `${size} - `}
|
||||||
{timeLeft ? `${activity} - ${timeLeft}` : activity}
|
{timeLeft ? `${activity} - ${timeLeft}` : activity}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -417,6 +417,7 @@ function Home({ initialSettings }) {
|
|||||||
)}
|
)}
|
||||||
<meta name="msapplication-TileColor" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
|
<meta name="msapplication-TileColor" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
|
||||||
<meta name="theme-color" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
|
<meta name="theme-color" content={themes[settings.color || "slate"][settings.theme || "dark"]} />
|
||||||
|
<meta name="color-scheme" content="dark light"></meta>
|
||||||
</Head>
|
</Head>
|
||||||
|
|
||||||
<Script src="/api/config/custom.js" />
|
<Script src="/api/config/custom.js" />
|
||||||
@@ -424,7 +425,7 @@ function Home({ initialSettings }) {
|
|||||||
<div
|
<div
|
||||||
className={classNames(
|
className={classNames(
|
||||||
settings.fullWidth ? "" : "container",
|
settings.fullWidth ? "" : "container",
|
||||||
"relative m-auto flex flex-col justify-start z-10 h-full",
|
"relative m-auto flex flex-col justify-start z-10 h-full min-h-screen",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<QuickLaunch
|
<QuickLaunch
|
||||||
@@ -539,38 +540,48 @@ export default function Wrapper({ initialSettings, fallback }) {
|
|||||||
html.classList.add(desiredThemeClass);
|
html.classList.add(desiredThemeClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove any previously applied inline styles
|
if (backgroundImage) {
|
||||||
body.style.backgroundImage = "";
|
const safeBackgroundImage = backgroundImage.replace(/'/g, "\\'");
|
||||||
body.style.backgroundColor = "";
|
body.style.backgroundImage = `linear-gradient(rgb(var(--bg-color) / ${opacity}), rgb(var(--bg-color) / ${opacity})), url('${safeBackgroundImage}')`;
|
||||||
body.style.backgroundAttachment = "";
|
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 = "";
|
||||||
|
};
|
||||||
}, [backgroundImage, opacity, theme, color, initialSettings.color]);
|
}, [backgroundImage, opacity, theme, color, initialSettings.color]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div id="page_wrapper" className="relative min-h-screen">
|
||||||
{backgroundImage && (
|
<div
|
||||||
<div
|
id="inner_wrapper"
|
||||||
id="background"
|
tabIndex="-1"
|
||||||
aria-hidden="true"
|
className={classNames(
|
||||||
style={{
|
"w-full min-h-screen overflow-auto",
|
||||||
backgroundImage: `linear-gradient(rgb(var(--bg-color) / ${opacity}), rgb(var(--bg-color) / ${opacity})), url('${backgroundImage}')`,
|
backgroundBlur &&
|
||||||
}}
|
`backdrop-blur${initialSettings.background.blur?.length ? `-${initialSettings.background.blur}` : ""}`,
|
||||||
/>
|
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
|
||||||
)}
|
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
|
||||||
<div id="page_wrapper" className="relative h-full">
|
)}
|
||||||
<div
|
>
|
||||||
id="inner_wrapper"
|
<Index initialSettings={initialSettings} fallback={fallback} />
|
||||||
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>
|
||||||
</>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,18 +30,6 @@ body,
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 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,
|
html,
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
// all widgets
|
// all widgets
|
||||||
fields,
|
fields,
|
||||||
hideErrors,
|
hideErrors,
|
||||||
|
highlight,
|
||||||
type,
|
type,
|
||||||
|
|
||||||
// azuredevops
|
// azuredevops
|
||||||
@@ -284,6 +285,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
|
|
||||||
// deluge, qbittorrent
|
// deluge, qbittorrent
|
||||||
enableLeechProgress,
|
enableLeechProgress,
|
||||||
|
enableLeechSize,
|
||||||
|
|
||||||
// diskstation
|
// diskstation
|
||||||
volume,
|
volume,
|
||||||
@@ -408,6 +410,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
// wgeasy
|
// wgeasy
|
||||||
threshold,
|
threshold,
|
||||||
|
|
||||||
|
// yourspotify
|
||||||
|
interval,
|
||||||
|
|
||||||
// technitium
|
// technitium
|
||||||
range,
|
range,
|
||||||
|
|
||||||
@@ -437,6 +442,21 @@ export function cleanServiceGroups(groups) {
|
|||||||
index,
|
index,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (highlight) {
|
||||||
|
let parsedHighlight = highlight;
|
||||||
|
if (typeof highlight === "string") {
|
||||||
|
try {
|
||||||
|
parsedHighlight = JSON.parse(highlight);
|
||||||
|
} catch (e) {
|
||||||
|
logger.error("Invalid highlight configuration detected in config for service '%s'", service.name);
|
||||||
|
parsedHighlight = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (parsedHighlight && typeof parsedHighlight === "object") {
|
||||||
|
widget.highlight = parsedHighlight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (type === "azuredevops") {
|
if (type === "azuredevops") {
|
||||||
if (userEmail) widget.userEmail = userEmail;
|
if (userEmail) widget.userEmail = userEmail;
|
||||||
if (repositoryId) widget.repositoryId = repositoryId;
|
if (repositoryId) widget.repositoryId = repositoryId;
|
||||||
@@ -490,6 +510,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
}
|
}
|
||||||
if (["deluge", "qbittorrent"].includes(type)) {
|
if (["deluge", "qbittorrent"].includes(type)) {
|
||||||
if (enableLeechProgress !== undefined) widget.enableLeechProgress = JSON.parse(enableLeechProgress);
|
if (enableLeechProgress !== undefined) widget.enableLeechProgress = JSON.parse(enableLeechProgress);
|
||||||
|
if (enableLeechSize !== undefined) widget.enableLeechSize = JSON.parse(enableLeechSize);
|
||||||
}
|
}
|
||||||
if (["opnsense", "pfsense"].includes(type)) {
|
if (["opnsense", "pfsense"].includes(type)) {
|
||||||
if (wan) widget.wan = wan;
|
if (wan) widget.wan = wan;
|
||||||
@@ -623,6 +644,11 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (pool3) widget.pool3 = pool3;
|
if (pool3) widget.pool3 = pool3;
|
||||||
if (pool4) widget.pool4 = pool4;
|
if (pool4) widget.pool4 = pool4;
|
||||||
}
|
}
|
||||||
|
if (type === "yourspotify") {
|
||||||
|
if (interval !== undefined) {
|
||||||
|
widget.interval = interval;
|
||||||
|
}
|
||||||
|
}
|
||||||
return widget;
|
return widget;
|
||||||
});
|
});
|
||||||
return cleanedService;
|
return cleanedService;
|
||||||
|
|||||||
257
src/utils/highlights.js
Normal file
257
src/utils/highlights.js
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
const DEFAULT_LEVEL_CLASSES = {
|
||||||
|
good: "bg-emerald-500/40 text-emerald-950 dark:bg-emerald-900/60 dark:text-emerald-400",
|
||||||
|
warn: "bg-amber-300/30 text-amber-900 dark:bg-amber-900/30 dark:text-amber-200",
|
||||||
|
danger: "bg-rose-700/45 text-rose-200 dark:bg-rose-950/70 dark:text-rose-400",
|
||||||
|
};
|
||||||
|
|
||||||
|
const normalizeFieldKeys = (fields, widgetType) => {
|
||||||
|
if (!fields || typeof fields !== "object") return {};
|
||||||
|
|
||||||
|
return Object.entries(fields).reduce((acc, [key, value]) => {
|
||||||
|
if (value === null || value === undefined) return acc;
|
||||||
|
if (typeof key !== "string") return acc;
|
||||||
|
const trimmedKey = key.trim();
|
||||||
|
if (trimmedKey === "") return acc;
|
||||||
|
|
||||||
|
acc[trimmedKey] = value;
|
||||||
|
|
||||||
|
if (widgetType && !trimmedKey.includes(".")) {
|
||||||
|
const namespacedKey = `${widgetType}.${trimmedKey}`;
|
||||||
|
if (!(namespacedKey in acc)) {
|
||||||
|
acc[namespacedKey] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const buildHighlightConfig = (globalConfig, widgetConfig, widgetType) => {
|
||||||
|
const levels = {
|
||||||
|
...DEFAULT_LEVEL_CLASSES,
|
||||||
|
...(globalConfig?.levels || {}),
|
||||||
|
...(widgetConfig?.levels || {}),
|
||||||
|
};
|
||||||
|
|
||||||
|
const { levels: _levels, ...fields } = widgetConfig || {};
|
||||||
|
const normalizedFields = normalizeFieldKeys(fields, widgetType);
|
||||||
|
|
||||||
|
const hasLevels = Object.values(levels).some(Boolean);
|
||||||
|
const hasFields = Object.keys(normalizedFields).length > 0;
|
||||||
|
|
||||||
|
if (!hasLevels && !hasFields) return null;
|
||||||
|
|
||||||
|
return { levels, fields: normalizedFields };
|
||||||
|
};
|
||||||
|
|
||||||
|
const NUMERIC_OPERATORS = {
|
||||||
|
gt: (value, target) => value > target,
|
||||||
|
gte: (value, target) => value >= target,
|
||||||
|
lt: (value, target) => value < target,
|
||||||
|
lte: (value, target) => value <= target,
|
||||||
|
eq: (value, target) => value === target,
|
||||||
|
ne: (value, target) => value !== target,
|
||||||
|
};
|
||||||
|
|
||||||
|
const STRING_OPERATORS = {
|
||||||
|
equals: (value, target, caseSensitive) =>
|
||||||
|
caseSensitive ? value === target : value.toLowerCase() === target.toLowerCase(),
|
||||||
|
includes: (value, target, caseSensitive) =>
|
||||||
|
caseSensitive ? value.includes(target) : value.toLowerCase().includes(target.toLowerCase()),
|
||||||
|
startsWith: (value, target, caseSensitive) =>
|
||||||
|
caseSensitive ? value.startsWith(target) : value.toLowerCase().startsWith(target.toLowerCase()),
|
||||||
|
endsWith: (value, target, caseSensitive) =>
|
||||||
|
caseSensitive ? value.endsWith(target) : value.toLowerCase().endsWith(target.toLowerCase()),
|
||||||
|
};
|
||||||
|
|
||||||
|
const toNumber = (value) => {
|
||||||
|
if (typeof value === "number" && Number.isFinite(value)) return value;
|
||||||
|
if (typeof value === "string" && value.trim()) {
|
||||||
|
const trimmed = value.trim();
|
||||||
|
const candidate = Number(trimmed);
|
||||||
|
if (!Number.isNaN(candidate)) return candidate;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
const parseNumericValue = (value) => {
|
||||||
|
if (value === null || value === undefined) return undefined;
|
||||||
|
if (typeof value === "number" && Number.isFinite(value)) return value;
|
||||||
|
|
||||||
|
if (typeof value === "string") {
|
||||||
|
const trimmed = value.trim();
|
||||||
|
if (!trimmed) return undefined;
|
||||||
|
|
||||||
|
const direct = Number(trimmed);
|
||||||
|
if (!Number.isNaN(direct)) return direct;
|
||||||
|
|
||||||
|
const compact = trimmed.replace(/\s+/g, "");
|
||||||
|
if (!compact || !/^[-+]?[0-9.,]+$/.test(compact)) return undefined;
|
||||||
|
|
||||||
|
const commaCount = (compact.match(/,/g) || []).length;
|
||||||
|
const dotCount = (compact.match(/\./g) || []).length;
|
||||||
|
|
||||||
|
if (commaCount && dotCount) {
|
||||||
|
const lastComma = compact.lastIndexOf(",");
|
||||||
|
const lastDot = compact.lastIndexOf(".");
|
||||||
|
if (lastComma > lastDot) {
|
||||||
|
const asDecimal = compact.replace(/\./g, "").replace(/,/g, ".");
|
||||||
|
const parsed = Number(asDecimal);
|
||||||
|
return Number.isNaN(parsed) ? undefined : parsed;
|
||||||
|
}
|
||||||
|
const asThousands = compact.replace(/,/g, "");
|
||||||
|
const parsed = Number(asThousands);
|
||||||
|
return Number.isNaN(parsed) ? undefined : parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (commaCount) {
|
||||||
|
const parts = compact.split(",");
|
||||||
|
if (commaCount === 1 && parts[1]?.length <= 2) {
|
||||||
|
const parsed = Number(compact.replace(",", "."));
|
||||||
|
if (!Number.isNaN(parsed)) return parsed;
|
||||||
|
}
|
||||||
|
const isGrouped = parts.length > 1 && parts.slice(1).every((part) => part.length === 3);
|
||||||
|
if (isGrouped) {
|
||||||
|
const parsed = Number(compact.replace(/,/g, ""));
|
||||||
|
if (!Number.isNaN(parsed)) return parsed;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dotCount) {
|
||||||
|
const parts = compact.split(".");
|
||||||
|
if (dotCount === 1 && parts[1]?.length <= 2) {
|
||||||
|
const parsed = Number(compact);
|
||||||
|
if (!Number.isNaN(parsed)) return parsed;
|
||||||
|
}
|
||||||
|
const isGrouped = parts.length > 1 && parts.slice(1).every((part) => part.length === 3);
|
||||||
|
if (isGrouped) {
|
||||||
|
const parsed = Number(compact.replace(/\./g, ""));
|
||||||
|
if (!Number.isNaN(parsed)) return parsed;
|
||||||
|
}
|
||||||
|
const parsed = Number(compact);
|
||||||
|
return Number.isNaN(parsed) ? undefined : parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsed = Number(compact);
|
||||||
|
return Number.isNaN(parsed) ? undefined : parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value === "object" && value !== null && "props" in value) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
const evaluateNumericRule = (value, rule) => {
|
||||||
|
if (!rule || typeof rule !== "object") return false;
|
||||||
|
const operator = rule.when && NUMERIC_OPERATORS[rule.when];
|
||||||
|
const numericValue = toNumber(rule.value);
|
||||||
|
if (operator && numericValue !== undefined) {
|
||||||
|
const passes = operator(value, numericValue);
|
||||||
|
return rule.negate ? !passes : passes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule.when === "between") {
|
||||||
|
const min = toNumber(rule.min ?? rule.value?.min);
|
||||||
|
const max = toNumber(rule.max ?? rule.value?.max);
|
||||||
|
if (min === undefined && max === undefined) return false;
|
||||||
|
const lowerBound = min ?? Number.NEGATIVE_INFINITY;
|
||||||
|
const upperBound = max ?? Number.POSITIVE_INFINITY;
|
||||||
|
const passes = value >= lowerBound && value <= upperBound;
|
||||||
|
return rule.negate ? !passes : passes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rule.when === "outside") {
|
||||||
|
const min = toNumber(rule.min ?? rule.value?.min);
|
||||||
|
const max = toNumber(rule.max ?? rule.value?.max);
|
||||||
|
if (min === undefined && max === undefined) return false;
|
||||||
|
const passes = value < (min ?? Number.NEGATIVE_INFINITY) || value > (max ?? Number.POSITIVE_INFINITY);
|
||||||
|
return rule.negate ? !passes : passes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const evaluateStringRule = (value, rule) => {
|
||||||
|
if (!rule || typeof rule !== "object") return false;
|
||||||
|
if (rule.when === "regex" && typeof rule.value === "string") {
|
||||||
|
try {
|
||||||
|
const flags = rule.flags || (rule.caseSensitive ? "" : "i");
|
||||||
|
const regex = new RegExp(rule.value, flags);
|
||||||
|
const passes = regex.test(value);
|
||||||
|
return rule.negate ? !passes : passes;
|
||||||
|
} catch (error) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const operator = rule.when && STRING_OPERATORS[rule.when];
|
||||||
|
if (!operator || typeof rule.value !== "string") return false;
|
||||||
|
const passes = operator(value, rule.value, Boolean(rule.caseSensitive));
|
||||||
|
return rule.negate ? !passes : passes;
|
||||||
|
};
|
||||||
|
|
||||||
|
const ensureArray = (value) => {
|
||||||
|
if (Array.isArray(value)) return value;
|
||||||
|
if (value === undefined || value === null) return [];
|
||||||
|
return [value];
|
||||||
|
};
|
||||||
|
|
||||||
|
const findHighlightLevel = (ruleSet, numericValue, stringValue) => {
|
||||||
|
const { numeric, string } = ruleSet;
|
||||||
|
|
||||||
|
if (numeric && numericValue !== undefined) {
|
||||||
|
const numericRules = ensureArray(numeric);
|
||||||
|
const numericCandidates = Array.isArray(numericValue) ? numericValue : [numericValue];
|
||||||
|
for (const candidate of numericCandidates) {
|
||||||
|
for (const rule of numericRules) {
|
||||||
|
if (rule?.level && evaluateNumericRule(candidate, rule)) {
|
||||||
|
return { level: rule.level, source: "numeric", rule };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string && stringValue !== undefined) {
|
||||||
|
const stringRules = ensureArray(string);
|
||||||
|
for (const rule of stringRules) {
|
||||||
|
if (rule?.level && evaluateStringRule(stringValue, rule)) {
|
||||||
|
return { level: rule.level, source: "string", rule };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const evaluateHighlight = (fieldKey, value, highlightConfig) => {
|
||||||
|
if (!highlightConfig || !fieldKey) return null;
|
||||||
|
const { fields } = highlightConfig;
|
||||||
|
if (!fields || typeof fields !== "object") return null;
|
||||||
|
|
||||||
|
const ruleSet = fields[fieldKey];
|
||||||
|
if (!ruleSet) return null;
|
||||||
|
|
||||||
|
const numericValue = parseNumericValue(value);
|
||||||
|
let stringValue;
|
||||||
|
if (typeof value === "string") {
|
||||||
|
stringValue = value;
|
||||||
|
} else if (typeof value === "number" || typeof value === "bigint") {
|
||||||
|
stringValue = String(value);
|
||||||
|
} else if (typeof value === "boolean") {
|
||||||
|
stringValue = value ? "true" : "false";
|
||||||
|
}
|
||||||
|
|
||||||
|
const normalizedString = typeof stringValue === "string" ? stringValue.trim() : stringValue;
|
||||||
|
|
||||||
|
return findHighlightLevel(ruleSet, numericValue, normalizedString);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getHighlightClass = (level, highlightConfig) => {
|
||||||
|
if (!level || !highlightConfig) return undefined;
|
||||||
|
return highlightConfig.levels?.[level];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getDefaultHighlightLevels = () => DEFAULT_LEVEL_CLASSES;
|
||||||
@@ -24,10 +24,11 @@ function buildResponse(plans) {
|
|||||||
|
|
||||||
plans.forEach((plan) => {
|
plans.forEach((plan) => {
|
||||||
const statuses = plan?.recentBackups?.status;
|
const statuses = plan?.recentBackups?.status;
|
||||||
|
// See https://github.com/garethgeorge/backrest/blob/4357295a17cb2e71639473c9929a060c4dd1b624/proto/v1/operations.proto#L78-L87
|
||||||
if (Array.isArray(statuses) && statuses.length > 0) {
|
if (Array.isArray(statuses) && statuses.length > 0) {
|
||||||
if (statuses[0] === "STATUS_SUCCESS") {
|
if (statuses[0] === "STATUS_SUCCESS") {
|
||||||
numSuccessLatest++;
|
numSuccessLatest++;
|
||||||
} else {
|
} else if (statuses[0] === "STATUS_ERROR") {
|
||||||
numFailureLatest++;
|
numFailureLatest++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,13 +106,19 @@ export default function Integration({ config, params, setEvents, hideErrors, tim
|
|||||||
};
|
};
|
||||||
|
|
||||||
const eventsToAdd = [];
|
const eventsToAdd = [];
|
||||||
events.forEach((event, index) => {
|
events.forEach((event) => {
|
||||||
const occurrences = getOcurrencesFromRange(event);
|
const occurrences = getOcurrencesFromRange(event);
|
||||||
|
|
||||||
occurrences.forEach((icalDate) => {
|
occurrences.forEach((icalDate) => {
|
||||||
const date = icalDate.toJSDate();
|
const date = icalDate.toJSDate();
|
||||||
|
|
||||||
const hash = simpleHash(`${event.id}-${event.title}-${index}-${date.toString()}`);
|
const occurrenceTimestamp = date.getTime();
|
||||||
|
const eventIdentifier =
|
||||||
|
event.id ??
|
||||||
|
simpleHash(
|
||||||
|
`${event.title ?? ""}-${event.type ?? ""}-${event.status ?? ""}-${event.url ?? ""}-${event.location ?? ""}`,
|
||||||
|
);
|
||||||
|
const hash = simpleHash(`${eventIdentifier}-${occurrenceTimestamp}`);
|
||||||
|
|
||||||
let title = event.title;
|
let title = event.title;
|
||||||
if (showName) {
|
if (showName) {
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ const components = {
|
|||||||
wgeasy: dynamic(() => import("./wgeasy/component")),
|
wgeasy: dynamic(() => import("./wgeasy/component")),
|
||||||
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
||||||
xteve: dynamic(() => import("./xteve/component")),
|
xteve: dynamic(() => import("./xteve/component")),
|
||||||
|
yourspotify: dynamic(() => import("./yourspotify/component")),
|
||||||
zabbix: dynamic(() => import("./zabbix/component")),
|
zabbix: dynamic(() => import("./zabbix/component")),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -205,13 +205,14 @@ export default function Component({ service }) {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { widget } = service;
|
const { widget } = service;
|
||||||
|
const enableNowPlaying = service.widget?.enableNowPlaying ?? true;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: sessionsData,
|
data: sessionsData,
|
||||||
error: sessionsError,
|
error: sessionsError,
|
||||||
mutate: sessionMutate,
|
mutate: sessionMutate,
|
||||||
} = useWidgetAPI(widget, "Sessions", {
|
} = useWidgetAPI(widget, enableNowPlaying ? "Sessions" : "", {
|
||||||
refreshInterval: 5000,
|
refreshInterval: enableNowPlaying ? 5000 : undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { data: countData, error: countError } = useWidgetAPI(widget, "Count", {
|
const { data: countData, error: countError } = useWidgetAPI(widget, "Count", {
|
||||||
@@ -239,13 +240,12 @@ export default function Component({ service }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const enableBlocks = service.widget?.enableBlocks;
|
const enableBlocks = service.widget?.enableBlocks;
|
||||||
const enableNowPlaying = service.widget?.enableNowPlaying ?? true;
|
|
||||||
const enableMediaControl = service.widget?.enableMediaControl !== false; // default is true
|
const enableMediaControl = service.widget?.enableMediaControl !== false; // default is true
|
||||||
const enableUser = !!service.widget?.enableUser; // default is false
|
const enableUser = !!service.widget?.enableUser; // default is false
|
||||||
const expandOneStreamToTwoRows = service.widget?.expandOneStreamToTwoRows !== false; // default is true
|
const expandOneStreamToTwoRows = service.widget?.expandOneStreamToTwoRows !== false; // default is true
|
||||||
const showEpisodeNumber = !!service.widget?.showEpisodeNumber; // default is false
|
const showEpisodeNumber = !!service.widget?.showEpisodeNumber; // default is false
|
||||||
|
|
||||||
if (!sessionsData || !countData) {
|
if ((enableNowPlaying && !sessionsData) || !countData) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{enableBlocks && <CountBlocks service={service} countData={null} />}
|
{enableBlocks && <CountBlocks service={service} countData={null} />}
|
||||||
|
|||||||
@@ -14,6 +14,12 @@ export default function Component({ service }) {
|
|||||||
return <Container service={service} error={resultError} />;
|
return <Container service={service} error={resultError} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!widget.fields || widget.fields.length === 0) {
|
||||||
|
widget.fields = ["online", "offline", "offline_alt", "total"];
|
||||||
|
} else if (widget.fields.length > 4) {
|
||||||
|
widget.fields = widget.fields.slice(0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
if (!resultData) {
|
if (!resultData) {
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default function Component({ service }) {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (data) {
|
if (data) {
|
||||||
setDataPoints((prevDataPoints) => {
|
setDataPoints((prevDataPoints) => {
|
||||||
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.free }];
|
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.available }];
|
||||||
if (newDataPoints.length > pointsLimit) {
|
if (newDataPoints.length > pointsLimit) {
|
||||||
newDataPoints.shift();
|
newDataPoints.shift();
|
||||||
}
|
}
|
||||||
@@ -67,10 +67,10 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
{data && !error && (
|
{data && !error && (
|
||||||
<Block position="bottom-3 left-3">
|
<Block position="bottom-3 left-3">
|
||||||
{data.free && chart && (
|
{data.available && chart && (
|
||||||
<div className="text-xs opacity-50">
|
<div className="text-xs opacity-50">
|
||||||
{t("common.bytes", {
|
{t("common.bytes", {
|
||||||
value: data.free,
|
value: data.available,
|
||||||
maximumFractionDigits: 1,
|
maximumFractionDigits: 1,
|
||||||
binary: true,
|
binary: true,
|
||||||
})}{" "}
|
})}{" "}
|
||||||
@@ -93,10 +93,10 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
{!chart && (
|
{!chart && (
|
||||||
<Block position="top-3 right-3">
|
<Block position="top-3 right-3">
|
||||||
{data.free && (
|
{data.available && (
|
||||||
<div className="text-xs opacity-50">
|
<div className="text-xs opacity-50">
|
||||||
{t("common.bytes", {
|
{t("common.bytes", {
|
||||||
value: data.free,
|
value: data.available,
|
||||||
maximumFractionDigits: 1,
|
maximumFractionDigits: 1,
|
||||||
binary: true,
|
binary: true,
|
||||||
})}{" "}
|
})}{" "}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
(!widget.showStacks && !containersData) ||
|
(!widget.showStacks && !containersData) ||
|
||||||
(widget.showSummary && (!stacksData || !serversData)) ||
|
(widget.showSummary && (!containersData || !stacksData || !serversData)) ||
|
||||||
(widget.showStacks && !stacksData)
|
(widget.showStacks && !stacksData)
|
||||||
) {
|
) {
|
||||||
return widget.showSummary ? (
|
return widget.showSummary ? (
|
||||||
|
|||||||
@@ -33,14 +33,6 @@ export default function Component({ service }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block
|
|
||||||
label="myspeed.ping"
|
|
||||||
value={t("common.ms", {
|
|
||||||
value: data[0].ping,
|
|
||||||
style: "unit",
|
|
||||||
unit: "millisecond",
|
|
||||||
})}
|
|
||||||
/>
|
|
||||||
<Block
|
<Block
|
||||||
label="myspeed.download"
|
label="myspeed.download"
|
||||||
value={t("common.bitrate", {
|
value={t("common.bitrate", {
|
||||||
@@ -55,6 +47,14 @@ export default function Component({ service }) {
|
|||||||
decimals: 2,
|
decimals: 2,
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
|
<Block
|
||||||
|
label="myspeed.ping"
|
||||||
|
value={t("common.ms", {
|
||||||
|
value: data[0].ping,
|
||||||
|
style: "unit",
|
||||||
|
unit: "millisecond",
|
||||||
|
})}
|
||||||
|
/>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ export default async function omadaProxyHandler(req, res) {
|
|||||||
|
|
||||||
const controllerVersionMajor = parseInt(controllerVersion.split(".")[0], 10);
|
const controllerVersionMajor = parseInt(controllerVersion.split(".")[0], 10);
|
||||||
|
|
||||||
if (![3, 4, 5].includes(controllerVersionMajor)) {
|
if (![3, 4, 5, 6].includes(controllerVersionMajor)) {
|
||||||
return res.status(500).json({ error: { message: "Error determining controller version", data } });
|
return res.status(500).json({ error: { message: "Error determining controller version", data } });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +80,7 @@ export default async function omadaProxyHandler(req, res) {
|
|||||||
loginUrl = `${url}/api/v2/login`;
|
loginUrl = `${url}/api/v2/login`;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
case 6:
|
||||||
loginUrl = `${url}/${cId}/api/v2/login`;
|
loginUrl = `${url}/${cId}/api/v2/login`;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -122,6 +123,7 @@ export default async function omadaProxyHandler(req, res) {
|
|||||||
sitesUrl = `${url}/api/v2/sites?token=${token}¤tPage=1¤tPageSize=1000`;
|
sitesUrl = `${url}/api/v2/sites?token=${token}¤tPage=1¤tPageSize=1000`;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
case 6:
|
||||||
sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}¤tPage=1¤tPageSize=1000`;
|
sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}¤tPage=1¤tPageSize=1000`;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -207,8 +209,8 @@ export default async function omadaProxyHandler(req, res) {
|
|||||||
connectedAp = siteResponseData.result.connectedAp;
|
connectedAp = siteResponseData.result.connectedAp;
|
||||||
activeUser = siteResponseData.result.activeUser;
|
activeUser = siteResponseData.result.activeUser;
|
||||||
alerts = siteResponseData.result.alerts;
|
alerts = siteResponseData.result.alerts;
|
||||||
} else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
|
} else if ([4, 5, 6].includes(controllerVersionMajor)) {
|
||||||
const siteName = controllerVersionMajor === 5 ? site.id : site.key;
|
const siteName = controllerVersionMajor > 4 ? site.id : site.key;
|
||||||
const siteStatsUrl =
|
const siteStatsUrl =
|
||||||
controllerVersionMajor === 4
|
controllerVersionMajor === 4
|
||||||
? `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}¤tPage=1¤tPageSize=1000`
|
? `${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}¤tPage=1¤tPageSize=1000`
|
||||||
|
|||||||
@@ -80,6 +80,11 @@ export default function Component({ service }) {
|
|||||||
timeLeft={t("common.duration", { value: queueEntry.eta })}
|
timeLeft={t("common.duration", { value: queueEntry.eta })}
|
||||||
title={queueEntry.name}
|
title={queueEntry.name}
|
||||||
activity={queueEntry.state}
|
activity={queueEntry.state}
|
||||||
|
size={
|
||||||
|
widget?.enableLeechSize
|
||||||
|
? t("common.bbytes", { value: queueEntry.size, maximumFractionDigits: 1 })
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
key={`${queueEntry.name}-${queueEntry.amount_left}`}
|
key={`${queueEntry.name}-${queueEntry.amount_left}`}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ export default function Component({ service }) {
|
|||||||
let status;
|
let status;
|
||||||
let uptime = 0;
|
let uptime = 0;
|
||||||
let logIndex = 0;
|
let logIndex = 0;
|
||||||
|
const hasLogs = Array.isArray(monitor.logs) && monitor.logs.length > 0;
|
||||||
|
|
||||||
switch (monitor.status) {
|
switch (monitor.status) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -62,7 +63,7 @@ export default function Component({ service }) {
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
status = t("uptimerobot.up");
|
status = t("uptimerobot.up");
|
||||||
uptime = t("common.duration", { value: monitor.logs[0].duration });
|
uptime = t("common.duration", { value: hasLogs ? monitor.logs[0].duration : 0 });
|
||||||
logIndex = 1;
|
logIndex = 1;
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
@@ -76,14 +77,14 @@ export default function Component({ service }) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const lastDown = new Date(monitor.logs[logIndex].datetime * 1000).toLocaleString();
|
const lastDown = hasLogs ? new Date(monitor.logs[logIndex].datetime * 1000).toLocaleString() : "";
|
||||||
const downDuration = t("common.duration", { value: monitor.logs[logIndex].duration });
|
const downDuration = t("common.duration", { value: hasLogs ? monitor.logs[logIndex].duration : 0 });
|
||||||
const hideDown = logIndex === 1 && monitor.logs[logIndex].type !== 1;
|
const hideDown = !hasLogs || (logIndex === 1 && monitor.logs[logIndex].type !== 1);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="uptimerobot.status" value={status} />
|
<Block label="uptimerobot.status" value={status} />
|
||||||
<Block label="uptimerobot.uptime" value={uptime} />
|
{hasLogs && <Block label="uptimerobot.uptime" value={uptime} />}
|
||||||
{!hideDown && <Block label="uptimerobot.lastDown" value={lastDown} />}
|
{!hideDown && <Block label="uptimerobot.lastDown" value={lastDown} />}
|
||||||
{!hideDown && <Block label="uptimerobot.downDuration" value={downDuration} />}
|
{!hideDown && <Block label="uptimerobot.downDuration" value={downDuration} />}
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ import watchtower from "./watchtower/widget";
|
|||||||
import wgeasy from "./wgeasy/widget";
|
import wgeasy from "./wgeasy/widget";
|
||||||
import whatsupdocker from "./whatsupdocker/widget";
|
import whatsupdocker from "./whatsupdocker/widget";
|
||||||
import xteve from "./xteve/widget";
|
import xteve from "./xteve/widget";
|
||||||
|
import yourspotify from "./yourspotify/widget";
|
||||||
import zabbix from "./zabbix/widget";
|
import zabbix from "./zabbix/widget";
|
||||||
|
|
||||||
const widgets = {
|
const widgets = {
|
||||||
@@ -291,6 +292,7 @@ const widgets = {
|
|||||||
wgeasy,
|
wgeasy,
|
||||||
whatsupdocker,
|
whatsupdocker,
|
||||||
xteve,
|
xteve,
|
||||||
|
yourspotify,
|
||||||
zabbix,
|
zabbix,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
76
src/widgets/yourspotify/component.jsx
Normal file
76
src/widgets/yourspotify/component.jsx
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
import { useMemo } from "react";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
function getStartDate(interval) {
|
||||||
|
const d = new Date();
|
||||||
|
switch (interval) {
|
||||||
|
case "day":
|
||||||
|
d.setDate(d.getDate() - 1);
|
||||||
|
break;
|
||||||
|
case "week":
|
||||||
|
d.setDate(d.getDate() - 7);
|
||||||
|
break;
|
||||||
|
case "month":
|
||||||
|
d.setMonth(d.getMonth() - 1);
|
||||||
|
break;
|
||||||
|
case "year":
|
||||||
|
d.setFullYear(d.getFullYear() - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return d.toISOString();
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
const interval = widget?.interval || "week";
|
||||||
|
|
||||||
|
const date = useMemo(() => {
|
||||||
|
return interval === "all" ? "2006-04-23T00:00:00.000Z" : getStartDate(interval);
|
||||||
|
}, [interval]);
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
timeSplit: "all",
|
||||||
|
start: date,
|
||||||
|
};
|
||||||
|
|
||||||
|
const { data: songsListened, error: songsError } = useWidgetAPI(widget, "songs", params);
|
||||||
|
const { data: timeListened, error: timeError } = useWidgetAPI(widget, "time", params);
|
||||||
|
const { data: artistsListened, error: artistsError } = useWidgetAPI(widget, "artists", params);
|
||||||
|
|
||||||
|
if (songsError || timeError || artistsError) {
|
||||||
|
return <Container service={service} error={songsError ?? timeError ?? artistsError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNaN(songsListened) || isNaN(timeListened) || isNaN(artistsListened)) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="yourspotify.songs" />
|
||||||
|
<Block label="yourspotify.time" />
|
||||||
|
<Block label="yourspotify.artists" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="yourspotify.songs" value={t("common.number", { value: songsListened })} />
|
||||||
|
|
||||||
|
<Block
|
||||||
|
label="yourspotify.time"
|
||||||
|
value={t(
|
||||||
|
timeListened > 0 ? "common.duration" : "common.number", // Display 0 if duration is 0
|
||||||
|
{
|
||||||
|
value: timeListened / 1000,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Block label="yourspotify.artists" value={t("common.number", { value: artistsListened })} />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
27
src/widgets/yourspotify/widget.js
Normal file
27
src/widgets/yourspotify/widget.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { asJson } from "utils/proxy/api-helpers";
|
||||||
|
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/spotify/{endpoint}?token={key}",
|
||||||
|
proxyHandler: genericProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
songs: {
|
||||||
|
endpoint: "songs_per",
|
||||||
|
params: ["start", "timeSplit"],
|
||||||
|
map: (data) => asJson(data)[0]?.count || 0,
|
||||||
|
},
|
||||||
|
time: {
|
||||||
|
endpoint: "time_per",
|
||||||
|
params: ["start", "timeSplit"],
|
||||||
|
map: (data) => asJson(data)[0]?.count || 0,
|
||||||
|
},
|
||||||
|
artists: {
|
||||||
|
endpoint: "different_artists_per",
|
||||||
|
params: ["start", "timeSplit"],
|
||||||
|
map: (data) => asJson(data)[0]?.artists?.length || 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
Reference in New Issue
Block a user