Merge branch 'dev'

This commit is contained in:
shamoon 2025-05-31 18:51:54 -07:00
commit 35be5559b3
No known key found for this signature in database
74 changed files with 2951 additions and 2102 deletions

View File

@ -4,7 +4,7 @@ body:
value: | value: |
### ⚠️ Before opening a discussion: ### ⚠️ Before opening a discussion:
- [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/). - [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/) and include the output of all steps below.
- [Search existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) [and discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions) (including closed ones!). - [Search existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) [and discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions) (including closed ones!).
- type: textarea - type: textarea
id: description id: description
@ -59,6 +59,6 @@ body:
value: | value: |
## ⚠️ STOP ⚠️ ## ⚠️ STOP ⚠️
Before you submit this support request, please ensure you have entered your configuration files and actually followed the steps from the troubleshooting guide linked above, if relevant. The troubleshooting steps often help to solve the problem. Before you submit this support request, please ensure you have entered your configuration files and actually followed the steps from the troubleshooting guide linked above *and posted the output*, if relevant. The troubleshooting steps often help to solve the problem or at least can help figure it out.
*Please remember that this project is maintained by regular people **just like you**, so if you don't take the time to fill out the requested information, don't expect a reply back.* *Please remember that this project is maintained by regular people **just like you**, so if you don't take the time to fill out the requested information, don't expect a reply back.*

View File

@ -154,6 +154,7 @@ jobs:
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }} VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
provenance: false
cache-from: type=local,src=/tmp/.buildx-cache cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max

View File

@ -49,7 +49,7 @@ COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
COPY --link --from=builder --chown=1000:1000 /app/.next/standalone/ ./ COPY --link --from=builder --chown=1000:1000 /app/.next/standalone/ ./
COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
RUN apk add --no-cache su-exec iputils-ping RUN apk add --no-cache su-exec iputils-ping shadow
ENV NODE_ENV=production ENV NODE_ENV=production
ENV HOSTNAME=0.0.0.0 ENV HOSTNAME=0.0.0.0

View File

@ -12,10 +12,43 @@ export PGID=${PGID:-0}
export HOMEPAGE_BUILDTIME=$(date +%s) export HOMEPAGE_BUILDTIME=$(date +%s)
# Set privileges for /app but only if pid 1 user is root and we are dropping privileges. # Check ownership before chown
# If container is run as an unprivileged user, it means owner already handled ownership setup on their own. if [ -e /app/config ]; then
# Running chown in that case (as non-root) will cause error CURRENT_UID=$(stat -c %u /app/config)
[ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ] && chown -R ${PUID}:${PGID} /app/config /app/public CURRENT_GID=$(stat -c %g /app/config)
if [ "$CURRENT_UID" -ne "$PUID" ] || [ "$CURRENT_GID" -ne "$PGID" ]; then
echo "Fixing ownership of /app/config"
if ! chown -R "$PUID:$PGID" /app/config 2>/dev/null; then
echo "Warning: Could not chown /app/config; continuing anyway"
fi
else
echo "/app/config already owned by correct UID/GID, skipping chown"
fi
else
echo "/app/config does not exist; skipping ownership check"
fi
# Ensure /app/config/logs exists and is owned
if [ -n "$PUID" ] && [ -n "$PGID" ]; then
mkdir -p /app/config/logs 2>/dev/null || true
if [ -d /app/config/logs ]; then
LOG_UID=$(stat -c %u /app/config/logs)
LOG_GID=$(stat -c %g /app/config/logs)
if [ "$LOG_UID" -ne "$PUID" ] || [ "$LOG_GID" -ne "$PGID" ]; then
echo "Fixing ownership of /app/config/logs"
chown -R "$PUID:$PGID" /app/config/logs 2>/dev/null || echo "Warning: Could not chown /app/config/logs"
fi
fi
fi
if [ -d /app/.next ]; then
CURRENT_UID=$(stat -c %u /app/.next)
if [ "$CURRENT_UID" -ne "$PUID" ]; then
echo "Fixing ownership of /app/.next"
chown -R "$PUID:$PGID" /app/.next || echo "Warning: Could not chown /app/.next"
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

View File

@ -20,7 +20,7 @@ Since Docker supports connecting with TLS and client certificate authentication,
```yaml ```yaml
my-remote-docker: my-remote-docker:
host: 192.168.0.101 host: 192.168.0.101
port: 275 port: 2375
tls: tls:
keyFile: tls/key.pem keyFile: tls/key.pem
caFile: tls/ca.pem caFile: tls/ca.pem
@ -66,6 +66,30 @@ my-docker:
port: 2375 port: 2375
``` ```
Use `protocol: https` if youre connecting through a reverse proxy (e.g., Traefik) that serves the Docker API over HTTPS:
```yaml
my-docker:
host: dockerproxy
port: 443
protocol: https
```
!!! note
Note: This does not require TLS certificates if the proxy handles encryption. Do not use `protocol: https` unless youre sure the target host supports HTTPS.
You can also include `headers` for the connection, for example, if you are using a reverse proxy that requires authentication:
```yaml
my-docker:
host: dockerproxy
port: 443
protocol: https
headers:
Authorization: Basic <base64-encoded-credentials>
```
## Using Socket Directly ## Using Socket Directly
If you'd rather use the socket directly, first make sure that you're passing the local socket into the Docker container. If you'd rather use the socket directly, first make sure that you're passing the local socket into the Docker container.

View File

@ -163,6 +163,18 @@ If the `href` attribute is not present, Homepage will ignore the specific Ingres
Homepage also features automatic service discovery for Gateway API. Service definitions are read by annotating the HttpRoute custom resource definition and are indentical to the Ingress example as defined in [Automatic Service Discovery](#automatic-service-discovery). Homepage also features automatic service discovery for Gateway API. Service definitions are read by annotating the HttpRoute custom resource definition and are indentical to the Ingress example as defined in [Automatic Service Discovery](#automatic-service-discovery).
To enable Gateway API HttpRoute update `kubernetes.yaml` to include:
```
gateway: true # enable gateway-api
```
#### Using the unoffocial helm chart?
If you are using the unofficial helm chart ensure that the `ClusterRole` has required permissions for `gateway.networking.k8s.io`.
See [ClusterRole and ClusterRoleBinding](../installation/k8s.md#clusterrole-and-clusterrolebinding)
## 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`.

View File

@ -101,7 +101,7 @@ theme: dark # or light
## Color Palette ## Color Palette
You can configured a fixed color palette (and disable the palette switcher) by passing the `color` option, like so: You can configure a fixed color palette (and disable the palette switcher) by passing the `color` option, like so:
```yaml ```yaml
color: slate color: slate

View File

@ -0,0 +1,17 @@
---
title: Checkmk
description: Checkmk Widget Configuration
---
Learn more about [Checkmk](https://github.com/Checkmk/checkmk).
To setup authentication, follow the official [Checkmk API](https://docs.checkmk.com/latest/en/rest_api.html?lquery=api#bearerauth) documentation.
```yaml
widget:
type: checkmk
url: http://checkmk.host.or.ip:port
site: your-site-name-cla-by-default
username: username
password: password
```

View File

@ -14,4 +14,5 @@ widget:
type: gamedig type: gamedig
serverType: csgo # see https://github.com/gamedig/node-gamedig#games-list serverType: csgo # see https://github.com/gamedig/node-gamedig#games-list
url: udp://server.host.or.ip:port url: udp://server.host.or.ip:port
gameToken: # optional, a token used by gamedig with certain games
``` ```

View File

@ -9,7 +9,7 @@ Learn more about [Gluetun](https://github.com/qdm12/gluetun).
Requires [HTTP control server options](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md) to be enabled. By default this runs on port `8000`. Requires [HTTP control server options](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md) to be enabled. By default this runs on port `8000`.
Allowed fields: `["public_ip", "region", "country"]`. Allowed fields: `["public_ip", "region", "country", "port_forwarded"]`.
To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml. To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml.

View File

@ -0,0 +1,18 @@
---
title: Jellystat
description: Jellystat Widget Configuration
---
Learn more about [Jellystat](https://github.com/CyferShepard/Jellystat). The widget supports (at least) Jellystat version 1.1.6
You can create an API key from inside Jellystat at `Settings > API Key`.
Allowed fields: `["songs", "movies", "episodes", "other"]`.
```yaml
widget:
type: jellystat
url: http://jellystat.host.or.ip
key: apikeyapikeyapikeyapikeyapikey
days: 30 # optional, defaults to 30
```

View File

@ -1,6 +1,6 @@
{ {
"name": "homepage", "name": "homepage",
"version": "1.2.0", "version": "1.3.0",
"private": true, "private": true,
"scripts": { "scripts": {
"preinstall": "npx only-allow pnpm", "preinstall": "npx only-allow pnpm",
@ -13,19 +13,19 @@
"dependencies": { "dependencies": {
"@headlessui/react": "^1.7.19", "@headlessui/react": "^1.7.19",
"@kubernetes/client-node": "^1.0.0", "@kubernetes/client-node": "^1.0.0",
"cal-parser": "^1.0.2",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"compare-versions": "^6.1.1", "compare-versions": "^6.1.1",
"dockerode": "^4.0.4", "dockerode": "^4.0.4",
"follow-redirects": "^1.15.9", "follow-redirects": "^1.15.9",
"gamedig": "^5.2.0", "gamedig": "^5.2.0",
"i18next": "^24.2.3", "i18next": "^24.2.3",
"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",
"luxon": "^3.5.0", "luxon": "^3.5.0",
"memory-cache": "^0.2.0", "memory-cache": "^0.2.0",
"minecraftstatuspinger": "^1.2.2", "minecraftstatuspinger": "^1.2.2",
"next": "^15.2.4", "next": "^15.3.1",
"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": "^6.1.1",
@ -34,8 +34,7 @@
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-i18next": "^11.18.6", "react-i18next": "^11.18.6",
"react-icons": "^5.4.0", "react-icons": "^5.4.0",
"recharts": "^2.15.1", "recharts": "^2.15.3",
"rrule": "^2.8.1",
"swr": "^2.3.3", "swr": "^2.3.3",
"systeminformation": "^5.25.11", "systeminformation": "^5.25.11",
"tough-cookie": "^5.1.2", "tough-cookie": "^5.1.2",
@ -46,12 +45,12 @@
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.10", "@tailwindcss/forms": "^0.5.10",
"@tailwindcss/postcss": "^4.0.9", "@tailwindcss/postcss": "^4.0.9",
"eslint": "^9.21.0", "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.1",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.2.3", "eslint-plugin-prettier": "^5.2.6",
"eslint-plugin-react": "^7.37.4", "eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-hooks": "^5.1.0",
"postcss": "^8.5.3", "postcss": "^8.5.3",
@ -63,5 +62,10 @@
}, },
"optionalDependencies": { "optionalDependencies": {
"osx-temperature-sensor": "^1.0.8" "osx-temperature-sensor": "^1.0.8"
},
"pnpm": {
"onlyBuiltDependencies": [
"sharp"
]
} }
} }

585
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Publieke IP", "public_ip": "Publieke IP",
"region": "Streek", "region": "Streek",
"country": "Land" "country": "Land",
"port_forwarded": "Poort Aangestuur"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanale", "channels": "Kanale",
@ -856,7 +857,8 @@
"physicalRelease": "Fisiese Vrylating", "physicalRelease": "Fisiese Vrylating",
"digitalRelease": "Digitale Vrylating", "digitalRelease": "Digitale Vrylating",
"noEventsToday": "Geen gebeure vir vandag nie!", "noEventsToday": "Geen gebeure vir vandag nie!",
"noEventsFound": "Geen gebeure gevind nie" "noEventsFound": "Geen gebeure gevind nie",
"errorWhenLoadingData": "Fout tydens laai van kalenderdata"
}, },
"romm": { "romm": {
"platforms": "Platform", "platforms": "Platform",
@ -1042,5 +1044,15 @@
"downloads": "Aflaaie", "downloads": "Aflaaie",
"uploads": "Oplaaie", "uploads": "Oplaaie",
"sharedFiles": "Lêers" "sharedFiles": "Lêers"
},
"jellystat": {
"songs": "Liedjies",
"movies": "Flieks",
"episodes": "Episodes",
"other": "Ander"
},
"checkmk": {
"serviceErrors": "Diensprobleme",
"hostErrors": "Gasheerprobleme"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "العام IP", "public_ip": "العام IP",
"region": "منطقة", "region": "منطقة",
"country": "الدولة" "country": "الدولة",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "القنوات", "channels": "القنوات",
@ -856,7 +857,8 @@
"physicalRelease": "الإصدار المادي", "physicalRelease": "الإصدار المادي",
"digitalRelease": "الإصدار الرقمي", "digitalRelease": "الإصدار الرقمي",
"noEventsToday": "لا توجد أحداث اليوم!", "noEventsToday": "لا توجد أحداث اليوم!",
"noEventsFound": "لم يتم العثور على أحداث" "noEventsFound": "لم يتم العثور على أحداث",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "المِنصات", "platforms": "المِنصات",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "ملفات" "sharedFiles": "ملفات"
},
"jellystat": {
"songs": "أغاني",
"movies": "أفلام",
"episodes": "حلقات",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Публично IP", "public_ip": "Публично IP",
"region": "Регион", "region": "Регион",
"country": "Страна" "country": "Страна",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Канали", "channels": "Канали",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Дигитално издания", "digitalRelease": "Дигитално издания",
"noEventsToday": "Няма събития за днес!", "noEventsToday": "Няма събития за днес!",
"noEventsFound": "Няма намерени събития" "noEventsFound": "Няма намерени събития",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Платформи", "platforms": "Платформи",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Файлове" "sharedFiles": "Файлове"
},
"jellystat": {
"songs": "Песни",
"movies": "Филми",
"episodes": "Епизоди",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP Pública", "public_ip": "IP Pública",
"region": "Regió", "region": "Regió",
"country": "País" "country": "País",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Canals", "channels": "Canals",
@ -856,7 +857,8 @@
"physicalRelease": "Estrena física", "physicalRelease": "Estrena física",
"digitalRelease": "Estrena digital", "digitalRelease": "Estrena digital",
"noEventsToday": "Cap esdeveniment per avui!", "noEventsToday": "Cap esdeveniment per avui!",
"noEventsFound": "No s'han trobat esdeveniments" "noEventsFound": "No s'han trobat esdeveniments",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Plataformes", "platforms": "Plataformes",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Fitxers" "sharedFiles": "Fitxers"
},
"jellystat": {
"songs": "Cançons",
"movies": "Pel·lícules",
"episodes": "Episodis",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Veřejná IP", "public_ip": "Veřejná IP",
"region": "Oblast", "region": "Oblast",
"country": "Stát" "country": "Stát",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanály", "channels": "Kanály",
@ -856,7 +857,8 @@
"physicalRelease": "Fyzické vydání", "physicalRelease": "Fyzické vydání",
"digitalRelease": "Digitální vydání", "digitalRelease": "Digitální vydání",
"noEventsToday": "Pro dnešek žádné události!", "noEventsToday": "Pro dnešek žádné události!",
"noEventsFound": "Nemáte žádné události" "noEventsFound": "Nemáte žádné události",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platformy", "platforms": "Platformy",
@ -1042,5 +1044,15 @@
"downloads": "Stažení", "downloads": "Stažení",
"uploads": "Nahrávání", "uploads": "Nahrávání",
"sharedFiles": "Soubory" "sharedFiles": "Soubory"
},
"jellystat": {
"songs": "Skladby",
"movies": "Filmy",
"episodes": "Epizody",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Offentlig IP", "public_ip": "Offentlig IP",
"region": "Område", "region": "Område",
"country": "Land" "country": "Land",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanaler", "channels": "Kanaler",
@ -856,7 +857,8 @@
"physicalRelease": "Fysisk udgivelse", "physicalRelease": "Fysisk udgivelse",
"digitalRelease": "Digitale udgivelser", "digitalRelease": "Digitale udgivelser",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforme", "platforms": "Platforme",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Filer" "sharedFiles": "Filer"
},
"jellystat": {
"songs": "Sange",
"movies": "Film",
"episodes": "Episoder",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -47,7 +47,7 @@
"load": "Last", "load": "Last",
"temp": "TEMP", "temp": "TEMP",
"max": "Max", "max": "Max",
"uptime": "UP" "uptime": "BETRIEBSZEIT"
}, },
"unifi": { "unifi": {
"users": "Benutzer", "users": "Benutzer",
@ -61,7 +61,7 @@
"wlan_devices": "WLAN-Geräte", "wlan_devices": "WLAN-Geräte",
"lan_users": "LAN-Benutzer", "lan_users": "LAN-Benutzer",
"wlan_users": "WLAN-Benutzer", "wlan_users": "WLAN-Benutzer",
"up": "UP", "up": "BETRIEBSZEIT",
"down": "EMPFANGEN", "down": "EMPFANGEN",
"wait": "Bitte warten", "wait": "Bitte warten",
"empty_data": "Subsystem-Status unbekannt" "empty_data": "Subsystem-Status unbekannt"
@ -150,7 +150,7 @@
"sent": "Gesendet", "sent": "Gesendet",
"externalIPAddress": "Externe IP", "externalIPAddress": "Externe IP",
"externalIPv6Address": "Externe IPv6", "externalIPv6Address": "Externe IPv6",
"externalIPv6Prefix": "Externer IPv4-Präfix" "externalIPv6Prefix": "Externes IPv6-Präfix"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Upstreams",
@ -436,7 +436,7 @@
"temp": "TEMP", "temp": "TEMP",
"_temp": "Temperatur", "_temp": "Temperatur",
"warn": "Warnung", "warn": "Warnung",
"uptime": "UP", "uptime": "BETRIEBSZEIT",
"total": "Gesamt", "total": "Gesamt",
"free": "Frei", "free": "Frei",
"used": "In Benutzung", "used": "In Benutzung",
@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Öffentliche IP", "public_ip": "Öffentliche IP",
"region": "Region", "region": "Region",
"country": "Land" "country": "Land",
"port_forwarded": "Port weitergeleitet"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanäle", "channels": "Kanäle",
@ -856,7 +857,8 @@
"physicalRelease": "Physische Version", "physicalRelease": "Physische Version",
"digitalRelease": "Digitale Version", "digitalRelease": "Digitale Version",
"noEventsToday": "Heute keine Ereignisse!", "noEventsToday": "Heute keine Ereignisse!",
"noEventsFound": "Keine Termine gefunden" "noEventsFound": "Keine Termine gefunden",
"errorWhenLoadingData": "Fehler beim Laden der Kalenderdaten"
}, },
"romm": { "romm": {
"platforms": "Plattformen", "platforms": "Plattformen",
@ -1025,11 +1027,11 @@
"timeleft": "Verbleibende Zeit" "timeleft": "Verbleibende Zeit"
}, },
"karakeep": { "karakeep": {
"bookmarks": "Bookmarks", "bookmarks": "Lesezeichen",
"favorites": "Favorites", "favorites": "Favoriten",
"archived": "Archived", "archived": "Archiviert",
"highlights": "Highlights", "highlights": "Highlights",
"lists": "Lists", "lists": "Listen",
"tags": "Schlagwörter" "tags": "Schlagwörter"
}, },
"slskd": { "slskd": {
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Dateien" "sharedFiles": "Dateien"
},
"jellystat": {
"songs": "Songs",
"movies": "Filme",
"episodes": "Episoden",
"other": "Andere"
},
"checkmk": {
"serviceErrors": "Dienstprobleme",
"hostErrors": "Hostprobleme"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Δημόσια ΙΡ", "public_ip": "Δημόσια ΙΡ",
"region": "Περιοχή", "region": "Περιοχή",
"country": "Χώρα" "country": "Χώρα",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Κανάλια", "channels": "Κανάλια",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Αρχεία" "sharedFiles": "Αρχεία"
},
"jellystat": {
"songs": "Τραγούδια",
"movies": "Ταινίες",
"episodes": "Επεισόδια",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Regiono", "region": "Regiono",
"country": "Lando" "country": "Lando",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanaloj", "channels": "Kanaloj",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Kantoj",
"movies": "Filmoj",
"episodes": "Epizodoj",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP pública", "public_ip": "IP pública",
"region": "Región", "region": "Región",
"country": "País" "country": "País",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Canales", "channels": "Canales",
@ -856,7 +857,8 @@
"physicalRelease": "Lanzamiento en físico", "physicalRelease": "Lanzamiento en físico",
"digitalRelease": "Lanzamiento en digital", "digitalRelease": "Lanzamiento en digital",
"noEventsToday": "¡Sin eventos para hoy!", "noEventsToday": "¡Sin eventos para hoy!",
"noEventsFound": "No se encontraron eventos" "noEventsFound": "No se encontraron eventos",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Plataformas", "platforms": "Plataformas",
@ -1025,11 +1027,11 @@
"timeleft": "Tiempo restante" "timeleft": "Tiempo restante"
}, },
"karakeep": { "karakeep": {
"bookmarks": "Bookmarks", "bookmarks": "Marcadores",
"favorites": "Favorites", "favorites": "Favoritos",
"archived": "Archived", "archived": "Archivado",
"highlights": "Highlights", "highlights": "Destacados",
"lists": "Lists", "lists": "Listas",
"tags": "Etiquetas" "tags": "Etiquetas"
}, },
"slskd": { "slskd": {
@ -1042,5 +1044,15 @@
"downloads": "Descargas", "downloads": "Descargas",
"uploads": "Subidas", "uploads": "Subidas",
"sharedFiles": "Archivos" "sharedFiles": "Archivos"
},
"jellystat": {
"songs": "Canciones",
"movies": "Películas",
"episodes": "Episodios",
"other": "Otros"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "Ez da gertaerarik aurkitu." "noEventsFound": "Ez da gertaerarik aurkitu.",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Abestiak",
"movies": "Filmak",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -103,7 +103,7 @@
"bitrate": "Débit", "bitrate": "Débit",
"no_active": "Aucun flux actif", "no_active": "Aucun flux actif",
"movies": "Films", "movies": "Films",
"series": "Séries TV", "series": "Séries",
"episodes": "Épisodes", "episodes": "Épisodes",
"songs": "Chansons" "songs": "Chansons"
}, },
@ -241,7 +241,7 @@
"sonarr": { "sonarr": {
"wanted": "Demandé", "wanted": "Demandé",
"queued": "En file d'attente", "queued": "En file d'attente",
"series": "Séries TV", "series": "Séries",
"queue": "En attente", "queue": "En attente",
"unknown": "Inconnu" "unknown": "Inconnu"
}, },
@ -405,7 +405,7 @@
"medusa": { "medusa": {
"wanted": "Demandé", "wanted": "Demandé",
"queued": "En file d'attente", "queued": "En file d'attente",
"series": "Séries TV" "series": "Séries"
}, },
"minecraft": { "minecraft": {
"players": "Joueurs", "players": "Joueurs",
@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP publique", "public_ip": "IP publique",
"region": "Région", "region": "Région",
"country": "Pays" "country": "Pays",
"port_forwarded": "Port Transféré"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Chaînes", "channels": "Chaînes",
@ -672,14 +673,14 @@
"m": "m" "m": "m"
}, },
"atsumeru": { "atsumeru": {
"series": "Séries TV", "series": "Séries",
"archives": "Archives", "archives": "Archives",
"chapters": "Chapitres", "chapters": "Chapitres",
"categories": "Catégories" "categories": "Catégories"
}, },
"komga": { "komga": {
"libraries": "Bibliothèques", "libraries": "Bibliothèques",
"series": "Séries TV", "series": "Séries",
"books": "Livres" "books": "Livres"
}, },
"diskstation": { "diskstation": {
@ -688,7 +689,7 @@
"volumeAvailable": "Disponible" "volumeAvailable": "Disponible"
}, },
"mylar": { "mylar": {
"series": "Séries TV", "series": "Séries",
"issues": "Anomalies", "issues": "Anomalies",
"wanted": "Demandé" "wanted": "Demandé"
}, },
@ -772,7 +773,7 @@
"books": "Livres", "books": "Livres",
"authors": "Auteurs", "authors": "Auteurs",
"categories": "Catégories", "categories": "Catégories",
"series": "Séries TV" "series": "Séries"
}, },
"jdownloader": { "jdownloader": {
"downloadCount": "En attente", "downloadCount": "En attente",
@ -781,7 +782,7 @@
"downloadSpeed": "Débit" "downloadSpeed": "Débit"
}, },
"kavita": { "kavita": {
"seriesCount": "Séries TV", "seriesCount": "Séries",
"totalFiles": "Fichiers" "totalFiles": "Fichiers"
}, },
"azuredevops": { "azuredevops": {
@ -856,7 +857,8 @@
"physicalRelease": "Sortie physique", "physicalRelease": "Sortie physique",
"digitalRelease": "Sortie numérique", "digitalRelease": "Sortie numérique",
"noEventsToday": "Rien pour aujourd'hui !", "noEventsToday": "Rien pour aujourd'hui !",
"noEventsFound": "Aucun événement trouvé" "noEventsFound": "Aucun événement trouvé",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Plateformes", "platforms": "Plateformes",
@ -1028,7 +1030,7 @@
"bookmarks": "Marque-pages", "bookmarks": "Marque-pages",
"favorites": "Favoris", "favorites": "Favoris",
"archived": "Archivé", "archived": "Archivé",
"highlights": "Highlights", "highlights": "À la une",
"lists": "Listes", "lists": "Listes",
"tags": "Étiquettes" "tags": "Étiquettes"
}, },
@ -1042,5 +1044,15 @@
"downloads": "Téléchargements", "downloads": "Téléchargements",
"uploads": "Téléversements", "uploads": "Téléversements",
"sharedFiles": "Fichiers" "sharedFiles": "Fichiers"
},
"jellystat": {
"songs": "Chansons",
"movies": "Films",
"episodes": "Épisodes",
"other": "Autres"
},
"checkmk": {
"serviceErrors": "Problèmes de service",
"hostErrors": "Problèmes d'hôte"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -149,8 +149,8 @@
"received": "Primljeno", "received": "Primljeno",
"sent": "Poslano", "sent": "Poslano",
"externalIPAddress": "Eksterna IP adresa", "externalIPAddress": "Eksterna IP adresa",
"externalIPv6Address": "Ext. IPv6", "externalIPv6Address": "Vanjs. IPv6",
"externalIPv6Prefix": "Ext. IPv6-Prefix" "externalIPv6Prefix": "Vanjs. IPv6 prefiks"
}, },
"caddy": { "caddy": {
"upstreams": "Glavne grane", "upstreams": "Glavne grane",
@ -178,7 +178,7 @@
"connectedAp": "Povezani AP-ovi", "connectedAp": "Povezani AP-ovi",
"activeUser": "Aktivni uređaji", "activeUser": "Aktivni uređaji",
"alerts": "Upozorenja", "alerts": "Upozorenja",
"connectedGateways": "Connected gateways", "connectedGateways": "Povezani pristupnici",
"connectedSwitches": "Povezani prekidači" "connectedSwitches": "Povezani prekidači"
}, },
"nzbget": { "nzbget": {
@ -229,8 +229,8 @@
"seed": "Prenošenje preuzetog sadržaja" "seed": "Prenošenje preuzetog sadržaja"
}, },
"develancacheui": { "develancacheui": {
"cachehitbytes": "Cache Hit Bytes", "cachehitbytes": "Bajtovi pogodaka predmemorije",
"cachemissbytes": "Cache Miss Bytes" "cachemissbytes": "Bajtovi promašaja predmemorije"
}, },
"downloadstation": { "downloadstation": {
"download": "Preuzimanje", "download": "Preuzimanje",
@ -313,13 +313,13 @@
}, },
"suwayomi": { "suwayomi": {
"download": "Preuzeto", "download": "Preuzeto",
"nondownload": "Non-Downloaded", "nondownload": "Nepreuzeto",
"read": "Pročitano", "read": "Pročitano",
"unread": "Nepročitano", "unread": "Nepročitano",
"downloadedread": "Downloaded & Read", "downloadedread": "Preuzeto i pročitano",
"downloadedunread": "Downloaded & Unread", "downloadedunread": "Preuzeto i nepročitano",
"nondownloadedread": "Non-Downloaded & Read", "nondownloadedread": "Nepreuzeto i pročitano",
"nondownloadedunread": "Non-Downloaded & Unread" "nondownloadedunread": "Nepreuzeto i nepročitano"
}, },
"tailscale": { "tailscale": {
"address": "Adresa", "address": "Adresa",
@ -337,15 +337,15 @@
}, },
"technitium": { "technitium": {
"totalQueries": "Upiti", "totalQueries": "Upiti",
"totalNoError": "Success", "totalNoError": "Uspješno",
"totalServerFailure": "Failures", "totalServerFailure": "Neuspješno",
"totalNxDomain": "NX Domains", "totalNxDomain": "NX domene",
"totalRefused": "Refused", "totalRefused": "Odbijeno",
"totalAuthoritative": "Authoritative", "totalAuthoritative": "Autoritativan",
"totalRecursive": "Recursive", "totalRecursive": "Rekurzivno",
"totalCached": "Cached", "totalCached": "Predmemorirano",
"totalBlocked": "Blokirano", "totalBlocked": "Blokirano",
"totalDropped": "Dropped", "totalDropped": "Odbačeno",
"totalClients": "Klijenti" "totalClients": "Klijenti"
}, },
"tdarr": { "tdarr": {
@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Javni IP", "public_ip": "Javni IP",
"region": "Regija", "region": "Regija",
"country": "Zemlja" "country": "Zemlja",
"port_forwarded": "Port proslijeđen"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanali", "channels": "Kanali",
@ -705,8 +706,8 @@
"time": "Vrijeme" "time": "Vrijeme"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Neto vrijednost",
"budget": "Budget" "budget": "Budžet"
}, },
"grafana": { "grafana": {
"dashboards": "Pregledne ploče", "dashboards": "Pregledne ploče",
@ -856,20 +857,21 @@
"physicalRelease": "Fizičko izdanje", "physicalRelease": "Fizičko izdanje",
"digitalRelease": "Digitalno izdanje", "digitalRelease": "Digitalno izdanje",
"noEventsToday": "Danas nema događaja!", "noEventsToday": "Danas nema događaja!",
"noEventsFound": "Nema događaja" "noEventsFound": "Nema događaja",
"errorWhenLoadingData": "Pogreška prilikom učitavanja podataka kalendara"
}, },
"romm": { "romm": {
"platforms": "Platforme", "platforms": "Platforme",
"totalRoms": "Igre", "totalRoms": "Igre",
"saves": "Saves", "saves": "Spremljeno",
"states": "States", "states": "Stanja",
"screenshots": "Snimke ekrana", "screenshots": "Snimke ekrana",
"totalfilesize": "Ukupna veličina" "totalfilesize": "Ukupna veličina"
}, },
"mailcow": { "mailcow": {
"domains": "Domene", "domains": "Domene",
"mailboxes": "Mailboxes", "mailboxes": "Poštanski sandučići",
"mails": "Mails", "mails": "Pošta",
"storage": "Spremište" "storage": "Spremište"
}, },
"netdata": { "netdata": {
@ -886,7 +888,7 @@
"notifications": "Obavijesti", "notifications": "Obavijesti",
"issues": "Problemi", "issues": "Problemi",
"pulls": "Zahtjevi za povlačenje", "pulls": "Zahtjevi za povlačenje",
"repositories": "Repositories" "repositories": "Repozitoriji"
}, },
"stash": { "stash": {
"scenes": "Scene", "scenes": "Scene",
@ -939,11 +941,11 @@
"upload": "Prijenos" "upload": "Prijenos"
}, },
"stocks": { "stocks": {
"stocks": "Stocks", "stocks": "Dionice",
"loading": "Loading", "loading": "Učitavanje",
"open": "Open - US Market", "open": "Otvoreno - američko tržište",
"closed": "Closed - US Market", "closed": "Zatvoreno - američko tržište",
"invalidConfiguration": "Invalid Configuration" "invalidConfiguration": "Nepravilna konfiguracija"
}, },
"frigate": { "frigate": {
"cameras": "Kamere", "cameras": "Kamere",
@ -956,26 +958,26 @@
"tags": "Oznake" "tags": "Oznake"
}, },
"zabbix": { "zabbix": {
"unclassified": "Not classified", "unclassified": "Nije klasificirano",
"information": "Informacije", "information": "Informacije",
"warning": "Upozorenje", "warning": "Upozorenje",
"average": "Average", "average": "Prosjek",
"high": "High", "high": "Visoko",
"disaster": "Disaster" "disaster": "Katastrofa"
}, },
"lubelogger": { "lubelogger": {
"vehicle": "Vehicle", "vehicle": "Vozilo",
"vehicles": "Vehicles", "vehicles": "Vozila",
"serviceRecords": "Service Records", "serviceRecords": "Servisni zapisi",
"reminders": "Podsjetnici", "reminders": "Podsjetnici",
"nextReminder": "Sljedeći podsjetnik", "nextReminder": "Sljedeći podsjetnik",
"none": "None" "none": "Ništa"
}, },
"vikunja": { "vikunja": {
"projects": "Active Projects", "projects": "Aktivni projekti",
"tasks7d": "Tasks Due This Week", "tasks7d": "Zadaci dospijeća ovog tjedna",
"tasksOverdue": "Overdue Tasks", "tasksOverdue": "Zakašnjeli zadaci",
"tasksInProgress": "Tasks In Progress" "tasksInProgress": "Zadaci u tijeku"
}, },
"headscale": { "headscale": {
"name": "Ime", "name": "Ime",
@ -987,7 +989,7 @@
}, },
"beszel": { "beszel": {
"name": "Ime", "name": "Ime",
"systems": "Systems", "systems": "Sustavi",
"up": "Dostupno", "up": "Dostupno",
"down": "Nedostupno", "down": "Nedostupno",
"paused": "Zaustavljeno", "paused": "Zaustavljeno",
@ -997,26 +999,26 @@
"cpu": "CPU", "cpu": "CPU",
"memory": "MEM", "memory": "MEM",
"disk": "Disk", "disk": "Disk",
"network": "NET" "network": "Mreža"
}, },
"argocd": { "argocd": {
"apps": "Apps", "apps": "Aplikacije",
"synced": "Synced", "synced": "Sinkronizirano",
"outOfSync": "Out Of Sync", "outOfSync": "Izvan sinkronizacije",
"healthy": "Funkcionalno", "healthy": "Funkcionalno",
"degraded": "Degraded", "degraded": "Degradirano",
"progressing": "Progressing", "progressing": "Napredovanje",
"missing": "Nedostaje", "missing": "Nedostaje",
"suspended": "Suspended" "suspended": "Suspendiran"
}, },
"spoolman": { "spoolman": {
"loading": "Loading" "loading": "Učitavanje"
}, },
"gitlab": { "gitlab": {
"groups": "Groups", "groups": "Grupe",
"issues": "Problemi", "issues": "Problemi",
"merges": "Merge Requests", "merges": "Zahtjevi za sjedinjenjem",
"projects": "Projects" "projects": "Projekti"
}, },
"apcups": { "apcups": {
"status": "Stanje", "status": "Stanje",
@ -1025,22 +1027,32 @@
"timeleft": "Preostalo vrijeme" "timeleft": "Preostalo vrijeme"
}, },
"karakeep": { "karakeep": {
"bookmarks": "Bookmarks", "bookmarks": "Oznake",
"favorites": "Favorites", "favorites": "Favoriti",
"archived": "Archived", "archived": "Arhivirano",
"highlights": "Highlights", "highlights": "Izdvajamo",
"lists": "Lists", "lists": "Liste",
"tags": "Oznake" "tags": "Oznake"
}, },
"slskd": { "slskd": {
"slskStatus": "Mreža", "slskStatus": "Mreža",
"connected": "Povezano", "connected": "Povezano",
"disconnected": "Odspojeno", "disconnected": "Odspojeno",
"updateStatus": "Update", "updateStatus": "Ažuriraj",
"update_yes": "Dostupno", "update_yes": "Dostupno",
"update_no": "Aktualno", "update_no": "Aktualno",
"downloads": "Downloads", "downloads": "Preuzimanje",
"uploads": "Uploads", "uploads": "Prijenos",
"sharedFiles": "Datoteke" "sharedFiles": "Datoteke"
},
"jellystat": {
"songs": "Pjesme",
"movies": "Filmovi",
"episodes": "Epizode",
"other": "Ostalo"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Nyilvános IP-cím", "public_ip": "Nyilvános IP-cím",
"region": "Régió", "region": "Régió",
"country": "Ország" "country": "Ország",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Csatornák", "channels": "Csatornák",
@ -856,7 +857,8 @@
"physicalRelease": "Fizikai kiadás", "physicalRelease": "Fizikai kiadás",
"digitalRelease": "Digitális kiadás", "digitalRelease": "Digitális kiadás",
"noEventsToday": "Ezen a napon nincsenek események!", "noEventsToday": "Ezen a napon nincsenek események!",
"noEventsFound": "Nem található esemény" "noEventsFound": "Nem található esemény",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Felület", "platforms": "Felület",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Fájlok" "sharedFiles": "Fájlok"
},
"jellystat": {
"songs": "Zeneszám",
"movies": "Film",
"episodes": "Epizód",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP Publik", "public_ip": "IP Publik",
"region": "Region", "region": "Region",
"country": "Negara" "country": "Negara",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channel", "channels": "Channel",
@ -856,7 +857,8 @@
"physicalRelease": "Rilis Fisik", "physicalRelease": "Rilis Fisik",
"digitalRelease": "Rilis Digital", "digitalRelease": "Rilis Digital",
"noEventsToday": "Tidak ada acara untuk hari ini!", "noEventsToday": "Tidak ada acara untuk hari ini!",
"noEventsFound": "Tidak ada acara yang ditemukan" "noEventsFound": "Tidak ada acara yang ditemukan",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platform", "platforms": "Platform",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "File" "sharedFiles": "File"
},
"jellystat": {
"songs": "Lagu",
"movies": "Film",
"episodes": "Episode",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -14,7 +14,7 @@
"date": "{{value, date}}", "date": "{{value, date}}",
"relativeDate": "{{value, relativeDate}}", "relativeDate": "{{value, relativeDate}}",
"duration": "{{value, duration}}", "duration": "{{value, duration}}",
"months": "mo", "months": "m",
"days": "g", "days": "g",
"hours": "o", "hours": "o",
"minutes": "m", "minutes": "m",
@ -313,13 +313,13 @@
}, },
"suwayomi": { "suwayomi": {
"download": "Scaricato", "download": "Scaricato",
"nondownload": "Non-Downloaded", "nondownload": "Non Scaricato",
"read": "Letti", "read": "Letti",
"unread": "Non letto", "unread": "Non letto",
"downloadedread": "Downloaded & Read", "downloadedread": "Scaricato E Letto",
"downloadedunread": "Downloaded & Unread", "downloadedunread": "Scaricato E Non Letto",
"nondownloadedread": "Non-Downloaded & Read", "nondownloadedread": "Non Scaricato E Letto",
"nondownloadedunread": "Non-Downloaded & Unread" "nondownloadedunread": "Non Scaricato E Non Letto"
}, },
"tailscale": { "tailscale": {
"address": "Indirizzo", "address": "Indirizzo",
@ -339,13 +339,13 @@
"totalQueries": "Richieste", "totalQueries": "Richieste",
"totalNoError": "Successo", "totalNoError": "Successo",
"totalServerFailure": "Fallimenti", "totalServerFailure": "Fallimenti",
"totalNxDomain": "NX Domains", "totalNxDomain": "Domini NX",
"totalRefused": "Refused", "totalRefused": "Rifiutato",
"totalAuthoritative": "Authoritative", "totalAuthoritative": "Autoritario",
"totalRecursive": "Recursive", "totalRecursive": "Ricorsivo",
"totalCached": "Cached", "totalCached": "In cache",
"totalBlocked": "Bloccati", "totalBlocked": "Bloccati",
"totalDropped": "Dropped", "totalDropped": "Saltati",
"totalClients": "Client" "totalClients": "Client"
}, },
"tdarr": { "tdarr": {
@ -568,12 +568,13 @@
"gluetun": { "gluetun": {
"public_ip": "IP pubblico", "public_ip": "IP pubblico",
"region": "Località", "region": "Località",
"country": "Paese" "country": "Paese",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Canali", "channels": "Canali",
"hd": "HD", "hd": "HD",
"tunerCount": "Tuners", "tunerCount": "Regolatori",
"channelNumber": "Canale", "channelNumber": "Canale",
"channelNetwork": "Rete", "channelNetwork": "Rete",
"signalStrength": "Intensità", "signalStrength": "Intensità",
@ -705,7 +706,7 @@
"time": "Tempo" "time": "Tempo"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Valore Netto",
"budget": "Budget" "budget": "Budget"
}, },
"grafana": { "grafana": {
@ -856,29 +857,30 @@
"physicalRelease": "Release fisici", "physicalRelease": "Release fisici",
"digitalRelease": "Versione digitale", "digitalRelease": "Versione digitale",
"noEventsToday": "Nessun evento per oggi!", "noEventsToday": "Nessun evento per oggi!",
"noEventsFound": "Nessun evento trovato" "noEventsFound": "Nessun evento trovato",
"errorWhenLoadingData": "Errore durante il caricamento dei dati del calendario"
}, },
"romm": { "romm": {
"platforms": "Piattaforme", "platforms": "Piattaforme",
"totalRoms": "Giochi", "totalRoms": "Giochi",
"saves": "Saves", "saves": "Salvati",
"states": "States", "states": "Stati",
"screenshots": "Screenshots", "screenshots": "Screenshot",
"totalfilesize": "Total Size" "totalfilesize": "Dimensioni totali"
}, },
"mailcow": { "mailcow": {
"domains": "Domini", "domains": "Domini",
"mailboxes": "Mailboxes", "mailboxes": "Caselle di posta",
"mails": "Mails", "mails": "Mail",
"storage": "Archiviazione" "storage": "Archiviazione"
}, },
"netdata": { "netdata": {
"warnings": "Avvisi", "warnings": "Avvisi",
"criticals": "Criticals" "criticals": "Critici"
}, },
"plantit": { "plantit": {
"events": "Eventi", "events": "Eventi",
"plants": "Plants", "plants": "Piante",
"photos": "Foto", "photos": "Foto",
"species": "Specie" "species": "Specie"
}, },
@ -886,7 +888,7 @@
"notifications": "Notifiche", "notifications": "Notifiche",
"issues": "Problemi", "issues": "Problemi",
"pulls": "Richieste di Pull", "pulls": "Richieste di Pull",
"repositories": "Repositories" "repositories": "Repository"
}, },
"stash": { "stash": {
"scenes": "Scene", "scenes": "Scene",
@ -928,8 +930,8 @@
"total": "Totale" "total": "Totale"
}, },
"swagdashboard": { "swagdashboard": {
"proxied": "Proxied", "proxied": "Proxato",
"auth": "With Auth", "auth": "Con Autenticazione",
"outdated": "Obsoleto", "outdated": "Obsoleto",
"banned": "Bannato" "banned": "Bannato"
}, },
@ -939,14 +941,14 @@
"upload": "Upload" "upload": "Upload"
}, },
"stocks": { "stocks": {
"stocks": "Stocks", "stocks": "Azioni",
"loading": "Caricamento", "loading": "Caricamento",
"open": "Open - US Market", "open": "Aperto - Mercato USA",
"closed": "Closed - US Market", "closed": "Chiuso - Mercato USA",
"invalidConfiguration": "Configurazione non valida" "invalidConfiguration": "Configurazione non valida"
}, },
"frigate": { "frigate": {
"cameras": "Cameras", "cameras": "Telecamere",
"uptime": "Tempo di attività", "uptime": "Tempo di attività",
"version": "Versione" "version": "Versione"
}, },
@ -956,26 +958,26 @@
"tags": "Tag" "tags": "Tag"
}, },
"zabbix": { "zabbix": {
"unclassified": "Not classified", "unclassified": "Non classificato",
"information": "Informazioni", "information": "Informazioni",
"warning": "Warning", "warning": "Avviso",
"average": "Media", "average": "Media",
"high": "High", "high": "Alto",
"disaster": "Disaster" "disaster": "Disastri"
}, },
"lubelogger": { "lubelogger": {
"vehicle": "Veicolo", "vehicle": "Veicolo",
"vehicles": "Veicoli", "vehicles": "Veicoli",
"serviceRecords": "Service Records", "serviceRecords": "Record Di Servizio",
"reminders": "Promemoria", "reminders": "Promemoria",
"nextReminder": "Promemoria Seguente", "nextReminder": "Promemoria Seguente",
"none": "Nessuno" "none": "Nessuno"
}, },
"vikunja": { "vikunja": {
"projects": "Active Projects", "projects": "Progetti attivi",
"tasks7d": "Tasks Due This Week", "tasks7d": "Attività Settimanali",
"tasksOverdue": "Overdue Tasks", "tasksOverdue": "Task scaduti",
"tasksInProgress": "Tasks In Progress" "tasksInProgress": "Task In Corso"
}, },
"headscale": { "headscale": {
"name": "Nome", "name": "Nome",
@ -1005,9 +1007,9 @@
"outOfSync": "Non Sincronizzato", "outOfSync": "Non Sincronizzato",
"healthy": "Sano", "healthy": "Sano",
"degraded": "Degradato", "degraded": "Degradato",
"progressing": "Progressing", "progressing": "Progressione",
"missing": "Mancanti", "missing": "Mancanti",
"suspended": "Suspended" "suspended": "Sospeso"
}, },
"spoolman": { "spoolman": {
"loading": "Caricamento" "loading": "Caricamento"
@ -1027,7 +1029,7 @@
"karakeep": { "karakeep": {
"bookmarks": "Segnalibri", "bookmarks": "Segnalibri",
"favorites": "Preferiti", "favorites": "Preferiti",
"archived": "Archived", "archived": "Archiviato",
"highlights": "Highlights", "highlights": "Highlights",
"lists": "Liste", "lists": "Liste",
"tags": "Tag" "tags": "Tag"
@ -1036,11 +1038,21 @@
"slskStatus": "Rete", "slskStatus": "Rete",
"connected": "Connesso", "connected": "Connesso",
"disconnected": "Disconnesso", "disconnected": "Disconnesso",
"updateStatus": "Update", "updateStatus": "Aggiornamento",
"update_yes": "Disponibili", "update_yes": "Disponibili",
"update_no": "Aggiornato", "update_no": "Aggiornato",
"downloads": "Download", "downloads": "Download",
"uploads": "Uploads", "uploads": "Caricamenti",
"sharedFiles": "File" "sharedFiles": "File"
},
"jellystat": {
"songs": "Canzoni",
"movies": "Film",
"episodes": "Episodi",
"other": "Altro"
},
"checkmk": {
"serviceErrors": "Problemi di servizio",
"hostErrors": "Problemi di host"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "パブリックIP", "public_ip": "パブリックIP",
"region": "地域", "region": "地域",
"country": "国" "country": "国",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "チャンネル", "channels": "チャンネル",
@ -856,7 +857,8 @@
"physicalRelease": "物理的なリリース", "physicalRelease": "物理的なリリース",
"digitalRelease": "デジタル・リリース", "digitalRelease": "デジタル・リリース",
"noEventsToday": "本日の予定なし", "noEventsToday": "本日の予定なし",
"noEventsFound": "予定が見つかりません" "noEventsFound": "予定が見つかりません",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "プラットフォーム", "platforms": "プラットフォーム",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "ファイル" "sharedFiles": "ファイル"
},
"jellystat": {
"songs": "曲",
"movies": "映画",
"episodes": "エピソード",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "채널", "channels": "채널",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "기종", "platforms": "기종",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "파일" "sharedFiles": "파일"
},
"jellystat": {
"songs": "음악",
"movies": "영화",
"episodes": "에피소드",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP Awam", "public_ip": "IP Awam",
"region": "Rantau", "region": "Rantau",
"country": "Negara" "country": "Negara",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Saluran", "channels": "Saluran",
@ -856,7 +857,8 @@
"physicalRelease": "Edaran fizikal", "physicalRelease": "Edaran fizikal",
"digitalRelease": "Edaran digital", "digitalRelease": "Edaran digital",
"noEventsToday": "Tiada agenda untuk hari ini!", "noEventsToday": "Tiada agenda untuk hari ini!",
"noEventsFound": "Tiada agenda dijumpai" "noEventsFound": "Tiada agenda dijumpai",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platform", "platforms": "Platform",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Lagu",
"movies": "Filem",
"episodes": "Episod",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Publiek IP", "public_ip": "Publiek IP",
"region": "Regio", "region": "Regio",
"country": "Land" "country": "Land",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanalen", "channels": "Kanalen",
@ -856,7 +857,8 @@
"physicalRelease": "Fysieke versie", "physicalRelease": "Fysieke versie",
"digitalRelease": "Digitale versie", "digitalRelease": "Digitale versie",
"noEventsToday": "Geen gebeurtenissen voor vandaag!", "noEventsToday": "Geen gebeurtenissen voor vandaag!",
"noEventsFound": "Geen gebeurtenissen gevonden" "noEventsFound": "Geen gebeurtenissen gevonden",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platformen", "platforms": "Platformen",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Bestanden" "sharedFiles": "Bestanden"
},
"jellystat": {
"songs": "Nummers",
"movies": "Films",
"episodes": "Afleveringen",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Offentlig IP", "public_ip": "Offentlig IP",
"region": "Region", "region": "Region",
"country": "Land" "country": "Land",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanal", "channels": "Kanal",
@ -856,7 +857,8 @@
"physicalRelease": "Fysisk utslipp", "physicalRelease": "Fysisk utslipp",
"digitalRelease": "Digital utgivelse", "digitalRelease": "Digital utgivelse",
"noEventsToday": "Ingen hendelser for i dag!", "noEventsToday": "Ingen hendelser for i dag!",
"noEventsFound": "Ingen hendelser funnet" "noEventsFound": "Ingen hendelser funnet",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Plattformer", "platforms": "Plattformer",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Sanger",
"movies": "Film",
"episodes": "Episoder",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -178,7 +178,7 @@
"connectedAp": "Połączone punkty dostępowe", "connectedAp": "Połączone punkty dostępowe",
"activeUser": "Aktywne urządzenia", "activeUser": "Aktywne urządzenia",
"alerts": "Alarmy", "alerts": "Alarmy",
"connectedGateways": "Connected gateways", "connectedGateways": "Połączone bramy",
"connectedSwitches": "Połączone przełączniki" "connectedSwitches": "Połączone przełączniki"
}, },
"nzbget": { "nzbget": {
@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Adres publiczny", "public_ip": "Adres publiczny",
"region": "Region", "region": "Region",
"country": "Państwo" "country": "Państwo",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanały", "channels": "Kanały",
@ -856,7 +857,8 @@
"physicalRelease": "Wydanie fizyczne", "physicalRelease": "Wydanie fizyczne",
"digitalRelease": "Wydanie cyfrowe", "digitalRelease": "Wydanie cyfrowe",
"noEventsToday": "Brak wydarzeń na dziś!", "noEventsToday": "Brak wydarzeń na dziś!",
"noEventsFound": "Nie znaleziono wydarzeń" "noEventsFound": "Nie znaleziono wydarzeń",
"errorWhenLoadingData": "Wystąpił błąd podczas ładowania danych kalendarza"
}, },
"romm": { "romm": {
"platforms": "Platformy", "platforms": "Platformy",
@ -1036,11 +1038,21 @@
"slskStatus": "Sieć", "slskStatus": "Sieć",
"connected": "Połączono", "connected": "Połączono",
"disconnected": "Rozłączono", "disconnected": "Rozłączono",
"updateStatus": "Update", "updateStatus": "Aktualizacja",
"update_yes": "Dostępne", "update_yes": "Dostępne",
"update_no": "Aktualny", "update_no": "Aktualny",
"downloads": "Downloads", "downloads": "Pobieranie",
"uploads": "Uploads", "uploads": "Przesyłanie",
"sharedFiles": "Pliki" "sharedFiles": "Pliki"
},
"jellystat": {
"songs": "Piosenki",
"movies": "Filmy",
"episodes": "Odcinki",
"other": "Inne"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP público", "public_ip": "IP público",
"region": "Região", "region": "Região",
"country": "País" "country": "País",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Canais", "channels": "Canais",
@ -856,7 +857,8 @@
"physicalRelease": "Lançamento físico", "physicalRelease": "Lançamento físico",
"digitalRelease": "Lançamento digital", "digitalRelease": "Lançamento digital",
"noEventsToday": "Não existem eventos hoje!", "noEventsToday": "Não existem eventos hoje!",
"noEventsFound": "Nenhum evento encontrado" "noEventsFound": "Nenhum evento encontrado",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Plataformas", "platforms": "Plataformas",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Ficheiros" "sharedFiles": "Ficheiros"
},
"jellystat": {
"songs": "Canções",
"movies": "Filmes",
"episodes": "Episódios",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "IP público", "public_ip": "IP público",
"region": "Região", "region": "Região",
"country": "País" "country": "País",
"port_forwarded": "Porta Encaminhada"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Canais", "channels": "Canais",
@ -856,7 +857,8 @@
"physicalRelease": "Versão física", "physicalRelease": "Versão física",
"digitalRelease": "Versão digital", "digitalRelease": "Versão digital",
"noEventsToday": "Nenhum evento para hoje!", "noEventsToday": "Nenhum evento para hoje!",
"noEventsFound": "Nenhum evento encontrado" "noEventsFound": "Nenhum evento encontrado",
"errorWhenLoadingData": "Erro ao carregar dados do calendário"
}, },
"romm": { "romm": {
"platforms": "Plataformas", "platforms": "Plataformas",
@ -1042,5 +1044,15 @@
"downloads": "Transferências", "downloads": "Transferências",
"uploads": "Envios", "uploads": "Envios",
"sharedFiles": "Arquivos" "sharedFiles": "Arquivos"
},
"jellystat": {
"songs": "Canções",
"movies": "Filmes",
"episodes": "Episódios",
"other": "Outro"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -134,20 +134,20 @@
}, },
"fritzbox": { "fritzbox": {
"connectionStatus": "Stare", "connectionStatus": "Stare",
"connectionStatusUnconfigured": "Unconfigured", "connectionStatusUnconfigured": "Neconfigurat",
"connectionStatusConnecting": "Connecting", "connectionStatusConnecting": "Connecting",
"connectionStatusAuthenticating": "Authenticating", "connectionStatusAuthenticating": "Authenticating",
"connectionStatusPendingDisconnect": "Pending Disconnect", "connectionStatusPendingDisconnect": "Pending Disconnect",
"connectionStatusDisconnecting": "Disconnecting", "connectionStatusDisconnecting": "Disconnecting",
"connectionStatusDisconnected": "Disconnected", "connectionStatusDisconnected": "Deconectat",
"connectionStatusConnected": "Connected", "connectionStatusConnected": "Conectat",
"uptime": "Uptime", "uptime": "Uptime",
"maxDown": "Max. Down", "maxDown": "Max. Down",
"maxUp": "Max. Up", "maxUp": "Max. Up",
"down": "Jos", "down": "Jos",
"up": "Sus", "up": "Sus",
"received": "Received", "received": "Primit",
"sent": "Sent", "sent": "Trimis",
"externalIPAddress": "Ext. IP", "externalIPAddress": "Ext. IP",
"externalIPv6Address": "Ext. IPv6", "externalIPv6Address": "Ext. IPv6",
"externalIPv6Prefix": "Ext. IPv6-Prefix" "externalIPv6Prefix": "Ext. IPv6-Prefix"
@ -163,8 +163,8 @@
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Shows",
"recordings": "Recordings", "recordings": "Înregistrări",
"scheduled": "Scheduled", "scheduled": "Programate",
"passes": "Passes" "passes": "Passes"
}, },
"tautulli": { "tautulli": {
@ -176,8 +176,8 @@
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
"activeUser": "Active devices", "activeUser": "Dispozitive active",
"alerts": "Alerts", "alerts": "Alerte",
"connectedGateways": "Connected gateways", "connectedGateways": "Connected gateways",
"connectedSwitches": "Connected switches" "connectedSwitches": "Connected switches"
}, },
@ -188,7 +188,7 @@
}, },
"plex": { "plex": {
"streams": "Fluxuri active", "streams": "Fluxuri active",
"albums": "Albums", "albums": "Albume",
"movies": "Filme", "movies": "Filme",
"tv": "Seriale" "tv": "Seriale"
}, },
@ -217,7 +217,7 @@
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "Temperatură Sistem",
"poolUsage": "Pool Usage", "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage", "volumeUsage": "Volume Usage",
"invalid": "Invalid" "invalid": "Invalid"
@ -247,7 +247,7 @@
}, },
"radarr": { "radarr": {
"wanted": "Dorite", "wanted": "Dorite",
"missing": "Missing", "missing": "Lipsește",
"queued": "În coadă", "queued": "În coadă",
"movies": "Filme", "movies": "Filme",
"queue": "Coadă", "queue": "Coadă",
@ -256,7 +256,7 @@
"lidarr": { "lidarr": {
"wanted": "Dorite", "wanted": "Dorite",
"queued": "În coadă", "queued": "În coadă",
"artists": "Artists" "artists": "Artiști"
}, },
"readarr": { "readarr": {
"wanted": "Dorite", "wanted": "Dorite",
@ -279,21 +279,21 @@
}, },
"overseerr": { "overseerr": {
"pending": "În așteptare", "pending": "În așteptare",
"processing": "Processing", "processing": "Procesare",
"approved": "Aprobate", "approved": "Aprobate",
"available": "Disponibile" "available": "Disponibile"
}, },
"netalertx": { "netalertx": {
"total": "Total", "total": "Total",
"connected": "Connected", "connected": "Conectat",
"new_devices": "New Devices", "new_devices": "Dispozitive Noi",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
}, },
"pihole": { "pihole": {
"queries": "Cereri", "queries": "Cereri",
"blocked": "Blocate", "blocked": "Blocate",
"blocked_percent": "Blocked %", "blocked_percent": "Blocked %",
"gravity": "Gravity" "gravity": "Gravitație"
}, },
"adguard": { "adguard": {
"queries": "Cereri", "queries": "Cereri",
@ -322,11 +322,11 @@
"nondownloadedunread": "Non-Downloaded & Unread" "nondownloadedunread": "Non-Downloaded & Unread"
}, },
"tailscale": { "tailscale": {
"address": "Address", "address": "Adresă",
"expires": "Expires", "expires": "Expiră",
"never": "Never", "never": "Niciodată",
"last_seen": "Last Seen", "last_seen": "Last Seen",
"now": "Now", "now": "Acum",
"years": "{{number}}y", "years": "{{number}}y",
"weeks": "{{number}}w", "weeks": "{{number}}w",
"days": "{{number}}d", "days": "{{number}}d",
@ -340,9 +340,9 @@
"totalNoError": "Success", "totalNoError": "Success",
"totalServerFailure": "Failures", "totalServerFailure": "Failures",
"totalNxDomain": "NX Domains", "totalNxDomain": "NX Domains",
"totalRefused": "Refused", "totalRefused": "Refuzat",
"totalAuthoritative": "Authoritative", "totalAuthoritative": "Authoritative",
"totalRecursive": "Recursive", "totalRecursive": "Recursiv",
"totalCached": "Cached", "totalCached": "Cached",
"totalBlocked": "Blocate", "totalBlocked": "Blocate",
"totalDropped": "Dropped", "totalDropped": "Dropped",
@ -352,7 +352,7 @@
"queue": "Coadă", "queue": "Coadă",
"processed": "Processed", "processed": "Processed",
"errored": "Errored", "errored": "Errored",
"saved": "Saved" "saved": "Salvat"
}, },
"traefik": { "traefik": {
"routers": "Routere", "routers": "Routere",
@ -408,8 +408,8 @@
"series": "Serie" "series": "Serie"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Jucători",
"version": "Version", "version": "Versiune",
"status": "Stare", "status": "Stare",
"up": "Online", "up": "Online",
"down": "Offline" "down": "Offline"
@ -434,7 +434,7 @@
"load": "Sarcină", "load": "Sarcină",
"wait": "Va rugăm așteptați", "wait": "Va rugăm așteptați",
"temp": "TEMP", "temp": "TEMP",
"_temp": "Temp", "_temp": "Temperatură",
"warn": "Warn", "warn": "Warn",
"uptime": "UP", "uptime": "UP",
"total": "Total", "total": "Total",
@ -456,7 +456,7 @@
"custom": "Personalizat", "custom": "Personalizat",
"visit": "Vizită", "visit": "Vizită",
"url": "URL", "url": "URL",
"searchsuggestion": "Suggestion" "searchsuggestion": "Sugestie"
}, },
"wmo": { "wmo": {
"0-day": "Însorit", "0-day": "Însorit",
@ -481,10 +481,10 @@
"56-night": "Light Freezing Drizzle", "56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle", "57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle", "57-night": "Freezing Drizzle",
"61-day": "Light Rain", "61-day": "Ploaie Ușoară",
"61-night": "Light Rain", "61-night": "Ploaie Ușoară",
"63-day": "Rain", "63-day": "Ploaie",
"63-night": "Rain", "63-night": "Ploaie",
"65-day": "Heavy Rain", "65-day": "Heavy Rain",
"65-night": "Heavy Rain", "65-night": "Heavy Rain",
"66-day": "Freezing Rain", "66-day": "Freezing Rain",
@ -517,10 +517,10 @@
"99-night": "Thunderstorm With Hail" "99-night": "Thunderstorm With Hail"
}, },
"homebridge": { "homebridge": {
"available_update": "System", "available_update": "Sistem",
"updates": "Updates", "updates": "Actualizări",
"update_available": "Update Available", "update_available": "Actualizare Disponibilă",
"up_to_date": "Up to Date", "up_to_date": "Actualizat",
"child_bridges": "Child Bridges", "child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Sus", "up": "Sus",
@ -528,63 +528,64 @@
"down": "Jos" "down": "Jos"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Nou",
"up": "Sus", "up": "Sus",
"grace": "In Grace Period", "grace": "In Grace Period",
"down": "Jos", "down": "Jos",
"paused": "Paused", "paused": "Pau",
"status": "Stare", "status": "Stare",
"last_ping": "Last Ping", "last_ping": "Ultimul Ping",
"never": "No pings yet" "never": "No pings yet"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Scanned", "containers_scanned": "Scanned",
"containers_updated": "Updated", "containers_updated": "Actualizat",
"containers_failed": "Failed" "containers_failed": "Eșuat"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Aprobate", "approvedPushes": "Aprobate",
"rejectedPushes": "Rejected", "rejectedPushes": "Respinse",
"filters": "Filters", "filters": "Filtre",
"indexers": "Indexatori" "indexers": "Indexatori"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Coadă", "downloads": "Coadă",
"videos": "Videos", "videos": "Videos",
"channels": "Channels", "channels": "Canale",
"playlists": "Playlists" "playlists": "Playlists"
}, },
"truenas": { "truenas": {
"load": "System Load", "load": "System Load",
"uptime": "Uptime", "uptime": "Uptime",
"alerts": "Alerts" "alerts": "Alerte"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "Viteză",
"active": "Activ", "active": "Activ",
"queue": "Coadă", "queue": "Coadă",
"total": "Total" "total": "Total"
}, },
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Regiune",
"country": "Country" "country": "Țară",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Canale",
"hd": "HD", "hd": "HD",
"tunerCount": "Tuners", "tunerCount": "Tunere",
"channelNumber": "Channel", "channelNumber": "Canal",
"channelNetwork": "Network", "channelNetwork": "Rețea",
"signalStrength": "Strength", "signalStrength": "Putere",
"signalQuality": "Quality", "signalQuality": "Calitate",
"symbolQuality": "Quality", "symbolQuality": "Calitate",
"networkRate": "Rata de biți", "networkRate": "Rata de biți",
"clientIP": "Client" "clientIP": "Client"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Passed",
"failed": "Failed", "failed": "Eșuat",
"unknown": "Necunoscut" "unknown": "Necunoscut"
}, },
"paperlessngx": { "paperlessngx": {
@ -592,12 +593,12 @@
"total": "Total" "total": "Total"
}, },
"peanut": { "peanut": {
"battery_charge": "Battery Charge", "battery_charge": "Încărcare Baterie",
"ups_load": "UPS Load", "ups_load": "UPS Load",
"ups_status": "UPS Status", "ups_status": "UPS Status",
"online": "Online", "online": "Online",
"on_battery": "On Battery", "on_battery": "On Battery",
"low_battery": "Low Battery" "low_battery": "Baterie descărcată"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "Please Wait",
@ -605,7 +606,7 @@
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "CPU Load",
"memoryUsed": "Memory Used", "memoryUsed": "Memorie Utilizată",
"uptime": "Uptime", "uptime": "Uptime",
"numberOfLeases": "Leases" "numberOfLeases": "Leases"
}, },
@ -615,22 +616,22 @@
"streams_xepg": "XEPG Channels" "streams_xepg": "XEPG Channels"
}, },
"opendtu": { "opendtu": {
"yieldDay": "Today", "yieldDay": "Astăzi",
"absolutePower": "Power", "absolutePower": "Putere",
"relativePower": "Power %", "relativePower": "Putere %",
"limit": "Limit" "limit": "Limită"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "CPU Load",
"memory": "Active Memory", "memory": "Memorie Activă",
"wanUpload": "WAN Upload", "wanUpload": "WAN Upload",
"wanDownload": "WAN Download" "wanDownload": "WAN Download"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "Starea Imprimantei",
"print_status": "Print Status", "print_status": "Print Status",
"print_progress": "Progress", "print_progress": "Progres",
"layers": "Layers" "layers": "Straturi"
}, },
"octoprint": { "octoprint": {
"printer_state": "Stare", "printer_state": "Stare",
@ -648,19 +649,19 @@
"wanStatus": "WAN Status", "wanStatus": "WAN Status",
"up": "Sus", "up": "Sus",
"down": "Jos", "down": "Jos",
"temp": "Temp", "temp": "Temperatură",
"disk": "Disk Usage", "disk": "Utilizare Disc",
"wanIP": "WAN IP" "wanIP": "WAN IP"
}, },
"proxmoxbackupserver": { "proxmoxbackupserver": {
"datastore_usage": "Datastore", "datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h", "failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "Procesor", "cpu_usage": "Procesor",
"memory_usage": "Memory" "memory_usage": "Memorie"
}, },
"immich": { "immich": {
"users": "Utilizatori", "users": "Utilizatori",
"photos": "Photos", "photos": "Fotografii",
"videos": "Videos", "videos": "Videos",
"storage": "Storage" "storage": "Storage"
}, },
@ -673,12 +674,12 @@
}, },
"atsumeru": { "atsumeru": {
"series": "Serie", "series": "Serie",
"archives": "Archives", "archives": "Arhive",
"chapters": "Chapters", "chapters": "Chapters",
"categories": "Categories" "categories": "Categorii"
}, },
"komga": { "komga": {
"libraries": "Libraries", "libraries": "Biblioteci",
"series": "Serie", "series": "Serie",
"books": "Cărți" "books": "Cărți"
}, },
@ -693,20 +694,20 @@
"wanted": "Dorite" "wanted": "Dorite"
}, },
"photoprism": { "photoprism": {
"albums": "Albums", "albums": "Albume",
"photos": "Photos", "photos": "Fotografii",
"videos": "Videos", "videos": "Videos",
"people": "People" "people": "Oameni"
}, },
"fileflows": { "fileflows": {
"queue": "Coadă", "queue": "Coadă",
"processing": "Processing", "processing": "Procesare",
"processed": "Processed", "processed": "Processed",
"time": "Time" "time": "Timp"
}, },
"firefly": { "firefly": {
"networth": "Net Worth", "networth": "Net Worth",
"budget": "Budget" "budget": "Buget"
}, },
"grafana": { "grafana": {
"dashboards": "Dashboards", "dashboards": "Dashboards",
@ -716,18 +717,18 @@
}, },
"nextcloud": { "nextcloud": {
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memorie Utilizată",
"freespace": "Free Space", "freespace": "Spațiu Liber",
"activeusers": "Active Users", "activeusers": "Utilizatori Activi",
"numfiles": "Files", "numfiles": "Fișiere",
"numshares": "Shared Items" "numshares": "Articole Partajate"
}, },
"kopia": { "kopia": {
"status": "Stare", "status": "Stare",
"size": "Size", "size": "Mărime",
"lastrun": "Last Run", "lastrun": "Ultima Rulare",
"nextrun": "Next Run", "nextrun": "Următoarea Rulare",
"failed": "Failed" "failed": "Eșuat"
}, },
"unmanic": { "unmanic": {
"active_workers": "Muncitori activi", "active_workers": "Muncitori activi",
@ -749,15 +750,15 @@
"uptime": "Uptime" "uptime": "Uptime"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Astăzi",
"gross_percent_1y": "One year", "gross_percent_1y": "Un an",
"gross_percent_max": "All time" "gross_percent_max": "Tot timpul"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasts", "podcasts": "Podcasturi",
"books": "Cărți", "books": "Cărți",
"podcastsDuration": "Duration", "podcastsDuration": "Durată",
"booksDuration": "Duration" "booksDuration": "Durată"
}, },
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "People Home",
@ -766,33 +767,33 @@
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Monitoring",
"updates": "Updates" "updates": "Actualizări"
}, },
"calibreweb": { "calibreweb": {
"books": "Cărți", "books": "Cărți",
"authors": "Authors", "authors": "Autori",
"categories": "Categories", "categories": "Categorii",
"series": "Serie" "series": "Serie"
}, },
"jdownloader": { "jdownloader": {
"downloadCount": "Coadă", "downloadCount": "Coadă",
"downloadBytesRemaining": "Rămas", "downloadBytesRemaining": "Rămas",
"downloadTotalBytes": "Size", "downloadTotalBytes": "Mărime",
"downloadSpeed": "Speed" "downloadSpeed": "Viteză"
}, },
"kavita": { "kavita": {
"seriesCount": "Serie", "seriesCount": "Serie",
"totalFiles": "Files" "totalFiles": "Fișiere"
}, },
"azuredevops": { "azuredevops": {
"result": "Result", "result": "Rezultat",
"status": "Stare", "status": "Stare",
"buildId": "Build ID", "buildId": "Build ID",
"succeeded": "Succeeded", "succeeded": "Succeeded",
"notStarted": "Not Started", "notStarted": "Not Started",
"failed": "Failed", "failed": "Eșuat",
"canceled": "Canceled", "canceled": "Anulat",
"inProgress": "In Progress", "inProgress": "În Progres",
"totalPrs": "Total PRs", "totalPrs": "Total PRs",
"myPrs": "My PRs", "myPrs": "My PRs",
"approved": "Aprobate" "approved": "Aprobate"
@ -801,25 +802,25 @@
"status": "Stare", "status": "Stare",
"online": "Online", "online": "Online",
"offline": "Offline", "offline": "Offline",
"name": "Name", "name": "Nume",
"map": "Map", "map": "Hartă",
"currentPlayers": "Current players", "currentPlayers": "Current players",
"players": "Players", "players": "Jucători",
"maxPlayers": "Max players", "maxPlayers": "Max players",
"bots": "Bots", "bots": "Boți",
"ping": "Ping" "ping": "Ping"
}, },
"urbackup": { "urbackup": {
"ok": "Ok", "ok": "Ok",
"errored": "Errors", "errored": "Erori",
"noRecent": "Out of Date", "noRecent": "Out of Date",
"totalUsed": "Used Storage" "totalUsed": "Used Storage"
}, },
"mealie": { "mealie": {
"recipes": "Recipes", "recipes": "Recipes",
"users": "Utilizatori", "users": "Utilizatori",
"categories": "Categories", "categories": "Categorii",
"tags": "Tags" "tags": "Etichete"
}, },
"openmediavault": { "openmediavault": {
"downloading": "Downloading", "downloading": "Downloading",
@ -827,15 +828,15 @@
"running": "Rulează", "running": "Rulează",
"stopped": "Oprit", "stopped": "Oprit",
"passed": "Passed", "passed": "Passed",
"failed": "Failed" "failed": "Eșuat"
}, },
"openwrt": { "openwrt": {
"uptime": "Uptime", "uptime": "Uptime",
"cpuLoad": "CPU Load Avg (5m)", "cpuLoad": "CPU Load Avg (5m)",
"up": "Sus", "up": "Sus",
"down": "Jos", "down": "Jos",
"bytesTx": "Transmitted", "bytesTx": "Transmis",
"bytesRx": "Received" "bytesRx": "Primit"
}, },
"uptimerobot": { "uptimerobot": {
"status": "Stare", "status": "Stare",
@ -844,7 +845,7 @@
"downDuration": "Downtime Duration", "downDuration": "Downtime Duration",
"sitesUp": "Sites Up", "sitesUp": "Sites Up",
"sitesDown": "Sites Down", "sitesDown": "Sites Down",
"paused": "Paused", "paused": "Pau",
"notyetchecked": "Not Yet Checked", "notyetchecked": "Not Yet Checked",
"up": "Sus", "up": "Sus",
"seemsdown": "Seems Down", "seemsdown": "Seems Down",
@ -852,77 +853,78 @@
"unknown": "Necunoscut" "unknown": "Necunoscut"
}, },
"calendar": { "calendar": {
"inCinemas": "In cinemas", "inCinemas": "În cinematografe",
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforme",
"totalRoms": "Games", "totalRoms": "Jocuri",
"saves": "Saves", "saves": "Salvări",
"states": "States", "states": "States",
"screenshots": "Screenshots", "screenshots": "Screenshots",
"totalfilesize": "Total Size" "totalfilesize": "Mărime Totală"
}, },
"mailcow": { "mailcow": {
"domains": "Domenii", "domains": "Domenii",
"mailboxes": "Mailboxes", "mailboxes": "Cutii poştale",
"mails": "Mails", "mails": "Mails",
"storage": "Storage" "storage": "Storage"
}, },
"netdata": { "netdata": {
"warnings": "Warnings", "warnings": "Warnings",
"criticals": "Criticals" "criticals": "Critice"
}, },
"plantit": { "plantit": {
"events": "Events", "events": "Evenimente",
"plants": "Plants", "plants": "Plante",
"photos": "Photos", "photos": "Fotografii",
"species": "Species" "species": "Specii"
}, },
"gitea": { "gitea": {
"notifications": "Notifications", "notifications": "Notificări",
"issues": "Issues", "issues": "Issues",
"pulls": "Pull Requests", "pulls": "Pull Requests",
"repositories": "Repositories" "repositories": "Repozitorii"
}, },
"stash": { "stash": {
"scenes": "Scenes", "scenes": "Scene",
"scenesPlayed": "Scenes Played", "scenesPlayed": "Scenes Played",
"playCount": "Total Plays", "playCount": "Total Plays",
"playDuration": "Time Watched", "playDuration": "Time Watched",
"sceneSize": "Scenes Size", "sceneSize": "Scenes Size",
"sceneDuration": "Scenes Duration", "sceneDuration": "Scenes Duration",
"images": "Images", "images": "Imagini",
"imageSize": "Images Size", "imageSize": "Images Size",
"galleries": "Galleries", "galleries": "Galerii",
"performers": "Performers", "performers": "Performers",
"studios": "Studios", "studios": "Studios",
"movies": "Filme", "movies": "Filme",
"tags": "Tags", "tags": "Etichete",
"oCount": "O Count" "oCount": "O Count"
}, },
"tandoor": { "tandoor": {
"users": "Utilizatori", "users": "Utilizatori",
"recipes": "Recipes", "recipes": "Recipes",
"keywords": "Keywords" "keywords": "Cuvinte cheie"
}, },
"homebox": { "homebox": {
"items": "Items", "items": "Items",
"totalWithWarranty": "With Warranty", "totalWithWarranty": "Cu Garanție",
"locations": "Locations", "locations": "Locaţii",
"labels": "Labels", "labels": "Etichete",
"users": "Utilizatori", "users": "Utilizatori",
"totalValue": "Total Value" "totalValue": "Total Value"
}, },
"crowdsec": { "crowdsec": {
"alerts": "Alerts", "alerts": "Alerte",
"bans": "Bans" "bans": "Bans"
}, },
"wgeasy": { "wgeasy": {
"connected": "Connected", "connected": "Conectat",
"enabled": "Activat", "enabled": "Activat",
"disabled": "Dezactivat", "disabled": "Dezactivat",
"total": "Total" "total": "Total"
@ -930,7 +932,7 @@
"swagdashboard": { "swagdashboard": {
"proxied": "Proxied", "proxied": "Proxied",
"auth": "With Auth", "auth": "With Auth",
"outdated": "Outdated", "outdated": "Învechit",
"banned": "Banned" "banned": "Banned"
}, },
"myspeed": { "myspeed": {
@ -939,37 +941,37 @@
"upload": "Încarcă" "upload": "Încarcă"
}, },
"stocks": { "stocks": {
"stocks": "Stocks", "stocks": "Acțiuni",
"loading": "Loading", "loading": "Loading",
"open": "Open - US Market", "open": "Open - US Market",
"closed": "Closed - US Market", "closed": "Closed - US Market",
"invalidConfiguration": "Invalid Configuration" "invalidConfiguration": "Invalid Configuration"
}, },
"frigate": { "frigate": {
"cameras": "Cameras", "cameras": "Camere",
"uptime": "Uptime", "uptime": "Uptime",
"version": "Version" "version": "Versiune"
}, },
"linkwarden": { "linkwarden": {
"links": "Links", "links": "Links",
"collections": "Collections", "collections": "Colecții",
"tags": "Tags" "tags": "Etichete"
}, },
"zabbix": { "zabbix": {
"unclassified": "Not classified", "unclassified": "Not classified",
"information": "Informație", "information": "Informație",
"warning": "Warning", "warning": "Atenție",
"average": "Average", "average": "Medie",
"high": "High", "high": "Înalt",
"disaster": "Disaster" "disaster": "Dezastru"
}, },
"lubelogger": { "lubelogger": {
"vehicle": "Vehicle", "vehicle": "Vehicul",
"vehicles": "Vehicles", "vehicles": "Vehicule",
"serviceRecords": "Service Records", "serviceRecords": "Service Records",
"reminders": "Reminders", "reminders": "Reminders",
"nextReminder": "Next Reminder", "nextReminder": "Next Reminder",
"none": "None" "none": "Niciunul"
}, },
"vikunja": { "vikunja": {
"projects": "Active Projects", "projects": "Active Projects",
@ -978,69 +980,79 @@
"tasksInProgress": "Tasks In Progress" "tasksInProgress": "Tasks In Progress"
}, },
"headscale": { "headscale": {
"name": "Name", "name": "Nume",
"address": "Address", "address": "Adresă",
"last_seen": "Last Seen", "last_seen": "Last Seen",
"status": "Stare", "status": "Stare",
"online": "Online", "online": "Online",
"offline": "Offline" "offline": "Offline"
}, },
"beszel": { "beszel": {
"name": "Name", "name": "Nume",
"systems": "Systems", "systems": "Sistem",
"up": "Sus", "up": "Sus",
"down": "Jos", "down": "Jos",
"paused": "Paused", "paused": "Pau",
"pending": "În așteptare", "pending": "În așteptare",
"status": "Stare", "status": "Stare",
"updated": "Updated", "updated": "Actualizat",
"cpu": "Procesor", "cpu": "Procesor",
"memory": "MEM", "memory": "MEM",
"disk": "Disk", "disk": "Disk",
"network": "NET" "network": "NET"
}, },
"argocd": { "argocd": {
"apps": "Apps", "apps": "Aplicaţii",
"synced": "Synced", "synced": "Synced",
"outOfSync": "Out Of Sync", "outOfSync": "Out Of Sync",
"healthy": "Sănătos", "healthy": "Sănătos",
"degraded": "Degraded", "degraded": "Degraded",
"progressing": "Progressing", "progressing": "Progressing",
"missing": "Missing", "missing": "Lipsește",
"suspended": "Suspended" "suspended": "Suspendat"
}, },
"spoolman": { "spoolman": {
"loading": "Loading" "loading": "Loading"
}, },
"gitlab": { "gitlab": {
"groups": "Groups", "groups": "Grupuri",
"issues": "Issues", "issues": "Issues",
"merges": "Merge Requests", "merges": "Merge Requests",
"projects": "Projects" "projects": "Proiecte"
}, },
"apcups": { "apcups": {
"status": "Stare", "status": "Stare",
"load": "Sarcină", "load": "Sarcină",
"bcharge": "Battery Charge", "bcharge": "Încărcare Baterie",
"timeleft": "Timp rămas" "timeleft": "Timp rămas"
}, },
"karakeep": { "karakeep": {
"bookmarks": "Bookmarks", "bookmarks": "Marcaje",
"favorites": "Favorites", "favorites": "Favorite",
"archived": "Archived", "archived": "Arhivat",
"highlights": "Highlights", "highlights": "Highlights",
"lists": "Lists", "lists": "Liste",
"tags": "Tags" "tags": "Etichete"
}, },
"slskd": { "slskd": {
"slskStatus": "Network", "slskStatus": "Rețea",
"connected": "Connected", "connected": "Conectat",
"disconnected": "Disconnected", "disconnected": "Deconectat",
"updateStatus": "Update", "updateStatus": "Update",
"update_yes": "Disponibile", "update_yes": "Disponibile",
"update_no": "Up to Date", "update_no": "Actualizat",
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Fișiere"
},
"jellystat": {
"songs": "Melodii",
"movies": "Filme",
"episodes": "Episoade",
"other": "Altele"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Публичный IP-адрес", "public_ip": "Публичный IP-адрес",
"region": "Регион", "region": "Регион",
"country": "Страна" "country": "Страна",
"port_forwarded": "Порт переадресован"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Каналы", "channels": "Каналы",
@ -856,7 +857,8 @@
"physicalRelease": "Физический релиз", "physicalRelease": "Физический релиз",
"digitalRelease": "Цифровой релиз", "digitalRelease": "Цифровой релиз",
"noEventsToday": "Нет событий на сегодня!", "noEventsToday": "Нет событий на сегодня!",
"noEventsFound": "Событий не найдено" "noEventsFound": "Событий не найдено",
"errorWhenLoadingData": "Ошибка при загрузке данных календаря"
}, },
"romm": { "romm": {
"platforms": "Платформы", "platforms": "Платформы",
@ -1042,5 +1044,15 @@
"downloads": "Скачивания", "downloads": "Скачивания",
"uploads": "Загрузки", "uploads": "Загрузки",
"sharedFiles": "Файлов" "sharedFiles": "Файлов"
},
"jellystat": {
"songs": "Песни",
"movies": "Фильмы",
"episodes": "Эпизоды",
"other": "Другой"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Verejná IP", "public_ip": "Verejná IP",
"region": "Región", "region": "Región",
"country": "Krajina" "country": "Krajina",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanály", "channels": "Kanály",
@ -856,7 +857,8 @@
"physicalRelease": "Fyzické vydanie", "physicalRelease": "Fyzické vydanie",
"digitalRelease": "Digitálne vydanie", "digitalRelease": "Digitálne vydanie",
"noEventsToday": "Žiadne udalosti na dnešný deň!", "noEventsToday": "Žiadne udalosti na dnešný deň!",
"noEventsFound": "Žiadne udalosti" "noEventsFound": "Žiadne udalosti",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platformy", "platforms": "Platformy",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Súborov" "sharedFiles": "Súborov"
},
"jellystat": {
"songs": "Skladby",
"movies": "Filmy",
"episodes": "Epizódy",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Javni IP", "public_ip": "Javni IP",
"region": "Regija", "region": "Regija",
"country": "Država" "country": "Država",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanali", "channels": "Kanali",
@ -856,7 +857,8 @@
"physicalRelease": "Fizična izdaja", "physicalRelease": "Fizična izdaja",
"digitalRelease": "Digitalna izdaja", "digitalRelease": "Digitalna izdaja",
"noEventsToday": "Za danes ni dogodkov!", "noEventsToday": "Za danes ni dogodkov!",
"noEventsFound": "Ni dogodkov" "noEventsFound": "Ni dogodkov",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforme", "platforms": "Platforme",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Datotek" "sharedFiles": "Datotek"
},
"jellystat": {
"songs": "Pesmi",
"movies": "Filmi",
"episodes": "Epizode",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Avsnitt",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -21,7 +21,7 @@
"seconds": "s" "seconds": "s"
}, },
"widget": { "widget": {
"missing_type": "Missing Widget Type: {{type}}", "missing_type": "ประเภทวิดเจ็ตหาย: {{type}}",
"api_error": "API มีข้อผิดพลาด", "api_error": "API มีข้อผิดพลาด",
"information": "ข้อมูล", "information": "ข้อมูล",
"status": "สถานะ", "status": "สถานะ",
@ -110,7 +110,7 @@
"esphome": { "esphome": {
"offline": "ออฟไลน์", "offline": "ออฟไลน์",
"offline_alt": "ออฟไลน์", "offline_alt": "ออฟไลน์",
"online": "Online", "online": "ออนไลน์",
"total": "ทั้งหมด", "total": "ทั้งหมด",
"unknown": "ไม่ทราบ" "unknown": "ไม่ทราบ"
}, },
@ -130,12 +130,12 @@
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Subscriptions",
"unread": "Unread" "unread": "ยังไม่ได้อ่าน"
}, },
"fritzbox": { "fritzbox": {
"connectionStatus": "สถานะ", "connectionStatus": "สถานะ",
"connectionStatusUnconfigured": "Unconfigured", "connectionStatusUnconfigured": "ยังไม่ได้กำหนดค่า",
"connectionStatusConnecting": "Connecting", "connectionStatusConnecting": "กำลังเชื่อมต่อ",
"connectionStatusAuthenticating": "Authenticating", "connectionStatusAuthenticating": "Authenticating",
"connectionStatusPendingDisconnect": "Pending Disconnect", "connectionStatusPendingDisconnect": "Pending Disconnect",
"connectionStatusDisconnecting": "Disconnecting", "connectionStatusDisconnecting": "Disconnecting",
@ -247,7 +247,7 @@
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "หายไป",
"queued": "Queued", "queued": "Queued",
"movies": "Movies", "movies": "Movies",
"queue": "Queue", "queue": "Queue",
@ -315,7 +315,7 @@
"download": "Downloaded", "download": "Downloaded",
"nondownload": "Non-Downloaded", "nondownload": "Non-Downloaded",
"read": "Read", "read": "Read",
"unread": "Unread", "unread": "ยังไม่ได้อ่าน",
"downloadedread": "Downloaded & Read", "downloadedread": "Downloaded & Read",
"downloadedunread": "Downloaded & Unread", "downloadedunread": "Downloaded & Unread",
"nondownloadedread": "Non-Downloaded & Read", "nondownloadedread": "Non-Downloaded & Read",
@ -364,8 +364,8 @@
"please_wait": "Please Wait" "please_wait": "Please Wait"
}, },
"npm": { "npm": {
"enabled": "Enabled", "enabled": "เปิด",
"disabled": "Disabled", "disabled": "ปิด",
"total": "ทั้งหมด" "total": "ทั้งหมด"
}, },
"coinmarketcap": { "coinmarketcap": {
@ -409,14 +409,14 @@
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Players",
"version": "Version", "version": "เวอร์ชั่น",
"status": "สถานะ", "status": "สถานะ",
"up": "Online", "up": "ออนไลน์",
"down": "ออฟไลน์" "down": "ออฟไลน์"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Read",
"unread": "Unread" "unread": "ยังไม่ได้อ่าน"
}, },
"authentik": { "authentik": {
"users": "ผู้ใช้", "users": "ผู้ใช้",
@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -595,7 +596,7 @@
"battery_charge": "Battery Charge", "battery_charge": "Battery Charge",
"ups_load": "UPS Load", "ups_load": "UPS Load",
"ups_status": "UPS Status", "ups_status": "UPS Status",
"online": "Online", "online": "ออนไลน์",
"on_battery": "On Battery", "on_battery": "On Battery",
"low_battery": "Low Battery" "low_battery": "Low Battery"
}, },
@ -799,7 +800,7 @@
}, },
"gamedig": { "gamedig": {
"status": "สถานะ", "status": "สถานะ",
"online": "Online", "online": "ออนไลน์",
"offline": "ออฟไลน์", "offline": "ออฟไลน์",
"name": "Name", "name": "Name",
"map": "Map", "map": "Map",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -923,8 +925,8 @@
}, },
"wgeasy": { "wgeasy": {
"connected": "Connected", "connected": "Connected",
"enabled": "Enabled", "enabled": "เปิด",
"disabled": "Disabled", "disabled": "ปิด",
"total": "ทั้งหมด" "total": "ทั้งหมด"
}, },
"swagdashboard": { "swagdashboard": {
@ -948,7 +950,7 @@
"frigate": { "frigate": {
"cameras": "Cameras", "cameras": "Cameras",
"uptime": "Uptime", "uptime": "Uptime",
"version": "Version" "version": "เวอร์ชั่น"
}, },
"linkwarden": { "linkwarden": {
"links": "Links", "links": "Links",
@ -982,7 +984,7 @@
"address": "Address", "address": "Address",
"last_seen": "Last Seen", "last_seen": "Last Seen",
"status": "สถานะ", "status": "สถานะ",
"online": "Online", "online": "ออนไลน์",
"offline": "ออฟไลน์" "offline": "ออฟไลน์"
}, },
"beszel": { "beszel": {
@ -1006,7 +1008,7 @@
"healthy": "Healthy", "healthy": "Healthy",
"degraded": "Degraded", "degraded": "Degraded",
"progressing": "Progressing", "progressing": "Progressing",
"missing": "Missing", "missing": "หายไป",
"suspended": "Suspended" "suspended": "Suspended"
}, },
"spoolman": { "spoolman": {
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Açık IP", "public_ip": "Açık IP",
"region": "Bölge", "region": "Bölge",
"country": "Ülke" "country": "Ülke",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Kanallar", "channels": "Kanallar",
@ -856,7 +857,8 @@
"physicalRelease": "Fiziksel Yayınlanan", "physicalRelease": "Fiziksel Yayınlanan",
"digitalRelease": "Dijitalde Yayınlandı", "digitalRelease": "Dijitalde Yayınlandı",
"noEventsToday": "Bugün için etkinlik yok!", "noEventsToday": "Bugün için etkinlik yok!",
"noEventsFound": "Etkinlik bulunamadı" "noEventsFound": "Etkinlik bulunamadı",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platformlar", "platforms": "Platformlar",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Dosyalar" "sharedFiles": "Dosyalar"
},
"jellystat": {
"songs": "Şarkılar",
"movies": "Filmler",
"episodes": "Bölümler",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Публічний IP", "public_ip": "Публічний IP",
"region": "Регіон", "region": "Регіон",
"country": "Країна" "country": "Країна",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Канали", "channels": "Канали",
@ -856,7 +857,8 @@
"physicalRelease": "Фізичний реліз", "physicalRelease": "Фізичний реліз",
"digitalRelease": "Цифровий реліз", "digitalRelease": "Цифровий реліз",
"noEventsToday": "Події на сьогодні відсутні!", "noEventsToday": "Події на сьогодні відсутні!",
"noEventsFound": "Події не знайдено" "noEventsFound": "Події не знайдено",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Платформи", "platforms": "Платформи",
@ -1042,5 +1044,15 @@
"downloads": "Завантаження", "downloads": "Завантаження",
"uploads": "Вивантаження", "uploads": "Вивантаження",
"sharedFiles": "Файли" "sharedFiles": "Файли"
},
"jellystat": {
"songs": "Пісні",
"movies": "Фільми",
"episodes": "Епізоди",
"other": "Інше"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Public IP",
"region": "Region", "region": "Region",
"country": "Country" "country": "Country",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Channels",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "No events for today!", "noEventsToday": "No events for today!",
"noEventsFound": "No events found" "noEventsFound": "No events found",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "Platforms", "platforms": "Platforms",
@ -1042,5 +1044,15 @@
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "公用IP", "public_ip": "公用IP",
"region": "地區", "region": "地區",
"country": "國家" "country": "國家",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "頻道", "channels": "頻道",
@ -856,7 +857,8 @@
"physicalRelease": "實體發行", "physicalRelease": "實體發行",
"digitalRelease": "數位發行", "digitalRelease": "數位發行",
"noEventsToday": "今日無事件", "noEventsToday": "今日無事件",
"noEventsFound": "未找到事件" "noEventsFound": "未找到事件",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "平台", "platforms": "平台",
@ -1042,5 +1044,15 @@
"downloads": "下載", "downloads": "下載",
"uploads": "上傳", "uploads": "上傳",
"sharedFiles": "檔案" "sharedFiles": "檔案"
},
"jellystat": {
"songs": "曲目",
"movies": "電影",
"episodes": "集",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -149,7 +149,7 @@
"received": "已接收", "received": "已接收",
"sent": "已发送", "sent": "已发送",
"externalIPAddress": "外部IP", "externalIPAddress": "外部IP",
"externalIPv6Address": "Ext. IPv6", "externalIPv6Address": "",
"externalIPv6Prefix": "Ext. IPv6-Prefix" "externalIPv6Prefix": "Ext. IPv6-Prefix"
}, },
"caddy": { "caddy": {
@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "公网 IP", "public_ip": "公网 IP",
"region": "区域", "region": "区域",
"country": "国家" "country": "国家",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "频道", "channels": "频道",
@ -719,7 +720,7 @@
"memoryusage": "内存", "memoryusage": "内存",
"freespace": "剩余空间", "freespace": "剩余空间",
"activeusers": "活跃用户", "activeusers": "活跃用户",
"numfiles": "Files", "numfiles": "文件",
"numshares": "共享项目" "numshares": "共享项目"
}, },
"kopia": { "kopia": {
@ -760,7 +761,7 @@
"booksDuration": "持续时间" "booksDuration": "持续时间"
}, },
"homeassistant": { "homeassistant": {
"people_home": "房间", "people_home": "在家人数",
"lights_on": "照明开", "lights_on": "照明开",
"switches_on": "开关开" "switches_on": "开关开"
}, },
@ -782,7 +783,7 @@
}, },
"kavita": { "kavita": {
"seriesCount": "系列", "seriesCount": "系列",
"totalFiles": "Files" "totalFiles": "文件"
}, },
"azuredevops": { "azuredevops": {
"result": "Result", "result": "Result",
@ -856,7 +857,8 @@
"physicalRelease": "Physical release", "physicalRelease": "Physical release",
"digitalRelease": "Digital release", "digitalRelease": "Digital release",
"noEventsToday": "今天没有活动!", "noEventsToday": "今天没有活动!",
"noEventsFound": "未找到事件" "noEventsFound": "未找到事件",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "平台", "platforms": "平台",
@ -886,7 +888,7 @@
"notifications": "通知", "notifications": "通知",
"issues": "问题", "issues": "问题",
"pulls": "PR", "pulls": "PR",
"repositories": "Repositories" "repositories": "代码仓库"
}, },
"stash": { "stash": {
"scenes": "场景", "scenes": "场景",
@ -1041,6 +1043,16 @@
"update_no": "Up to Date", "update_no": "Up to Date",
"downloads": "Downloads", "downloads": "Downloads",
"uploads": "Uploads", "uploads": "Uploads",
"sharedFiles": "Files" "sharedFiles": "文件"
},
"jellystat": {
"songs": "歌曲",
"movies": "电影",
"episodes": "剧集",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -568,7 +568,8 @@
"gluetun": { "gluetun": {
"public_ip": "公用IP", "public_ip": "公用IP",
"region": "地區", "region": "地區",
"country": "國家" "country": "國家",
"port_forwarded": "Port Forwarded"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "頻道", "channels": "頻道",
@ -856,7 +857,8 @@
"physicalRelease": "實體發行", "physicalRelease": "實體發行",
"digitalRelease": "數位發行", "digitalRelease": "數位發行",
"noEventsToday": "今日無事件", "noEventsToday": "今日無事件",
"noEventsFound": "未找到事件" "noEventsFound": "未找到事件",
"errorWhenLoadingData": "Error when loading calendar data"
}, },
"romm": { "romm": {
"platforms": "平台", "platforms": "平台",
@ -1042,5 +1044,15 @@
"downloads": "下載", "downloads": "下載",
"uploads": "上傳", "uploads": "上傳",
"sharedFiles": "檔案" "sharedFiles": "檔案"
},
"jellystat": {
"songs": "曲目",
"movies": "電影",
"episodes": "集",
"other": "Other"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
} }
} }

View File

@ -49,7 +49,7 @@ export const searchProviders = {
function getAvailableProviderIds(options) { function getAvailableProviderIds(options) {
if (options.provider && Array.isArray(options.provider)) { if (options.provider && Array.isArray(options.provider)) {
return Object.keys(searchProviders).filter((value) => options.provider.includes(value)); return options.provider.filter((value) => searchProviders.hasOwnProperty(value));
} }
if (options.provider && searchProviders[options.provider]) { if (options.provider && searchProviders[options.provider]) {
return [options.provider]; return [options.provider];

View File

@ -135,6 +135,28 @@ function pruneEmptyGroups(groups) {
}); });
} }
function mergeLayoutGroupsIntoConfigured(configuredGroups, layoutGroups) {
for (const layoutGroup of layoutGroups) {
const existing = findGroupByName(configuredGroups, layoutGroup.name);
if (existing) {
if (layoutGroup.groups?.length) {
existing.groups ??= [];
for (const sub of layoutGroup.groups) {
const existingSub = findGroupByName(existing.groups, sub.name);
if (!existingSub) {
existing.groups.push(sub);
} else {
// recursive merge if needed
mergeLayoutGroupsIntoConfigured([existingSub], [sub]);
}
}
}
} else {
configuredGroups.push(layoutGroup);
}
}
}
export async function servicesResponse() { export async function servicesResponse() {
let discoveredDockerServices; let discoveredDockerServices;
let discoveredKubernetesServices; let discoveredKubernetesServices;
@ -191,14 +213,10 @@ export async function servicesResponse() {
const definedLayouts = initialSettings.layout ? Object.keys(initialSettings.layout) : null; const definedLayouts = initialSettings.layout ? Object.keys(initialSettings.layout) : null;
if (definedLayouts) { if (definedLayouts) {
// this handles cases where groups are only defined in the settings.yaml layout and not in the services.yaml // this handles cases where groups are only defined in the settings.yaml layout and not in the services.yaml
const layoutConfiguredGroups = Object.entries(initialSettings.layout).map(([key, value]) => const layoutGroups = Object.entries(initialSettings.layout).map(([key, value]) =>
convertLayoutGroupToGroup(key, value), convertLayoutGroupToGroup(key, value),
); );
layoutConfiguredGroups.forEach((group) => { mergeLayoutGroupsIntoConfigured(configuredServices, layoutGroups);
if (!configuredServices.find((serviceGroup) => serviceGroup.name === group.name)) {
configuredServices.push(group);
}
});
} }
mergedGroupsNames.forEach((groupName) => { mergedGroupsNames.forEach((groupName) => {

View File

@ -14,19 +14,29 @@ export const CONF_DIR = process.env.HOMEPAGE_CONFIG_DIR
: join(process.cwd(), "config"); : join(process.cwd(), "config");
export default function checkAndCopyConfig(config) { export default function checkAndCopyConfig(config) {
// Ensure config directory exists
if (!existsSync(CONF_DIR)) { if (!existsSync(CONF_DIR)) {
mkdirSync(CONF_DIR, { recursive: true }); try {
mkdirSync(CONF_DIR, { recursive: true });
} catch (e) {
console.warn(`Could not create config directory ${CONF_DIR}: ${e.message}`);
return false;
}
} }
const configYaml = join(CONF_DIR, config); const configYaml = join(CONF_DIR, config);
// If the config file doesn't exist, try to copy the skeleton
if (!existsSync(configYaml)) { if (!existsSync(configYaml)) {
const configSkeleton = join(process.cwd(), "src", "skeleton", config); const configSkeleton = join(process.cwd(), "src", "skeleton", config);
try { try {
copyFileSync(configSkeleton, configYaml); copyFileSync(configSkeleton, configYaml);
console.info("%s was copied to the config folder", config); console.info("%s was copied to the config folder", config);
} catch (err) { } catch (err) {
console.error("error copying config", err); console.error("❌ Failed to initialize required config: %s", configYaml);
throw err; console.error("Reason: %s", err.message);
console.error("Hint: Make /app/config writable or manually place the config file.");
process.exit(1);
} }
return true; return true;

View File

@ -40,6 +40,15 @@ export default function getDockerArguments(server) {
res.conn.ca = readFileSync(path.join(CONF_DIR, servers[server].tls.caFile)); res.conn.ca = readFileSync(path.join(CONF_DIR, servers[server].tls.caFile));
res.conn.cert = readFileSync(path.join(CONF_DIR, servers[server].tls.certFile)); res.conn.cert = readFileSync(path.join(CONF_DIR, servers[server].tls.certFile));
res.conn.key = readFileSync(path.join(CONF_DIR, servers[server].tls.keyFile)); res.conn.key = readFileSync(path.join(CONF_DIR, servers[server].tls.keyFile));
res.conn.protocol = "https";
}
if (servers[server].protocol) {
res.conn.protocol = servers[server].protocol;
}
if (servers[server].headers) {
res.conn.headers = servers[server].headers;
} }
return res; return res;

View File

@ -304,6 +304,9 @@ export function cleanServiceGroups(groups) {
// frigate // frigate
enableRecentEvents, enableRecentEvents,
// gamedig
gameToken,
// beszel, glances, immich, komga, mealie, pihole, pfsense, speedtest // beszel, glances, immich, komga, mealie, pihole, pfsense, speedtest
version, version,
@ -331,6 +334,9 @@ export function cleanServiceGroups(groups) {
referrerPolicy, referrerPolicy,
src, src,
// jellystat
days,
// kopia // kopia
snapshotHost, snapshotHost,
snapshotPath, snapshotPath,
@ -484,6 +490,9 @@ export function cleanServiceGroups(groups) {
if (["diskstation", "qnap"].includes(type)) { if (["diskstation", "qnap"].includes(type)) {
if (volume) widget.volume = volume; if (volume) widget.volume = volume;
} }
if (type === "gamedig") {
if (gameToken) widget.gameToken = gameToken;
}
if (type === "kopia") { if (type === "kopia") {
if (snapshotHost) widget.snapshotHost = snapshotHost; if (snapshotHost) widget.snapshotHost = snapshotHost;
if (snapshotPath) widget.snapshotPath = snapshotPath; if (snapshotPath) widget.snapshotPath = snapshotPath;
@ -563,6 +572,9 @@ export function cleanServiceGroups(groups) {
if (type === "spoolman") { if (type === "spoolman") {
if (spoolIds !== undefined) widget.spoolIds = spoolIds; if (spoolIds !== undefined) widget.spoolIds = spoolIds;
} }
if (type === "jellystat") {
if (days !== undefined) widget.days = parseInt(days, 10);
}
return widget; return widget;
}); });
return cleanedService; return cleanedService;

View File

@ -34,6 +34,9 @@ export default async function credentialedProxyHandler(req, res, map) {
headers["X-CMC_PRO_API_KEY"] = `${widget.key}`; headers["X-CMC_PRO_API_KEY"] = `${widget.key}`;
} else if (widget.type === "gotify") { } else if (widget.type === "gotify") {
headers["X-gotify-Key"] = `${widget.key}`; headers["X-gotify-Key"] = `${widget.key}`;
} else if (widget.type === "checkmk") {
headers["Accept"] = `application/json`;
headers.Authorization = `Bearer ${widget.username} ${widget.password}`;
} else if ( } else if (
[ [
"argocd", "argocd",
@ -65,7 +68,7 @@ export default async function credentialedProxyHandler(req, res, map) {
} else if (widget.type === "proxmoxbackupserver") { } else if (widget.type === "proxmoxbackupserver") {
delete headers["Content-Type"]; delete headers["Content-Type"];
headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`; headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`;
} else if (widget.type === "autobrr") { } else if (["autobrr", "jellystat"].includes(widget.type)) {
headers["X-API-Token"] = `${widget.key}`; headers["X-API-Token"] = `${widget.key}`;
} else if (widget.type === "tubearchivist") { } else if (widget.type === "tubearchivist") {
headers.Authorization = `Token ${widget.key}`; headers.Authorization = `Token ${widget.key}`;

View File

@ -72,8 +72,23 @@ export default async function beszelProxyHandler(req, res) {
}, },
}); });
if ([400, 403].includes(status)) { const badRequest = [400, 403].includes(status);
logger.debug(`HTTP ${status} retrieving data from Beszel, logging in and trying again.`); const text = data.toString("utf-8");
let isEmpty = false;
try {
const json = JSON.parse(text);
isEmpty = Array.isArray(json.items) && json.items.length === 0;
} catch (err) {
logger.debug("Failed to parse Beszel response JSON:", err);
}
if (badRequest || isEmpty) {
if (badRequest) {
logger.debug(`HTTP ${status} retrieving data from Beszel, logging in and trying again.`);
} else {
logger.debug(`Received empty list from Beszel, logging in and trying again.`);
}
cache.del(`${tokenCacheKey}.${service}`); cache.del(`${tokenCacheKey}.${service}`);
[status, token] = await login(loginUrl, widget.username, widget.password, service); [status, token] = await login(loginUrl, widget.username, widget.password, service);

View File

@ -1,21 +1,20 @@
import { parseString } from "cal-parser"; import ICAL from "ical.js";
import { DateTime } from "luxon"; import { DateTime } from "luxon";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { useEffect } from "react"; import { useEffect } from "react";
import { RRule } from "rrule";
import Error from "../../../components/services/widget/error"; import Error from "../../../components/services/widget/error";
import useWidgetAPI from "../../../utils/proxy/use-widget-api"; import useWidgetAPI from "../../../utils/proxy/use-widget-api";
// https://gist.github.com/jlevy/c246006675becc446360a798e2b2d781
function simpleHash(str) { function simpleHash(str) {
/* eslint-disable no-plusplus, no-bitwise */
let hash = 0; let hash = 0;
const prime = 31;
for (let i = 0; i < str.length; i++) { for (let i = 0; i < str.length; i++) {
hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0; hash = (hash * prime + str.charCodeAt(i)) % 2_147_483_647;
} }
return (hash >>> 0).toString(36);
/* eslint-disable no-plusplus, no-bitwise */ return Math.abs(hash).toString(36);
} }
export default function Integration({ config, params, setEvents, hideErrors, timezone }) { export default function Integration({ config, params, setEvents, hideErrors, timezone }) {
@ -25,11 +24,49 @@ export default function Integration({ config, params, setEvents, hideErrors, tim
}); });
useEffect(() => { useEffect(() => {
let parsedIcal; const { showName = false } = config?.params || {};
let events = [];
if (!icalError && icalData && !icalData.error) { if (!icalError && icalData && !icalData.error) {
parsedIcal = parseString(icalData.data); if (!icalData.data) {
if (parsedIcal.events.length === 0) { icalData.error = { message: `'${config.name}': ${t("calendar.errorWhenLoadingData")}` };
return;
}
const jCal = ICAL.parse(icalData.data);
const vCalendar = new ICAL.Component(jCal);
const buildEvent = (event, type) => {
return {
id: event.getFirstPropertyValue("uid"),
type,
title: event.getFirstPropertyValue("summary"),
rrule: event.getFirstPropertyValue("rrule"),
dtstart:
event.getFirstPropertyValue("dtstart") ||
event.getFirstPropertyValue("due") ||
event.getFirstPropertyValue("completed") ||
ICAL.Time.now(), // handles events without a date
dtend:
event.getFirstPropertyValue("dtend") ||
event.getFirstPropertyValue("due") ||
event.getFirstPropertyValue("completed") ||
ICAL.Time.now(), // handles events without a date
location: event.getFirstPropertyValue("location"),
status: event.getFirstPropertyValue("status"),
};
};
const getEvents = () => {
const vEvents = vCalendar.getAllSubcomponents("vevent").map((event) => buildEvent(event, "vevent"));
const vTodos = vCalendar.getAllSubcomponents("vtodo").map((todo) => buildEvent(todo, "vtodo"));
return [...vEvents, ...vTodos];
};
events = getEvents();
if (events.length === 0) {
icalData.error = { message: `'${config.name}': ${t("calendar.noEventsFound")}` }; icalData.error = { message: `'${config.name}': ${t("calendar.noEventsFound")}` };
} }
} }
@ -37,72 +74,67 @@ export default function Integration({ config, params, setEvents, hideErrors, tim
const startDate = DateTime.fromISO(params.start); const startDate = DateTime.fromISO(params.start);
const endDate = DateTime.fromISO(params.end); const endDate = DateTime.fromISO(params.end);
if (icalError || !parsedIcal || !startDate.isValid || !endDate.isValid) { if (icalError || events.length === 0 || !startDate.isValid || !endDate.isValid) {
return; return;
} }
const eventsToAdd = {}; const rangeStart = ICAL.Time.fromJSDate(startDate.toJSDate());
const events = parsedIcal?.getEventsBetweenDates(startDate.toJSDate(), endDate.toJSDate()); const rangeEnd = ICAL.Time.fromJSDate(endDate.toJSDate());
const now = timezone ? DateTime.now().setZone(timezone) : DateTime.now();
events?.forEach((event) => { const getOcurrencesFromRange = (event) => {
let title = `${event?.summary?.value}`; if (!event.rrule) {
if (config?.params?.showName) { if (event.dtstart.compare(rangeStart) >= 0 && event.dtend.compare(rangeEnd) <= 0) {
title = `${config.name}: ${title}`; return [event.dtstart];
}
// 'dtend' is null for all-day events
const { dtstart, dtend = { value: 0 } } = event;
const eventToAdd = (date, i, type) => {
const days = dtend.value === 0 ? 1 : (dtend.value - dtstart.value) / (1000 * 60 * 60 * 24);
const eventDate = timezone ? DateTime.fromJSDate(date, { zone: timezone }) : DateTime.fromJSDate(date);
for (let j = 0; j < days; j += 1) {
// See https://github.com/gethomepage/homepage/issues/2753 uid is not stable
// assumption is that the event is the same if the start, end and title are all the same
const hash = simpleHash(`${dtstart?.value}${dtend?.value}${title}${i}${j}${type}}`);
eventsToAdd[hash] = {
title,
date: eventDate.plus({ days: j }),
color: config?.color ?? "zinc",
isCompleted: eventDate < now,
additional: event.location?.value,
type: "ical",
};
} }
};
let recurrenceOptions = event?.recurrenceRule?.origOptions; return [];
// RRuleSet does not have dtstart, add it manually
if (event?.recurrenceRule && event.recurrenceRule.rrules && event.recurrenceRule.rrules()?.[0]?.origOptions) {
recurrenceOptions = event.recurrenceRule.rrules()[0].origOptions;
recurrenceOptions.dtstart = dtstart.value;
} }
if (recurrenceOptions && Object.keys(recurrenceOptions).length !== 0) { const iterator = event.rrule.iterator(event.dtstart);
try {
const rule = new RRule(recurrenceOptions);
const recurringEvents = rule.between(startDate.toJSDate(), endDate.toJSDate());
recurringEvents.forEach((date, i) => { const occurrences = [];
let eventDate = date; for (let next = iterator.next(); next && next.compare(rangeEnd) < 0; next = iterator.next()) {
if (event.dtstart?.params?.tzid) { if (next.compare(rangeStart) < 0) {
// date is in UTC but parsed as if it is in current timezone, so we need to adjust it continue;
const dateInUTC = DateTime.fromJSDate(date).setZone("UTC");
const offset = dateInUTC.offset - DateTime.fromJSDate(date, { zone: event.dtstart.params.tzid }).offset;
eventDate = dateInUTC.plus({ minutes: offset }).toJSDate();
}
eventToAdd(eventDate, i, "recurring");
});
return;
} catch (e) {
// eslint-disable-next-line no-console
console.error("Unable to parse recurring events from iCal: %s", e);
} }
occurrences.push(next.clone());
} }
event.matchingDates.forEach((date, i) => eventToAdd(date, i, "single")); return occurrences;
};
const eventsToAdd = [];
events.forEach((event, index) => {
const occurrences = getOcurrencesFromRange(event);
occurrences.forEach((icalDate) => {
const date = icalDate.toJSDate();
const hash = simpleHash(`${event.id}-${event.title}-${index}-${date.toString()}`);
let title = event.title;
if (showName) {
title = `${config.name}: ${title}`;
}
const getIsCompleted = () => {
if (event.type === "vtodo") {
return event.status === "COMPLETED";
}
return DateTime.fromJSDate(date) < DateTime.now();
};
eventsToAdd[hash] = {
title,
date: DateTime.fromJSDate(date),
color: config?.color ?? "zinc",
isCompleted: getIsCompleted(),
additional: event.location,
type: "ical",
};
});
}); });
setEvents((prevEvents) => ({ ...prevEvents, ...eventsToAdd })); setEvents((prevEvents) => ({ ...prevEvents, ...eventsToAdd }));

View File

@ -0,0 +1,40 @@
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: servicesData, error: servicesError } = useWidgetAPI(widget, "services_info", {
columns: "state",
query: '{"op": "!=", "left": "state", "right": "0"}',
});
const { data: hostsData, error: hostsError } = useWidgetAPI(widget, "hosts_info", {
columns: "state",
query: '{"op": "!=", "left": "state", "right": "0"}',
});
if (servicesError || hostsError) {
return <Container service={service} error={servicesError ?? hostsError} />;
}
if (!servicesData || !hostsData) {
return (
<Container service={service}>
<Block label="checkmk.serviceErrors" />
<Block label="checkmk.hostErrors" />
</Container>
);
}
return (
<Container service={service}>
<Block label="checkmk.serviceErrors" value={t("common.number", { value: servicesData.value.length })} />
<Block label="checkmk.hostErrors" value={t("common.number", { value: hostsData.value.length })} />
</Container>
);
}

View File

@ -0,0 +1,19 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/{site}/check_mk/api/1.0/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
services_info: {
endpoint: "domain-types/service/collections/all",
params: ["columns", "query"],
},
hosts_info: {
endpoint: "domain-types/host/collections/all",
params: ["columns", "query"],
},
},
};
export default widget;

View File

@ -16,6 +16,7 @@ const components = {
calibreweb: dynamic(() => import("./calibreweb/component")), calibreweb: dynamic(() => import("./calibreweb/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")), changedetectionio: dynamic(() => import("./changedetectionio/component")),
channelsdvrserver: dynamic(() => import("./channelsdvrserver/component")), channelsdvrserver: dynamic(() => import("./channelsdvrserver/component")),
checkmk: dynamic(() => import("./checkmk/component")),
cloudflared: dynamic(() => import("./cloudflared/component")), cloudflared: dynamic(() => import("./cloudflared/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")), coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
crowdsec: dynamic(() => import("./crowdsec/component")), crowdsec: dynamic(() => import("./crowdsec/component")),
@ -59,6 +60,7 @@ const components = {
jdownloader: dynamic(() => import("./jdownloader/component")), jdownloader: dynamic(() => import("./jdownloader/component")),
jellyfin: dynamic(() => import("./emby/component")), jellyfin: dynamic(() => import("./emby/component")),
jellyseerr: dynamic(() => import("./jellyseerr/component")), jellyseerr: dynamic(() => import("./jellyseerr/component")),
jellystat: dynamic(() => import("./jellystat/component")),
kavita: dynamic(() => import("./kavita/component")), kavita: dynamic(() => import("./kavita/component")),
komga: dynamic(() => import("./komga/component")), komga: dynamic(() => import("./komga/component")),
kopia: dynamic(() => import("./kopia/component")), kopia: dynamic(() => import("./kopia/component")),

View File

@ -12,13 +12,19 @@ export default async function gamedigProxyHandler(req, res) {
const url = new URL(serviceWidget.url); const url = new URL(serviceWidget.url);
try { try {
const serverData = await GameDig.query({ const gamedigOptions = {
type: serviceWidget.serverType, type: serviceWidget.serverType,
host: url.hostname, host: url.hostname,
port: url.port, port: url.port,
givenPortOnly: true, givenPortOnly: true,
checkOldIDs: true, checkOldIDs: true,
}); };
if (serviceWidget.gameToken) {
gamedigOptions.token = serviceWidget.gameToken;
}
const serverData = await GameDig.query(gamedigOptions);
res.status(200).send({ res.status(200).send({
online: true, online: true,

View File

@ -112,7 +112,7 @@ export default function Component({ service }) {
<div className="bg-linear-to-br from-theme-500/30 via-theme-600/20 to-theme-700/10 absolute -top-10 -left-2 -right-2 -bottom-2 h-[calc(100%+3em)] w-[calc(100%+1em)]" /> <div className="bg-linear-to-br from-theme-500/30 via-theme-600/20 to-theme-700/10 absolute -top-10 -left-2 -right-2 -bottom-2 h-[calc(100%+3em)] w-[calc(100%+1em)]" />
)} )}
<Block position="-top-6 right-2"> <Block position={chart ? "-top-6 right-2" : "top-3 right-3"}>
{quicklookData && quicklookData.cpu_name && chart && ( {quicklookData && quicklookData.cpu_name && chart && (
<div className="text-[0.6rem] opacity-50">{quicklookData.cpu_name}</div> <div className="text-[0.6rem] opacity-50">{quicklookData.cpu_name}</div>
)} )}

View File

@ -7,17 +7,19 @@ export default function Component({ service }) {
const { widget } = service; const { widget } = service;
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip"); const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
const { data: portForwardedData, error: portForwardedError } = useWidgetAPI(widget, "port_forwarded");
if (gluetunError) { if (gluetunError || portForwardedError) {
return <Container service={service} error={gluetunError} />; return <Container service={service} error={gluetunError || portForwardedError} />;
} }
if (!gluetunData) { if (!gluetunData || !portForwardedData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="gluetun.public_ip" /> <Block label="gluetun.public_ip" />
<Block label="gluetun.region" /> <Block label="gluetun.region" />
<Block label="gluetun.country" /> <Block label="gluetun.country" />
<Block label="gluetun.port_forwarded" />
</Container> </Container>
); );
} }
@ -27,6 +29,7 @@ export default function Component({ service }) {
<Block label="gluetun.public_ip" value={gluetunData.public_ip} /> <Block label="gluetun.public_ip" value={gluetunData.public_ip} />
<Block label="gluetun.region" value={gluetunData.region} /> <Block label="gluetun.region" value={gluetunData.region} />
<Block label="gluetun.country" value={gluetunData.country} /> <Block label="gluetun.country" value={gluetunData.country} />
<Block label="gluetun.port_forwarded" value={portForwardedData.port} />
</Container> </Container>
); );
} }

View File

@ -9,6 +9,10 @@ const widget = {
endpoint: "publicip/ip", endpoint: "publicip/ip",
validate: ["public_ip", "country"], validate: ["public_ip", "country"],
}, },
port_forwarded: {
endpoint: "openvpn/portforwarded",
validate: ["port"],
},
}, },
}; };

View File

@ -0,0 +1,38 @@
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
// Days validation
if (!(Number.isInteger(widget.days) && 0 < widget.days)) widget.days = 30;
const { data: viewsData, error: viewsError } = useWidgetAPI(widget, "getViewsByLibraryType", { days: widget.days });
const error = viewsError || viewsData?.message;
if (error) {
return <Container service={service} error={error} />;
}
if (!viewsData) {
return (
<Container service={service}>
<Block label="jellystat.songs" />
<Block label="jellystat.movies" />
<Block label="jellystat.episodes" />
<Block label="jellystat.other" />
</Container>
);
}
return (
<Container service={service}>
<Block label="jellystat.songs" value={viewsData.Audio} />
<Block label="jellystat.movies" value={viewsData.Movie} />
<Block label="jellystat.episodes" value={viewsData.Series} />
<Block label="jellystat.other" value={viewsData.Other} />
</Container>
);
}

View File

@ -0,0 +1,15 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
getViewsByLibraryType: {
endpoint: "stats/getViewsByLibraryType",
params: ["days"],
},
},
};
export default widget;

View File

@ -13,6 +13,7 @@ import calendar from "./calendar/widget";
import calibreweb from "./calibreweb/widget"; import calibreweb from "./calibreweb/widget";
import changedetectionio from "./changedetectionio/widget"; import changedetectionio from "./changedetectionio/widget";
import channelsdvrserver from "./channelsdvrserver/widget"; import channelsdvrserver from "./channelsdvrserver/widget";
import checkmk from "./checkmk/widget";
import cloudflared from "./cloudflared/widget"; import cloudflared from "./cloudflared/widget";
import coinmarketcap from "./coinmarketcap/widget"; import coinmarketcap from "./coinmarketcap/widget";
import crowdsec from "./crowdsec/widget"; import crowdsec from "./crowdsec/widget";
@ -49,6 +50,7 @@ import immich from "./immich/widget";
import jackett from "./jackett/widget"; import jackett from "./jackett/widget";
import jdownloader from "./jdownloader/widget"; import jdownloader from "./jdownloader/widget";
import jellyseerr from "./jellyseerr/widget"; import jellyseerr from "./jellyseerr/widget";
import jellystat from "./jellystat/widget";
import karakeep from "./karakeep/widget"; import karakeep from "./karakeep/widget";
import kavita from "./kavita/widget"; import kavita from "./kavita/widget";
import komga from "./komga/widget"; import komga from "./komga/widget";
@ -150,6 +152,7 @@ const widgets = {
calibreweb, calibreweb,
changedetectionio, changedetectionio,
channelsdvrserver, channelsdvrserver,
checkmk,
cloudflared, cloudflared,
coinmarketcap, coinmarketcap,
crowdsec, crowdsec,
@ -190,6 +193,7 @@ const widgets = {
jdownloader, jdownloader,
jellyfin: emby, jellyfin: emby,
jellyseerr, jellyseerr,
jellystat,
kavita, kavita,
komga, komga,
kopia, kopia,